Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4852 lines
122 KiB

!IF 0
Copyright (c) 1989-1996 Microsoft Corporation
Module Name:
makefile.def
Abstract:
This is the standard makefile for the components of the NT project.
It includes the following files:
.\sources. - developer supplies this file. It defines the
required TARGETNAME, TARGETPATH, TARGETTYPE and
SOURCES as well as optional macros that control
the behavior of the compiler and linker:
obj\_objects.mac - built by BUILD.EXE from .\sources.
Targets:
all - Builds all targets in this make file
clean - Erase all targets that can be produced by this make
file, ignoring errors. Also rebuilds the depend target.
depend - Rebuilts source file dependencies, using BUILD.EXE tool
Useful Variables Set:
CPUTYPE={I386|AXP64|ALPHA|MPPC|IA64|AMD64|ARM}
Optional Controls Variables (partial list), these are environment variables,
remember they can be set with env=value on the command line as well:
NOTE: xxx_... is {MSC|386|axp64|alpha|MPPC|ia64|amd64} where MSC_ applies to the C8 compiler
independent of the cpu type. Specific cpu_ will take precedence
over the equivalent MSC_ variable.
EXAMPLE: To compile with codeview symbols for windbg:
set NTDEBUG=ntsd
set NTDEBUGTYPE=windbg
set MSC_OPTIMIZATION=/Od
nttest=filename
umtest=filename
umappl=filename
NT_UP
Define as 0 in environment to turn on MP.
If undefined or equal to 1, you get UP.
xxx_warning_level
xxx_optimization
xxx_STDCALL = 1 use _stdcall calling convention
0 use _cdecl calling convention
ntdebug
browser_info
xxx_cppflags
ntcppflags
NT_INST - set to turn on instrumentation
BASEDIR - \nt or \ntrel (default \nt)
PRECOMPILED_CXX=1 - do precompiled headers for CXX instead of C files
note: precompiled headers can not be used on both
c and cxx files in a single directory.
!ENDIF
!if 0
! message You must use nmake version 1.30 or greater...
!endif
# See if the user wants BROWSER_INFO.
!ifdef BROWSER_INFO
USER_ENV_BROWSER_INFO=1
!endif
!ifdef COMPRESS_PDBS
COMPRESS_CMD=-compact /c /q $(@D)\$(@B).pdb
!else
COMPRESS_CMD=
!endif
#
# Select build target and set platform specific variables.
#
!ifndef BUILD_ALLOW_LINKER_WARNINGS
LINKER_WARNING_SWITCH=/WX
!else
LINKER_WARNING_SWITCH=
!endif
!INCLUDE makefile.plt
!ifndef MASTER_VERSION_FILE
!if "$(POCKETPC)" == ""
MASTER_VERSION_FILE = $(SDK_INC_PATH)\ntverp.h
!endif
DEFAULT_VERSION_FILE=1
!endif
#
# IDL/RDL/TDL build rules.
#
!ifdef IDL_RULES
IDL_OUT_DIR =.
IDL_HDR_OUT_DIR =.
RDL_OUT_DIR =.
RDL_HDR_OUT_DIR =.
! ifndef MIDL_INCS
MIDL_INCS = $(_OBJ_DIR)\$(TARGET_DIRECTORY)
! endif
!endif
!ifndef LANGUAGE
LANGUAGE=usa
!endif
# define a simple macro that can be used for the object subdir in makefile.inc/sources files
O = $(_OBJ_DIR)\$(TARGET_DIRECTORY)
#
# Include the developer supplied file that defines the TARGETNAME, TARGETPATH,
# TARGETTYPE and SOURCES macros. Make sure it defines them.
#
!if defined(USE_CAPK)
# Kernel profiling - icecap api's come from the kernel or from rtl\icecap.c when building the kernel/hal/ntdll
USE_ICECAP4=1
PERFLIBS=
C_DEFINES=$(C_DEFINES) /D_CAPKERN=1
ASM_DEFINES=$(ASM_DEFINES) /D_CAPKERN=1
!endif
!if defined(USE_ICECAP) || defined(USE_ICECAP4) || defined(USE_DLP)
! ifdef USE_ICECAP
PERFFLAGS=-Gh
PERFLIBS=$(SDK_LIB_PATH)\icap.lib
! else
! ifdef USE_ICECAP4
PERFFLAGS=/fastcap
! else # USE_DLP
PERFFLAGS=/dlp
! endif
! ifndef PERFLIBS
PERFLIBS=$(SDK_LIB_PATH)\icecap.lib
! endif
! endif
! if $(FREEBUILD)
NTDEBUG=ntsdnodbg
! else
NTDEBUG=ntsd
! endif
NTDEBUGTYPE=windbg
NTBBT=1
!endif
LATEST_WIN32_WIN95_VERSION=0x0400
LATEST_WIN32_WCE_VERSION=0x0300
#
# Set versions correctly for NT4/2000/XP
# Default to XP
#
!if $(_NT_TARGET_VERSION) == 0x502 ## Windows Server 2003 ##
LATEST_WIN32_IE_VERSION =0x0600
LATEST_WIN32_WINNT_VERSION=0x0502
SUBSYSTEM_VERSION_CURRENT =4.10
SUBSYSTEM_VERSION_LATEST =5.02
!elseif $(_NT_TARGET_VERSION) == 0x501 ## Windows XP ##
LATEST_WIN32_IE_VERSION =0x0600
LATEST_WIN32_WINNT_VERSION=0x0501
SUBSYSTEM_VERSION_CURRENT=4.10
SUBSYSTEM_VERSION_LATEST =5.01
!elseif $(_NT_TARGET_VERSION) == 0x500 ## Windows 2000 ##
LATEST_WIN32_IE_VERSION =0x0501
LATEST_WIN32_WINNT_VERSION=0x0500
SUBSYSTEM_VERSION_CURRENT=4.10
SUBSYSTEM_VERSION_LATEST =5.00
!elseif $(_NT_TARGET_VERSION) == 0x400 ## Windows NT 4 ##
LATEST_WIN32_IE_VERSION =0x0200
LATEST_WIN32_WINNT_VERSION=0x0400
SUBSYSTEM_VERSION_CURRENT =4.00
SUBSYSTEM_VERSION_LATEST =4.00
!else
!message NMAKE : Uxxxx: _NT_TARGET_VERSION value is unknown. Update Makefile.def to understand the new version.
!endif # _NT_TARGET_VERSION
#
# Set Windows CE/PocketPC variables.
#
!if "$(POCKETPC)" != ""
! if "$(POCKETPC_EMULATION)" != ""
WINCE_IMAGE = -WINDOWSCE:EMULATION
! else
WINCE_IMAGE = -WINDOWSCE
! endif
CVTRES_PLATFORM_FLAGS = $(WINCE_IMAGE)
!endif
# Setup rebase command for use with MANAGED_CODE (TLBIMP doesn't support /baseaddress)
REBASE_CMD=rebase.exe -i $(COFFBASE_TXT_FILE) $@
#
# Run miscfiles rules during both compile and link phases. Sources file
# can override by setting this a value other than 0
#
MISCFILES_DURING_LINK=0
!INCLUDE .\sources
SOURCES_USED=$(SOURCES_USED) .\sources
#
# Attempt to include the sources file from the target subdirectory.
#
!IF EXIST(.\$(TARGET_DIRECTORY)\sources)
! INCLUDE .\$(TARGET_DIRECTORY)\sources
SOURCES_USED=$(SOURCES_USED) .\$(TARGET_DIRECTORY)\sources
!ENDIF
#
# Attempt to include the sources file from the parent target subdirectory.
#
!IF EXIST(..\$(TARGET_DIRECTORY)\sources)
! INCLUDE ..\$(TARGET_DIRECTORY)\sources
SOURCES_USED=$(SOURCES_USED) ..\$(TARGET_DIRECTORY)\sources
!ENDIF
!if (defined(MANAGED_CODE) || defined(MANAGED_VB))
VC7_SYMBOLS=1
! if defined(MANAGED_TOOL_PATH)
PATH=$(MANAGED_TOOL_PATH);$(PATH)
! if [set path=$(MANAGED_TOOL_PATH);$(PATH)]
! endif
! endif
!endif
!if defined(MANAGED_CXX)
VC7_SYMBOLS=1
!endif
!if $(LTCG_DRIVER) && "$(TARGETTYPE)" == "DRIVER"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_DRIVER_LIBRARY) && "$(TARGETTYPE)" == "DRIVER_LIBRARY"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_DYNLINK) && "$(TARGETTYPE)" == "DYNLINK"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_EXPORT_DRIVER) && "$(TARGETTYPE)" == "EXPORT_DRIVER"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_GDI_DRIVER) && "$(TARGETTYPE)" == "GDI_DRIVER"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_HAL) && "$(TARGETTYPE)" == "HAL"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_LIBRARY) && "$(TARGETTYPE)" == "LIBRARY"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_MINIPORT) && "$(TARGETTYPE)" == "MINIPORT"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_PROGRAM) && "$(TARGETTYPE)" == "PROGRAM"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_PROGLIB) && "$(TARGETTYPE)" == "PROGLIB"
LINK_TIME_CODE_GENERATION=1
!endif
!if $(LTCG_UMAPPL_NOLIB) && "$(TARGETTYPE)" == "UMAPPL_NOLIB"
LINK_TIME_CODE_GENERATION=1
!endif
# Allow alternate object directories.
!ifndef BUILD_ALT_DIR
BUILD_ALT_DIR=
! ifdef CHECKED_ALT_DIR
! if !$(FREEBUILD)
BUILD_ALT_DIR=d
! endif
! endif
!endif
_OBJ_DIR = obj$(BUILD_ALT_DIR)
#
# SXS Build
#
# Step by Step
#
# For building a monolithic application, foo.ext (where .ext is usually .exe but for example .scr).
# For building an application that hosts arbitrary (3rd party) code.
# For building a single file component like comctl32.dll.
# For building a multiple file component.
#
# Reference
#
# An assembly contains a manifest and one or more files, usually .dlls.
# The manifest can be in a resource in one of the files, or it can be in a seperate
# .manifest file. For purposes of fitting on an 8.3 CD, .man is allowed.
# For preprocessing, the source file can be .manifest-src.
# Build.exe is generally limited to building one .dll per directory, so
# you can be building files for an assembly without building a manifest.
#
# To build/binplace a manifest:
#
# SXS_MANIFEST required
# This is the source file that contains your manifest.
# It must end in .manifest or .manifest-src.
# It is always preprocessed. Available macros include:
# SXS_ASSEMBLY_NAME
# SXS_ASSEMBLY_VERSION
# SXS_ASSEMBLY_LANGUAGE
# SXS_PROCESSOR_ARCHITECTURE
#
# SXS_MANIFEST_IN_RESOURCES optional
# This is defined or not, so you just say
# SXS_MANIFEST_IN_RESOURCES=
# or don't say anything.
#
# SXS_ASSEMBLY_NAME and/or SXS_SHORT_ASSEMBLY_NAME required
# One can be generated from the other.
# SXS_SHORT_ASSEMBLY_NAME is used where 8.3 limits apply, like on the product CD.
# Both of these macros can be hierarchical, using dot, dash, or underscore to seperate
# elements. SXS_SHORT_ASSEMBLY_NAME should actually only contain 8 character elements.
#
# SXS_ASSEMBLY_VERSION optional, defaults to 5.1.
# We append .0.0 to this.
#
# SXS_ASSEMBLY_LANGUAGE or SXS_ASSEMBLY_LANGUAGE_INDEPENDENT required
# SXS_ASSEMBLY_LANGUAGE_INDEPENDENT is defined or not.
# SXS_ASSEMBLY_LANGUAGE is four digits like
# 0409 for English US
# 0009 for English
# 0000 for language independent
# We should make this easier as is done for resources (LANGUAGE => RCCODEPAGE), but for now we don't.
#
# To build/binplace a file into an assembly, a subset of the information
# needed for manifests is needed:
#
# SXS_ASSEMBLY_NAME and/or SXS_SHORT_ASSEMBLY_NAME
# SXS_ASSEMBLY_VERSION
# SXS_ASSEMBLY_LANGUAGE or SXS_ASSEMBLY_LANGUAGE_INDEPENDENT
#
# There are restrictions on the values of these macros and not all restrictions
# are currently enforced by the build. Enforcements that are present are done
# ifdef VERIFY_SOURCES in verify.src.
#
!if defined(SXS_MANIFEST) \
|| defined(SXS_BINPLACE_ALSO_ROOT) \
|| defined(SXS_ASSEMBLY_NAME) \
|| defined(SXS_ASSEMBLY_VERSION) \
|| defined(SXS_ASSEMBLY_LANGUAGE_INDEPENDENT) \
|| defined(SXS_ASSEMBLY_LANGUAGE)
VERIFY_SOURCES=1
!endif
!if "$(ALT_PROJECT)" == "WOW6432" || "$(ALT_PROJECT_TARGET)" == "WOW6432"
SXS_PDB_WOW6432_W_PREFIX=w
SXS_LOG_WOWBINS_W_ASMS_PREFIX=w
SXS_LOG_BINPLACE_WOW6432_PREFIX=wow6432^\
SXS_WOW6432=1
!endif
# Form this particularly so build.exe reports errors.
# Using !error doesn't work as well.
# It is based on what \nt\base\wow64\tools and verify.src do.
SXS_BUILD_ERROR_MSG=NMAKE : U1234: 'SXS_BUILD' ($(NTMAKEENV)\makefile.def)
SXS_MERGE_MODULE_ERROR_MSG=NMAKE : U1234: 'SXS_MERGE_MODULE_GENERATION' ($(NTMAKEENV)\makefile.def)
#
# There's two meta-modes of operation in SXS - Application manifest mode and component manifest mode.
# Depending on what you have defined in your sources file, you can simplify all of the build process
# down to a very minimal set of commands in your sources files and still get Fusionization goodness.
#
# Example:
#
# SXS_APPLICATION_MANIFEST=MyAppManifest.manifest
#
# (or)
#
# SXS_COMPONENT_MANIFEST=MyComponentManifest.manifest
#
# See the code below for what gets defined based on each - it's more or less the defaults, but
# explicitly spelled out.
#
# No fair using either app and component manifest, and specifying sxs_manifest, or using both by accident
!if defined(SXS_APPLICATION_MANIFEST) && defined(SXS_COMPONENT_MANIFEST)
!message $(SXS_BUILD_ERROR_MSG) You can have only one of SXS_APPLICATION_MANIFEST or SXS_COMPONENT_MANIFEST, not both
!elseif defined(SXS_MANIFEST) && ( defined(SXS_APPLICATION_MANIFEST) || defined(SXS_COMPONENT_MANIFEST) )
!message $(SXS_BUILD_ERROR_MSG) When using SXS_APPLICATION_MANIFEST or SXS_COMPONENT_MANIFEST, do not specify SXS_MANIFEST
!endif
# Applications get the following defaults that are not defaulted later:
# - SXS_ASSEMBLY_LANGUAGE=SXS_ASSEMBLY_LANGUAGE_INDEPENDENT
# - SXS_ASSEMBLY_NAME=Microsoft.Windows.$(PROJECT).$(TARGETNAME)
# - Manifest in resources
!if defined(SXS_APPLICATION_MANIFEST)
SXS_MANIFEST=$(SXS_APPLICATION_MANIFEST)
SXS_MANIFEST_IN_RESOURCES=1
SXS_NO_BINPLACE=1
!if !defined(SXS_ASSEMBLY_NAME)
SXS_ASSEMBLY_NAME=Microsoft.Windows.$(_PROJECT_).$(TARGETNAME)
!endif
!if !defined(SXS_ASSEMBLY_LANGUAGE)
SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1
!endif
# Components get the following defaulted:
# - SXS_ASSEMBLY_NAME=Microsoft.Windows.$(PROJECT).$(TARGETNAME)
# - Language independent
!elseif defined(SXS_COMPONENT_MANIFEST)
SXS_MANIFEST=$(SXS_COMPONENT_MANIFEST)
!if !defined(SXS_ASSEMBLY_NAME)
SXS_ASSEMBLY_NAME=Microsoft.Windows.$(_PROJECT_).$(TARGETNAME)
!endif
!if !defined(SXS_ASSEMBLY_LANGUAGE)
SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1
!endif
!endif
!ifdef VERIFY_SOURCES
!include $(NTMAKEENV)\verify.src
!endif
!if defined(ISOLATION_AWARE_ENABLED)
C_DEFINES=$(C_DEFINES) -DISOLATION_AWARE_ENABLED=1
!endif
#
# NO_BINPLACE implies SXS_NO_BINPLACE
#
!if defined(NO_BINPLACE)
SXS_NO_BINPLACE=1
!endif
#
# Building an .exe implies SXS_NO_BINPLACE.
#
!if "$(TARGETTYPE)" == "PROGRAM"
SXS_NO_BINPLACE=1
!endif
#
# We can build SXS_ASSEMBLY_NAME out of SXS_SHORT_ASSEMBLY_NAME
# and vice versa.
#
!if !defined(SXS_ASSEMBLY_NAME) && defined(SXS_SHORT_ASSEMBLY_NAME)
SXS_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME)
!endif
!if !defined(SXS_SHORT_ASSEMBLY_NAME) && defined(SXS_ASSEMBLY_NAME)
SXS_SHORT_ASSEMBLY_NAME=$(SXS_ASSEMBLY_NAME)
!endif
#
# Support the idea of a hierarchical 8.3 name, besides that this
# transform might be applied after the preceding assignment.
#
# eg: msft-vcrtl => msft\vcrtl
#
# Turn hierarchical names using [-._ ] as the element divider
# into hierarchical file system names. (Note that _ and . are not
# currently allowed in assembly names.)
SXS_SHORT_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME:-=\)
SXS_SHORT_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME:_=\)
SXS_SHORT_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME:.=\)
SXS_SHORT_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME: =\)
# Shorten one special name that is likely to appear in long assembly names.
SXS_SHORT_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME:Microsoft=Msft)
SXS_SHORT_ASSEMBLY_NAME=$(SXS_SHORT_ASSEMBLY_NAME:microsoft=msft)
!if defined(SXS_MANIFEST_IN_RESOURCES) && !defined(SXS_MANIFEST)
!message $(SXS_BUILD_ERROR_MSG) You must specify SXS_MANIFEST if you specify SXS_MANIFEST_IN_RESOURCES.
!endif
!if defined(SXS_ASSEMBLY_VERSION) && !defined(SXS_ASSEMBLY_NAME)
!message $(SXS_BUILD_ERROR_MSG) You may not specify SXS_ASSEMBLY_VERSION without SXS_ASSEMBLY_NAME or SXS_SHORT_ASSEMBLY_NAME.
!endif
!if (defined(SXS_ASSEMBLY_LANGUAGE) || defined(SXS_ASSEMBLY_LANGUAGE_INDEPENDENT)) && !defined(SXS_ASSEMBLY_NAME)
!message $(SXS_BUILD_ERROR_MSG) You may not specify SXS_ASSEMBLY_LANGUAGE or SXS_ASSEMBLY_LANGUAGE_INDEPENDENT without SXS_ASSEMBLY_NAME or SXS_SHORT_ASSEMBLY_NAME.
!endif
!if defined(SXS_BINPLACE_ALSO_ROOT) && !defined(SXS_ASSEMBLY_NAME)
!message $(SXS_BUILD_ERROR_MSG) You may not specify SXS_BINPLACE_ALSO_ROOT without SXS_ASSEMBLY_NAME or SXS_SHORT_ASSEMBLY_NAME.
!endif
!if defined(SXS_ASSEMBLY_NAME) # {
#
# SXS_ASSEMBLY_VERSION may only contain dots and digits.
# Removing them should leave nothing.
#
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_ASSEMBLY_VERSION)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:.=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:0=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:1=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:2=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:3=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:4=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:5=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:6=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:7=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:8=)
SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS=$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS:9=)
!if "$(SXS_CHECK_ASSEMBLY_VERSION_CHARACTERS)" != ""
!message $(SXS_BUILD_ERROR_MSG) SXS_ASSEMBLY_VERSION ($(SXS_ASSEMBLY_VERSION)) may only contain dots and digits.
!endif
#
# ASSERT(SXS_ASSEMBLY_LANGUAGE xor SXS_ASSEMBLY_LANGUAGE_INDEPENDENT)
#
!if (!defined(SXS_ASSEMBLY_LANGUAGE) && !defined(SXS_ASSEMBLY_LANGUAGE_INDEPENDENT)) \
|| ( defined(SXS_ASSEMBLY_LANGUAGE) && defined(SXS_ASSEMBLY_LANGUAGE_INDEPENDENT))
!message $(SXS_BUILD_ERROR_MSG) Must specify SXS_ASSEMBLY_LANGUAGE or SXS_ASSEMBLY_LANGUAGE_INDEPENDENT, not both.
!endif
#
# Derive from SXS_ASSEMBLY_LANGUAGE from SXS_ASSEMBLY_LANGUAGE_INDEPENDENT.
#
!if defined(SXS_ASSEMBLY_LANGUAGE_INDEPENDENT) && !defined(SXS_ASSEMBLY_LANGUAGE)
SXS_ASSEMBLY_LANGUAGE=x-ww
!endif
#
# This is for Fusion stuff only. It does not need to match the nt subsystem version.
#
!if !defined(SXS_ASSEMBLY_VERSION)
SXS_ASSEMBLY_VERSION=5.1
!endif
#
# Clients usually only provide major.minor, and we append .0.0.
#
!if defined(SXS_ASSEMBLY_VERSION) # {
!if !defined(SXS_ASSEMBLY_VERSION_PART_3)
SXS_ASSEMBLY_VERSION_PART_3=0
!endif
!if !defined(SXS_ASSEMBLY_VERSION_PART_4)
SXS_ASSEMBLY_VERSION_PART_4=0
!endif
SXS_ASSEMBLY_VERSION=$(SXS_ASSEMBLY_VERSION).$(SXS_ASSEMBLY_VERSION_PART_3).$(SXS_ASSEMBLY_VERSION_PART_4)
!endif # }
!if !defined(SXS_NO_BINPLACE) # {
#
# We might need SXS_ASSEMBLY_LANGUAGE and even SXS_ASSEMBLY_PROCESSOR_ARCHITECTURE
# in SXS_BINPLACE_DIR, esp. for example if we have any data only assemblies with
# the same name/version as code containing assemblies.
#
# Eventually the mapping from assembly metadata to run-time paths and
# build-time paths will be exposed by sxs.dll/sxs.lib consumed
# by build tools written in C/C++ (possibly just binplace).
# Build/Make are too constraining for our needs.
# For now we get by.
#
# "asms" is very special, it is the root of where assemblies are binplaced
# and it is the root of where they appear on the CD. This string appears in
# a number of places:
# \nt\tools\PostBuildScripts
# \nt\admin\ntsetup\inf\win4\inf\dosnet.inx
# \nt\admin\ntsetup\inf\win4\inf\syssetup.inx
#
SXS_BINPLACE_DIR1=asms
# Remove dots from SXS_ASSEMBLY_VERSION to make it legal 8.3 (only one dot allowed)
# We place version in front of name due to restrictions on how the manifest
# file name related to the name of leaf directory it is in.
SXS_BINPLACE_DIR2=$(SXS_ASSEMBLY_VERSION:.=)\$(SXS_SHORT_ASSEMBLY_NAME)
SXS_BINPLACE_DIR3=$(SXS_BINPLACE_DIR1)\$(SXS_BINPLACE_DIR2)
SXS_BINPLACE_SLASH_DIR3=\$(SXS_BINPLACE_DIR3)
#
# create msms destination directory
#
!if defined(SXS_GENERATE_MERGE_MODULE) # {
#
# if the generate mode is not defined, set it default : 0
#
!if !defined(SXS_MERGE_MODULE_FOR_ASSEMBLY_GROUP)
SXS_MERGE_MODULE_FOR_ASSEMBLY_GROUP=0
!else
SXS_MERGE_MODULE_FOR_ASSEMBLY_GROUP=1
!endif
!if "$(SXS_MERGE_MODULE_GUID)" == "" || "$(SXS_MERGE_MODULE_COMPONENT_GUID)" == "" # {
!error $(SXS_MERGE_MODULE_ERROR_MSG) MergeModule GUID and MergeModule Component must be specified
!endif # }
!if !defined(SXS_MERGE_MODULE) # { use the manifest basename as the msm basename
SXS_MERGE_MODULE=$(SXS_MANIFEST_BASENAME).msm
!endif #}
!if !defined(SXS_MERGE_MODULE_LOCATION)
SXS_MERGE_MODULE_DESTINATION=asm_msm\$(SXS_BINPLACE_DIR2)
!else
#
#parse this string to generate the real path
#
SXS_MERGE_MODULE_LOCATION=$(SXS_ASSEMBLY_VERSION:.=)\$(SXS_MERGE_MODULE_LOCATION)
SXS_MERGE_MODULE_LOCATION=$(SXS_MERGE_MODULE_LOCATION:-=\)
SXS_MERGE_MODULE_LOCATION=$(SXS_MERGE_MODULE_LOCATION:_=\)
SXS_MERGE_MODULE_LOCATION=$(SXS_MERGE_MODULE_LOCATION:.=\)
SXS_MERGE_MODULE_LOCATION=$(SXS_MERGE_MODULE_LOCATION: =\)
SXS_MERGE_MODULE_LOCATION=asm_msm\$(SXS_MERGE_MODULE_LOCATION)
!endif
!endif # }
BINPLACE_GENERATE_PLACEFILE=1
!if "$(BINPLACE_DESTINATIONS)" == ""
BINPLACE_DESTINATIONS=$(SXS_BINPLACE_DIR3)
!else
BINPLACE_DESTINATIONS=$(BINPLACE_DESTINATIONS):$(SXS_BINPLACE_DIR3)
!endif
BINPLACE_DESTINATIONS_NORETAIL=$(BINPLACE_DESTINATIONS)
!if defined(SXS_BINPLACE_ALSO_ROOT)
BINPLACE_DESTINATIONS=$(BINPLACE_DESTINATIONS):retail
!endif
!endif # !SXS_NO_BINPLACE }
#
# Optionally uniquize the .pdb names, so they can go in a flat directory (%_nttree%\symbols.pri\retail\dll)
#
!if !defined(SXS_LONG_PDB_NAME)
SXS_LONG_PDB_NAME=$(SXS_PDB_WOW6432_W_PREFIX)$(SXS_ASSEMBLY_NAME:.=)-$(SXS_ASSEMBLY_VERSION:.=)-$(TARGETNAME:.=)
!endif
!if !defined(SXS_NO_BINPLACE) #{
!if !defined(TARGETPDB) && "$(SXS_USE_LONG_PDB_NAME)" == "1"
LINKER_FLAGS=$(LINKER_FLAGS) -pdb:$(TARGETPATH)\$(TARGET_DIRECTORY)\$(SXS_LONG_PDB_NAME).pdb
!endif
SXS_BINPLACE_FLAGS=-ChangeAsmsToRetailForSymbols
!endif #}
!endif # !SXS_ASSEMBLY_NAME }
!if defined(BINPLACE_LOG) && !defined(NO_SXS_LOG)
!if !defined(NO_BINPLACE) && ("$(TARGETTYPE)" == "NOTARGET" || "$(MAKEDLL)" != "" || "$(BUILD_PASS)" == "PASS2")
SXS_LOG_PASS=1
SXS_LOG_CMD= ( echo. )
!endif
!endif
!if defined(SXS_LOG_PASS) && !defined(APPEND_TOOL)
APPEND_TOOL=appendtool.exe
!endif
!if defined(SXS_MANIFEST) # {
#
# If removing .manifest or .Manifest from SXS_MANIFEST leaves it unchanged,
# it doesn't contain either one and is invalid.
#
!if "$(SXS_MANIFEST:.Manifest=)" == "$(SXS_MANIFEST)" \
&& "$(SXS_MANIFEST:.manifest=)" == "$(SXS_MANIFEST)"
!message $(SXS_BUILD_ERROR_MSG) SXS_MANIFEST ($(SXS_MANIFEST)) must contain ".Manifest", it must end in ".Manifest or ".Manifest-src"
!endif
SXS_MANIFEST_SOURCE_FILENAME=$(SXS_MANIFEST:..\=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_SOURCE_FILENAME)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.manifest-src=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.Manifest-src=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.manifest=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.Manifest=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.man=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.Man=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.man-src=)
SXS_MANIFEST_BASENAME=$(SXS_MANIFEST_BASENAME:.Man-src=)
#
# Always make .man file in the obj directory.
#
SXS_MANIFEST_OBJ1=$(O)\$(SXS_MANIFEST_BASENAME).man
!if !defined(SXS_MANIFEST_IN_RESOURCES)
#
# OBJ is files in obj\i386.
# BIN is binplaced files, possibly also in obj\i386.
#
# The binplaced file must be 8.3.
# The obj\i386 file
# - should allow .exes to be run from obj\i386 that don't have manifest-in-resources
# - not override manifest-in-resources
#
SXS_MANIFEST_BIN_FILENAME=$(SXS_MANIFEST_BASENAME).man
!if !defined(NO_BINPLACE) && !defined(SXS_NO_BINPLACE) && ("$(BUILD_PASS)" == "PASS1" || "$(BUILD_PASS)" == "PASSALL")
SXS_MISCFILES=$(SXS_MISCFILES) $(SXS_MANIFEST_OBJ1)
!endif
# Make a .manifest file identical to the .man file (we just copy it).
!if "$(TARGETTYPE)" != "NOTARGET" && ("$(MAKEDLL)" != "" || "$(BUILD_PASS)" == "PASS2")
SXS_MANIFEST_OBJ2=$(O)\$(TARGETNAME).$(TARGETEXT).manifest
!endif
!else
SXS_MANIFEST_BIN_FILENAME=$(TARGETNAME).$(TARGETEXT)
!if !defined(SXS_MANIFEST_RESOURCE_ID)
!if defined(ISOLATION_AWARE_ENABLED) || "$(TARGETTYPE)" == "DYNLINK"
SXS_MANIFEST_RESOURCE_ID=ISOLATIONAWARE_MANIFEST_RESOURCE_ID
!elseif "$(TARGETTYPE)" == "PROGRAM" || "$(TARGETTYPE)" == "PROGLIB" || "$(TARGETTYPE)" == "UMAPPL_NOLIB"
SXS_MANIFEST_RESOURCE_ID=CREATEPROCESS_MANIFEST_RESOURCE_ID
!endif
!endif
#
# Putting manifests in resources requires no editing of the .rc file.
# We can do this via forceinclude-file or forceinclude-string.
# I thought rc.exe had a forceinclude-file feature like the C++ compiler.
# By the time I realized that it doesn't, it seemed better to press ahead
# with simulating it than not depend on it. There is unlikely any other way
# to support SXS_MANIFEST_IN_RESOURCES without requiring "nonlocal" .rc file
# edits (ie: without further fanning out how many files need to touched in how
# many places by clients who want to build sxs assemblies).
#
RCOPTIONS=-DSXS_MANIFEST_OBJ1="\"$(SXS_MANIFEST_OBJ1:\=/)\"" $(RCOPTIONS)
INCPATHRC=$(INCPATHRC)
RC_FORCE_INCLUDE_STRING=$(RC_FORCE_INCLUDE_STRING)^
^#include "windows.h"^
^/* RT_MANIFEST is in winuser.h and winuser.rh */^
$(SXS_MANIFEST_RESOURCE_ID) RT_MANIFEST SXS_MANIFEST_OBJ1
#RC_FORCE_INCLUDE_FILES=$(RC_FORCE_INCLUDE_FILES);$(BASE_INC_PATH)\SxsManifestInResource.rc2
#RC_FORCE_INCLUDE_STRING=
!endif # SXS_MANIFEST_IN_RESOURCES
!if defined(SXS_LOG_PASS) # {
#
# data for PostBuild/ManifestMangler
#
!if !defined(APPEND_CMD)
APPEND_CMD=$(APPEND_TOOL) -file $(BINPLACE_LOG)-sxs -
!endif
SXS_LOG_CMD= ( $(SXS_LOG_CMD) ) & \
( echo \
SXS_ASSEMBLY_NAME="$(SXS_ASSEMBLY_NAME)" \
SXS_ASSEMBLY_VERSION="$(SXS_ASSEMBLY_VERSION)" \
SXS_ASSEMBLY_LANGUAGE="$(SXS_ASSEMBLY_LANGUAGE)" \
SXS_MANIFEST="$(SXS_LOG_BINPLACE_WOW6432_PREFIX)$(SXS_BINPLACE_DIR3)\$(SXS_MANIFEST_BIN_FILENAME)" \
| $(APPEND_CMD) )
#
# Produce manifest-related, including
# Required: catalog,
# Optional: merge module
#
!if !defined(SXS_NO_BINPLACE) # {
!if 1 #{ begin create log-file-entry for Assembly Catalog
!if !defined(SXS_FUSIONLIST_TXT_DATA_VALIDLANGS)
SXS_FUSIONLIST_TXT_DATA_VALIDLANGS=all
!endif
!if !defined(SXS_FUSIONLIST_TXT_DATA_LANGEXCEPTIONS)
SXS_FUSIONLIST_TXT_DATA_LANGEXCEPTIONS=-
!endif
!if !defined(SXS_FUSIONLIST_TXT_DATA_VALIDARCHS)
SXS_FUSIONLIST_TXT_DATA_VALIDARCHS=all
!endif
!if !defined(SXS_FUSIONLIST_TXT_DATA_VALIDDEBUG)
SXS_FUSIONLIST_TXT_DATA_VALIDDEBUG=all
!endif
#
# Filename ValidLangs Exceptions ValidArchs ValidDebug AltName
#
!if !defined(SXS_FUSIONLIST_TXT_DATA) #{
SXS_FUSIONLIST_TXT_DATA=\
$(SXS_BINPLACE_DIR3)\$(SXS_MANIFEST_BASENAME).cat \
$(SXS_FUSIONLIST_TXT_DATA_VALIDLANGS) \
$(SXS_FUSIONLIST_TXT_DATA_LANGEXCEPTIONS) \
$(SXS_FUSIONLIST_TXT_DATA_VALIDARCHS) \
$(SXS_FUSIONLIST_TXT_DATA_VALIDDEBUG)
!endif #}
!if !defined(SXS_FUSIONLIST_TXT_DATA_WOW) #{
SXS_FUSIONLIST_TXT_DATA_WOW=\
wowbins\$(SXS_LOG_WOWBINS_W_ASMS_PREFIX)$(SXS_BINPLACE_DIR3)\$(SXS_MANIFEST_BASENAME).cat \
$(SXS_FUSIONLIST_TXT_DATA_VALIDLANGS) \
$(SXS_FUSIONLIST_TXT_DATA_LANGEXCEPTIONS) \
ia64 \
$(SXS_FUSIONLIST_TXT_DATA_VALIDDEBUG)
!endif #}
!endif #} end create log-file-entry for Assembly Catalog
!if defined(SXS_GENERATE_MERGE_MODULE) # { begin create log-file-entry for Assembly MergeModule
#
# the msm-log lsitfile is in the format of
# SourceFileDirectory | Destination-MSM-Filename | MergeModuleID | MergeModuleComponent ID
#
!if !defined(SXS_MERGE_MODULE_TXT_DATA) #{
SXS_MERGE_MODULE_TXT_DATA=\
$(SXS_MERGE_MODULE_FOR_ASSEMBLY_GROUP),\
$(SXS_MERGE_MODULE_GUID),\
$(_NTTREE)\$(SXS_MERGE_MODULE_LOCATION)\$(SXS_MERGE_MODULE),\
$(_NTTREE)\$(SXS_BINPLACE_DIR3)\$(SXS_MANIFEST_BASENAME).man,\
$(SXS_MERGE_MODULE_COMPONENT_GUID)
!endif # }
!endif # } end create log-file-entry for Assembly MergeModule
!endif # SXS_NO_BINPLACE }
!endif # SXS_LOG_PASS }
!endif # SXS_MANIFEST }
!if defined(SXS_LOG_PASS) && (defined(SXS_FUSIONLIST_TXT_DATA) || defined(SXS_FUSIONLIST_TXT_DATA_WOW)) # {
# $(COMPUTERNAME) for unique per build machine names in a distributed build environment.
# These files are combined in postbuild.
SXS_NEWPRS_FUSIONLIST_TXT=$(BINPLACE_LOG)\..\fusionlist_$(COMPUTERNAME).txt
!if defined(SXS_FUSIONLIST_TXT_DATA)
SXS_LOG_CMD=( $(SXS_LOG_CMD) ) & ( echo $(SXS_FUSIONLIST_TXT_DATA) | $(APPEND_TOOL) -file $(SXS_NEWPRS_FUSIONLIST_TXT) - )
!endif
!if defined(SXS_FUSIONLIST_TXT_DATA_WOW)
SXS_LOG_CMD=( $(SXS_LOG_CMD) ) & ( echo $(SXS_FUSIONLIST_TXT_DATA_WOW) | $(APPEND_TOOL) -file $(SXS_NEWPRS_FUSIONLIST_TXT) - )
!endif
!endif # }
!if defined(SXS_LOG_PASS) && defined(SXS_MERGE_MODULE_TXT_DATA) # {
SXS_MERGEMODULE_LIST_TXT=$(BINPLACE_LOG)\..\sxsMsmList_$(COMPUTERNAME).txt
!if defined(SXS_MERGE_MODULE_TXT_DATA)
SXS_LOG_CMD=( $(SXS_LOG_CMD) ) & ( echo $(SXS_MERGE_MODULE_TXT_DATA) | $(APPEND_TOOL) -file $(SXS_MERGEMODULE_LIST_TXT) - )
!endif
!endif # }
#
# Do this independently of the presence of any other SXS options
# to aid .manifest preprocessing in the absense of any other sxs build support,
# like for users of CreateActCtx. The MultiRes test case uses this.
#
!if !defined(SXS_PROCESSOR_ARCHITECTURE)
!if defined(SXS_WOW6432)
SXS_PROCESSOR_ARCHITECTURE=wow64
!elseif defined(_BUILDARCH)
SXS_PROCESSOR_ARCHITECTURE=$(_BUILDARCH)
!elseif $(386)
SXS_PROCESSOR_ARCHITECTURE=x86
!elseif $(IA64)
SXS_PROCESSOR_ARCHITECTURE=ia64
!else
!message $(SXS_BUILD_ERROR_MSG) Cannot determine processorArchitecture.
!endif
!endif
# makefile.def debugging support
!if defined(BUILD_DEBUG)
TYPE=rem
NOECHO=
!else
TYPE=@type
NOECHO=@
!endif
!if defined(LOCALIZED_RESOURCES) && !defined(RCCODEPAGE)
! if "$(LANGUAGE)" == "JPN" || "$(LANGUAGE)" == "jpn"
RCCODEPAGE=932
! elseif "$(LANGUAGE)" == "KOR" || "$(LANGUAGE)" == "kor"
RCCODEPAGE=949
! elseif "$(LANGUAGE)" == "CHS" || "$(LANGUAGE)" == "chs"
RCCODEPAGE=936
! elseif "$(LANGUAGE)" == "CHP" || "$(LANGUAGE)" == "chp"
RCCODEPAGE=936
! elseif "$(LANGUAGE)" == "CHT" || "$(LANGUAGE)" == "cht"
RCCODEPAGE=950
! endif
!endif
#
# Set far east specific defines based on the project
#
DO_FE_SB=0
!if "$(ALT_PROJECT_TARGET)" == ""
ALT_PROJECT_TARGET=.
!endif
!if "$(ALT_PROJECT)" == "FE" || \
"$(ALT_PROJECT)" == "CHT" || \
"$(ALT_PROJECT)" == "CHS" || \
"$(ALT_PROJECT)" == "CHP" || \
"$(ALT_PROJECT)" == "JPN" || \
"$(ALT_PROJECT)" == "KOR" || \
"$(ALT_PROJECT)" == "NEC_98"
C_DEFINES=$(C_DEFINES) -DDBCS -DKKBUGFIX
ASM_DEFINES=$(ASM_DEFINES) -DDBCS -DKKBUGFIX
DO_FE_SB=1
!endif
!if "$(ALT_PROJECT)" == "CHT"
C_DEFINES=$(C_DEFINES) -DTAIWAN
ASM_DEFINES=$(ASM_DEFINES) -DTAIWAN
!elseif "$(ALT_PROJECT)" == "CHS" || "$(ALT_PROJECT)" == "CHP"
C_DEFINES=$(C_DEFINES) -DPRC
ASM_DEFINES=$(ASM_DEFINES) -DPRC
!elseif "$(ALT_PROJECT)" == "JPN"
C_DEFINES=$(C_DEFINES) -DJAPAN
ASM_DEFINES=$(ASM_DEFINES) -DJAPAN
!elseif "$(ALT_PROJECT)" == "KOR"
C_DEFINES=$(C_DEFINES) -DKOREA
ASM_DEFINES=$(ASM_DEFINES) -DKOREA
!elseif "$(ALT_PROJECT)" == "NEC_98"
C_DEFINES=$(C_DEFINES) -DJAPAN -DNEC_98
ASM_DEFINES=$(ASM_DEFINES) -DJAPAN -DNEC_98
!elseif "$(ALT_PROJECT)" != ""
C_DEFINES=$(C_DEFINES) -D_$(ALT_PROJECT)_
!endif
!IF "$(ALT_PROJECT)" == "HYDRA"
ASM_DEFINES=$(ASM_DEFINES) -D_HYDRA_
HYDRA=1
!ENDIF
!IF "$(ALT_PROJECT)" == "JANUS"
ASM_DEFINES=$(ASM_DEFINES) -D_JANUS_
C_DEFINES=$(C_DEFINES) -D_JANUS_
JANUS=1
!ENDIF
!IF ("$(NO_W32_SB)" == "" && "$(W32_SB)" == "1")
DO_FE_SB=1
! ENDIF
!IF "$(DO_FE_SB)" == "1"
C_DEFINES=$(C_DEFINES) -DFE_SB -DFE_IME
ASM_DEFINES=$(ASM_DEFINES) -DFE_SB
!ENDIF
!IF "$(ALT_PROJECT)" == "DS"
# Nothing, just -D_DS_ from above
!ENDIF
!ifdef RESOURCE_ONLY_DLL
# Resource only DLL's have no exports, no entrypoint, no code, no data, no debug symbolic.
NTDEBUGTYPE=
NTDEBUG=
LINKER_DBG_SECTION=-debug:NONE
NO_DLL_EXPORTS=1
!undef NTBBT
!undef DLLENTRY
!undef USE_MAPSYM
NO_BROWSER_FILE=1
LINK_NO_RELEASE=1
MAKEDLL=1
TARGETLIBS=
LINKLIBS=
USE_NOLIBS=1
NO_NTDLL=1
!else
LINKER_DBG_SECTION=-debug:FULL
!endif
!ifdef DEPRECATE_DDK_FUNCTIONS
C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS
!endif
!IFNDEF TARGETPATH
! ERROR Your .\sources. file must define the TARGETPATH= macro
!ENDIF
!if "$(TARGETPATH)" == "obj" || "$(TARGETPATH)" == "OBJ"
TARGETPATH=$(_OBJ_DIR)
!endif
!if "$(TARGETPATHLIB)" == "obj" || "$(TARGETPATHLIB)" == "OBJ"
TARGETPATHLIB=$(_OBJ_DIR)
!endif
!ifdef TARGETPATHLIB
! if ("$(TARGETTYPE)" == "DYNLINK") || ("$(TARGETTYPE)" == "EXPORT_DRIVER")
! if "$(MAKEDLL)" == ""
# Pass 1 of a two pass build. Make sure TargetPath is the same as targetpathlib.
NO_BROWSER_FILE=1
TARGETPATH=$(TARGETPATHLIB)
! endif
! endif
!else
TARGETPATHLIB=$(TARGETPATH)
!endif
!IF ("$(TARGETPATH)" == "$(BASEDIR)\lib") || ("$(TARGETPATH)" == "$(BASEDIR)\LIB")
! ERROR Setting TARGETPATH= $(BASEDIR)\lib in .\sources is not valid - please use obj.
!ENDIF
!IFNDEF TARGETTYPE
! ERROR Your .\sources. file must define the TARGETTYPE= macro
!ENDIF
!IFNDEF TARGETNAME
! IF "$(TARGETTYPE)" != "NOTARGET"
! ERROR Your .\sources. file must define the TARGETNAME= macro
! ELSE
TARGETNAME=
! ENDIF
!ENDIF
!IFNDEF SOURCES
! ERROR Your .\sources. file must define the SOURCES= macro
!ENDIF
!if ("$(BUILD_ALT_DIR)" != "" && "$(BUILD_ALT_DIR)" != "d")
! if ("$(UMAPPL:*=X)" != "$(UMAPPL)")
! error Can't use multiple UMAPPL with Alternate Directories (other than "d")
! elseif ("$(UMTEST:*=X)" != "$(UMTEST)")
! error Can't use multiple UMTEST with Alternate Directories (other than "d")
! endif
!endif
!ifndef COFFBASE_TXT_FILE
COFFBASE_TXT_FILE = $(NTMAKEENV)\coffbase.txt
!endif
!IFNDEF UMBASE
! IFDEF COFFBASE
UMBASE=@$(COFFBASE_TXT_FILE),$(COFFBASE)
! ELSE
! if $(WIN64)
# wait for wow64/CreateProcess support
#UMBASE=@$(COFFBASE_TXT_FILE),usermode64
UMBASE=@$(COFFBASE_TXT_FILE),usermode
! else
UMBASE=@$(COFFBASE_TXT_FILE),usermode
! endif
! ENDIF
!ENDIF
LINKLIBS=$(LINKLIBS) $(PERFLIBS)
!if !defined(ATL_VER) || ("$(ATL_VER)" == "10")
ATL_VER=21
!endif
!if defined(USE_ATL)
!ifdef ATL_INC_PATH
ATL_INCLUDES=$(ATL_INC_PATH)\atl$(ATL_VER)
!else
ATL_INCLUDES=$(SDK_INC_PATH)\atl$(ATL_VER)
!endif
ATL_DEFINES=/D_ATL_DLL
! if "$(ATL_VER)" == "10"
ATL_LIBS=
! else
ATL_LIBS=$(SDK_LIB_PATH)\atl.lib $(ADDITIONAL_ATL_LIBS)
! endif
!elseif defined(USE_STATIC_ATL)
!ifdef ATL_INC_PATH
ATL_INCLUDES=$(ATL_INC_PATH)\atl$(ATL_VER)
!else
ATL_INCLUDES=$(SDK_INC_PATH)\atl$(ATL_VER)
!endif
ATL_LIBS=$(ADDITIONAL_ATL_LIBS)
ATL_DEFINES=/D_ATL_STATIC_REGISTRY
!endif
!if !defined(WTL_VER)
WTL_VER=10
!endif
!if defined(USE_WTL)
!ifdef WTL_INC_PATH
WTL_INCLUDES=$(WTL_INC_PATH)\wtl$(WTL_VER)
!else
WTL_INCLUDES=$(SDK_INC_PATH)\wtl$(WTL_VER)
!endif
!endif
!IF DEFINED(USE_MFC) || DEFINED(USE_MFCUNICODE)
!if "$(PLATFORM_MFC_VER)" != "0x0600"
# MFC versions before 6.0 need NT4/Win95 values. Override at your own risk.
!ifndef WIN32_WINNT_VERSION
WIN32_WINNT_VERSION=0x0400
!endif
!ifndef WIN32_IE_VERSION
WIN32_IE_VERSION=0x0300
!endif
!else # MFC post 6x defaults to the current version of IE/Win2k.
!ifndef WIN32_WINNT_VERSION
WIN32_WINNT_VERSION=$(LATEST_WIN32_WINNT_VERSION)
!endif
!ifndef WIN32_IE_VERSION
WIN32_IE_VERSION=$(LATEST_WIN32_IE_VERSION)
!endif
!endif
!ifndef WIN32_WIN95_VERSION
WIN32_WIN95_VERSION=0x0400
!endif
!ifndef WIN32_WCE_VERSION
WIN32_WCE_VERSION=0x0300
!endif
#---------------------------------------------------------#
# this set of defines establishes the "correct" build #
# environment for an app that needs to use MFC. the #
# app's sources file only needs to specify USE_MFC=1 #
# and this makefile will set the enviroment up correctly. #
#---------------------------------------------------------#
! ifndef UMENTRY
! ifdef USE_MFCUNICODE
UMENTRY=wwinmain
! else
UMENTRY=winmain
! endif
! endif
! if "$(TARGETTYPE)" == "DYNLINK" && !defined(RESOURCE_ONLY_DLL)
! ifndef DLLENTRY
DLLENTRY=_DllMainCRTStartup
! endif
! endif
! ifndef UMTYPE
UMTYPE=windows
! endif
UMENTRYABS=
# Allow other MFC's.
# To do so, you need to:
# 1. Define MFC_INCLUDES to point to your MFC headers.
# 2. Define MFC_LIBS to point to your MFC libraries (specifically, the dll
# library)
# 3. Define USE_MSVCRT=1 if you don't want to link with the NT CRT DLL.
#
# Note:
# There is only one type of build (_AFXDLL or MFC in a DLL linking to the
# CRT in a dll).
# You should disable the alternate MFC's if compiling for RISC platforms.
# You need to handle specifying the correct libs for Check/Free and
# Ansi/Unicode.
! if !defined(USE_MSVCRT) && !defined(USE_NOLIBS) && !defined(USE_MSVCRT40)
! if defined(USE_STATIC_MFC)
USE_LIBCMT=1
! else
USE_CRTDLL=1
! endif
! endif
# Add MFC_FLAGS in just in case there's old sources files that use it.
MFC_DEFINES=$(MFC_DEFINES) $(MFC_FLAGS) -D_AFX_NOFORCE_LIBS -D_MFC_VER=$(PLATFORM_MFC_VER)
! ifdef DEBUG_CRTS
MFC_DEFINES=$(MFC_DEFINES) -D_AFX_ENABLE_INLINES
! endif
! IFDEF USE_MFCUNICODE
MFC_DEFINES=$(MFC_DEFINES) -DUNICODE -D_UNICODE
! ENDIF
# Assume Latest MFC (4.0 for now)
! ifndef USE_STATIC_MFC
MFC_DEFINES=$(MFC_DEFINES) -D_AFXDLL
LINKER_FLAGS = $(LINKER_FLAGS) /include:__afxForceSTDAFX
! endif
! ifdef MFC_USRDLL
MFC_DEFINES=$(MFC_DEFINES) -D_USRDLL
LINKER_FLAGS = $(LINKER_FLAGS) /include:__afxForceUSRDLL
! endif
# MFC 4 uses Native EH only
!ifndef USE_NATIVE_EH
USE_NATIVE_EH=1
!endif
USE_RTTI=1
# UNICODE must use the UNICODE entrypoint
! ifdef USE_MFCUNICODE
! if "$(UMENTRY)" == "winmain"
UMENTRY = wwinmain
! else if "$(UMENTRY)" == "main"
UMENTRY = wmain
! endif
! endif
! ifndef MFC_VER
MFC_VER=42
! else if "$(MFC_VER)" == "40" && !defined(USE_STATIC_MFC)
!undef USE_MSVCRT
!undef USE_CRTDLL
USE_MSVCRT40=1
! endif
! ifndef MFC_DAO_INC
MFC_DAO_INC=$(SDK_INC_PATH)\dao350
! endif
! ifndef MFC_INCLUDES
MFC_INCLUDES=$(SDK_INC_PATH)\mfc$(MFC_VER);$(MFC_DAO_INC)
! ifdef MFC_LANGUAGE
MFC_INCLUDES=$(SDK_INC_PATH)\mfc$(MFC_VER)\l.$(MFC_LANGUAGE);$(MFC_INCLUDES)
! endif
! endif
! ifndef MFC_LIBS
! ifdef USE_STATIC_MFC
! ifdef DEBUG_CRTS
! ifdef USE_MFCUNICODE
MFC_STATIC_LIB =
MFC_LIBS=$(SDK_LIB_PATH)\uafxcwd.lib
! else
MFC_STATIC_LIB =
MFC_LIBS=$(SDK_LIB_PATH)\nafxcwd.lib
! endif
! else
! ifdef USE_MFCUNICODE
MFC_STATIC_LIB =
MFC_LIBS=$(SDK_LIB_PATH)\uafxcw.lib
! else
MFC_STATIC_LIB =
MFC_LIBS=$(SDK_LIB_PATH)\nafxcw.lib
! endif
! endif
! else # USE_STATIC_MFC
! ifdef DEBUG_CRTS
! ifdef USE_MFCUNICODE
MFC_STATIC_LIB = $(SDK_LIB_PATH)\mfcs$(MFC_VER)ud.lib
MFC_LIBS=$(SDK_LIB_PATH)\mfc$(MFC_VER)ud.lib \
$(SDK_LIB_PATH)\mfcd$(MFC_VER)ud.lib \
$(SDK_LIB_PATH)\mfcn$(MFC_VER)ud.lib \
$(SDK_LIB_PATH)\mfco$(MFC_VER)ud.lib
! else
MFC_STATIC_LIB = $(SDK_LIB_PATH)\mfcs$(MFC_VER)d.lib
MFC_LIBS=$(SDK_LIB_PATH)\mfc$(MFC_VER)d.lib \
$(SDK_LIB_PATH)\mfcd$(MFC_VER)d.lib \
$(SDK_LIB_PATH)\mfcn$(MFC_VER)d.lib \
$(SDK_LIB_PATH)\mfco$(MFC_VER)d.lib
! endif
! else
! ifdef USE_MFCUNICODE
MFC_STATIC_LIB = $(SDK_LIB_PATH)\mfcs$(MFC_VER)u.lib
MFC_LIBS=$(SDK_LIB_PATH)\mfc$(MFC_VER)u.lib
! else
MFC_STATIC_LIB = $(SDK_LIB_PATH)\mfcs$(MFC_VER).lib
MFC_LIBS=$(SDK_LIB_PATH)\mfc$(MFC_VER).lib
! endif
! endif
MFC_LIBS=$(MFC_STATIC_LIB) $(MFC_LIBS)
! endif # USE_STATIC_MFC
! endif # MFC_LIBS
!endif # USE_MFC
!IFNDEF UMTYPE
!if "$(TARGETTYPE)" == "DYNLINK"
UMTYPE=console
!ifndef SUBSYSTEM_VERSION
SUBSYSTEM_VERSION=$(SUBSYSTEM_VERSION_CURRENT)
!endif
!else
UMTYPE=nt
!endif
!ENDIF
!ifdef USE_MFC30
LIBC_DEFINES=
!else
! ifdef DEBUG_CRTS
DCRT=d
LIBC_DEFINES = -D_DEBUG
! else
DCRT=
LIBC_DEFINES = -DNDEBUG
! endif
!endif
# For all but X86, MSVCRT20==MSVCRT40==CRTDLL==MSVCRT
!if !$(386)
! if defined(USE_MSVCRT20)
USE_MSVCRT=1
! undef USE_MSVCRT20
! elseif defined(USE_MSVCRT40)
USE_MSVCRT=1
! undef USE_MSVCRT40
! elseif defined(USE_CRTDLL)
USE_MSVCRT=1
! undef USE_CRTDLL
! endif
!endif
!if defined(USE_CRTDLL) || defined(USE_MSVCRT)
! if !$(MPPC)
LIBC_LIB=$(CRT_LIB_PATH)\msvcrt$(DCRT).lib
! if defined(USE_IOSTREAM)
LIBC_LIB=$(LIBC_LIB) $(CRT_LIB_PATH)\msvcirt$(DCRT).lib
! endif
! if defined(USE_STL)
LIBC_LIB=$(LIBC_LIB) $(CRT_LIB_PATH)\msvcprt$(DCRT).lib
! endif
LIBC_DEFINES=$(LIBC_DEFINES) -D_DLL=1 -D_MT=1
! endif
!elseif defined(USE_IERT)
! ERROR USE_IERT is no longer supported. Switch to USE_LIBCMT or USE_MSVCRT.
!elseif defined(USE_LIBCMT)
LIBC_LIB=$(CRT_LIB_PATH)\libcmt$(DCRT).lib
! if defined(USE_IOSTREAM)
LIBC_LIB=$(CRT_LIB_PATH)\libcimt$(DCRT).lib $(LIBC_LIB)
! endif
! if defined(USE_STL)
LIBC_LIB=$(CRT_LIB_PATH)\libcpmt$(DCRT).lib $(LIBC_LIB)
! endif
LIBC_DEFINES=$(LIBC_DEFINES) -D_MT=1
!elseif defined(USE_LIBCNTPR)
LIBC_LIB=$(CRT_LIB_PATH)\libcntpr.lib
!elseif (defined(USE_NTDLL) || \
"$(TARGETTYPE)" == "DRIVER" || \
"$(TARGETTYPE)" == "EXPORT_DRIVER" || \
defined(USE_SYSDLL) )
LIBC_DEFINES=$(LIBC_DEFINES) -D_DLL=1
LIBC_LIB=
!elseif defined(USE_NOLIBS) || \
"$(TARGETTYPE)" == "HAL" || \
"$(TARGETTYPE)" == "GDI_DRIVER"
NO_NTDLL=1
LIBC_LIB=
!elseif defined(USE_MSVCRT20)
LIBC_LIB=$(CRT_LIB_PATH)\msvcrt2$(DCRT).lib
LIBC_DEFINES=$(LIBC_DEFINES) -D_DLL=1 -D_MT=1
!elseif defined(USE_MSVCRT40)
LIBC_LIB=$(CRT_LIB_PATH)\msvcrt4$(DCRT).lib
LIBC_DEFINES=$(LIBC_DEFINES) -D_DLL=1 -D_MT=1
!else
LIBC_LIB=$(CRT_LIB_PATH)\libc$(DCRT).lib
! if defined(USE_IOSTREAM)
LIBC_LIB=$(CRT_LIB_PATH)\libci$(DCRT).lib $(LIBC_LIB)
! endif
! if defined(USE_STL)
LIBC_LIB=$(CRT_LIB_PATH)\libcp$(DCRT).lib $(LIBC_LIB)
! endif
!endif
!if defined(USE_VCCOM)
LIBC_LIB = $(SDK_LIB_PATH)\vccomsup.lib $(LIBC_LIB)
!endif
!IFNDEF GPSIZE
GPSIZE= 0
!ENDIF
!ifdef NTLIBPATH
LIBRARY_PATH = $(NTLIBPATH)\*\lib
!else
LIBRARY_PATH = $(SDK_LIB_PATH)
!endif
!if defined(USE_MFC) || defined(USE_MFCUNICODE)
LIBC_LIB = $(MFC_LIBS) $(LIBC_LIB)
!endif
!if defined(USE_ATL) || defined(USE_STATIC_ATL)
LIBC_LIB = $(LIBC_LIB) $(ATL_LIBS)
# Piggy back on MFC_DEFINES for now.
MFC_DEFINES = $(MFC_DEFINES) $(ATL_DEFINES)
!endif
!if $(386) && defined(USE_MSLU)
# MSLU goes after MFC/ATL/CRT but before everything else
LIBC_LIB = $(LIBC_LIB) $(SDK_LIB_PATH)\unicows.lib
!endif
NT_LIBS=$(LIBRARY_PATH)\ntdll.lib
GUI32_LIBS=$(LIBRARY_PATH)\gdi32.lib \
$(LIBRARY_PATH)\user32.lib
NT_CRT=$(LIBRARY_PATH)\nt.lib
WIN32_LIBS=$(LIBC_LIB) \
$(LIBRARY_PATH)\advapi32.lib \
$(LIBRARY_PATH)\kernel32.lib
NTSS_LIBS=$(NT_LIBS) $(NT_CRT) $(BASE_LIB_PATH)\smdll.lib
OS2_LIBS=$(NT_LIBS) $(SDK_LIB_PATH)\os2dll.lib
!if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
# Building a WDM driver. Default the subsystem version to the DDK version # (currently 1.0)
! ifndef SUBSYSTEM_VERSION
SUBSYSTEM_VERSION=1.10
! endif
!endif
!ifndef SUBSYSTEM_VERSION
! ifndef EXPECTED_WINVER
SUBSYSTEM_WINVER = ,4.00
! else
SUBSYSTEM_WINVER = ,$(EXPECTED_WINVER)
! endif
SUBSYSTEM_CONVER = ,4.00
SUBSYSTEM_OS2VER =
SUBSYSTEM_NATVER =,$(SUBSYSTEM_VERSION_LATEST)
!else
SUBSYSTEM_WINVER = ,$(SUBSYSTEM_VERSION)
SUBSYSTEM_CONVER = ,$(SUBSYSTEM_VERSION)
SUBSYSTEM_OS2VER = ,$(SUBSYSTEM_VERSION)
SUBSYSTEM_NATVER = ,$(SUBSYSTEM_VERSION)
# Set the appropriate default WIN32_xxxxx values
! if "$(SUBSYSTEM_VERSION)" == "4.00"
! ifndef WIN32_WINNT_VERSION
WIN32_WINNT_VERSION=0x0400
! endif
! ifndef WIN32_WIN95_VERSION
WIN32_WIN95_VERSION=0x0400
! endif
! ifndef WIN32_WCE_VERSION
WIN32_WCE_VERSION=0x0400
! endif
! ifndef WIN32_IE_VERSION
WIN32_IE_VERSION=0x0300
! endif
! elseif "$(SUBSYSTEM_VERSION)" == "3.51"
! ifndef WIN32_WINNT_VERSION
WIN32_WINNT_VERSION=0x0351
! endif
! ifndef WIN32_WIN95_VERSION
WIN32_WIN95_VERSION=0x0300
! endif
! ifndef WIN32_WCE_VERSION
WIN32_WCE_VERSION=0x0300
! endif
! ifndef WIN32_IE_VERSION
WIN32_IE_VERSION=0x0200
! endif
! ifndef WINVER_VERSION
WINVER_VERSION=0x0400 # Special case - WINVER was 4.00 for NT 3.51
! endif
! elseif "$(SUBSYSTEM_VERSION)" == "3.50"
! ifndef WIN32_WINNT_VERSION
WIN32_WINNT_VERSION=0x0350
! endif
! ifndef WIN32_WIN95_VERSION
WIN32_WIN95_VERSION=0x0300
! endif
! ifndef WIN32_WCE_VERSION
WIN32_WCE_VERSION=0x0300
! endif
! ifndef WIN32_IE_VERSION
WIN32_IE_VERSION=0x0100
! endif
! ifndef WINVER_VERSION
WINVER_VERSION=0x0400 # Special case - WINVER was 4.00 for NT 3.50
! endif
! endif
!endif
CRT_INCLUDES=$(CRT_INC_PATH)
!ifdef USE_IOSTREAM
CRT_INCLUDES=$(CRT_INCLUDES);$(IOSTREAMS_INC_PATH)
!endif
!ifdef USE_STL
CRT_INCLUDES=$(CRT_INCLUDES);$(STL6_INC_PATH)
!endif
!IF "$(UMTYPE)" == "nt"
SUBSYSTEM=native$(SUBSYSTEM_NATVER)
UMINCL=$(CRT_INCLUDES)
STD_CALL_ENTRY=1
UMENTRY=-entry:NtProcessStartup
UMLIBS=$(UMLIBS) $(NT_LIBS) $(NT_CRT)
NOT_TERMINAL_SERVER_AWARE=1
!ELSEIF "$(UMTYPE)" == "windows"
SUBSYSTEM=windows$(SUBSYSTEM_WINVER)
UMINCL=$(CRT_INCLUDES)
! IF "$(UMENTRY)" == "winmain"
UMENTRY=-entry:WinMainCRTStartup
! ELSEIF "$(UMENTRY)" == "wwinmain"
UMENTRY=-entry:wWinMainCRTStartup
! ELSEIF "$(UMENTRY)" == "wmain"
UMENTRY=-entry:wmainCRTStartup
! ELSEIF "$(UMENTRYABS)" == ""
UMENTRY=-entry:mainCRTStartup
! ELSE
UMENTRY=-entry:$(UMENTRYABS)
! ENDIF
UMLIBS=$(UMLIBS) $(WIN32_LIBS) $(GUI32_LIBS)
!ELSEIF "$(UMTYPE)" == "console"
SUBSYSTEM=console$(SUBSYSTEM_CONVER)
UMINCL=$(CRT_INCLUDES)
! IF "$(UMENTRY)" == "winmain"
UMENTRY=-entry:WinMainCRTStartup
! ELSEIF "$(UMENTRY)" == "wwinmain"
UMENTRY=-entry:wWinMainCRTStartup
! ELSEIF "$(UMENTRY)" == "wmain"
UMENTRY=-entry:wmainCRTStartup
! ELSEIF "$(UMENTRYABS)" == ""
UMENTRY=-entry:mainCRTStartup
! ELSE
UMENTRY=-entry:$(UMENTRYABS)
! ENDIF
!IF !$(MPPC)
UMLIBS=$(UMLIBS) $(WIN32_LIBS)
!ENDIF
!ELSEIF "$(UMTYPE)" == "ntss"
SUBSYSTEM=native$(SUBSYSTEM_NATVER)
UMINCL=$(CRT_INCLUDES)
STD_CALL_ENTRY=1
UMENTRY=-entry:NtProcessStartup
NOT_TERMINAL_SERVER_AWARE=1
!IF !$(MPPC)
UMLIBS=$(UMLIBS) $(NTSS_LIBS)
!ENDIF
!ELSEIF "$(UMTYPE)" == "os2"
SUBSYSTEM=os2$(SUBSYSTEM_OS2VER)
UMINCL=$(SDK_INC_PATH)\os2;$(CRT_INCLUDES)
STD_CALL_ENTRY=1
UMENTRY=-entry:NtProcessStartup
NOT_TERMINAL_SERVER_AWARE=1
UMLIBS=$(UMLIBS) $(OS2_LIBS)
!ELSE
! ERROR Invalid UMTYPE value - $(UMTYPE)
!ENDIF # UMTYPE tests
#
# If you edit this line you need to modify $(BASEDIR)\sdktools\build\build.c
#
NTINCLUDES=$(OAK_INC_PATH);$(SDK_INC_PATH)
#
# Let drivers include files such as ntddk.h.
# WDM drivers\libs can only include wdm.h type of files though ...
# DDK_INC_PATH must be first for precedence.
#
!IF "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
NTINCLUDES=$(NTINCLUDES);$(WDM_INC_PATH)
!ELSEIF "$(DRIVERTYPE)" == "fs" || "$(DRIVERTYPE)" == "FS"
NTINCLUDES=$(NTINCLUDES);$(DDK_INC_PATH);$(IFSKIT_INC_PATH)
!ELSEIF "$(TARGETTYPE)" == "DRIVER" || \
"$(TARGETTYPE)" == "EXPORT_DRIVER" || \
"$(TARGETTYPE)" == "MINIPORT" || \
"$(TARGETTYPE)" == "DRIVER_LIBRARY"
NTINCLUDES=$(NTINCLUDES);$(DDK_INC_PATH);$(WDM_INC_PATH)
!ENDIF
!IFNDEF CBSTRING
! IF "$(MAJORCOMP)" == "ntos" || \
"$(MAJORCOMP)" == "NTOS" || \
"$(TARGETTYPE)" == "DRIVER" || \
"$(TARGETTYPE)" == "DRIVER_LIBRARY" || \
"$(TARGETTYPE)" == "GDI_DRIVER" || \
"$(TARGETTYPE)" == "HAL" || \
"$(TARGETTYPE)" == "EXPORT_DRIVER" || \
"$(TARGETTYPE)" == "MINIPORT"
! IF "$(DRIVERTYPE)" != "VXD"
CBSTRING= -cbstring
! ENDIF
! ELSE
CBSTRING=
! ENDIF
!ENDIF
!if "$(TARGETTYPE)" == "DRIVER_LIBRARY"
TARGETTYPE=LIBRARY
!endif
#
# Add PROJECT_INC_PATH to NTINCLUDES, if NO_PRIVATE_INC is not set
#
!IFDEF PROJECT_INC_PATH
! IFNDEF NO_PRIVATE_INC
NTINCLUDES=$(PROJECT_ROOT)\inc;$(PROJECT_ROOT)\inc\$(O);$(PROJECT_INC_PATH);$(NTINCLUDES)
! ENDIF
!ENDIF
NTINCLUDES=$(O);$(NTINCLUDES)
!IFDEF INCLUDES_FROM
! IF [process-includes-from $(INCLUDES_FROM) >__makefile.def.tmp]
! ENDIF
! INCLUDE __makefile.def.tmp
! IF [del __makefile.def.tmp >nul 2>nul]
! ENDIF
!ENDIF
!IFDEF LIBS_FROM
! IF [process-libs-from $(LIBS_FROM) >__makefile.def.tmp]
! ENDIF
! INCLUDE __makefile.def.tmp
! IF [del __makefile.def.tmp >nul 2>nul]
! ENDIF
!ENDIF
!if "$(POCKETPC)" == ""
!IFNDEF COMPILER_WARNINGS
COMPILER_WARNINGS=-FI$(SDK_INC_PATH)\warning.h $(PROJECT_COMPILER_WARNINGS)
!ifdef USE_LINT
LINT_FORCEDINCS=$(LINT_FORCEDINCS) -header($(SDK_INC_PATH)\warning.h)
!endif
!ENDIF
!endif
# If you change this to 600, fix MIDL_OPTIMIZATION default below.
!ifndef WIN32_WINNT_VERSION
WIN32_WINNT_VERSION=$(LATEST_WIN32_WINNT_VERSION)
!endif
!ifndef WIN32_WIN95_VERSION
WIN32_WIN95_VERSION=$(LATEST_WIN32_WIN95_VERSION)
!endif
!ifndef WIN32_WCE_VERSION
WIN32_WCE_VERSION=$(LATEST_WIN32_WCE_VERSION)
!endif
!ifndef WIN32_IE_VERSION
WIN32_IE_VERSION=$(LATEST_WIN32_IE_VERSION)
!endif
!ifndef WINVER_VERSION
!if defined(CHICAGO_PRODUCT)
WINVER_VERSION=$(WIN32_WIN95_VERSION)
!elseif defined(POCKETPC)
WINVER_VERSION=$(WIN32_WCE_VERSION)
!else
WINVER_VERSION=$(WIN32_WINNT_VERSION)
!endif
!endif
!ifdef UNDEF_WINVER
_WINVER_VERSION=/UWINVER
!else
_WINVER_VERSION=/DWINVER=$(WINVER_VERSION)
!endif
!IF defined(POCKETPC)
NO_NTDLL=1
! IFNDEF WIN32_DEFINE
WIN32_DEFINE=-DWIN32=300 -D_WIN32_WCE=$(WIN32_WCE_VERSION) $(_WINVER_VERSION)
! if "$(POCKETPC_EMULATION)" != ""
WIN32_DEFINE = $(WIN32_DEFINE) -D_WIN32_WCE_EMULATION
! endif
! ENDIF
!ELSEIF defined(CHICAGO_PRODUCT)
NO_NTDLL=1
! IFNDEF WIN32_DEFINE
WIN32_DEFINE=-DWIN32=200 -D_CHICAGO_=200 -D_WIN32_WINDOWS=$(WIN32_WIN95_VERSION) $(_WINVER_VERSION)
! ENDIF
!ELSEIF $(MPPC)
! IFNDEF MAC_INCLUDES
MAC_INCLUDES=$(BASEDIR)\com\macdcom\dll\src\inc
MAC_INCLUDES=$(MAC_INCLUDES); $(SDK_INC_PATH)\mppc
MAC_INCLUDES=$(MAC_INCLUDES); $(SDK_INC_PATH)
MAC_INCLUDES=$(MAC_INCLUDES); $(SDK_INC_PATH)\mppc\macos
MAC_INCLUDES=$(MAC_INCLUDES); $(SDK_INC_PATH)\mppc\mrc
! ENDIF
NTINCLUDES= $(MAC_INCLUDES);$(NTINCLUDES)
NO_NTDLL=1
WIN32_DEFINE=-DPOWERMAC=1
!ELSE
WIN32_DEFINE=-DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=$(WIN32_WINNT_VERSION) $(_WINVER_VERSION)
!ENDIF
WIN32_DEFINE = $(WIN32_DEFINE) -D_WIN32_IE=$(WIN32_IE_VERSION)
INCLUDES = $(INCLUDES: =)
NTINCLUDES = $(NTINCLUDES: =)
UMINCL = $(UMINCL: =)
MFC_INCLUDES = $(MFC_INCLUDES: =)
USER_INCLUDES =$(USER_INCLUDES: =)
ATL_INCLUDES = $(ATL_INCLUDES: =)
WTL_INCLUDES = $(WTL_INCLUDES: =)
# MFC, ATL, WTL, and USER first
INCPATH0=-I$(MFC_INCLUDES:;= -I) -I$(ATL_INCLUDES:;= -I) -I$(WTL_INCLUDES:;= -I) -I$(USER_INCLUDES:;= -I)
INCPATH1=-I$(MFC_INCLUDES:;= -I) -I$(ATL_INCLUDES:;= -I) -I$(WTL_INCLUDES:;= -I) -I$(USER_INCLUDES:;= -I)
# INCLUDES if set
!ifdef INCLUDES
INCPATH0 = $(INCPATH0) -I$(INCLUDES:;= -I)
INCPATH1 = $(INCPATH1) -I$(INCLUDES:;= -I)
!endif
# Finally NT and UM
INCPATH0=$(INCPATH0) -I$(NTINCLUDES:;= -I) -I$(UMINCL:;= -I)
INCPATH1=$(INCPATH1) -I$(NTINCLUDES:;= -I) -I$(UMINCL:;= -I)
# Remove empty "-I " settings (INCL/NTINCLUDES/UMINCL/MFC_INCLUDES macros may be empty above)
INCPATH0=$(INCPATH0:-I =)
INCPATH1=$(INCPATH1:-I =)
!ifdef USE_LINT
LINT_INCLUDES=-i$(TARGET_DIRECTORY)\ -i. $(LINT_PRECOMPPATH) $(INCPATH1:-I=-i)
!endif
!IFNDEF DLLENTRY
DLLENTRY=-noentry
!ELSE
! if "$(DLLENTRY:-entry:=)" == "$(DLLENTRY)"
DLLENTRY=-entry:$(DLLENTRY)
! endif
!ENDIF
!IF $(MPPC)
DLLENTRY=-noentry
!ENDIF
!IFNDEF DLLBASE
! IFDEF COFFBASE
DLLBASE=@$(COFFBASE_TXT_FILE),$(COFFBASE)
! ELSE
DLLBASE=@$(COFFBASE_TXT_FILE),$(TARGETNAME)
! ENDIF
!ENDIF
!IFNDEF DLLDEF
DLLDEF=$(@B).def
!ENDIF
!IFNDEF BOOTBASE
! IFDEF FRAZZLE
BOOTBASE=0xd0100000,0xd0104000
! ELSE
BOOTBASE=0xd0ff0000,0xd0ff4000
! ENDIF
!ENDIF
!IFNDEF DRIVERBASE
DRIVERBASE=0x10000
!ENDIF
!IFNDEF HALBASE
HALBASE=0x80010000
!ENDIF
#
# Generate a macro file to include for managed code basing else default
#
!IF !defined(GENBASEMAC_CMD)
GENBASEMAC_CMD=$(_NTBINDIR)\tools\genbasemac.pl
!ENDIF
!if (defined(MANAGED_CODE) || defined(MANAGED_VB))
! if "$(GENBASEMAC_CMD)"!=""
! if !exist($(GENBASEMAC_CMD))
! message NMAKE : Uxxxx: unable to find $(GENBASEMAC_CMD)
! endif
! message BUILD: $(GENBASEMAC_CMD) $(O) $(TARGETNAME) $(COFFBASE_TXT_FILE)
! IF ([-perl $(GENBASEMAC_CMD) $(O) $(TARGETNAME) $(COFFBASE_TXT_FILE)])
! ENDIF
! IF EXIST( $(O)\coffbase.mac )
! INCLUDE $(O)\coffbase.mac
! ELSE
MANAGED_COFFBASE=0x400000
! ENDIF
! endif
!ENDIF
#
# Map lower case to upper case for variables that can be specified from the
# command line.
#
!IFDEF nttest
NTTEST=$(nttest)
!ENDIF
!IFDEF makedll
MAKEDLL=$(makedll)
!ENDIF
!IFDEF umtest
UMTEST=$(umtest)
!ENDIF
#
# Build up list of referenced modules for
# c# compiler
#
!if "$(REFERENCES)" != ""
!IF $(386)
REFERENCES=$(REFERENCES:*=I386)
!ELSEIF $(IA64)
REFERENCES=$(REFERENCES:*=IA64)
!elseif $(AMD64)
REFERENCES=$(REFERENCES:*=AMD64)
!endif
REFERENCES=$(REFERENCES: =)
MANAGED_REFERENCES=/r:$(REFERENCES:;= /r:)
!endif
#
# Include the list of object files (defined as the OBJECTS macro) that was
# built by BUILD program, using the SOURCES= macro defined in the sources.
# file. Use macro substitution to build the supported target objects.
#
!if !exist($(_OBJ_DIR)\_objects.mac)
!if [-build -O]
!endif
!endif
!if "$(BINPLACE_LOG)" != ""
!if [-mkdir $(BINPLACE_LOG)\.. > nul 2>&1]
!endif
!endif
!INCLUDE $(_OBJ_DIR)\_objects.mac
!IF $(386)
OBJECTS=$(386_OBJECTS)
DLLLIBOBJECTS=$(DLLLIBOBJECTS) $(386_DLLLIBOBJECTS)
!ELSEIF $(MPPC)
OBJECTS=$(MPPC_OBJECTS)
DLLLIBOBJECTS=$(DLLLIBOBJECTS) $(MPPC_DLLLIBOBJECTS)
!ELSEIF $(IA64)
OBJECTS=$(IA64_OBJECTS)
DLLLIBOBJECTS=$(DLLLIBOBJECTS) $(IA64_DLLLIBOBJECTS)
!ELSEIF $(AMD64)
OBJECTS=$(AMD64_OBJECTS)
DLLLIBOBJECTS=$(DLLLIBOBJECTS) $(AMD64_DLLLIBOBJECTS)
!ELSEIF $(ARM)
OBJECTS=$(ARM_OBJECTS)
DLLLIBOBJECTS=$(DLLLIBOBJECTS) $(ARM_DLLLIBOBJECTS)
!ENDIF
!ifdef MAC_RESOURCE
MAC_RESOURCE_OBJECT=$(_OBJ_DIR)\$(TARGET_DIRECTORY)\$(MAC_RESOURCE:.r=.rsc)
OBJECTS=$(OBJECTS) $(MAC_RESOURCE_OBJECT)
!endif
#
# BUILD.EXE defines the NOLINK variable to disable the building of any
# test executables when it is recursing on a dirs. file to build components
# in subdirectories.
#
!IF "$(BUILDMSG)" != "Stop."
! IFDEF NOLINK
! UNDEF NTTEST
! UNDEF MAKEDLL
! ELSE
! IFDEF nolink
! UNDEF NTTEST
! UNDEF MAKEDLL
! ENDIF
! ENDIF # DEF NOLINK
!ENDIF # BUILDMSG != "Stop."
!IF (!defined(MANAGED_CODE) && !defined(MANAGED_VB))
DYNLINK_LIB=$(TARGETPATHLIB)\$(TARGET_DIRECTORY)\$(TARGETNAME).lib
DYNLINK_LIBDIR=$(ALT_PROJECT_TARGET)\$(TARGET_DIRECTORY)\$(TARGETNAME).lib
!ENDIF
!IF "$(TARGETNAMEP)" != ""
DYNLINK_LIBP=$(TARGETPATHLIB)\$(TARGET_DIRECTORY)\$(TARGETNAMEP).lib
DYNLINK_LIBPDIR=$(ALT_PROJECT_TARGET)\$(TARGET_DIRECTORY)\$(TARGETNAMEP).lib
!ENDIF
!IF !$(MPPC)
DYNLINK_EXP=$(TARGETPATHLIB)\$(TARGET_DIRECTORY)\$(TARGETNAME).exp
!ENDIF
#
# Determine type of target link we are doing
#
!IF "$(TARGETTYPE)" == "PROGLIB"
! IF "$(TARGETEXT)" == ""
TARGETEXT=exe
!endif
TARGETLIB=
!ELSEIF "$(TARGETTYPE)" == "PROGRAM"
! IF "$(TARGETEXT)" == ""
TARGETEXT=exe
!endif
!ifdef USE_NTDLL
TARGETLIB=$(SDK_LIB_PATH)\ntdll.lib
!else
TARGETLIB=
!endif
!ELSEIF "$(TARGETTYPE)" == "DYNLINK"
!if (defined(MANAGED_CODE) || defined(MANAGED_VB))
REFERENCE_DIR=$(PROJECT_ROOT)\Reference\$(TARGET_DIRECTORY)
!IF "$(SERVICEBASE)" == ""
SERVICEBASE=http://localhost
!ENDIF
MAKEDLL=1
!ENDIF
! IF "$(MAKEDLL)" != ""
! IF "$(TARGETNAME)" == "ntdll"
TARGETLIB=
! ELSEIF defined (USE_NTDLL) # USE_NTDLL never links with LIBC_LIB
TARGETLIB=$(WIN32DLL_LIBS) $(SDK_LIB_PATH)\ntdll.lib
! ELSEIF defined (USE_SYSDLL) # USE_SYSDLL uses either kernel32 (Win95) or ntdll (NT) for CRT support
! if defined(CHICAGO_PRODUCT)
TARGETLIB=$(WIN32DLL_LIBS) $(SDK_LIB_PATH)\kernel32.lib
! else
TARGETLIB=$(WIN32DLL_LIBS) $(SDK_LIB_PATH)\ntdll.lib
! endif
! ELSEIF defined (NO_NTDLL) # NO_NTDLL never links with ntdll
TARGETLIB=$(WIN32DLL_LIBS) $(LIBC_LIB)
! ELSE # Everything else uses ntdll after libc.
TARGETLIB=$(WIN32DLL_LIBS) $(LIBC_LIB) $(SDK_LIB_PATH)\ntdll.lib
! ENDIF
! IF "$(TARGETEXT)" == ""
TARGETEXT=dll
! ENDIF
! ELSE # "$(MAKEDLL)" != ""
TARGETEXT=lib
TARGETLIB=
! ENDIF # "$(MAKEDLL)" != ""
!ELSEIF "$(TARGETTYPE)" == "LIBRARY"
TARGETEXT=lib
TARGETLIB=
!ELSEIF "$(TARGETTYPE)" == "DRIVER"
TARGETEXT=sys
!if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
TARGETLIB=$(DDK_LIB_PATH)\wdm.lib
!ELSEIF "$(DRIVERTYPE)" == "VXD"
TARGETEXT=vxd
!ELSE
TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib $(DDK_LIB_PATH)\hal.lib $(DDK_LIB_PATH)\wmilib.lib
!ENDIF
!ELSEIF "$(TARGETTYPE)" == "EXPORT_DRIVER"
! IF "$(MAKEDLL)" != ""
TARGETEXT=sys
!if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
TARGETLIB=$(DDK_LIB_PATH)\wdm.lib
!ELSE
TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib $(DDK_LIB_PATH)\hal.lib $(DDK_LIB_PATH)\wmilib.lib
!ENDIF
! ELSE
TARGETEXT=lib
TARGETLIB=
! ENDIF
!ELSEIF "$(TARGETTYPE)" == "HAL"
! IF "$(MAKEDLL)" != ""
TARGETEXT=dll
TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib
! ELSE
TARGETEXT=lib
TARGETLIB=
! ENDIF
!ELSEIF "$(TARGETTYPE)" == "MINIPORT"
TARGETEXT=sys
!ELSEIF "$(TARGETTYPE)" == "GDI_DRIVER"
TARGETEXT=dll
TARGETLIB=$(DDK_LIB_PATH)\win32k.lib
!ifdef USE_LIBCNTPR_FOR_GDI_DRIVER_CRTS
TARGETLIB=$(SDK_LIB_PATH)\libcntpr.lib $(TARGETLIB)
!endif
!ENDIF # TARGETTYPE
TARGET=
!ifdef NOLIB
!undef NTTARGETFILE1
!endif
!IF "$(TARGETTYPE)" != "UMAPPL_NOLIB" && !defined(NOLIB)
! IF "$(OBJECTS)" != ""
TARGET=$(TARGETPATH)\*\$(TARGETNAME).$(TARGETEXT)
! ELSEIF "$(OBJLIBFILES)" != "" && "$(TARGETTYPE)" == "LIBRARY"
TARGET=$(TARGETPATH)\*\$(TARGETNAME).$(TARGETEXT)
! ENDIF
!ENDIF # TARGETTYPE != UMAPPL_NOLIB
!IFDEF NOTARGETLIB
TARGETLIB=
!ENDIF
!IFNDEF MACHINE_TARGETLIBS
MACHINE_TARGETLIBS=$(TARGETLIB) $(TARGETLIBS)
!ENDIF
!if (!defined(MANAGED_CODE) && !defined(MANAGED_VB))
TARGETOBJFILES=$(TARGETOBJFILES) $(OBJECTS)
!ENDIF
!IF "$(NOLINK)" == "" || \
("$(NOLINK)" != "" && ("$(TARGETTYPE)"=="LIBRARY" || \
( ("$(TARGETTYPE)"=="DYNLINK" || \
"$(TARGETTYPE)"=="PROGLIB" || \
"$(TARGETTYPE)"=="EXPORT_DRIVER" || \
"$(TARGETTYPE)"=="HAL") && \
"$(MAKEDLL)" == "") \
) \
)
! IF "$(NOLINK)" != "" && "$(TARGET)" != ""
! ifndef NO_DLL_EXPORTS
TARGETLIBFILES=$(TARGETLIBFILES) $(TARGETPATH)\*\$(TARGETNAME).lib
! endif
! ELSE
TARGETEXEFILES=$(TARGETEXEFILES) $(TARGET)
! ENDIF
!ENDIF # NOLINK == "" || building .lib file for dll
!IF "$(NTTEST)" != ""
TARGETOBJFILES=$(TARGETOBJFILES) $(O)\$(NTTEST).obj
! IFNDEF NOLINK
TARGETEXEFILES=$(TARGETEXEFILES) $(O)\$(NTTEST).exe
! ENDIF # NDEF NOLINK
!ENDIF # NTTEST != ""
UMOBJFILES=
UMEXEFILES=
!IF "$(UMAPPLEXT)" == ""
UMAPPLEXT=.exe
!ENDIF
!IF "$(UMAPPL)" != ""
UMOBJFILES=obj\*\$(UMAPPL:*=.obj obj\*\).obj
! IF "$(UMAPPLEXT)" == ".com"
! IFNDEF NOLINK
UMEXEFILES=obj\*\$(UMAPPL:*=.com obj\*\).com
! ENDIF
! ELSEIF "$(UMAPPLEXT)" == ".exe"
! IFNDEF NOLINK
UMEXEFILES=obj\*\$(UMAPPL:*=.exe obj\*\).exe
! ENDIF
! ELSEIF "$(UMAPPLEXT)" == ".scr"
! IFNDEF NOLINK
UMEXEFILES=obj\*\$(UMAPPL:*=.scr obj\*\).scr
! ENDIF
! ELSE
! ERROR Unsupport UMAPPLEXT = $(UMAPPLEXT)
! ENDIF # UMAPPLEXT
!ENDIF # UMAPPL != ""
!IF "$(UMTEST)" != ""
UMOBJFILES=$(UMOBJFILES) obj\*\$(UMTEST:*=.obj obj\*\).obj
! IFNDEF NOLINK
UMEXEFILES=$(UMEXEFILES) obj\*\$(UMTEST:*=.exe obj\*\).exe
! ENDIF
!ENDIF
!if "$(BUILD_ALT_DIR)" == "d"
UMOBJFILES=$(UMOBJFILES:obj\*\=objd\*\)
UMEXEFILES=$(UMEXEFILES:obj\*\=objd\*\)
!endif
!IFDEF USE_LINT
! IFNDEF LINT_OUTPUT
LINT_OUTPUT=$(TARGETNAME)
! ENDIF
! IFNDEF LINT_EXT
LINT_EXT=tmp
! ENDIF
! IF "$(LINT_TYPE)" == "all"
TARGETLOBFILES1=
TARGETLOBFILES2=$(O)\$(LINT_OUTPUT).$(LINT_EXT)
! ELSEIF "$(LINT_TYPE)" == "lob"
TARGETLOBFILES1=$(TARGETOBJFILES:.obj=.lob)
TARGETLOBFILES2=
! ELSE
TARGETLOBFILES1=
TARGETLOBFILES2=$(TARGETOBJFILES:.obj=.lob)
! ENDIF
!ELSE
TARGETLOBFILES1=
TARGETLOBFILES2=
!ENDIF
#
# Define NT_UP as 0 in environment to turn on MP.
# If undefined or equal to 1, you get UP.
#
!IFNDEF NT_UP
NT_UP=1
!ENDIF
!IF "$(NT_UP)"=="0"
NT_UP_DEFINES=
!ELSE
NT_UP_DEFINES=-DNT_UP=1
!ENDIF
!IFNDEF NT_INST
NT_INST=0
!ENDIF
#
# User defined variables (environment variables or command line).
# A cpu specific definition will take precedence over the MSC definition.
#
# xxx_WARNING_LEVEL
# xxx_OPTIMIZATION
# xxx_CPPFLAGS
#
!IFNDEF MSC_WARNING_LEVEL
MSC_WARNING_LEVEL=/W3
!ENDIF
DEFAULT_MSC_OPT = /Oxs
#
# End of user defined variables.
#
STD_DEFINES=-DCONDITION_HANDLING=1 $(NT_UP_DEFINES) \
-DNT_INST=$(NT_INST) $(WIN32_DEFINE) $(NT_PNP_POWER_DEFINES) \
$(NT_PNP_STUB_DEFINES)
!IFNDEF NOT_LEAN_AND_MEAN
STD_DEFINES = $(STD_DEFINES) -DWIN32_LEAN_AND_MEAN=1
!ENDIF
!IF "$(NTDEBUG)" == ""
TARGET_DBG_DEFINES= -DDEVL=1
DBGFLAGS=
!ELSEIF "$(NTDEBUG)" == "ntsdnodbg"
DBGFLAGS= /Zi
TARGET_DBG_DEFINES= -DDEVL=1
!ELSEIF "$(NTDEBUG)" == "ntsd" || "$(NTDEBUG)" == "cvp" || "$(NTDEBUG)" == "sym"
DBGFLAGS=/Zi
TARGET_DBG_DEFINES= -DDBG=1 -DDEVL=1
!ELSE
! ERROR NTDEBUG macro can be either "ntsd", "cvp" or "sym" or "ntsdnodbg"
!ENDIF
!ifdef OFFICIAL_BUILD_MACHINE
TARGET_DBG_DEFINES=$(TARGET_DBG_DEFINES) -DOFFICIAL_BUILD=1
!endif
!ifndef __BUILDMACHINE__
__BUILDMACHINE__=$(USERNAME: =)
!endif
!if exist ($(BASEDIR)\__blddate__)
!include $(BASEDIR)\__blddate__
!endif
TARGET_DBG_DEFINES=$(TARGET_DBG_DEFINES)\
!ifdef BUILDDATE
-D__BUILDDATE__=$(BUILDDATE)\
!endif
-D__BUILDMACHINE__=$(__BUILDMACHINE__)
!IF "$(PRECOMPILED_OPTION)" == ""
! IF "$(PRECOMPILED_INCLUDE)" != ""
! IF "$(PRECOMPILED_INCLUDE)" != "$(PRECOMPILED_INCLUDE:.hxx=)"
PRECOMPILED_CXX=1
! ENDIF
! IF "$(PRECOMPILED_INCLUDE)" != "$(PRECOMPILED_INCLUDE:.hpp=)"
PRECOMPILED_CXX=1
! ENDIF
! IF "$(PRECOMPILED_INCLUDE)" != "$(PRECOMPILED_INCLUDE:.cxx=)"
PRECOMPILED_CXX=1
! ENDIF
! IF "$(PRECOMPILED_INCLUDE)" != "$(PRECOMPILED_INCLUDE:.cpp=)"
PRECOMPILED_CXX=1
! ENDIF
! IF "$(PRECOMPILED_PCH)" == ""
PRECOMPILED_PCH=$(PRECOMPILED_INCLUDE:.hxx=.pch)
PRECOMPILED_PCH=$(PRECOMPILED_PCH:.hpp=.pch)
PRECOMPILED_PCH=$(PRECOMPILED_PCH:.h=.pch)
PRECOMPILED_PCH=$(PRECOMPILED_PCH:.cxx=.pch)
PRECOMPILED_PCH=$(PRECOMPILED_PCH:.cpp=.pch)
PRECOMPILED_PCH=$(PRECOMPILED_PCH:.c=.pch)
PRECOMPILED_PCH=$(PRECOMPILED_PCH:..\=)
! ENDIF
! IF "$(PRECOMPILED_OBJ)" == ""
PRECOMPILED_OBJ=$(PRECOMPILED_PCH:.pch=.obj)
! ENDIF
! ENDIF
!ENDIF
!IF "$(PRECOMPILED_OPTION)" == ""
! IF "$(PRECOMPILED_INCLUDE)" != ""
! IF "$(PRECOMPILED_PCH)" != ""
HEADERFILE=/Fp$(O)\$(PRECOMPILED_PCH)
! ENDIF
! IF "$(PRECOMPILED_OBJ)" != ""
HEADEROBJNAME=$(O)\$(PRECOMPILED_OBJ)
HEADEROBJ=/Fo"$(MAKEDIR)\$(HEADEROBJNAME)"
! ENDIF
! IF !$(MPPC)
! IF "$(PRECOMPILED_CXX)" == ""
PRECOMPILED=/Yu$(PRECOMPILED_INCLUDE:..\=) $(HEADERFILE)
PRECOMPILED_CXX=
! ELSE
PRECOMPILED=
PRECOMPILED_CXX=/Yu$(PRECOMPILED_INCLUDE:..\=) $(HEADERFILE)
! ENDIF
! ENDIF
PRECOMPILED_TARGET=$(O)\$(PRECOMPILED_PCH)
! ELSE
PRECOMPILED=
PRECOMPILED_CXX=
! ENDIF
!ELSE
! IF "$(PRECOMPILED_CXX)" == ""
PRECOMPILED=$(PRECOMPILED_OPTION)
PRECOMPILED_CXX=
! ELSE
PRECOMPILED=
PRECOMPILED_CXX=$(PRECOMPILED_OPTION)
! ENDIF
PRECOMPILED_TARGET=$(PRECOMPILED_TARGET)
! IF "$(PRECOMPILED_TARGET)" != ""
HEADERFILE=/Fp$(PRECOMPILED_TARGET)
! ENDIF
! IF "$(PRECOMPILED_OBJ)" != ""
HEADEROBJNAME=$(PRECOMPILED_OBJ)
HEADEROBJ=/Fo$(HEADEROBJNAME)
! ENDIF
!ENDIF
!IF "$(NTNOPCH)" != ""
# Need to do this conditionally. If the pch obj exists, it's likely existing files
# reference it (ie: this isn't a clean build). Keep the file ref but delete the
# pch stuff so links will work.
!ifdef HEADEROBJNAME
!if !exist($(HEADEROBJNAME))
HEADEROBJNAME=
HEADEROBJ=
PRECOMPILED_OBJ=
!endif
!endif
PRECOMPILED=
PRECOMPILED_CXX=
PRECOMPILED_INCLUDE=
PRECOMPILED_TARGET=
PRECOMPILED_PCH=
!ENDIF
USECXX_FLAG=$(USECXX_FLAG:p=P)
!IF ("$(PRECOMPILED_CXX)" == "") && ("$(USECXX_FLAG)" == "")
PRECOMPILED_FLAG=$(PRECOMPILED_FLAG) /Tc
!ELSE
PRECOMPILED_FLAG=$(PRECOMPILED_FLAG) /Tp
!ENDIF
#
# Set linker options
#
#
# Merge _PAGE with PAGE, _TEXT with .text, and make sure
# INIT sections are discardable
#
!if !$(MPPC)
!ifdef LINKER_NOREF
LINK_REF_FLAG=-OPT:NOREF -OPT:NOICF
!else
! ifdef LINKER_NOICF
LINK_REF_FLAG=-OPT:REF -OPT:NOICF
! else
LINK_REF_FLAG=-OPT:REF -OPT:ICF
! endif
!endif
!endif
!ifdef NOT_TERMINAL_SERVER_AWARE
TSLINKER_FLAG=
!else
! if $(_NT_TOOLS_VERSION) >= 0x700
TSLINKER_FLAG=/tsaware
! else
TSLINKER_FLAG=
! endif
!endif
DEFAULT_LINK_LIB_IGNORE=4010,4037,4039,4065,4070,4078,4087,4089,4198,4221
!ifdef LINK_LIB_IGNORE
LINK_LIB_IGNORE_FLAG=-IGNORE:$(LINK_LIB_IGNORE),$(DEFAULT_LINK_LIB_IGNORE)
!else
LINK_LIB_IGNORE_FLAG=-IGNORE:$(DEFAULT_LINK_LIB_IGNORE)
!endif
!IF $(IA64)
LINK_LIB_IGNORE_FLAG= $(LINK_LIB_IGNORE_FLAG),4108,4088,4218
!ENDIF
!if defined(LINK_TIME_CODE_GENERATION) && !defined(FORCENATIVEOBJECT)
# 4218: non-native module found; restarting link with /LTCG
# 4235: /LTCG specified but no code generation required; remove /LTCG from the link command line to improve linker performance
LINK_LIB_IGNORE_FLAG= $(LINK_LIB_IGNORE_FLAG),4218,4235
!endif
!ifdef LINK_NO_RELEASE
LINK_RELEASE=
!else
LINK_RELEASE=/release
!endif
!ifdef USE_INCREMENTAL_LINKING
LINK_INCREMENTAL_FLAG = -OPT:NOREF \
$(LINK_LIB_IGNORE_FLAG)
!else
LINK_INCREMENTAL_FLAG = $(LINK_REF_FLAG) \
$(LINK_LIB_IGNORE_FLAG) \
-INCREMENTAL:NO \
-FULLBUILD \
$(LINK_RELEASE)
!endif
!ifdef BACKGROUND_USE
LINKER_FLAGS = $(LINKER_FLAGS) -WS:aggressive
!endif
!ifdef LARGE_ADDRESS_AWARE
LINKER_FLAGS = $(LINKER_FLAGS) -LARGEADDRESSAWARE
!endif
LINK_TIME_CODE_GENERATION_LINKER_FLAGS=
!if defined(LINK_TIME_CODE_GENERATION) && !defined(FORCENATIVEOBJECT)
# If NTPOGO_TARGENAME is defined, a package is generated in
# $(_NTTREE)\POGO\$(NTPOGO_TARGETNAME) that contains all of
# files necessary to build a POGO instrumented/optimized binary.
# pgi.cmd and pgo.cmd are generated to do the PGI and PGO builds.
!if defined(NTPOGO_TARGETNAME)
NTPOGO_TARGETDIR=$(_NTTREE)\POGO\$(NTPOGO_TARGETNAME)
!if [rmdir /s /q $(NTPOGO_TARGETDIR)]
!endif
!if [-mkdir $(NTPOGO_TARGETDIR) > nul 2>&1]
!endif
# Profiling has to be turned off for POGO.
!if [@echo findstr -i -v -r "[-/^]order:@" link.rsp ^> pogo.rsp > $(NTPOGO_TARGETDIR)\pgi.cmd]
!endif
!if [@echo findstr -i -v -r "[-/^]order:@" link.rsp ^> pogo.rsp > $(NTPOGO_TARGETDIR)\pgo.cmd]
!endif
# Delete any zero sized pdb (/linkrepro may put one there).
!if [@echo @for /f "tokens=4,5" %%i in ('dir /-C *.pdb') do @if 0 equ %%i del %%j >> $(NTPOGO_TARGETDIR)\pgi.cmd]
!endif
!if [@echo @for /f "tokens=4,5" %%i in ('dir /-C *.pdb') do @if 0 equ %%i del %%j >> $(NTPOGO_TARGETDIR)\pgo.cmd]
!endif
# Kernel?
!if ("$(MAJORCOMP)" == "ntos" || "$(MAJORCOMP)" == "NTOS") && \
("$(MINORCOMP)" == "init" || "$(MINORCOMP)" == "INIT")
!if [@copy $(ENDUSER_LIB_PATH)\pogortntos.lib $(NTPOGO_TARGETDIR)]
!endif
!if [@echo link @pogo.rsp -ltcg:PGI pogortntos.lib -d2:-PogoNtoskrnl >> $(NTPOGO_TARGETDIR)\pgi.cmd]
!endif
!if [@echo link @pogo.rsp -ltcg:PGO -d2:-PogoNtoskrnl >> $(NTPOGO_TARGETDIR)\pgo.cmd]
!endif
# Driver?
!elseif (("$(TARGETTYPE)" == "DRIVER") || ("$(TARGETTYPE)" == "EXPORT_DRIVER"))
!if [@copy $(ENDUSER_LIB_PATH)\pogortsys.lib $(NTPOGO_TARGETDIR)]
!endif
!if [@echo link @pogo.rsp -ltcg:PGI pogortsys.lib -d2:-PogoKmode >> $(NTPOGO_TARGETDIR)\pgi.cmd]
!endif
!if [@echo link @pogo.rsp -ltcg:PGO -d2:-PogoKmode >> $(NTPOGO_TARGETDIR)\pgo.cmd]
!endif
# Neither kernel or driver?
!else
!if [@copy $(ENDUSER_LIB_PATH)\pogort.lib $(NTPOGO_TARGETDIR)]
!endif
!if [@echo link @pogo.rsp -ltcg:PGI pogort.lib >> $(NTPOGO_TARGETDIR)\pgi.cmd]
!endif
!if [@echo link @pogo.rsp -ltcg:PGO >> $(NTPOGO_TARGETDIR)\pgo.cmd]
!endif
!endif
LINKER_FLAGS=$(LINKER_FLAGS) -linkrepro:$(NTPOGO_TARGETDIR)
!endif
LINK_TIME_CODE_GENERATION_LINKER_FLAGS=-ltcg
LINKER_FLAGS=$(LINKER_FLAGS) $(LINK_TIME_CODE_GENERATION_LINKER_FLAGS)
!endif
!if $(MPPC)
LINKER_FLAGS = $(LINKER_FLAGS) \
-SECTION:INIT,d \
$(LINK_INCREMENTAL_FLAG) \
-NODEFAULTLIB
!else
LINKER_FLAGS = $(LINKER_FLAGS) \
-MERGE:_PAGE=PAGE \
-MERGE:_TEXT=.text \
-SECTION:INIT,d \
$(LINK_INCREMENTAL_FLAG) \
-NODEFAULTLIB
!endif
LINKER_FLAGS=$(LINKER_FLAGS) $(LINKER_WARNING_SWITCH)
!ifndef LINKER_APP_VERSION
LINKER_APP_VERSION=5.1
!endif
LINK_OS_VERSIONS = -version:$(LINKER_APP_VERSION) -osversion:5.1
!IF $(MPPC)
#*****MacPPC linker flags
TARGET_DIRECTORY=mppc
UMLIBS=$(UMLIBS:*=mppc)
LINKLIBS=$(LINKLIBS:*=mppc)
DLLDEF=$(DLLDEF:*=mppc)
PRECOMPILED_TARGET= $(PRECOMPILED_TARGET:*=mppc)
PRECOMPILED_OBJ= $(PRECOMPILED_OBJ:*=mppc)
PRECOMPILED_OPTION= $(PRECOMPILED_OPTION:*=mppc)
#
# Set the default creator and type. If were building a dll then use
# cfmg and shlb, for apps use ???? and APPL.
#
!ifndef MAC_CREATOR
!if "$(TARGETTYPE)" == "DYNLINK"
MAC_CREATOR=cfmg
!else
MAC_CREATOR=????
!endif
!endif
!ifndef MAC_TYPE
!if "$(TARGETTYPE)" == "DYNLINK"
MAC_TYPE=shlb
!else
MAC_TYPE=APPL
!endif
!endif
#
# MAC_CREATOR and MAC_TYPE may contain embedded spaces. To do this we need to
# enclose their operand in quotes. Now get rid of the quotes leaving the spaces
#
MAC_CREATOR=$(MAC_CREATOR:^"=)
MAC_TYPE=$(MAC_TYPE:^"=)
#
# Setup for the linker
#
!if "$(TARGETTYPE)"=="DYNLINK"
LINKER_FLAGS=$(LINKER_FLAGS) -mac:nobundle -dll -def:$(DLLDEF)
LINKER_FLAGS=$(LINKER_FLAGS) -mac:MFILEPAD
LINKER_FLAGS=$(LINKER_FLAGS) -mac:init="$(MAC_INITPROC)"
LINKER_FLAGS=$(LINKER_FLAGS) -mac:term="$(MAC_TERMPROC)"
!else
LINKER_FLAGS=-mac:bundle
!endif
LINKER_FLAGS=$(LINKER_FLAGS) -mac:type="$(MAC_TYPE)"
LINKER_FLAGS=$(LINKER_FLAGS) -mac:creator="$(MAC_CREATOR)"
LINKER_FLAGS=$(LINKER_FLAGS) -debug:FULL
LINKER_FLAGS=$(LINKER_FLAGS) -debugtype:both
LINKER_FLAGS=$(LINKER_FLAGS) -NODEFAULTLIB
#*****End Mac linker flags
!ELSE
LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) -debugtype:cv $(LINK_OS_VERSIONS)
!ENDIF
LIBRARIAN_FLAGS = $(LINK_LIB_IGNORE_FLAG) $(LIBRARIAN_FLAGS) $(LINKER_WARNING_SWITCH) -nodefaultlib
LIBRARIAN_FLAGS = $(LIBRARIAN_FLAGS) -machine:$(MACHINE_TYPE)
LINK_TIME_CODE_GENERATION_LIBRARIAN_FLAGS =
!if defined(LINK_TIME_CODE_GENERATION) && !defined(FORCENATIVEOBJECT)
LINK_TIME_CODE_GENERATION_LIBRARIAN_FLAGS = -ltcg
LIBRARIAN_FLAGS = $(LIBRARIAN_FLAGS) $(LINK_TIME_CODE_GENERATION_LIBRARIAN_FLAGS)
!endif
!ifndef LIB_NAME
LIB_NAME=lib
!endif
LIBRARIAN=$(LIB_NAME) -out:$@ $(LIBRARIAN_FLAGS)
!ifndef LINK_NAME
LINK_NAME=link
!endif
LINKER=$(LINK_NAME) -out:$@ -machine:$(MACHINE_TYPE)
!if defined(NTPROFILEINPUT) && ("$(TARGETTYPE)" == "LIBRARY")
! message NTPROFILEINPUT s/b removed in: $(MAKEDIR).
!endif
!IF defined(NTPROFILEINPUT) || defined(EXEPROFILEINPUT)
ORDER=-order:@$(@B).prf
!ENDIF
!IFDEF DLLORDER
ORDER=-order:@$(DLLORDER)
!ENDIF
!IFNDEF DRIVER_ALIGNMENT
DRIVER_ALIGNMENT=0x80
!ENDIF
!ifndef HAL_ALIGNMENT
HAL_ALIGNMENT=0x80
!endif
!ifndef KERNEL_ALIGNMENT
KERNEL_ALIGNMENT=0x80
!endif
#
# [GorN] 3/30/2000
#
# WPP section (WMI tracing preprocessor)
#
# env. vars:
#
# RUN_WPP=list of files to run wpp on
# WPP_REVISION=override default revision
#
!if !defined(WPP_REVISION)
WPP_REVISION=rev1
!endif
!if !defined(WPP_NAME)
WPP_NAME=tracewpp.exe
!endif
!if $(ANSI_ANNOTATION)
WPP_MAKEFILE_FLAGS=-DWPP_ANSI_ANNOTATION
!endif
!if defined(RUN_WPP)
RUN_WPP=$(WPP_MAKEFILE_FLAGS) -cfgdir:$(WPP_CONFIG_PATH)\$(WPP_REVISION) -odir:$(O) $(RUN_WPP)
# execute wpp now
! if [-$(WPP_NAME) $(RUN_WPP)]
! endif
! if exist(obj\_tracewpp.mac)
! include obj\_tracewpp.mac
WPP_TARGETS=$(WPP_EXTRA_TARGETS)
! endif
BINPLACE_FLAGS = $(BINPLACE_FLAGS) -:TMF
C_DEFINES=$(C_DEFINES) -DRUN_WPP
!else
WPP_TARGETS=
!endif
#
# LINT section
#
# Main env. vars:
# USE_LINT=1 to turn on PC-lint processing
# LINT_TYPE={all,lob,<nothing>}
# all - processes all $(SOURCES) files at once
# lob - processes $(SOURCES) individually and then consolidates
# <nothing> - processes $(SOURCES) individually (like John Daly's tool)
#
# Other env. vars:
# LINT_PATH=path to PC-lint directory (default=$(BASEDIR)\lint)
# LINT_APP=name of PC-lint executable (default=lint-nt)
# LINT_OUTPUT=base name of lint output file (default=$(TARGETNAME))
# LINT_EXT=extension of output files (default=tmp)
# LINT_FORCEDINCS=list of forced include files. same as in -FI compiler switch
# LINT_OPTS=options passed to PC-lint (default=+v -zero)
# LINT_PRECOMPPATH=paths that were used for precompiled header.
# - some components generate a pch in
# a separate step and use the pch amongst several
# subdirs. This env. var. lets one specify the
# include paths used for the pch.
#
!ifdef USE_LINT
# Convert CDEFINES which may contain /DSYMBOL1, -DSYMBOL2 to
# -dSYMBOL1 and -dSYMBOL2 which PC-Lint wants
LINT_DEFS=$(CDEFINES:-D=-d)
LINT_DEFINES=$(LINT_DEFS:/D=-d)
! ifndef LINT_PATH
LINT_PATH=$(BASEDIR)\lint
! endif
! ifndef LINT_APP
LINT_APP=$(LINT_PATH)\lint-nt
! endif
!ifndef LINT_OPTS
LINT_OPTS=+v -zero
!endif
! if "$(LINT_TYPE)" == "all"
! ifndef LINT_ALL_CMD
LINT_ALL_CMD=$(LINT_APP) $(LINT_OPTS) $(LINT_INCLUDES) $(LINT_DEFINES) $(LINT_FORCEDINCS) -i$(LINT_PATH)\ std.lnt -os($(O)\$(LINT_OUTPUT).$(LINT_EXT))
! endif
! else
! if "$(LINT_TYPE)" == "lob"
! ifndef LINT_CMD
LINT_CMD=$(LINT_APP) -u $(LINT_OPTS) $(LINT_INCLUDES) $(LINT_DEFINES) $(LINT_FORCEDINCS) -i$(LINT_PATH)\ std.lnt +os($(O)\$(LINT_OUTPUT).$(LINT_EXT)) -oo($@)
! endif
! ifndef LINT_CMD2
LINT_CMD2=$(LINT_APP) $(LINT_OPTS) -i$(LINT_PATH)\ std.lnt +os($(O)\$(LINT_OUTPUT).$(LINT_EXT)) $(O)\*.lob
! endif
! else
! ifndef LINT_CMD
LINT_CMD=$(LINT_APP) $(LINT_OPTS) $(LINT_INCLUDES) $(LINT_DEFINES) $(LINT_FORCEDINCS) -i$(LINT_PATH)\ std.lnt +os($(O)\$(LINT_OUTPUT).$(LINT_EXT))
! endif
! endif
! endif
!else
LINT_CMD2=
!endif
!ifndef LINT_CMD2
LINT_CMD2=
!endif
#
# Standard inference rules for C files that produce object files.
#
.SUFFIXES: .asm .asmx .c .class .cs .cxx .cpp .exe .f .java .obj .odl .p .rc .rcpp .res .s .sdl .tdl .thk .vb
#
# Processor specific control and options.
#
DRIVER_ENTRY=DriverEntry
GDI_DRIVER_ENTRY=DrvEnableDriver
!include $(TARGET_DIRECTORY)mk.inc
!ifndef LINKER_STACKSIZE
!ifdef LINKER_STACKCOMMITSIZE
LINKER_STACKSIZE = -STACK:$(DEFAULT_STACKRESERVE),$(LINKER_STACKCOMMITSIZE)
!else
LINKER_STACKSIZE = -STACK:$(DEFAULT_STACKRESERVE),$(DEFAULT_STACKCOMMIT)
!endif
!endif
LINKER_STACKSIZE_DLL=-STACK:0x100000,0x1000 LINKER_STACKSIZE_DLL=-STACK:0x40000,0x1000
!if defined(USE_MAPSYM) && !defined(NO_MAPSYM)
MAPSYM_CMD = mapsym -o $(@D)\$(@B).sym $(@D)\$(@B).map
LINKER_FLAGS=$(LINKER_FLAGS) -map
BINPLACE_FLAGS = $(BINPLACE_FLAGS) -W
!else
MAPSYM_CMD =
!endif
# @@BEGIN_DDKSPLIT
!if defined(_NTTREE) && defined(NO_PDB_PATHS)
LINKER_FLAGS = $(LINKER_FLAGS) -PDBPATH:NONE
!endif
# @@END_DDKSPLIT
LIBRARY_OBJS=$(IMPLIB_OBJS) $(MFC_STATIC_LIB) $(LINKLIBS) $(OBJECTS)
!if "$(TARGETTYPE)" != "DRIVER" && \
"$(TARGETTYPE)" != "EXPORT_DRIVER" && \
"$(TARGETTYPE)" != "MINIPORT" && \
"$(TARGETTYPE)" != "GDI_DRIVER"
LINKER_FLAGS = $(LINKER_FLAGS) -merge:.rdata=.text
!endif
!if $(DELAYLOAD_SUPPORTED)
! if "$(DELAYLOAD)" != ""
! if "$(DLOAD_ERROR_HANDLER)" != ""
! if "$(DLOAD_ERROR_HANDLER)" == "KERNEL32" || \
"$(DLOAD_ERROR_HANDLER)" == "kernel32.dll" || \
"$(DLOAD_ERROR_HANDLER)" == "KERNEL32.DLL" || \
"$(DLOAD_ERROR_HANDLER)" == "Kernel32.DLL" || \
"$(DLOAD_ERROR_HANDLER)" == "Kernel32.dll"
DLOAD_ERROR_HANDLER = kernel32
! endif
! if "$(DLOAD_FORCE_ERROR_CHECK)" != ""
# force delayload checking as if this module used kernel32 as its error handler
BINPLACE_FLAGS = -dl $(TARGETNAME).$(TARGETEXT),FORCE $(BINPLACE_FLAGS)
! else
BINPLACE_FLAGS = -dl $(TARGETNAME).$(TARGETEXT),$(DLOAD_ERROR_HANDLER) $(BINPLACE_FLAGS)
! endif
! else
! if "$(NOLINK)" == ""
! message BUILDMSG: Warning: DLOAD_ERROR_HANDLER not specified in $(MAKEDIR)
! endif
! endif
! if "$(DLOAD_ERROR_HANDLER)" == "kernel32"
CRTLIBS=$(CRTLIBS) $(BASE_LIB_PATH)\kernel32dloadhandler.lib
TARGETLIBS = $(TARGETLIBS) $(SDK_LIB_PATH)\kernl32p.lib
! else
CRTLIBS=$(CRTLIBS) $(SDK_LIB_PATH)\delayload.lib
! endif
DELAYLOAD = $(DELAYLOAD: =)
DELAYLOAD_FLAGS = /delayload:$(DELAYLOAD:;= /delayload:)
! ifdef DELAYLOAD_UNLOAD_SUPPORT
DELAYLOAD_FLAGS = $(DELAYLOAD_FLAGS) /delay:unload
! endif
LINKER_FLAGS = $(LINKER_FLAGS) $(DELAYLOAD_FLAGS)
C_DEFINES=$(C_DEFINES) /DDELAYLOAD_VERSION=$(DELAYLOAD_VERSION)
! endif
!endif
#
# Clear the suffixes list so we can ensure only pass zero stuff will be built
#
!IFDEF PASS0ONLY
.SUFFIXES:
!ENDIF
# @@BEGIN_DDKSPLIT
#
# DDK does not allow signing of binaries or SCP
#
!ifdef NT_SIGNCODE
!ifdef NT_CERTHASH
SIGNCODE_CMD=signcode -sha1 $(NT_CERTHASH) -n "Microsoft Windows 2000 Test Signature" -i "http://ntbld" $@
!else
SIGNCODE_CMD=signcode -v $(_NTBINDIR)\tools\driver.pvk -spc $(_NTBINDIR)\tools\driver.spc -n "Microsoft Windows 2000 Test Signature" -i "http://ntbld" $@
!endif
!ifdef SIGNTOOL_SIGN
SIGNCODE_CMD=signtool sign /q $(SIGNTOOL_SIGN) $@
!endif
!endif
# SCP is ms internal
!if $(SCP_SUPPORTED)
! if defined(SCP_ENABLED) && defined(SCP_CONFIGFILE)
SCP_CMD=vsp21.exe $@ /F=$(SCP_CONFIGFILE)
! else
SCP_CMD=
! endif
!else
SCP_CMD=
!endif
# @@END_DDKSPLIT
DRIVER_SWITCH = -driver
!if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
DRIVER_SWITCH = $(DRIVER_SWITCH) -driver:wdm
!else if "$(DRIVERTYPE)" == "VXD"
DRIVER_SWITCH = -vxd $(SDK_LIB_DEST)\i386\vxdwraps.clb
!endif
!ifdef BINARY_PUBLISH_DIR
! ifndef BINARY_PUBLISH_FILES
! error Must define BINARY_PUBLISH_FILES if defining BINARY_PUBLISH_DIR
! endif
BINARY_PUBLISH_ROOT=$(BASEDIR)\$(_PROJECT_)\$(PROJECT_BINDROP_DIR)
BINARY_PUBLISH_ROOT=$(BINARY_PUBLISH_ROOT)\$(BINARY_PUBLISH_DIR)
BINARY_PUBLISH_ROOT=$(BINARY_PUBLISH_ROOT)\$(TARGET_DIRECTORY)\$(BUILD_TYPE)
!endif
!if defined(BINARY_PUBLISH) || defined(BINARY_PUBLISH_DIR) || !defined(_NTTREE)
#
# since we're generating binary drops of this source there's no need to
# binplace the files. The files should be binplaced from the binary_release
# directory.
#
NO_BINPLACE=1
!endif
!ifdef NO_BINPLACE
BINPLACE_CMD=echo Skip Binplace:
BINPLACE_FLAGS=
!else
! ifndef BINPLACE_PLACEFILE
! if defined(BINPLACE_GENERATE_PLACEFILE)
BINPLACE_PLACEFILE = $(O)\placefil.txt
! elseif "$(BUILD_PRODUCT)" == "IE"
BINPLACE_PLACEFILE = $(BINPLACE_PLACEFILE_DIR)\ieplace.txt
! else
BINPLACE_PLACEFILE = $(BINPLACE_PLACEFILE_DIR)\placefil.txt
! endif
! endif
! ifdef BINPLACE_GENERATE_PLACEFILE
MAKE_PLACEFILE_CMD=for %i in ($(SXS_MISCFILES) $(TARGET)) do echo %~nxi $(BINPLACE_DESTINATIONS) >> $(BINPLACE_PLACEFILE)
! if defined(SXS_LOG_PASS) && defined(SXS_ASSEMBLY_NAME) && "$(TARGETTYPE)" != "NOTARGET"
MAKE_PLACEFILE_CMD=( $(MAKE_PLACEFILE_CMD) ) && ( for /f "delims=:" %i in ('echo $(BINPLACE_DESTINATIONS_NORETAIL)') do for %j in ($(TARGET)) do echo %i\%~nxj | $(APPEND_TOOL) -file $(BINPLACE_LOG)\..\symbolcd_cablists_asms_$(COMPUTERNAME).lst - )
! endif
! ifdef BINPLACE_ADDITIONAL_PLACEFILES
#
# BINPLACE_ADDITIONAL_PLACEFILES is a semicolon delimited list of additional placefiles.
# The last parameter is the output (which we also use as an input, so we repeat it).
#
MAKE_PLACEFILE_CMD=( $(MAKE_PLACEFILE_CMD) ) && ( merge_placefiles $(BINPLACE_ADDITIONAL_PLACEFILES:;= ) $(BINPLACE_PLACEFILE) $(BINPLACE_PLACEFILE) )
!endif
!else
MAKE_PLACEFILE_CMD=echo.
! endif
BINPLACE_FLAGS = -P $(BINPLACE_PLACEFILE) $(BINPLACE_FLAGS) $(SXS_BINPLACE_FLAGS)
! if "$(BUILD_PRODUCT)" == "NT" && !defined(COFF_OUTPUT_ONLY) && !defined(INTL_BLD)
BINPLACE_FLAGS = -:DBG -j $(BINPLACE_FLAGS)
! endif
_NTTREE= $(_NTTREE)\$(ALT_PROJECT_TARGET)
# If NTDBGFILES is defined then use binplace to split the symbols.
# Define BINPLACE flags as needed if separate .DBG file requested.
! IFDEF NTDBGFILES
BINPLACE_DBGFLAGS_NT = -S $(_NTTREE)\Symbols
! ifdef NTDBGFILES_PRIVATE
BINPLACE_DBGFLAGS_NT = $(BINPLACE_DBGFLAGS_NT) -n $(_NTTREE)\Symbols.pri
! endif
! else
BINPLACE_DBGFLAGS_NT=
! ENDIF
! if "$(VERIFY_LC)" == "1"
! ifndef LC_PATH
LC_PATH=.
! endif
BINPLACE_LC_FLAGS = -G $(LC_PATH)\$(@F).lc
BINPLACE_LC_MISCFLAGS = -G $(LC_PATH)\$(**F).lc
! else
BINPLACE_LC_FLAGS=
BINPLACE_LC_MISCFLAGS=
! endif
BINPLACE_FLAGS=-R $(_NTTREE) $(BINPLACE_DBGFLAGS_NT) $(BINPLACE_FLAGS)
BINPLACE_TOOL=@binplace
BINPLACE_CMD = $(BINPLACE_TOOL) $(BINPLACE_FLAGS) $(BINPLACE_LC_FLAGS) $@
!endif
BINPLACE_CMD_NT=$(BINPLACE_CMD)
!ifdef NTDUMPAMAP
MAPDUMP_CMD = link -dump -map $@ | sort /R /+62 > $(_NTDUMPAMAP)\$(@B).srt
!else
MAPDUMP_CMD =
!endif
#
# Define this macro so including make files can supply a yes prompt
# as appropriate. Put the "yes." file in a visible place for OEM's
# so they can make too.
#
!IFNDEF NOPASS0
#
# Pass Zero Inference Rules: IDL files (MIDL) and MC files
#
.SUFFIXES: .h .idl .mc .odl .tdl .asn .thk .mof
! IF $(386)
PASS0_OBJECTS=$(PASS0_386_OBJECTS)
! ELSEIF $(MPPC)
PASS0_OBJECTS=$(PASS0_MPPC_OBJECTS)
! ELSEIF $(IA64)
PASS0_OBJECTS=$(PASS0_IA64_OBJECTS)
! ELSEIF $(AMD64)
PASS0_OBJECTS=$(PASS0_AMD64_OBJECTS)
! ELSEIF $(ARM)
PASS0_OBJECTS=$(PASS0_ARM_OBJECTS)
! ENDIF
!ENDIF # IFNDEF NOPASS0
MIDL = midl
MKTYPLIB = mktyplib
ASN = asn1
# Disable midl timestamps wherever possible
MIDL_FLAGS=$(MIDL_FLAGS) -no_stamp -nologo /WX
!IFDEF USE_OLE_MC
MC = mc -o
!ELSE
MC = mc
!ENDIF
MOFCOMP = mofcomp
!IF "$(IDL_TYPE)" == "ole" || "$(IDL_TYPE)" == ""
IDL_TYPE=OLE
!ELSEIF "$(IDL_TYPE)" == "rpc"
IDL_TYPE=RPC
!ENDIF
!IFNDEF PASS0_HEADERDIR
PASS0_HEADERDIR=.
!ENDIF
!IF "$(WIN32_WINNT_VERSION)" == "0x0500"
MIDL_OPTIMIZATION=$(MIDL_OPTIMIZATION_NT5)
!ELSE
! IF "$(WIN32_WINNT_VERSION)" != "$(LATEST_WIN32_WINNT_VERSION)"
MIDL_OPTIMIZATION=$(MIDL_OPTIMIZATION_NT4)
! ENDIF
!ENDIF
!IF DEFINED(MIDL_NO_ROBUST)
MIDL_OPTIMIZATION=$(MIDL_OPTIMIZATION_NO_ROBUST)
!ENDIF
# If the user specified a midl protocol, switch to it. This assumes that it
# is defaulted in makefile.plt to "-protocol all" or ""
!ifdef MIDL_PROTOCOL
MIDL_OPTIMIZATION=$(MIDL_OPTIMIZATION:-protocol all=)
MIDL_OPTIMIZATION=$(MIDL_OPTIMIZATION) -protocol $(MIDL_PROTOCOL)
!endif
! ifdef MIDL_TLBDIR
MIDL_TLBSWITCH=/tlb $(MIDL_TLBDIR)\$(<F:.idl=.tlb)
! else
MIDL_TLBSWITCH=
! endif
!IF "$(IDL_TYPE)" == "OLE"
#! IF DEFINED(PASS0_CLIENTDIR) || DEFINED(PASS0_SERVERDIR)
#! ERROR PASS0_CLIENTDIR and PASS0_SERVERDIR can only be used with IDL_TYPE=RPC!
#! ENDIF
! IFNDEF PASS0_SOURCEDIR
PASS0_SOURCEDIR=.
! ENDIF
! IFNDEF MIDL_UUIDDIR
MIDL_UUIDDIR=$(PASS0_SOURCEDIR)
! ENDIF
! ifndef PASS0_UUIDDIR
PASS0_UUIDDIR=$(MIDL_UUIDDIR)
! endif
!if $(MPPC)
PACKING= -Zp2
!else
PACKING= -Zp8
!endif
!ifdef USE_IDLBASED_DLLDATA
DLLDATA_NAME=$(<F:.idl=_dlldata.c)
!else
DLLDATA_NAME=dlldata.c
!endif
! IFNDEF NO_PASS0_RULES
.idl{$(PASS0_HEADERDIR)}.h:
$(MIDL) \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext -c_ext \
-proxy $(PASS0_SOURCEDIR)\$(<F:.idl=_p.c) \
-dlldata $(PASS0_SOURCEDIR)\$(DLLDATA_NAME) \
-iid $(MIDL_UUIDDIR)\$(<F:.idl=_i.c) \
$(MIDL_TLBSWITCH) \
-header $@ \
-cpp_cmd $(MIDL_CPP) \
$(C_DEFINES) \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$<
{..\}.idl{$(PASS0_HEADERDIR)}.h:
$(MIDL) \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext -c_ext \
-proxy $(PASS0_SOURCEDIR)\$(<F:.idl=_p.c) \
-dlldata $(PASS0_SOURCEDIR)\$(DLLDATA_NAME) \
-iid $(MIDL_UUIDDIR)\$(<F:.idl=_i.c) \
$(MIDL_TLBSWITCH) \
-header $@ \
-cpp_cmd $(MIDL_CPP) \
$(C_DEFINES) \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$<
{$(O)}.idl{$(PASS0_HEADERDIR)}.h:
$(MIDL) \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext -c_ext \
-proxy $(PASS0_SOURCEDIR)\$(<F:.idl=_p.c) \
-dlldata $(PASS0_SOURCEDIR)\$(DLLDATA_NAME) \
-iid $(MIDL_UUIDDIR)\$(<F:.idl=_i.c) \
$(MIDL_TLBSWITCH) \
-header $@ \
-cpp_cmd $(MIDL_CPP) \
$(C_DEFINES) \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$<
! ENDIF
!ELSEIF "$(IDL_TYPE)" == "RPC"
#! IF DEFINED(PASS0_SOURCEDIR) || DEFINED(MIDL_UUIDDR)
#! ERROR PASS0_SOURCEDIR and MIDL_UUIDDIR can only be used with IDL_TYPE=OLE!
#! ENDIF
! IFNDEF PASS0_CLIENTDIR
PASS0_CLIENTDIR=$(TARGETPATH)
! ENDIF
! IFNDEF PASS0_SERVERDIR
PASS0_SERVERDIR=$(PASS0_CLIENTDIR)
! ENDIF
! IFNDEF NO_PASS0_RULES
.idl{$(PASS0_HEADERDIR)}.h:
$(MIDL) \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext -c_ext \
-cstub $(PASS0_CLIENTDIR)\$(<F:.idl=_c.c) \
-sstub $(PASS0_SERVERDIR)\$(<F:.idl=_s.c) \
$(MIDL_TLBSWITCH) \
-header $@ \
-cpp_cmd $(MIDL_CPP) \
$(C_DEFINES) \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$<
{..\}.idl{$(PASS0_HEADERDIR)}.h:
$(MIDL) \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext -c_ext \
-cstub $(PASS0_CLIENTDIR)\$(<F:.idl=_c.c) \
-sstub $(PASS0_SERVERDIR)\$(<F:.idl=_s.c) \
$(MIDL_TLBSWITCH) \
-header $@ \
-cpp_cmd $(MIDL_CPP) \
$(C_DEFINES) \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$<
{$(O)}.idl{$(PASS0_HEADERDIR)}.h:
$(MIDL) \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext -c_ext \
-cstub $(PASS0_CLIENTDIR)\$(<F:.idl=_c.c) \
-sstub $(PASS0_SERVERDIR)\$(<F:.idl=_s.c) \
$(MIDL_TLBSWITCH) \
-header $@ \
-cpp_cmd $(MIDL_CPP) \
$(C_DEFINES) \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$<
! ENDIF
!ELSE
! ERROR Invalid IDL_TYPE value. Supported values: OLE and RPC.
!ENDIF # IDL_TYPE
CPPXX = $(C_PREPROCESSOR_FLAGS:/Tc=)
CPPXX = $(CPPXX:-Tc=)
!IFNDEF NO_PASS0_RULES
! IFNDEF MC_SOURCEDIR
! IFDEF PASS0_SOURCEDIR
MC_SOURCEDIR=$(PASS0_SOURCEDIR)
! ELSE
MC_SOURCEDIR=$(PASS0_CLIENTDIR)
! ENDIF
! ENDIF
.mc{$(PASS0_HEADERDIR)}.h:
$(MC) -h $(PASS0_HEADERDIR) -r $(MC_SOURCEDIR) $(MC_FLAGS) $<
.mc{$(MC_SOURCEDIR)}.rc:
$(MC) -h $(PASS0_HEADERDIR) -r $(MC_SOURCEDIR) $(MC_FLAGS) $<
{..\}.mc{$(PASS0_HEADERDIR)}.h:
$(MC) -h $(PASS0_HEADERDIR) -r $(MC_SOURCEDIR) $(MC_FLAGS) $<
{..\}.mc{$(MC_SOURCEDIR)}.rc:
$(MC) -h $(PASS0_HEADERDIR) -r $(MC_SOURCEDIR) $(MC_FLAGS) $<
{$(O)}.mc{$(PASS0_HEADERDIR)}.h:
$(MC) -h $(PASS0_HEADERDIR) -r $(MC_SOURCEDIR) $(MC_FLAGS) $<
{$(O)}.mc{$(MC_SOURCEDIR)}.rc:
$(MC) -h $(PASS0_HEADERDIR) -r $(MC_SOURCEDIR) $(MC_FLAGS) $<
# ManagedObjectFormat files
# First preprocess MOF via the C pre processor
# Next separate MOF into MOF and MFL, then concatenate them and
# finally compile into binary form
{..\}.mof{$(O)}.mof:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
{}.mof{$(O)}.mof:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
{$(O)}.mof{$(O)}.bmf:
$(MOFCOMP) -N:root\wmi -Amendment:ms_409 -MFL:$(O)\MFL.MFL -MOF:$(O)\MOF.MOF $<
wmimofck -y$(O)\MOF.MOF -z$(O)\MFL.MFL $(O)\MOFMFL.MOF
$(MOFCOMP) -WMI -B:$@ $(O)\MOFMFL.MOF
!ifdef USE_MIDL_FOR_MKTYPLIB
MIDL_MKTYPLIB_FLAGS = \
$(PACKING) \
$(INCPATH0) \
-char unsigned \
-ms_ext \
-c_ext \
$(C_DEFINES) -D__MKTYPLIB__ \
$(MIDL_FLAGS) \
$(MIDL_OPTIMIZATION) \
$(MKTYPLIB_FLAGS:-h =-header ) \
-tlb $@ \
-cpp_cmd $(MIDL_CPP) \
-mktyplib203
.odl{$(O)\}.tlb:
$(MIDL) $(MIDL_MKTYPLIB_FLAGS) $<
{..\}.odl{$(O)\}.tlb:
$(MIDL) $(MIDL_MKTYPLIB_FLAGS) $<
.tdl{$(O)\}.tlb:
$(MIDL) $(MIDL_MKTYPLIB_FLAGS) $<
{..\}.tdl{$(O)\}.tlb:
$(MIDL) $(MIDL_MKTYPLIB_FLAGS) $<
!else
.odl{$(O)\}.tlb:
@echo $(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $<
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $(O)\MyTypLib.TMP
$(CPPXX: =
)
-D__MKTYPLIB__
<<NOKEEP
@$(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $(O)\MyTypLib.TMP
{..\}.odl{$(O)\}.tlb:
@echo $(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $<
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $(O)\MyTypLib.TMP
$(CPPXX: =
)
-D__MKTYPLIB__
<<NOKEEP
@$(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $(O)\MyTypLib.TMP
.tdl{$(O)\}.tlb:
@echo $(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $<
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $(O)\MyTypLib.TMP
$(CPPXX: =
)
-D__MKTYPLIB__
<<NOKEEP
@$(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $(O)\MyTypLib.TMP
{..\}.tdl{$(O)\}.tlb:
@echo $(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $<
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $(O)\MyTypLib.TMP
$(CPPXX: =
)
-D__MKTYPLIB__
<<NOKEEP
@$(MKTYPLIB) /tlb $@ -nocpp $(MKTYPLIB_FLAGS) $(O)\MyTypLib.TMP
!endif
# OSSINFO must be set in the *environment* for the ASN compiler to find its
# configuration file, $(OSSINFO)\ossinfo.
! ifndef OSSINFO
OSSINFO=$(SDK_LIB_DEST)
! endif
! ifndef ASNDEFAULTFILE
ASNDEFAULTFILE=$(OSSINFO)\asn1dflt.z4
! endif
! ifndef ASNSYNTAX
ASNSYNTAX=-1990
! endif
ASNFLAGS=$(ASNDEFAULTFILE) $(ASNSYNTAX) $(ASNFLAGS)
# if ASNDBG is explicitly set, let that control whether the voluminous ASN
# symbols are supressed. Otherwise, suppress the symbols for free builds.
! ifdef ASNDBG
! if $(ASNDBG) == 0
ASNFLAGS=-minimize $(ASNFLAGS)
! endif
! elseif $(FREEBUILD)
ASNFLAGS=-minimize $(ASNFLAGS)
! endif
{}.asn{$(PASS0_HEADERDIR)}.h:
$(ASN) $(ASNFLAGS) -out $(PASS0_HEADERDIR)\$(@B) $<
!ENDIF
#
# Default language ID to US English (0x0409)
#
!IFDEF RCCODEPAGE
RCOPTIONS=$(RCOPTIONS) -c $(RCCODEPAGE)
!ENDIF
!IFNDEF RCNOFONTMAP
RCOPTIONS=-z "MS Sans Serif,Helv/MS Shell Dlg" $(RCOPTIONS)
!ENDIF
SXS_RC_MANIFEST_DEFINES=$(SXS_MANIFEST_DEFINES)
SXS_RC_MANIFEST_DEFINES=$(SXS_RC_MANIFEST_DEFINES:"\"=""")
SXS_RC_MANIFEST_DEFINES=$(SXS_RC_MANIFEST_DEFINES:\""=""")
RCOPTIONS=$(SXS_RC_MANIFEST_DEFINES) $(RCOPTIONS)
!ifdef RCLANGUAGE
RCOPTIONS=-l $(RCLANGUAGE) $(RCOPTIONS)
!else
RCOPTIONS=-l 409 $(RCOPTIONS)
!endif
RC_COMPILER=rc $(RCOPTIONS)
INCPATHRC = $(INCPATH0: =)
INCPATHRC = $(INCPATHRC:-I=;)
INCPATHRC = $(INCPATHRC:/I=;)
CDEFINERC = $(CDEFINES: = )
CDEFINERC = $(CDEFINERC: = )
!if defined(RC_FORCE_INCLUDE_FILES)
# Concatenate the FORCE_INCLUDES files in front of the .rc file.
# We put nul in front because there is an extra leading semicolon which produces
# an extra leading plus sign.
RC_TEMP1=$(@R).rc_temp1
RC_FORCE_INCLUDE_FILES_CMD=copy nul$(RC_FORCE_INCLUDE_FILES:;=+)+$< $(RC_TEMP1)
INCPATHRC=$(INCPATHRC);..
!else
RC_TEMP1=$<
RC_FORCE_INCLUDE_FILES_CMD=
!endif
!if defined(RC_FORCE_INCLUDE_STRING)
RC_TEMP2=$(@R).rc_temp2
INCPATHRC=$(INCPATHRC);..
!else
RC_TEMP2=$(RC_TEMP1)
!endif
RC_TEMP=$(RC_TEMP2)
!if defined(SXS_MANIFEST_IN_RESOURCES)
MAKE_MANIFEST_CMD=nmake -nologo $(SXS_MANIFEST_OBJ1)
!else
MAKE_MANIFEST_CMD=
!endif
!IF $(MPPC)
{$(O)\}.rc{$(O)\}.res:
$(RC_COMPILER) -r -m -fo $@ $(RC_DEFINES) $(RCXBANG) $(INCPATH0) $<
!ELSE
{$(O)\}.rc{$(O)\}.res:
$(TYPE) <<$(ECHO_RSP)
$(RC_COMPILER) -r -fo $@ $(CDEFINES) $(INCPATH0) $<
<<NOKEEP
$(NOECHO)$(MAKE_MANIFEST_CMD)
$(NOECHO)$(RC_FORCE_INCLUDE_FILES_CMD)
! IF defined(RC_FORCE_INCLUDE_STRING)
$(NOECHO)copy << + $(RC_TEMP1) $(RC_TEMP2)
$(RC_FORCE_INCLUDE_STRING)
<<NOKEEP
! endif
$(NOECHO)set include=$(INCPATHRC);$(INCLUDE)
$(NOECHO)$(RC_COMPILER) -r -fo $@ $(CDEFINERC) $(RC_TEMP)
$(NOECHO)set include=$(INCLUDE)
!ENDIF
!IF $(MPPC)
{..\}.rc{$(O)\}.res:
$(RC_COMPILER) -r -m -fo $@ $(RC_DEFINES) $(RCXBANG) $(INCPATH0) $<
!ELSE
{..\}.rc{$(O)\}.res:
$(TYPE) <<$(ECHO_RSP)
$(RC_COMPILER) -r -fo $@ $(CDEFINES) $(INCPATH0) $<
<<NOKEEP
$(NOECHO)$(MAKE_MANIFEST_CMD)
$(NOECHO)$(RC_FORCE_INCLUDE_FILES_CMD)
! if defined(RC_FORCE_INCLUDE_STRING)
$(NOECHO)copy << + $(RC_TEMP1) $(RC_TEMP2)
$(RC_FORCE_INCLUDE_STRING)
<<NOKEEP
! endif
$(NOECHO)set include=$(INCPATHRC);$(INCLUDE)
$(NOECHO)$(RC_COMPILER) -r -fo $@ $(CDEFINERC) $(RC_TEMP)
$(NOECHO)set include=$(INCLUDE)
!ENDIF
!IF $(MPPC)
{}.rc{$(O)\}.res:
$(RC_COMPILER) -r -m -fo $@ $(RC_DEFINES) $(RCXBANG) $(INCPATH0) $<
!ELSE
{}.rc{$(O)\}.res:
$(TYPE) <<$(ECHO_RSP)
$(RC_COMPILER) -r -fo $@ $(CDEFINES) $(INCPATH0) $<
<<NOKEEP
$(NOECHO)$(MAKE_MANIFEST_CMD)
$(NOECHO)$(RC_FORCE_INCLUDE_FILES_CMD)
! if defined(RC_FORCE_INCLUDE_STRING)
$(NOECHO)copy << + $(RC_TEMP1) $(RC_TEMP2)
$(RC_FORCE_INCLUDE_STRING)
<<NOKEEP
! endif
$(NOECHO)set include=$(INCPATHRC);$(INCLUDE)
$(NOECHO)$(RC_COMPILER) -r -fo $@ $(CDEFINERC) $(RC_TEMP)
$(NOECHO)set include=$(INCLUDE)
!ENDIF
!IF $(MPPC)
#
# The definitions for the resource compiler are the same as the definitions
# for the C compiler except we need to remove INC_OLE2 because the resource
# compiler doesn't understand the pragma's that the VC guys used to rename
# the macos include files. Thus, the resource compiler can't parse the ole
# headers
#
RC_DEFINES=$(C_DEFINES:INC_OLE2=NO_OLE)
#
# Setup for the mac resource compiler
#
# Macintosh-specific resourse (.r) to .rsc rule
MRC_COMPILER=mrc -l 0x409
.SUFFIXES: .r
{..\}.r{$(_OBJ_DIR)\$(TARGET_DIRECTORY)\}.rsc:
$(MRC_COMPILER) -o $(@R).rsc $(RC_DEFINES) $(INCPATH0) $<
.r{$(_OBJ_DIR)\$(TARGET_DIRECTORY)\}.rsc:
$(MRC_COMPILER) -o $(@R).rsc $(RC_DEFINES) $(INCPATH0) $<
!ENDIF
{..\}.rc.rcpp:
set include=$(INCPATHRC);$(INCLUDE)
$(RC_COMPILER) -r -p -fo $(@R).tmp $(CDEFINERC) $<
@set include=$(INCLUDE)
{}.rc.rcpp:
set include=$(INCPATHRC);$(INCLUDE)
$(RC_COMPILER) -r -p -fo $(@R).tmp $(CDEFINERC) $<
@set include=$(INCLUDE)
.thk{$(O)\}.asm:
thunk -o $@ $<
JVC = jvc /nologo
!ifndef JAVA_DEBUG_FLAGS
!if $(FREEBUILD)
JAVA_DEBUG_FLAGS = /O
!else
JAVA_DEBUG_FLAGS = /g
!endif
!endif
!ifndef JAVA_WARNING_FLAGS
JAVA_WARNING_FLAGS = /w4
!endif
JAVA_BASE_CLASS = \
$(SDK_PATH)\classes\afc.zip; \
$(SDK_PATH)\classes\classes.zip
JAVA_CLASS_PATH = $(JAVA_BASE_CLASS); $(MAKEDIR); $(USER_CLASS_PATH)
JAVA_CLASS_PATH = $(JAVA_CLASS_PATH: =)
JVC_FLAGS = /cp $(JAVA_CLASS_PATH) $(JAVA_DEBUG_FLAGS) $(JAVA_WARNING_FLAGS) /d $(O)
{$(MAKEDIR)}.java{$(O)\}.class:
$(JVC) $(JVC_FLAGS) $<
#
# The DDK must support using VC 5 which does not support the /FC switch
# allow disabling of it
#
!ifdef DDK_VC5_COMPILE
USE_FC =
!else
USE_FC = /FC
!endif
ECHO_RSP = $(O)\echo.msg
CL_RSP = $(O)\cl.rsp
CLCOD_RSP = $(O)\clcod.rsp
LINK_RSP = $(O)\lnk.rsp
{$(O)\}.cxx{$(O)\}.obj:
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\}.cxx{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\$(TARGET_DIRECTORY)\}.cxx{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{$(O)\}.cpp{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\}.cpp{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\$(TARGET_DIRECTORY)\}.cpp{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{}.cxx{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{$(TARGET_DIRECTORY)\}.cxx{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{}.cpp{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{$(TARGET_DIRECTORY)\}.cpp{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXX_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\}.cxx{}.cod:
$(CXX_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\}.cxx{}.pp:
$(CXX_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $< > $@
$(CXX_COMPILER_FLAGS: =
)
<<NOKEEP
{..\}.cpp{}.cod:
$(CXX_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC)
$(CXX_COMPILER_FLAGS: =
)
$<
<<NOKEEP
{..\}.cpp{}.pp:
$(CXX_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $< > $@
$(CXX_COMPILER_FLAGS: =
)
<<NOKEEP
{}.cxx{}.cod:
$(CXX_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $<
$(CXX_COMPILER_FLAGS: =
)
<<NOKEEP
{}.cxx{}.pp:
$(CXX_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $< > $@
$(CXX_COMPILER_FLAGS: =
)
<<NOKEEP
{}.cpp{}.cod:
$(CXX_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $<
$(CXX_COMPILER_FLAGS: =
)
<<NOKEEP
{}.cpp{}.pp:
$(CXX_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $< > $@
$(CXX_COMPILER_FLAGS: =
)
<<NOKEEP
# Expand spaces to newlines, replace double # signs with spaces.
EX_C_COMPILER_FLAGS=$(C_COMPILER_FLAGS: =^
)
EX_C_COMPILER_FLAGS=$(EX_C_COMPILER_FLAGS:^#^#= )
{..\}.c{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
<<NOKEEP
@$(C_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC) $(USECXX_FLAG)
$(EX_C_COMPILER_FLAGS)
$<
<<NOKEEP
{..\$(TARGET_DIRECTORY)\}.c{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
<<NOKEEP
@$(C_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC) $(USECXX_FLAG)
$(EX_C_COMPILER_FLAGS)
$<
<<NOKEEP
{$(O)\}.c{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
<<NOKEEP
@$(C_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC)
$(EX_C_COMPILER_FLAGS)
$<
<<NOKEEP
{}.c{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
<<NOKEEP
@$(C_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC) $(USECXX_FLAG)
$(EX_C_COMPILER_FLAGS)
$<
<<NOKEEP
{$(TARGET_DIRECTORY)\}.c{$(O)\}.obj::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
<<NOKEEP
@$(C_COMPILER_NAME) @<<$(CL_RSP) -Fo"$(MAKEDIR)\$(O)/" $(USE_FC) $(USECXX_FLAG)
$(EX_C_COMPILER_FLAGS)
$<
<<NOKEEP
{..\}.c{}.cod:
$(C_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $(USECXX_FLAG) $<
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{$(O)\}.c{}.cod:
$(C_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $(USECXX_FLAG) $<
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{..\$(TARGET_DIRECTORY)\}.c{}.cod:
$(C_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $(USECXX_FLAG) $<
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{$(O)\}.c{}.pp:
$(C_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $(USECXX_FLAG) $< > $@
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{..\}.c{}.pp:
$(C_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $(USECXX_FLAG) $< > $@
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{..\$(TARGET_DIRECTORY)\}.c{}.pp:
$(C_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $(USECXX_FLAG) $< > $@
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{}.c{}.cod:
$(C_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $(USECXX_FLAG) $<
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{$(TARGET_DIRECTORY)\}.c{}.cod:
$(C_COMPILER_NAME) @<<$(CLCOD_RSP) /Fc $(USE_FC) $(USECXX_FLAG) $<
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{}.c{}.pp:
$(C_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $(USECXX_FLAG) $< > $@
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{$(TARGET_DIRECTORY)\}.c{}.pp:
$(C_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $(USECXX_FLAG) $< > $@
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
{}.c{$(TARGET_DIRECTORY)\}.pp:
$(C_COMPILER_NAME) @<<$(CL_RSP) /E $(USE_FC) $(USECXX_FLAG) $< > $@
$(EX_C_COMPILER_FLAGS)
<<NOKEEP
#
# C# compiler rules
#
!if $(FREEBUILD)
MANAGED_STD_FLAGS=$(MANAGED_STD_FLAGS) /optimize+ /debug:pdbonly
!else
MANAGED_STD_FLAGS=$(MANAGED_STD_FLAGS) /debug:full
!if defined(MANAGED_VB)
MANAGED_STD_FLAGS=$(MANAGED_STD_FLAGS) /define:DEBUG=1
!else
MANAGED_STD_FLAGS=$(MANAGED_STD_FLAGS) /define:DEBUG
!endif
!endif
EX_MANAGED_COMPILER_FLAGS=$(MANAGED_STD_FLAGS)
{..\}.cs{$O\}.dll::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
@$(CS_COMPILER_NAME) @<<$(CS_RSP)
$(EX_MANAGED_COMPILER_FLAGS)
$<
<<NOKEEP
{..\}.vb{$O\}.dll::
@type <<$(ECHO_RSP)
$(ECHO_MSG)
<<NOKEEP
@$(VB_NET_COMPILER_NAME) @<<$(VB_RSP)
$(EX_MANAGED_COMPILER_FLAGS)
$<
<<NOKEEP
#
# SDL proxy generation rules
#
.sdl.cs::
webserviceutil /c:proxy /path:$<
!if "$(NTNOFUZZYLOOKUP)"=="1"
LIBRARY_OBJS=
!else
LIBRARY_OBJS = $(LIBRARY_OBJS) $(HEADEROBJNAME)
!endif
!ifdef USE_INCREMENTAL_LINKING
IMPLIB_DEPEND =
!else
IMPLIB_DEPEND = $(LIBRARY_OBJS)
!endif
#
# inference rules for preprocessing manifests
# It would be nice to go from .manifest to .manifest.obj, but nmake doesn't work that way.
# There is some precedent for going from .src to .manifest, but I'd rather generated files
# end in obj. But we can't go from .manifest to .manifestobj either, because of the case
# of manifests not in resources.
#
# .manifest-src is needed only for the unusual case of multiple manifests resources,
# when you write the .rc file lines by hand instead of us doing it for you, and
# then the .rc is not pushed into the objdir and it picks up the unpreprocessed one.
# For example: \nt\base\win32\fusion\tests\sxstest\testdata\Hello\ExeMultiRes.
#
# .man is for fitting in 8.3
#
.SUFFIXES: .manifest-src .manifest .man
# This string is needed in at least four places in the tree, so factor it to here.
SYSTEM_COMPATIBLE_ASSEMBLY_NAME=Microsoft.Windows.SystemCompatible
DEFINE_SYSTEM_COMPATIBLE_ASSEMBLY_NAME=\
-DSYSTEM_COMPATIBLE_ASSEMBLY_NAME="\"$(SYSTEM_COMPATIBLE_ASSEMBLY_NAME)\"" \
-DLSYSTEM_COMPATIBLE_ASSEMBLY_NAME=L"\"$(SYSTEM_COMPATIBLE_ASSEMBLY_NAME)\""
SYSTEM_COMPATIBLE_ASSEMBLY_VERSION=5.2
SYSTEM_COMPATIBLE_ASSEMBLY_VERSION_PART_3=0
SYSTEM_COMPATIBLE_ASSEMBLY_VERSION_PART_4=0
SXS_MANIFEST_DEFINES= \
-DSXS_ASSEMBLY_NAME="\"$(SXS_ASSEMBLY_NAME)\"" \
-DSXS_ASSEMBLY_VERSION="\"$(SXS_ASSEMBLY_VERSION)\"" \
-DSXS_ASSEMBLY_LANGUAGE="\"$(SXS_ASSEMBLY_LANGUAGE)\"" \
-DSXS_PROCESSOR_ARCHITECTURE="\"$(SXS_PROCESSOR_ARCHITECTURE)\"" \
-DSXS_TARGET="\"$(TARGETNAME).$(TARGETEXT:lib=dll)\"" \
$(DEFINE_SYSTEM_COMPATIBLE_ASSEMBLY_NAME) \
$(SXS_MANIFEST_DEFINES)
#MANIFEST_PREPROCESSOR_NAME=$(C_PREPROCESSOR_NAME)
# $(TARGET_CPP) does not include -FIwarning.h.
# Otherwise we have to filter the data through, like Perl:
# while (<>) {
# if (!/^#pragma.+/ && !/^$/) {
# print;
# }
#}
!ifndef MANIFEST_PREPROCESSOR_NAME
MANIFEST_PREPROCESSOR_NAME=preprocessor.exe
!endif
!ifndef MANIFEST_VALIDATOR_SCHEMA
MANIFEST_VALIDATOR_SCHEMA=$(NTMAKEENV)\appschema.xml
!endif
!ifndef MANIFEST_VALIDATOR_NAME
MANIFEST_VALIDATOR_NAME=FusionManifestValidator /b /s:$(MANIFEST_VALIDATOR_SCHEMA)
!endif
#
# .manifest-src -> .man
#
{}.manifest-src{$(O)}.man:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..}.manifest-src{$(O)}.man:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..\..}.manifest-src{$(O)}.man:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
#
# .manifest-src -> .manifest
#
{}.manifest-src{$(O)}.manifest:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..}.manifest-src{$(O)}.manifest:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..\..}.manifest-src{$(O)}.manifest:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
#
# .manifest -> .man
#
{}.manifest{$(O)}.man:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..}.manifest{$(O)}.man:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..\..}.manifest{$(O)}.man:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
#
# .manifest -> .manifest
#
{}.manifest{$(O)}.manifest:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..}.manifest{$(O)}.manifest:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
{..\..}.manifest{$(O)}.manifest:
$(MANIFEST_PREPROCESSOR_NAME) -o $@ -i $< $(SXS_MANIFEST_DEFINES)
$(MANIFEST_VALIDATOR_NAME) /m:$@
#
# Standard inference rule for generating machine specific def files.
#
.SUFFIXES: .def .src
{..\}.src{$(O)}.def:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
{}.src{$(O)}.def:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
{..\}.def{$(O)}.def:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
{}.def{$(O)}.def:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
# one more level down for HALS
{..\..\}.src{$(O)}.def:
@type <<$(ECHO_RSP)
$(ECHO_MSG) /EP $<
<<NOKEEP
@$(C_PREPROCESSOR_NAME) @<<$(CL_RSP) /Tc$< > $@
$(CPPXX: =
)
<<NOKEEP
!ifdef NO_BROWSER_FILE
BROWSERFILE=
!else
! ifdef BROWSER_INFO
! ifndef BROWSERFILE
! if "$(TARGETNAME)" == ""
BROWSERFILE=
! else
BROWSERFILE=$(TARGETPATH)\$(TARGET_DIRECTORY)\$(TARGETNAME).bsc
! endif
! endif
! else
BROWSERFILE=
! endif
!endif
!if defined (USE_LINT) && ("$(LINT_TYPE)" != "all")
{}.cxx{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{$(TARGET_DIRECTORY)\}.cxx{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{..\}.cxx{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{..\$(TARGET_DIRECTORY)\}.cxx{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{}.cpp{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{$(TARGET_DIRECTORY)\}.cpp{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{..\}.cpp{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{..\$(TARGET_DIRECTORY)\}.cpp{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{}.c{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{$(TARGET_DIRECTORY)\}.c{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{..\}.c{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
! endif
$(LINT_CMD) $<
{..\$(TARGET_DIRECTORY)\}.c{$(O)\}.lob:
! if "$(LINT_TYPE)" != "lob"
@echo done >$@
!endif
$(LINT_CMD) $<
!endif
#
# Standard inference rule for User Mode object files that produce User Mode
# image files
#
{$(O)\}.obj{$(O)\}$(UMAPPLEXT):
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE)
$(TSLINKER_FLAG)
$(ORDER: =
)
$(LINKGPSIZE: =
)
$(LINKER_OPTIDATA)
-base:$(UMBASE)
-subsystem:$(SUBSYSTEM)
$(UMENTRY)
$(HEADEROBJNAME: =
)
$(UMRES: =
)
$<
$(UMOBJS: =
)
$(UMLIBS: =
)
$(CRTLIBS: =
)
$(LINKLIBS: =
)
$(BO_LIB)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
#
# Standard list of targets: all, clean and loc. all is the default target.
#
!IFNDEF PASS0ONLY
all: $(_OBJ_DIR)\_objects.mac \
$(NTTARGETFILE0) \
$(WPP_TARGETS) \
$(PASS0_OBJECTS) \
PASS0_Pub \
PASS0_Binp \
$(PRECOMPILED_TARGET) \
$(HEADEROBJNAME) \
build_objects \
$(SXS_MANIFEST_OBJ1) \
$(SXS_MANIFEST_OBJ2) \
$(TARGETLOBFILES1) \
$(TARGETLIBFILES) \
$(NTTARGETFILE1) \
$(TARGETEXEFILES) \
!if "$(BROWSERFILE)" != ""
$(BROWSERFILE) \
!endif
$(TARGETLOBFILES2) \
PASS1_Pub \
build_umobjects \
$(UMEXEFILES) \
$(NTTARGETFILES) \
PASS2_Pub \
! if !$(MISCFILES_DURING_LINK) || !defined(NOLINK)
! if "$(MISCFILES: =)" != "" || defined(SXS_MISCFILES)
$(MISCFILES) \
$(SXS_MISCFILES) \
! ifdef _NTTREE
binplace_miscfiles \
! endif
! endif
! endif
!ifdef SXS_LOG_CMD
sxs_log_cmd \
!endif
BINARY_Pub \
LastStep
! if "$(BUILDMSG)" != ""
@echo.
@echo $(BUILDMSG)
! endif
LastStep:
!ifdef SXS_LOG_CMD
sxs_log_cmd:
$(SXS_LOG_CMD)
!endif
binplace_miscfiles: $(MISCFILES) $(SXS_MISCFILES)
!ifndef NO_BINPLACE
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_TOOL) $(BINPLACE_FLAGS) $(BINPLACE_LC_MISCFLAGS) @<<
$**
<<NOKEEP
!endif
build_objects: $(TARGETOBJFILES)
build_umobjects: $(UMOBJFILES)
!ELSE # PASS0ONLY
all: $(NTTARGETFILE0) \
$(WPP_TARGETS) \
$(PASS0_OBJECTS) \
PASS0_Pub \
PASS0_Binp
! IF "$(BUILDMSG)" != ""
@echo.
@echo $(BUILDMSG)
! ENDIF
!ENDIF # PASS0ONLY
update:
@echo Updating library.
$(_OBJ_DIR)\_objects.mac: $(SOURCES_USED)
@echo Rebuilding $(_OBJ_DIR)\_objects.mac from $(SOURCES_USED).
@build -OZf >nul 2>&1
@echo $(_OBJ_DIR)\_objects.mac was rebuilt, please reinvoke NMAKE
@md \ >nul 2>nul
!ifdef NO_BINPLACE
PASS0_BINP:
PASS1_BINP:
PASS2_BINP:
!else
PASS0_BINP:
!if defined(PASS0_BINPLACE) && "$(BUILD_PASS)" != "PASS1" && "$(BUILD_PASS)" != "PASS2"
$(BINPLACE_TOOL) @<<
$(BINPLACE_FLAGS)
$(PASS0_BINPLACE)
<<NOKEEP
!endif
PASS1_BINP:
!if defined(PASS1_BINPLACE) && "$(BUILD_PASS)" != "PASS0" && "$(BUILD_PASS)" != "PASS2"
$(BINPLACE_TOOL) @<<
$(BINPLACE_FLAGS)
$(PASS1_BINPLACE)
<<NOKEEP
!endif
PASS2_BINP:
!if defined(PASS2_BINPLACE) && "$(BUILD_PASS)" != "PASS0" && "$(BUILD_PASS)" != "PASS1"
$(BINPLACE_TOOL) @<<
$(BINPLACE_FLAGS)
$(PASS2_BINPLACE)
<<NOKEEP
!endif
!endif
PASS0_Pub:
!if defined(PASS0_PUBLISH) && "$(BUILD_PASS)" != "PASS1" && "$(BUILD_PASS)" != "PASS2"
$(PUBLISH_CMD) -F <<
$(PASS0_PUBLISH:}=}
)
<<NOKEEP
!endif
PASS1_Pub:
!if defined(PASS1_PUBLISH) && "$(BUILD_PASS)" != "PASS0" && "$(BUILD_PASS)" != "PASS2" && !defined(NOLIB)
$(PUBLISH_CMD) -F <<
$(PASS1_PUBLISH:}=}
)
<<NOKEEP
!endif
PASS2_Pub:
!if defined(PASS2_PUBLISH) && "$(BUILD_PASS)" != "PASS0" && "$(BUILD_PASS)" != "PASS1"
$(PUBLISH_CMD) -F <<
$(PASS2_PUBLISH:}=}
)
<<NOKEEP
!endif
#
# Binary drop runs only during the link phase
#
BINARY_Pub:
!ifdef BINARY_PUBLISH
! if "$(BINPUBLISH)" == "1"
$(BINDROP_CMD) -F <<
$(BINARY_PUBLISH:}=}
)
<<NOKEEP
! else
@echo BINARY_PUBLISH_PROJECTS in environment doesn't contain $(_PROJECT_) -
@echo binaries will not be published.
! endif
!else if defined(BINARY_PUBLISH_FILES)
! if "$(BINPUBLISH)" == "1"
@cmd /v:on /c make_publish_spec.cmd $(BINARY_PUBLISH_ROOT) $(O) $(BINARY_PUBLISH_FILES) | $(BINDROP_CMD) -I
! else
@echo BINARY_PUBLISH_PROJECTS in environment doesn't contain $(_PROJECT_) -
@echo binaries will not be published.
! endif
!endif
!IF DEFINED(NTTARGETFILES) || DEFINED(NTTARGETFILE0) || DEFINED(NTTARGETFILE1) || DEFINED(USE_MAKEFILE_INC)
! INCLUDE .\makefile.inc
!ENDIF
!IF "$(PRECOMPILED_INCLUDE)" != ""
! ifdef PRECOMPILED_SOURCEFILE
$(PRECOMPILED_TARGET) $(HEADEROBJNAME): $(PRECOMPILED_INCLUDE)
@type <<
$(ECHO_PRECOMPILED_MSG1)
<<NOKEEP
@$(C_COMPILER_NAME) @<< $(PRECOMPILED_FLAG) $(PRECOMPILED_SOURCEFILE)
$(EX_C_COMPILER_FLAGS)
/Yl$(TARGETNAME) /Yc$(?F) $(HEADERFILE) $(HEADEROBJ)
<<NOKEEP
! else
$(PRECOMPILED_TARGET) $(HEADEROBJNAME): $(PRECOMPILED_INCLUDE)
@type <<$(O)\pch_hdr.src
$(ECHO_PRECOMPILED_MSG2)
#include "$(?F)"
<<NOKEEP
@$(C_COMPILER_NAME) @<< $(PRECOMPILED_FLAG)<<$(O)\pch_hdr.src
$(EX_C_COMPILER_FLAGS)
/Yl$(TARGETNAME) /Yc$(?F) $(HEADERFILE) $(HEADEROBJ)
<<NOKEEP
#include "$(?F)"
<<NOKEEP
! endif
!ENDIF
!IFNDEF NOLINK
! IF "$(UMTEST)" != "" || "$(UMAPPL)" != ""
$(UMEXEFILES): $(UMLIBS) $(CRTLIBS) $(LINKLIBS)
! ENDIF
!ENDIF
!if "$(BROWSERFILE)" != ""
! ifndef BSCMAKE_FLAGS
BSCMAKE_FLAGS = -nologo
! endif
$(BROWSERFILE) : \
! if "$(OBJECTS)" != "" || "$(OTHER_SBR_FILES)" != ""
$(O)\*.sbr $(OTHER_SBR_FILES)
-bscmake $(BSCMAKE_FLAGS) -o "$(BROWSERFILE)" @<<$(O)\bscmake.rsp
$(**: =
)
<<NOKEEP
! endif
!endif
#
# These dependencies produce the target binaries from the object files.
# These will trigger the sources to object inference rules to generate the
# object files.
#
!IF "$(TARGET)" != ""
! IF "$(TARGETTYPE)"=="PROGLIB"
$(TARGET:.exe=.lib) $(TARGET:.exe=.exp): \
! if "$(BUILD_PASS)" != "PASS2"
$(IMPLIB_DEPEND) \
! endif
$(DLLDEF)
-$(LIB_NAME) -out:$(@R).lib @<<
$(LIBRARIAN_FLAGS: =
)
-def:$(DLLDEF)
$(LIBRARY_OBJS: =
)
<<NOKEEP
$(LINT_CMD2)
$(TARGET): $(OBJECTS) $(TARGETPATH)\$(TARGET_DIRECTORY)\$(TARGETNAME).exp $(UMRES) $(BO_LIB) $(UMLIBS) $(CRTLIBS) $(MACHINE_TARGETLIBS) $(LINKLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE)
$(TSLINKER_FLAG)
$(ORDER: =
)
$(LINKGPSIZE: =
)
$(HEADEROBJNAME: =
)
$(LINKER_OPTIDATA)
-subsystem:$(SUBSYSTEM)
-base:$(UMBASE)
$(UMENTRY: =
)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
! ELSEIF "$(TARGETTYPE)"=="PROGRAM"
! if (!defined(MANAGED_CODE) && !defined(MANAGED_VB))
$(TARGET): $(UMRES) $(OBJECTS) $(BO_LIB) $(CRTLIBS) $(UMLIBS) $(MACHINE_TARGETLIBS) $(LINKLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE)
$(TSLINKER_FLAG)
-subsystem:$(SUBSYSTEM)
-base:$(UMBASE)
$(ORDER: =
)
$(LINKGPSIZE: =
)
$(UMENTRY: =
)
$(LINKER_OPTIDATA)
$(HEADEROBJNAME: =
)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
$(LINT_CMD2)
! ELSE # MANAGED_CODE or MANAGED_VB is set
!IF !defined(MANAGED_TARGET_TYPE)
!IF "$(UMTYPE)" != "console"
MANAGED_TARGET_TYPE = winexe
!ELSE
MANAGED_TARGET_TYPE = exe
!ENDIF
!ENDIF
$(TARGET) : $(SOURCES)
!if defined(MANAGED_VB)
$(VB_NET_COMPILER_NAME) \
!else
$(CS_COMPILER_NAME) \
!endif
/target:$(MANAGED_TARGET_TYPE) /out:$(TARGET) $(MANAGED_STD_FLAGS) $(MANAGED_REFERENCES) $(SOURCES)
$(BINPLACE_CMD)
! ENDIF # MANAGED_CODE || MANAGED_VB
! ELSEIF "$(TARGETTYPE)"=="DYNLINK"
! ifdef NO_DLL_EXPORTS
DYNLINK_EXP=
! elseif (!defined(MANAGED_CODE) && !defined(MANAGED_VB))
$(DYNLINK_LIB) $(DYNLINK_EXP) : \
! if "$(BUILD_PASS)" != "PASS2"
$(IMPLIB_DEPEND) $(DLLLIBOBJECTS) \
! endif
$(DLLDEF)
-$(LIB_NAME) -out:$(DYNLINK_LIB) @<<
$(LIBRARIAN_FLAGS: =
)
-def:$(DLLDEF)
$(LIBRARY_OBJS: =
)
<<NOKEEP
! IF "$(DLLLIBOBJECTS)" != " "
-$(LIB_NAME) -out:$(DYNLINK_LIB) @<<
$(LIBRARIAN_FLAGS: =
)
$(@R).lib
$(DLLLIBOBJECTS)
<<NOKEEP
! ENDIF
$(LINT_CMD2)
! endif # NO_DLL_EXPORTS
! IF "$(MAKEDLL)" != ""
! if (!defined(MANAGED_CODE) && !defined(MANAGED_VB))
$(TARGET): $(DYNLINK_EXP) $(OBJECTS) $(BO_LIB) $(LINKLIBS) $(CRTLIBS) $(MACHINE_TARGETLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE_DLL)
-dll
$(ORDER: =
)
$(LINKER_OPTIDATA)
-base:$(DLLBASE)
-subsystem:$(SUBSYSTEM)
$(DLLENTRY: =
)
$(HEADEROBJNAME: =
)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
$(MAPDUMP_CMD)
! ELSE # MANAGED_CODE || MANAGED_VB is set
!IF "$(MANAGED_TARGET_TYPE)"==""
MANAGED_TARGET_TYPE = library
!ENDIF
$(TARGET) : $(SOURCES)
!if defined(MANAGED_VB)
$(VB_NET_COMPILER_NAME) \
!else
$(CS_COMPILER_NAME) \
!endif
/target:$(MANAGED_TARGET_TYPE) /out:$(TARGET) /baseaddress:$(MANAGED_COFFBASE) $(MANAGED_STD_FLAGS) \
$(MANAGED_REFERENCES) $(SOURCES)
! IF "$(SERVICEPROXY)" != ""
copy /y $(TARGET) $(REFERENCE_DIR)\tempproxy.dll
webserviceutil /base:$(SERVICEBASE) /command:makeSDL /assembly:$(REFERENCE_DIR)\tempproxy.dll /out:$(PROXYPATH)
del $(REFERENCE_DIR)\tempproxy.dll
! ENDIF
$(BINPLACE_CMD)
! ENDIF # MANAGED_CODE || MANAGED_VB
! ENDIF # "$(MAKEDLL)" != ""
! ELSEIF "$(TARGETTYPE)"=="LIBRARY"
$(TARGET): $(OBJECTS) $(OBJLIBFILES)
@-erase $@ >nul 2>nul
-$(LIBRARIAN) @<<
$(HEADEROBJNAME: =
)
$(**: =
)
<<NOKEEP
$(LINT_CMD2)
! ELSEIF "$(TARGETTYPE)"=="DRIVER" || \
"$(TARGETTYPE)"=="MINIPORT"
$(TARGET): $(OBJECTS) $(BO_LIB) $(MACHINE_TARGETLIBS) $(CRTLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE_DLL)
$(ORDER: =
)
$(SECTION_INFO1)
$(SECTION_INFO2)
$(LINKER_OPTIDATA)
$(DRIVER_SWITCH)
-base:$(DRIVERBASE)
! IF "$(DRIVERTYPE)" == "VXD"
-def:$(DLLDEF)
! ELSE
-align:$(DRIVER_ALIGNMENT)
-subsystem:native$(SUBSYSTEM_NATVER)
-entry:$(DRIVER_ENTRY)$(ENTRY_SUFFIX)
!endif
-out:$(TARGET)
$(HEADEROBJNAME: =
)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
$(MAPDUMP_CMD)
$(LINT_CMD2)
! ELSEIF "$(TARGETTYPE)"=="GDI_DRIVER"
$(TARGET): $(OBJECTS) $(BO_LIB) $(MACHINE_TARGETLIBS) $(CRTLIBS) $(GDI_DRIVER_LIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE_DLL)
-dll
$(ORDER: =
)
$(SECTION_INFO1)
$(SECTION_INFO2)
$(LINKER_OPTIDATA)
$(DRIVER_SWITCH)
-align:$(DRIVER_ALIGNMENT)
-subsystem:native$(SUBSYSTEM_NATVER)
-base:$(DRIVERBASE)
-entry:$(GDI_DRIVER_ENTRY)$(GDI_ENTRY_SUFFIX)
-out:$(TARGET)
$(HEADEROBJNAME: =
)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
$(MAPDUMP_CMD)
$(LINT_CMD2)
! ELSEIF "$(TARGETTYPE)"=="EXPORT_DRIVER"
$(DYNLINK_EXP) $(DYNLINK_LIB) : \
! if "$(BUILD_PASS)" != "PASS2"
$(BO_LIB) $(LINKLIBS) $(DLLLIBOBJECTS) \
! endif
$(DLLDEF) $(OBJECTS)
-$(LIB_NAME) -out:$(DYNLINK_LIB) @<<
$(LIBRARIAN_FLAGS: =
)
-def:$(DLLDEF)
$(OBJECTS)
$(LINKLIBS)
<<NOKEEP
! if "$(DLLLIBOBJECTS)" != " "
-$(LIB_NAME) -out:$(DYNLINK_LIB) @<<
$(LIBRARIAN_FLAGS: =
)
$(DYNLINK_LIB)
$(DLLLIBOBJECTS)
<<NOKEEP
! endif
$(LINT_CMD2)
! IF "$(MAKEDLL)" != ""
$(TARGET): $(DYNLINK_EXP) $(OBJECTS) $(BO_LIB) $(CRTLIBS) $(MACHINE_TARGETLIBS) $(LINKLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(ORDER: =
)
$(LINKER_STACKSIZE_DLL)
$(LINKER_OPTIDATA)
$(DRIVER_SWITCH)
-align:$(DRIVER_ALIGNMENT)
-subsystem:native$(SUBSYSTEM_NATVER)
-base:$(DRIVERBASE)
-entry:$(DRIVER_ENTRY)$(ENTRY_SUFFIX)
-out:$(TARGET)
$(HEADEROBJNAME: =
)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAPSYM_CMD)
$(COMPRESS_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
! ENDIF
! ELSEIF "$(TARGETTYPE)"=="HAL"
! IF "$(MAKEDLL)" == ""
$(TARGET) $(TARGET:.lib=.exp): $(DLLDEF) $(O)\*.obj
-$(LIB_NAME) -out:$(@R).lib @<<
$(LIBRARIAN_FLAGS: =
)
-def:$(DLLDEF)
$(O)\*.obj
<<NOKEEP
! ELSE
$(TARGET:.dll=.lib) $(TARGET:.dll=.exp): $(DLLDEF) $(O)\*.obj
-$(LIB_NAME) -out:$(@R).lib @<<
$(LIBRARIAN_FLAGS: =
)
-def:$(DLLDEF)
$(O)\*.obj
<<NOKEEP
$(TARGET): $(TARGETPATH)\$(TARGET_DIRECTORY)\$(TARGETNAME).exp $(OBJECTS) $(CRTLIBS) $(MACHINE_TARGETLIBS) $(LINKLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE_DLL)
$(LINKER_OPTIDATA)
$(DRIVER_SWITCH)
-align:$(HAL_ALIGNMENT)
-subsystem:$(SUBSYSTEM)
-base:$(HALBASE)
-dll
-entry:HalInitSystem$(ENTRY_SUFFIX)
-out:$(TARGET)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
$(MAPDUMP_CMD)
$(LINT_CMD2)
! ENDIF
! ENDIF
!ENDIF
!IFNDEF NOLINK
! IF "$(NTTEST)" != ""
obj\$(TARGET_DIRECTORY)\$(NTTEST).exe: $(NTRES) obj\$(TARGET_DIRECTORY)\$(NTTEST).obj \
$(BO_LIB) $(KERNEL_LIBS) \
$(LINKLIBS)
$(LINKER) @<<
$(LINKER_FLAGS: =
)
$(LINKER_STACKSIZE)
$(ORDER: =
)
$(LINKGPSIZE: =
)
$(NTTEST_LINK_OPTIONS: =
)
$(LINKER_OPTIDATA)
$(DRIVER_SWITCH)
-align:$(KERNEL_ALIGNMENT)
-subsystem:$(SUBSYSTEM)
$(**: =
)
<<NOKEEP
$(POST_BUILD_CMD)
$(SCP_CMD)
$(SIGNCODE_CMD)
$(MAKE_PLACEFILE_CMD)
$(BINPLACE_CMD)
$(MAPDUMP_CMD)
$(LINT_CMD2)
! ENDIF
!ENDIF
!IF DEFINED(USE_LINT) && ("$(LINT_TYPE)" == "all")
$(O)\$(LINT_OUTPUT).$(LINT_EXT): $(TARGETOBJFILES)
$(LINT_ALL_CMD) $(SOURCES)
!ENDIF
$(O)\*.res : $(MASTER_VERSION_FILE)
!if defined(SXS_MANIFEST_OBJ2)
$(SXS_MANIFEST_OBJ2) : $(SXS_MANIFEST_OBJ1)
copy $(SXS_MANIFEST_OBJ1) $(SXS_MANIFEST_OBJ2)
!endif
#
# [GorN] 3/30/2000
#
# WPP. extra rules. Can't have them before the rule to build "all"
#
!if defined(RUN_WPP) && exist(obj\_tracewpp.mac)
WPP_DEFINE_RULES=1
! include obj\_tracewpp.mac
!endif