|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!ifndef _RULES_VC |
|
_RULES_VC = 1 |
|
|
|
|
|
|
|
|
|
RULES_VERSION_MAJOR = 1 |
|
RULES_VERSION_MINOR = 2 |
|
|
|
|
|
!if "$(PROJECT)" == "" |
|
!error *** Error: Macro PROJECT not defined! Please define it before including rules.vc |
|
!endif |
|
|
|
!if "$(PRJ_PACKAGE_TCLNAME)" == "" |
|
PRJ_PACKAGE_TCLNAME = $(PROJECT) |
|
!endif |
|
|
|
|
|
DOING_TCL = 0 |
|
DOING_TK = 0 |
|
!if "$(PROJECT)" == "tcl" |
|
DOING_TCL = 1 |
|
!elseif "$(PROJECT)" == "tk" |
|
DOING_TK = 1 |
|
!endif |
|
|
|
!ifndef NEED_TK |
|
|
|
!ifdef PROJECT_REQUIRES_TK |
|
NEED_TK = $(PROJECT_REQUIRES_TK) |
|
!else |
|
NEED_TK = 0 |
|
!endif |
|
!endif |
|
|
|
!ifndef NEED_TCL_SOURCE |
|
NEED_TCL_SOURCE = 0 |
|
!endif |
|
|
|
!ifdef NEED_TK_SOURCE |
|
!if $(NEED_TK_SOURCE) |
|
NEED_TK = 1 |
|
!endif |
|
!else |
|
NEED_TK_SOURCE = 0 |
|
!endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!if !defined(MSDEVDIR) && !defined(MSVCDIR) && !defined(VCINSTALLDIR) && !defined(MSSDK) && !defined(WINDOWSSDKDIR) |
|
MSG = ^ |
|
Visual C++ compiler environment not initialized. |
|
!error $(MSG) |
|
!endif |
|
|
|
|
|
|
|
|
|
|
|
!if "$(MAKEFILEVC)" == "" |
|
|
|
!if exist("$(PROJECT).vc") |
|
MAKEFILEVC = $(PROJECT).vc |
|
!elseif exist("makefile.vc") |
|
MAKEFILEVC = makefile.vc |
|
!endif |
|
!endif |
|
|
|
!if !exist("$(MAKEFILEVC)") |
|
MSG = ^ |
|
You must run nmake from the directory containing the project makefile.^ |
|
If you are doing that and getting this message, set the MAKEFILEVC^ |
|
macro to the name of the project makefile. |
|
!message WARNING: $(MSG) |
|
!endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RMDIR = rmdir /S /Q |
|
CPY = xcopy /i /y >NUL |
|
CPYDIR = xcopy /e /i /y >NUL |
|
COPY = copy /y >NUL |
|
MKDIR = mkdir |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ROOT = $(MAKEDIR)\.. |
|
|
|
|
|
!ifndef COMPATDIR |
|
COMPATDIR = $(ROOT)\compat |
|
!endif |
|
!ifndef DOCDIR |
|
DOCDIR = $(ROOT)\doc |
|
!endif |
|
!ifndef GENERICDIR |
|
GENERICDIR = $(ROOT)\generic |
|
!endif |
|
!ifndef TOOLSDIR |
|
TOOLSDIR = $(ROOT)\tools |
|
!endif |
|
!ifndef TESTDIR |
|
TESTDIR = $(ROOT)\tests |
|
!endif |
|
!ifndef LIBDIR |
|
!if exist("$(ROOT)\library") |
|
LIBDIR = $(ROOT)\library |
|
!else |
|
LIBDIR = $(ROOT)\lib |
|
!endif |
|
!endif |
|
!ifndef DEMODIR |
|
!if exist("$(LIBDIR)\demos") |
|
DEMODIR = $(LIBDIR)\demos |
|
!else |
|
DEMODIR = $(ROOT)\demos |
|
!endif |
|
!endif |
|
|
|
|
|
|
|
|
|
WINDIR = $(ROOT)\win |
|
|
|
!ifndef RCDIR |
|
!if exist("$(WINDIR)\rc") |
|
RCDIR = $(WINDIR)\rc |
|
!else |
|
RCDIR = $(WINDIR) |
|
!endif |
|
!endif |
|
RCDIR = $(RCDIR:/=\) |
|
|
|
|
|
|
|
|
|
!ifdef INSTALLDIR |
|
|
|
_INSTALLDIR = $(INSTALLDIR:/=\) |
|
!else |
|
|
|
_INSTALLDIR = $(HOMEDRIVE)\Tcl |
|
!endif |
|
|
|
!if $(DOING_TCL) |
|
|
|
|
|
|
|
|
|
_TCL_H = ..\generic\tcl.h |
|
|
|
|
|
|
|
!elseif $(DOING_TK) |
|
|
|
|
|
|
|
TCLINSTALL = 0 |
|
!if "$(TCLDIR)" == "" |
|
!if [echo TCLDIR = \> nmakehlp.out] \ |
|
|| [nmakehlp -L generic\tcl.h >> nmakehlp.out] |
|
!error *** Could not locate Tcl source directory. |
|
!endif |
|
!include nmakehlp.out |
|
!endif |
|
|
|
_TCLDIR = $(TCLDIR:/=\) |
|
_TCL_H = $(_TCLDIR)\generic\tcl.h |
|
!if !exist("$(_TCL_H)") |
|
!error Could not locate tcl.h. Please set the TCLDIR macro to point to the Tcl *source* directory. |
|
!endif |
|
|
|
_TK_H = ..\generic\tk.h |
|
|
|
|
|
|
|
!else |
|
|
|
|
|
|
|
|
|
|
|
!if "$(TCLDIR)" != "" |
|
|
|
_TCLDIR = $(TCLDIR:/=\) |
|
!if exist("$(_TCLDIR)\include\tcl.h") |
|
TCLINSTALL = 1 |
|
_TCL_H = $(_TCLDIR)\include\tcl.h |
|
!elseif exist("$(_TCLDIR)\generic\tcl.h") |
|
TCLINSTALL = 0 |
|
_TCL_H = $(_TCLDIR)\generic\tcl.h |
|
!endif |
|
|
|
!else |
|
|
|
|
|
|
|
|
|
!if exist("$(_INSTALLDIR)\include\tcl.h") && !$(NEED_TCL_SOURCE) |
|
|
|
TCLINSTALL = 1 |
|
TCLDIR = $(_INSTALLDIR)\.. |
|
|
|
|
|
_TCLDIR = $(_INSTALLDIR)\.. |
|
_TCL_H = $(_TCLDIR)\include\tcl.h |
|
|
|
!else |
|
|
|
!if [echo _TCLDIR = \> nmakehlp.out] \ |
|
|| [nmakehlp -L generic\tcl.h >> nmakehlp.out] |
|
!error *** Could not locate Tcl source directory. |
|
!endif |
|
!include nmakehlp.out |
|
TCLINSTALL = 0 |
|
TCLDIR = $(_TCLDIR) |
|
_TCL_H = $(_TCLDIR)\generic\tcl.h |
|
|
|
!endif |
|
|
|
!endif |
|
|
|
!ifndef _TCL_H |
|
MSG =^ |
|
Failed to find tcl.h. The TCLDIR macro is set incorrectly or is not set and default path does not contain tcl.h. |
|
!error $(MSG) |
|
!endif |
|
|
|
|
|
!if $(NEED_TK) |
|
|
|
!if "$(TKDIR)" != "" |
|
|
|
_TKDIR = $(TKDIR:/=\) |
|
!if exist("$(_TKDIR)\include\tk.h") |
|
TKINSTALL = 1 |
|
_TK_H = $(_TKDIR)\include\tk.h |
|
!elseif exist("$(_TKDIR)\generic\tk.h") |
|
TKINSTALL = 0 |
|
_TK_H = $(_TKDIR)\generic\tk.h |
|
!endif |
|
|
|
!else |
|
|
|
|
|
|
|
|
|
!if exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE) |
|
|
|
TKINSTALL = 1 |
|
|
|
|
|
_TKDIR = $(_INSTALLDIR)\.. |
|
_TK_H = $(_TKDIR)\include\tk.h |
|
TKDIR = $(_TKDIR) |
|
|
|
!else |
|
|
|
!if [echo _TKDIR = \> nmakehlp.out] \ |
|
|| [nmakehlp -L generic\tk.h >> nmakehlp.out] |
|
!error *** Could not locate Tk source directory. |
|
!endif |
|
!include nmakehlp.out |
|
TKINSTALL = 0 |
|
TKDIR = $(_TKDIR) |
|
_TK_H = $(_TKDIR)\generic\tk.h |
|
|
|
!endif |
|
|
|
!endif |
|
|
|
!ifndef _TK_H |
|
MSG =^ |
|
Failed to find tk.h. The TKDIR macro is set incorrectly or is not set and default path does not contain tk.h. |
|
!error $(MSG) |
|
!endif |
|
|
|
!endif |
|
|
|
!if $(NEED_TCL_SOURCE) && $(TCLINSTALL) |
|
MSG = ^ |
|
*** Warning: This extension requires the source distribution of Tcl.^ |
|
*** Please set the TCLDIR macro to point to the Tcl sources. |
|
!error $(MSG) |
|
!endif |
|
|
|
!if $(NEED_TK_SOURCE) |
|
!if $(TKINSTALL) |
|
MSG = ^ |
|
*** Warning: This extension requires the source distribution of Tk.^ |
|
*** Please set the TKDIR macro to point to the Tk sources. |
|
!error $(MSG) |
|
!endif |
|
!endif |
|
|
|
|
|
|
|
|
|
!if exist("$(_INSTALLDIR)\include\tcl.h") |
|
_INSTALLDIR=$(_INSTALLDIR)\lib |
|
!endif |
|
|
|
|
|
!endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cc32 = $(CC) |
|
link32 = link |
|
lib32 = lib |
|
rc32 = $(RC) |
|
|
|
|
|
|
|
|
|
|
|
|
|
_HASH=^ |
|
_VC_MANIFEST_EMBED_EXE= |
|
_VC_MANIFEST_EMBED_DLL= |
|
VCVER=0 |
|
!if ![echo VCVERSION=_MSC_VER > vercl.x] \ |
|
&& ![echo $(_HASH)if defined(_M_IX86) >> vercl.x] \ |
|
&& ![echo ARCH=IX86 >> vercl.x] \ |
|
&& ![echo $(_HASH)elif defined(_M_AMD64) >> vercl.x] \ |
|
&& ![echo ARCH=AMD64 >> vercl.x] \ |
|
&& ![echo $(_HASH)endif >> vercl.x] \ |
|
&& ![$(cc32) -nologo -TC -P vercl.x 2>NUL] |
|
!include vercl.i |
|
!if $(VCVERSION) < 1900 |
|
!if ![echo VCVER= ^\> vercl.vc] \ |
|
&& ![set /a $(VCVERSION) / 100 - 6 >> vercl.vc] |
|
!include vercl.vc |
|
!endif |
|
!else |
|
|
|
|
|
VCVER = $(VCVERSION) |
|
!endif |
|
!endif |
|
|
|
!if ![del 2>NUL /q/f vercl.x vercl.i vercl.vc] |
|
!endif |
|
|
|
|
|
|
|
!ifdef MACHINE |
|
!if "$(MACHINE)" == "x86" |
|
!undef MACHINE |
|
MACHINE = IX86 |
|
!elseif "$(MACHINE)" == "x64" |
|
!undef MACHINE |
|
MACHINE = AMD64 |
|
!endif |
|
!if "$(MACHINE)" != "$(ARCH)" |
|
!error Specified MACHINE macro $(MACHINE) does not match detected target architecture $(ARCH). |
|
!endif |
|
!else |
|
MACHINE=$(ARCH) |
|
!endif |
|
|
|
|
|
|
|
|
|
!if ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i x86] |
|
NATIVE_ARCH=IX86 |
|
!else |
|
NATIVE_ARCH=AMD64 |
|
!endif |
|
|
|
|
|
!if $(VCVERSION) >= 1400 |
|
_VC_MANIFEST_EMBED_EXE=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 |
|
_VC_MANIFEST_EMBED_DLL=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 |
|
!endif |
|
|
|
!ifndef CFG_ENCODING |
|
CFG_ENCODING = \"cp1252\" |
|
!endif |
|
|
|
################################################################ |
|
# 4. Build the nmakehlp program |
|
# This is a helper app we need to overcome nmake's limiting |
|
# environment. We will call out to it to get various bits of |
|
# information about supported compiler options etc. |
|
# |
|
# Tcl itself will always use the nmakehlp.c program which is |
|
# in its own source. This is the "master" copy and kept updated. |
|
# |
|
# Extensions built against an installed Tcl will use the installed |
|
# copy of Tcl's nmakehlp.c if there is one and their own version |
|
# otherwise. In the latter case, they would also be using their own |
|
# rules.vc. Note that older versions of Tcl do not install nmakehlp.c |
|
# or rules.vc. |
|
# |
|
# Extensions built against Tcl sources will use the one from the Tcl source. |
|
# |
|
# When building an extension using a sufficiently new version of Tcl, |
|
# rules-ext.vc will define NMAKEHLPC appropriately to point to the |
|
# copy of nmakehlp.c to be used. |
|
|
|
!ifndef NMAKEHLPC |
|
# Default to the one in the current directory (the extension's own nmakehlp.c) |
|
NMAKEHLPC = nmakehlp.c |
|
|
|
!if !$(DOING_TCL) |
|
!if $(TCLINSTALL) |
|
!if exist("$(_TCLDIR)\lib\nmake\nmakehlp.c") |
|
NMAKEHLPC = $(_TCLDIR)\lib\nmake\nmakehlp.c |
|
!endif |
|
!else # ! $(TCLINSTALL) |
|
!if exist("$(_TCLDIR)\win\nmakehlp.c") |
|
NMAKEHLPC = $(_TCLDIR)\win\nmakehlp.c |
|
!endif |
|
!endif # $(TCLINSTALL) |
|
!endif # !$(DOING_TCL) |
|
|
|
!endif # NMAKEHLPC |
|
|
|
# We always build nmakehlp even if it exists since we do not know |
|
# what source it was built from. |
|
!if [$(cc32) -nologo "$(NMAKEHLPC)" -link -subsystem:console > nul] |
|
!endif |
|
|
|
################################################################ |
|
# 5. Test for compiler features |
|
# Visual C++ compiler options have changed over the years. Check |
|
# which options are supported by the compiler in use. |
|
# |
|
# The following macros are set: |
|
# OPTIMIZATIONS - the compiler flags to be used for optimized builds |
|
# DEBUGFLAGS - the compiler flags to be used for debug builds |
|
# LINKERFLAGS - Flags passed to the linker |
|
# |
|
# Note that these are the compiler settings *available*, not those |
|
# that will be *used*. The latter depends on the OPTS macro settings |
|
# which we have not yet parsed. |
|
# |
|
# Also note that some of the flags in OPTIMIZATIONS are not really |
|
# related to optimization. They are placed there only for legacy reasons |
|
# as some extensions expect them to be included in that macro. |
|
|
|
# -Op improves float consistency. Note only needed for older compilers |
|
# Newer compilers do not need or support this option. |
|
!if [nmakehlp -c -Op] |
|
FPOPTS = -Op |
|
!endif |
|
|
|
# Strict floating point semantics - present in newer compilers in lieu of -Op |
|
!if [nmakehlp -c -fp:strict] |
|
FPOPTS = $(FPOPTS) -fp:strict |
|
!endif |
|
|
|
!if "$(MACHINE)" == "IX86" |
|
### test for pentium errata |
|
!if [nmakehlp -c -QI0f] |
|
!message *** Compiler has 'Pentium 0x0f fix' |
|
FPOPTS = $(FPOPTS) -QI0f |
|
!else |
|
!message *** Compiler does not have 'Pentium 0x0f fix' |
|
!endif |
|
!endif |
|
|
|
### test for optimizations |
|
# /O2 optimization includes /Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy as per |
|
# documentation. Note we do NOT want /Gs as that inserts a _chkstk |
|
# stack probe at *every* function entry, not just those with more than |
|
# a page of stack allocation resulting in a performance hit. However, |
|
# /O2 documentation is misleading as its stack probes are simply the |
|
# default page size locals allocation probes and not what is implied |
|
# by an explicit /Gs option. |
|
|
|
OPTIMIZATIONS = $(FPOPTS) |
|
|
|
!if [nmakehlp -c -O2] |
|
OPTIMIZING = 1 |
|
OPTIMIZATIONS = $(OPTIMIZATIONS) -O2 |
|
!else |
|
# Legacy, really. All modern compilers support this |
|
!message *** Compiler does not have 'Optimizations' |
|
OPTIMIZING = 0 |
|
!endif |
|
|
|
# Checks for buffer overflows in local arrays |
|
!if [nmakehlp -c -GS] |
|
OPTIMIZATIONS = $(OPTIMIZATIONS) -GS |
|
!endif |
|
|
|
# Link time optimization. Note that this option (potentially) makes |
|
# generated libraries only usable by the specific VC++ version that |
|
# created it. Requires /LTCG linker option |
|
!if [nmakehlp -c -GL] |
|
OPTIMIZATIONS = $(OPTIMIZATIONS) -GL |
|
CC_GL_OPT_ENABLED = 1 |
|
!else |
|
# In newer compilers -GL and -YX are incompatible. |
|
!if [nmakehlp -c -YX] |
|
OPTIMIZATIONS = $(OPTIMIZATIONS) -YX |
|
!endif |
|
!endif # [nmakehlp -c -GL] |
|
|
|
DEBUGFLAGS = $(FPOPTS) |
|
|
|
# Run time error checks. Not available or valid in a release, non-debug build |
|
# RTC is for modern compilers, -GZ is legacy |
|
!if [nmakehlp -c -RTC1] |
|
DEBUGFLAGS = $(DEBUGFLAGS) -RTC1 |
|
!elseif [nmakehlp -c -GZ] |
|
DEBUGFLAGS = $(DEBUGFLAGS) -GZ |
|
!endif |
|
|
|
#---------------------------------------------------------------- |
|
# Linker flags |
|
|
|
# LINKER_TESTFLAGS are for internal use when we call nmakehlp to test |
|
# if the linker supports a specific option. Without these flags link will |
|
# return "LNK1561: entry point must be defined" error compiling from VS-IDE: |
|
# They are not passed through to the actual application / extension |
|
# link rules. |
|
!ifndef LINKER_TESTFLAGS |
|
LINKER_TESTFLAGS = /DLL /NOENTRY /OUT:nmakehlp.out |
|
!endif |
|
|
|
LINKERFLAGS = |
|
|
|
# If compiler has enabled link time optimization, linker must too with -ltcg |
|
!ifdef CC_GL_OPT_ENABLED |
|
!if [nmakehlp -l -ltcg $(LINKER_TESTFLAGS)] |
|
LINKERFLAGS = $(LINKERFLAGS) -ltcg |
|
!endif |
|
!endif |
|
|
|
######################################################################## |
|
# 6. Parse the OPTS macro to work out the requested build configuration. |
|
# Based on this, we will construct the actual switches to be passed to the |
|
# compiler and linker using the macros defined in the previous section. |
|
# The following macros are defined by this section based on OPTS |
|
# STATIC_BUILD - 0 -> Tcl is to be built as a shared library |
|
# 1 -> build as a static library and shell |
|
# TCL_THREADS - legacy but always 1 on Windows since winsock requires it. |
|
# DEBUG - 1 -> debug build, 0 -> release builds |
|
# SYMBOLS - 1 -> generate PDB's, 0 -> no PDB's |
|
# PROFILE - 1 -> generate profiling info, 0 -> no profiling |
|
# PGO - 1 -> profile based optimization, 0 -> no |
|
# MSVCRT - 1 -> link to dynamic C runtime even when building static Tcl build |
|
# 0 -> link to static C runtime for static Tcl build. |
|
# Does not impact shared Tcl builds (STATIC_BUILD == 0) |
|
# TCL_USE_STATIC_PACKAGES - 1 -> statically link the registry and dde extensions |
|
# in the Tcl shell. 0 -> keep them as shared libraries |
|
# Does not impact shared Tcl builds. |
|
# USE_THREAD_ALLOC - 1 -> Use a shared global free pool for allocation. |
|
# 0 -> Use the non-thread allocator. |
|
# UNCHECKED - 1 -> when doing a debug build with symbols, use the release |
|
# C runtime, 0 -> use the debug C runtime. |
|
# USE_STUBS - 1 -> compile to use stubs interfaces, 0 -> direct linking |
|
# CONFIG_CHECK - 1 -> check current build configuration against Tcl |
|
# configuration (ignored for Tcl itself) |
|
# Further, LINKERFLAGS are modified based on above. |
|
|
|
# Default values for all the above |
|
STATIC_BUILD = 0 |
|
TCL_THREADS = 1 |
|
DEBUG = 0 |
|
SYMBOLS = 0 |
|
PROFILE = 0 |
|
PGO = 0 |
|
MSVCRT = 1 |
|
TCL_USE_STATIC_PACKAGES = 0 |
|
USE_THREAD_ALLOC = 1 |
|
UNCHECKED = 0 |
|
CONFIG_CHECK = 1 |
|
!if $(DOING_TCL) |
|
USE_STUBS = 0 |
|
!else |
|
USE_STUBS = 1 |
|
!endif |
|
|
|
# If OPTS is not empty AND does not contain "none" which turns off all OPTS |
|
# set the above macros based on OPTS content |
|
!if "$(OPTS)" != "" && ![nmakehlp -f "$(OPTS)" "none"] |
|
|
|
# OPTS are specified, parse them |
|
|
|
!if [nmakehlp -f $(OPTS) "static"] |
|
!message *** Doing static |
|
STATIC_BUILD = 1 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "nostubs"] |
|
!message *** Not using stubs |
|
USE_STUBS = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "nomsvcrt"] |
|
!message *** Doing nomsvcrt |
|
MSVCRT = 0 |
|
!else |
|
!if [nmakehlp -f $(OPTS) "msvcrt"] |
|
!message *** Doing msvcrt |
|
MSVCRT = 1 |
|
!else |
|
!if !$(STATIC_BUILD) |
|
MSVCRT = 1 |
|
!else |
|
MSVCRT = 0 |
|
!endif |
|
!endif |
|
!endif # [nmakehlp -f $(OPTS) "nomsvcrt"] |
|
|
|
!if [nmakehlp -f $(OPTS) "staticpkg"] && $(STATIC_BUILD) |
|
!message *** Doing staticpkg |
|
TCL_USE_STATIC_PACKAGES = 1 |
|
!else |
|
TCL_USE_STATIC_PACKAGES = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "nothreads"] |
|
!message *** Compile explicitly for non-threaded tcl |
|
TCL_THREADS = 0 |
|
USE_THREAD_ALLOC= 0 |
|
!else |
|
TCL_THREADS = 1 |
|
USE_THREAD_ALLOC= 1 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "symbols"] |
|
!message *** Doing symbols |
|
DEBUG = 1 |
|
!else |
|
DEBUG = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "pdbs"] |
|
!message *** Doing pdbs |
|
SYMBOLS = 1 |
|
!else |
|
SYMBOLS = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "profile"] |
|
!message *** Doing profile |
|
PROFILE = 1 |
|
!else |
|
PROFILE = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "pgi"] |
|
!message *** Doing profile guided optimization instrumentation |
|
PGO = 1 |
|
!elseif [nmakehlp -f $(OPTS) "pgo"] |
|
!message *** Doing profile guided optimization |
|
PGO = 2 |
|
!else |
|
PGO = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "loimpact"] |
|
!message *** Warning: ignoring option "loimpact" - deprecated on modern Windows. |
|
!endif |
|
|
|
# TBD - should get rid of this option |
|
!if [nmakehlp -f $(OPTS) "thrdalloc"] |
|
!message *** Doing thrdalloc |
|
USE_THREAD_ALLOC = 1 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "tclalloc"] |
|
USE_THREAD_ALLOC = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "unchecked"] |
|
!message *** Doing unchecked |
|
UNCHECKED = 1 |
|
!else |
|
UNCHECKED = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(OPTS) "noconfigcheck"] |
|
CONFIG_CHECK = 1 |
|
!else |
|
CONFIG_CHECK = 0 |
|
!endif |
|
|
|
!endif # "$(OPTS)" != "" && ... parsing of OPTS |
|
|
|
# Set linker flags based on above |
|
|
|
!if $(PGO) > 1 |
|
!if [nmakehlp -l -ltcg:pgoptimize $(LINKER_TESTFLAGS)] |
|
LINKERFLAGS = $(LINKERFLAGS:-ltcg=) -ltcg:pgoptimize |
|
!else |
|
MSG=^ |
|
This compiler does not support profile guided optimization. |
|
!error $(MSG) |
|
!endif |
|
!elseif $(PGO) > 0 |
|
!if [nmakehlp -l -ltcg:pginstrument $(LINKER_TESTFLAGS)] |
|
LINKERFLAGS = $(LINKERFLAGS:-ltcg=) -ltcg:pginstrument |
|
!else |
|
MSG=^ |
|
This compiler does not support profile guided optimization. |
|
!error $(MSG) |
|
!endif |
|
!endif |
|
|
|
################################################################ |
|
# 7. Parse the STATS macro to configure code instrumentation |
|
# The following macros are set by this section: |
|
# TCL_MEM_DEBUG - 1 -> enables memory allocation instrumentation |
|
# 0 -> disables |
|
# TCL_COMPILE_DEBUG - 1 -> enables byte compiler logging |
|
# 0 -> disables |
|
|
|
# Default both are off |
|
TCL_MEM_DEBUG = 0 |
|
TCL_COMPILE_DEBUG = 0 |
|
|
|
!if "$(STATS)" != "" && ![nmakehlp -f "$(STATS)" "none"] |
|
|
|
!if [nmakehlp -f $(STATS) "memdbg"] |
|
!message *** Doing memdbg |
|
TCL_MEM_DEBUG = 1 |
|
!else |
|
TCL_MEM_DEBUG = 0 |
|
!endif |
|
|
|
!if [nmakehlp -f $(STATS) "compdbg"] |
|
!message *** Doing compdbg |
|
TCL_COMPILE_DEBUG = 1 |
|
!else |
|
TCL_COMPILE_DEBUG = 0 |
|
!endif |
|
|
|
!endif |
|
|
|
#################################################################### |
|
# 8. Parse the CHECKS macro to configure additional compiler checks |
|
# The following macros are set by this section: |
|
# WARNINGS - compiler switches that control the warnings level |
|
# TCL_NO_DEPRECATED - 1 -> disable support for deprecated functions |
|
# 0 -> enable deprecated functions |
|
|
|
# Defaults - Permit deprecated functions and warning level 3 |
|
TCL_NO_DEPRECATED = 0 |
|
WARNINGS = -W3 |
|
|
|
!if "$(CHECKS)" != "" && ![nmakehlp -f "$(CHECKS)" "none"] |
|
|
|
!if [nmakehlp -f $(CHECKS) "nodep"] |
|
!message *** Doing nodep check |
|
TCL_NO_DEPRECATED = 1 |
|
!endif |
|
|
|
!if [nmakehlp -f $(CHECKS) "fullwarn"] |
|
!message *** Doing full warnings check |
|
WARNINGS = -W4 |
|
!if [nmakehlp -l -warn:3 $(LINKER_TESTFLAGS)] |
|
LINKERFLAGS = $(LINKERFLAGS) -warn:3 |
|
!endif |
|
!endif |
|
|
|
!if [nmakehlp -f $(CHECKS) "64bit"] && [nmakehlp -c -Wp64] |
|
!message *** Doing 64bit portability warnings |
|
WARNINGS = $(WARNINGS) -Wp64 |
|
!endif |
|
|
|
!endif |
|
|
|
################################################################ |
|
# 9. Extract various version numbers |
|
# For Tcl and Tk, version numbers are extracted from tcl.h and tk.h |
|
# respectively. For extensions, versions are extracted from the |
|
# configure.in or configure.ac from the TEA configuration if it |
|
# exists, and unset otherwise. |
|
# Sets the following macros: |
|
# TCL_MAJOR_VERSION |
|
# TCL_MINOR_VERSION |
|
# TCL_PATCH_LEVEL |
|
# TCL_VERSION |
|
# TK_MAJOR_VERSION |
|
# TK_MINOR_VERSION |
|
# TK_PATCH_LEVEL |
|
# TK_VERSION |
|
# DOTVERSION - set as (for example) 2.5 |
|
# VERSION - set as (for example 25) |
|
#-------------------------------------------------------------- |
|
|
|
!if [echo REM = This file is generated from rules.vc > versions.vc] |
|
!endif |
|
!if [echo TCL_MAJOR_VERSION = \>> versions.vc] \ |
|
&& [nmakehlp -V "$(_TCL_H)" TCL_MAJOR_VERSION >> versions.vc] |
|
!endif |
|
!if [echo TCL_MINOR_VERSION = \>> versions.vc] \ |
|
&& [nmakehlp -V "$(_TCL_H)" TCL_MINOR_VERSION >> versions.vc] |
|
!endif |
|
!if [echo TCL_PATCH_LEVEL = \>> versions.vc] \ |
|
&& [nmakehlp -V "$(_TCL_H)" TCL_PATCH_LEVEL >> versions.vc] |
|
!endif |
|
|
|
!if defined(_TK_H) |
|
!if [echo TK_MAJOR_VERSION = \>> versions.vc] \ |
|
&& [nmakehlp -V $(_TK_H) TK_MAJOR_VERSION >> versions.vc] |
|
!endif |
|
!if [echo TK_MINOR_VERSION = \>> versions.vc] \ |
|
&& [nmakehlp -V $(_TK_H) TK_MINOR_VERSION >> versions.vc] |
|
!endif |
|
!if [echo TK_PATCH_LEVEL = \>> versions.vc] \ |
|
&& [nmakehlp -V $(_TK_H) TK_PATCH_LEVEL >> versions.vc] |
|
!endif |
|
!endif # _TK_H |
|
|
|
!include versions.vc |
|
|
|
TCL_VERSION = $(TCL_MAJOR_VERSION)$(TCL_MINOR_VERSION) |
|
TCL_DOTVERSION = $(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION) |
|
!if defined(_TK_H) |
|
TK_VERSION = $(TK_MAJOR_VERSION)$(TK_MINOR_VERSION) |
|
TK_DOTVERSION = $(TK_MAJOR_VERSION).$(TK_MINOR_VERSION) |
|
!endif |
|
|
|
# Set DOTVERSION and VERSION |
|
!if $(DOING_TCL) |
|
|
|
DOTVERSION = $(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION) |
|
VERSION = $(TCL_VERSION) |
|
|
|
!elseif $(DOING_TK) |
|
|
|
DOTVERSION = $(TK_DOTVERSION) |
|
VERSION = $(TK_VERSION) |
|
|
|
!else # Doing a non-Tk extension |
|
|
|
# If parent makefile has not defined DOTVERSION, try to get it from TEA |
|
# first from a configure.in file, and then from configure.ac |
|
!ifndef DOTVERSION |
|
!if [echo DOTVERSION = \> versions.vc] \ |
|
|| [nmakehlp -V $(ROOT)\configure.in ^[$(PROJECT)^] >> versions.vc] |
|
!if [echo DOTVERSION = \> versions.vc] \ |
|
|| [nmakehlp -V $(ROOT)\configure.ac ^[$(PROJECT)^] >> versions.vc] |
|
!error *** Could not figure out extension version. Please define DOTVERSION in parent makefile before including rules.vc. |
|
!endif |
|
!endif |
|
!include versions.vc |
|
!endif # DOTVERSION |
|
VERSION = $(DOTVERSION:.=) |
|
|
|
!endif # $(DOING_TCL) ... etc. |
|
|
|
################################################################ |
|
# 10. Construct output directory and file paths |
|
# Figure-out how to name our intermediate and output directories. |
|
# In order to avoid inadvertent mixing of object files built using |
|
# different compilers, build configurations etc., |
|
# |
|
# Naming convention (suffixes): |
|
# t = full thread support. |
|
# s = static library (as opposed to an import library) |
|
# g = linked to the debug enabled C run-time. |
|
# x = special static build when it links to the dynamic C run-time. |
|
# |
|
# The following macros are set in this section: |
|
# SUFX - the suffix to use for binaries based on above naming convention |
|
# BUILDDIRTOP - the toplevel default output directory |
|
# is of the form {Release,Debug}[_AMD64][_COMPILERVERSION] |
|
# TMP_DIR - directory where object files are created |
|
# OUT_DIR - directory where output executables are created |
|
# Both TMP_DIR and OUT_DIR are defaulted only if not defined by the |
|
# parent makefile (or command line). The default values are |
|
# based on BUILDDIRTOP. |
|
# STUBPREFIX - name of the stubs library for this project |
|
# PRJIMPLIB - output path of the generated project import library |
|
# PRJLIBNAME - name of generated project library |
|
# PRJLIB - output path of generated project library |
|
# PRJSTUBLIBNAME - name of the generated project stubs library |
|
# PRJSTUBLIB - output path of the generated project stubs library |
|
# RESFILE - output resource file (only if not static build) |
|
|
|
SUFX = tsgx |
|
|
|
!if $(DEBUG) |
|
BUILDDIRTOP = Debug |
|
!else |
|
BUILDDIRTOP = Release |
|
!endif |
|
|
|
!if "$(MACHINE)" != "IX86" |
|
BUILDDIRTOP =$(BUILDDIRTOP)_$(MACHINE) |
|
!endif |
|
!if $(VCVER) > 6 |
|
BUILDDIRTOP =$(BUILDDIRTOP)_VC$(VCVER) |
|
!endif |
|
|
|
!if !$(DEBUG) || $(DEBUG) && $(UNCHECKED) |
|
SUFX = $(SUFX:g=) |
|
!endif |
|
|
|
TMP_DIRFULL = .\$(BUILDDIRTOP)\$(PROJECT)_ThreadedDynamicStaticX |
|
|
|
!if !$(STATIC_BUILD) |
|
TMP_DIRFULL = $(TMP_DIRFULL:Static=) |
|
SUFX = $(SUFX:s=) |
|
EXT = dll |
|
TMP_DIRFULL = $(TMP_DIRFULL:X=) |
|
SUFX = $(SUFX:x=) |
|
!else |
|
TMP_DIRFULL = $(TMP_DIRFULL:Dynamic=) |
|
EXT = lib |
|
!if !$(MSVCRT) |
|
TMP_DIRFULL = $(TMP_DIRFULL:X=) |
|
SUFX = $(SUFX:x=) |
|
!endif |
|
!endif |
|
|
|
!if !$(TCL_THREADS) |
|
TMP_DIRFULL = $(TMP_DIRFULL:Threaded=) |
|
SUFX = $(SUFX:t=) |
|
!endif |
|
|
|
!ifndef TMP_DIR |
|
TMP_DIR = $(TMP_DIRFULL) |
|
!ifndef OUT_DIR |
|
OUT_DIR = .\$(BUILDDIRTOP) |
|
!endif |
|
!else |
|
!ifndef OUT_DIR |
|
OUT_DIR = $(TMP_DIR) |
|
!endif |
|
!endif |
|
|
|
# Relative paths -> absolute |
|
!if [echo OUT_DIR = \> nmakehlp.out] \ |
|
|| [nmakehlp -Q "$(OUT_DIR)" >> nmakehlp.out] |
|
!error *** Could not fully qualify path OUT_DIR=$(OUT_DIR) |
|
!endif |
|
!if [echo TMP_DIR = \>> nmakehlp.out] \ |
|
|| [nmakehlp -Q "$(TMP_DIR)" >> nmakehlp.out] |
|
!error *** Could not fully qualify path TMP_DIR=$(TMP_DIR) |
|
!endif |
|
!include nmakehlp.out |
|
|
|
# The name of the stubs library for the project being built |
|
STUBPREFIX = $(PROJECT)stub |
|
|
|
# Set up paths to various Tcl executables and libraries needed by extensions |
|
!if $(DOING_TCL) |
|
|
|
TCLSHNAME = $(PROJECT)sh$(TCL_VERSION)$(SUFX).exe |
|
TCLSH = $(OUT_DIR)\$(TCLSHNAME) |
|
TCLIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib |
|
TCLLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT) |
|
TCLLIB = $(OUT_DIR)\$(TCLLIBNAME) |
|
|
|
TCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib |
|
TCLSTUBLIB = $(OUT_DIR)\$(TCLSTUBLIBNAME) |
|
TCL_INCLUDES = -I"$(WINDIR)" -I"$(GENERICDIR)" |
|
|
|
!else # ! $(DOING_TCL) |
|
|
|
!if $(TCLINSTALL) # Building against an installed Tcl |
|
|
|
# When building extensions, we need to locate tclsh. Depending on version |
|
# of Tcl we are building against, this may or may not have a "t" suffix. |
|
# Try various possibilities in turn. |
|
TCLSH = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX).exe |
|
!if !exist("$(TCLSH)") && $(TCL_THREADS) |
|
TCLSH = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX).exe |
|
!endif |
|
!if !exist("$(TCLSH)") |
|
TCLSH = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX:t=).exe |
|
!endif |
|
|
|
TCLSTUBLIB = $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib |
|
TCLIMPLIB = $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX).lib |
|
# When building extensions, may be linking against Tcl that does not add |
|
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. |
|
!if !exist("$(TCLIMPLIB)") |
|
TCLIMPLIB = $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).lib |
|
!endif |
|
TCL_LIBRARY = $(_TCLDIR)\lib |
|
TCLREGLIB = $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib |
|
TCLDDELIB = $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib |
|
TCLTOOLSDIR = \must\have\tcl\sources\to\build\this\target |
|
TCL_INCLUDES = -I"$(_TCLDIR)\include" |
|
|
|
!else # Building against Tcl sources |
|
|
|
TCLSH = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX).exe |
|
!if !exist($(TCLSH)) && $(TCL_THREADS) |
|
TCLSH = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX).exe |
|
!endif |
|
!if !exist($(TCLSH)) |
|
TCLSH = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe |
|
!endif |
|
TCLSTUBLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib |
|
TCLIMPLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX).lib |
|
# When building extensions, may be linking against Tcl that does not add |
|
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. |
|
!if !exist("$(TCLIMPLIB)") |
|
TCLIMPLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).lib |
|
!endif |
|
TCL_LIBRARY = $(_TCLDIR)\library |
|
TCLREGLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib |
|
TCLDDELIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib |
|
TCLTOOLSDIR = $(_TCLDIR)\tools |
|
TCL_INCLUDES = -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win" |
|
|
|
!endif # TCLINSTALL |
|
|
|
tcllibs = "$(TCLSTUBLIB)" "$(TCLIMPLIB)" |
|
|
|
!endif # $(DOING_TCL) |
|
|
|
# We need a tclsh that will run on the host machine as part of the build. |
|
# IX86 runs on all architectures. |
|
!ifndef TCLSH_NATIVE |
|
!if "$(MACHINE)" == "IX86" || "$(MACHINE)" == "$(NATIVE_ARCH)" |
|
TCLSH_NATIVE = $(TCLSH) |
|
!else |
|
!error You must explicitly set TCLSH_NATIVE for cross-compilation |
|
!endif |
|
!endif |
|
|
|
# Do the same for Tk and Tk extensions that require the Tk libraries |
|
!if $(DOING_TK) || $(NEED_TK) |
|
WISHNAMEPREFIX = wish |
|
WISHNAME = $(WISHNAMEPREFIX)$(TK_VERSION)$(SUFX).exe |
|
TKLIBNAME = $(PROJECT)$(TK_VERSION)$(SUFX).$(EXT) |
|
TKSTUBLIBNAME = tkstub$(TK_VERSION).lib |
|
TKIMPLIBNAME = tk$(TK_VERSION)$(SUFX).lib |
|
|
|
!if $(DOING_TK) |
|
WISH = $(OUT_DIR)\$(WISHNAME) |
|
TKSTUBLIB = $(OUT_DIR)\$(TKSTUBLIBNAME) |
|
TKIMPLIB = $(OUT_DIR)\$(TKIMPLIBNAME) |
|
TKLIB = $(OUT_DIR)\$(TKLIBNAME) |
|
TK_INCLUDES = -I"$(WINDIR)" -I"$(GENERICDIR)" |
|
|
|
!else # effectively NEED_TK |
|
|
|
!if $(TKINSTALL) # Building against installed Tk |
|
WISH = $(_TKDIR)\bin\$(WISHNAME) |
|
TKSTUBLIB = $(_TKDIR)\lib\$(TKSTUBLIBNAME) |
|
TKIMPLIB = $(_TKDIR)\lib\$(TKIMPLIBNAME) |
|
# When building extensions, may be linking against Tk that does not add |
|
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. |
|
!if !exist("$(TKIMPLIB)") |
|
TKIMPLIBNAME = tk$(TK_VERSION)$(SUFX:t=).lib |
|
TKIMPLIB = $(_TKDIR)\lib\$(TKIMPLIBNAME) |
|
!endif |
|
TK_INCLUDES = -I"$(_TKDIR)\include" |
|
!else # Building against Tk sources |
|
WISH = $(_TKDIR)\win\$(BUILDDIRTOP)\$(WISHNAME) |
|
TKSTUBLIB = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKSTUBLIBNAME) |
|
TKIMPLIB = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKIMPLIBNAME) |
|
# When building extensions, may be linking against Tk that does not add |
|
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. |
|
!if !exist("$(TKIMPLIB)") |
|
TKIMPLIBNAME = tk$(TK_VERSION)$(SUFX:t=).lib |
|
TKIMPLIB = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKIMPLIBNAME) |
|
!endif |
|
TK_INCLUDES = -I"$(_TKDIR)\generic" -I"$(_TKDIR)\win" -I"$(_TKDIR)\xlib" |
|
!endif # TKINSTALL |
|
tklibs = "$(TKSTUBLIB)" "$(TKIMPLIB)" |
|
|
|
!endif # $(DOING_TK) |
|
!endif # $(DOING_TK) || $(NEED_TK) |
|
|
|
# Various output paths |
|
PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib |
|
PRJLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT) |
|
PRJLIB = $(OUT_DIR)\$(PRJLIBNAME) |
|
|
|
PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib |
|
PRJSTUBLIB = $(OUT_DIR)\$(PRJSTUBLIBNAME) |
|
|
|
# If extension parent makefile has not defined a resource definition file, |
|
# we will generate one from standard template. |
|
!if !$(DOING_TCL) && !$(DOING_TK) && !$(STATIC_BUILD) |
|
!ifdef RCFILE |
|
RESFILE = $(TMP_DIR)\$(RCFILE:.rc=.res) |
|
!else |
|
RESFILE = $(TMP_DIR)\$(PROJECT).res |
|
!endif |
|
!endif |
|
|
|
################################################################### |
|
# 11. Construct the paths for the installation directories |
|
# The following macros get defined in this section: |
|
# LIB_INSTALL_DIR - where libraries should be installed |
|
# BIN_INSTALL_DIR - where the executables should be installed |
|
# DOC_INSTALL_DIR - where documentation should be installed |
|
# SCRIPT_INSTALL_DIR - where scripts should be installed |
|
# INCLUDE_INSTALL_DIR - where C include files should be installed |
|
# DEMO_INSTALL_DIR - where demos should be installed |
|
# PRJ_INSTALL_DIR - where package will be installed (not set for Tcl and Tk) |
|
|
|
!if $(DOING_TCL) || $(DOING_TK) |
|
LIB_INSTALL_DIR = $(_INSTALLDIR)\lib |
|
BIN_INSTALL_DIR = $(_INSTALLDIR)\bin |
|
DOC_INSTALL_DIR = $(_INSTALLDIR)\doc |
|
!if $(DOING_TCL) |
|
SCRIPT_INSTALL_DIR = $(_INSTALLDIR)\lib\$(PROJECT)$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION) |
|
!else # DOING_TK |
|
SCRIPT_INSTALL_DIR = $(_INSTALLDIR)\lib\$(PROJECT)$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION) |
|
!endif |
|
DEMO_INSTALL_DIR = $(SCRIPT_INSTALL_DIR)\demos |
|
INCLUDE_INSTALL_DIR = $(_INSTALLDIR)\include |
|
|
|
!else # extension other than Tk |
|
|
|
PRJ_INSTALL_DIR = $(_INSTALLDIR)\$(PROJECT)$(DOTVERSION) |
|
LIB_INSTALL_DIR = $(PRJ_INSTALL_DIR) |
|
BIN_INSTALL_DIR = $(PRJ_INSTALL_DIR) |
|
DOC_INSTALL_DIR = $(PRJ_INSTALL_DIR) |
|
SCRIPT_INSTALL_DIR = $(PRJ_INSTALL_DIR) |
|
DEMO_INSTALL_DIR = $(PRJ_INSTALL_DIR)\demos |
|
INCLUDE_INSTALL_DIR = $(_INSTALLDIR)\..\include |
|
|
|
!endif |
|
|
|
################################################################### |
|
# 12. Set up actual options to be passed to the compiler and linker |
|
# Now we have all the information we need, set up the actual flags and |
|
# options that we will pass to the compiler and linker. The main |
|
# makefile should use these in combination with whatever other flags |
|
# and switches are specific to it. |
|
# The following macros are defined, names are for historical compatibility: |
|
# OPTDEFINES - /Dxxx C macro flags based on user-specified OPTS |
|
# COMPILERFLAGS - /Dxxx C macro flags independent of any configuration opttions |
|
# crt - Compiler switch that selects the appropriate C runtime |
|
# cdebug - Compiler switches related to debug AND optimizations |
|
# cwarn - Compiler switches that set warning levels |
|
# cflags - complete compiler switches (subsumes cdebug and cwarn) |
|
# ldebug - Linker switches controlling debug information and optimization |
|
# lflags - complete linker switches (subsumes ldebug) except subsystem type |
|
# dlllflags - complete linker switches to build DLLs (subsumes lflags) |
|
# conlflags - complete linker switches for console program (subsumes lflags) |
|
# guilflags - complete linker switches for GUI program (subsumes lflags) |
|
# baselibs - minimum Windows libraries required. Parent makefile can |
|
# define PRJ_LIBS before including rules.rc if additional libs are needed |
|
|
|
OPTDEFINES = -DTCL_CFGVAL_ENCODING=$(CFG_ENCODING) -DSTDC_HEADERS |
|
|
|
!if $(TCL_MEM_DEBUG) |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_MEM_DEBUG |
|
!endif |
|
!if $(TCL_COMPILE_DEBUG) |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS |
|
!endif |
|
!if $(TCL_THREADS) |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_THREADS=1 |
|
!if $(USE_THREAD_ALLOC) |
|
OPTDEFINES = $(OPTDEFINES) -DUSE_THREAD_ALLOC=1 |
|
!endif |
|
!endif |
|
!if $(STATIC_BUILD) |
|
OPTDEFINES = $(OPTDEFINES) -DSTATIC_BUILD |
|
!endif |
|
!if $(TCL_NO_DEPRECATED) |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_NO_DEPRECATED |
|
!endif |
|
|
|
!if $(USE_STUBS) |
|
# Note we do not define USE_TCL_STUBS even when building tk since some |
|
# test targets in tk do not use stubs |
|
!if ! $(DOING_TCL) |
|
USE_STUBS_DEFS = -DUSE_TCL_STUBS -DUSE_TCLOO_STUBS |
|
!if $(NEED_TK) |
|
USE_STUBS_DEFS = $(USE_STUBS_DEFS) -DUSE_TK_STUBS |
|
!endif |
|
!endif |
|
!endif # USE_STUBS |
|
|
|
!if !$(DEBUG) |
|
OPTDEFINES = $(OPTDEFINES) -DNDEBUG |
|
!if $(OPTIMIZING) |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_OPTIMIZED |
|
!endif |
|
!endif |
|
!if $(PROFILE) |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_PROFILED |
|
!endif |
|
!if "$(MACHINE)" == "AMD64" |
|
OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_DO64BIT |
|
!endif |
|
!if $(VCVERSION) < 1300 |
|
OPTDEFINES = $(OPTDEFINES) -DNO_STRTOI64 |
|
!endif |
|
|
|
# _ATL_XP_TARGETING - Newer SDK's need this to build for XP |
|
COMPILERFLAGS = /D_ATL_XP_TARGETING |
|
|
|
# Following is primarily for the benefit of extensions. Tcl 8.5 builds |
|
# Tcl without /DUNICODE, while 8.6 builds with it defined. When building |
|
# an extension, it is advisable (but not mandated) to use the same Windows |
|
# API as the Tcl build. This is accordingly defaulted below. A particular |
|
# extension can override this by pre-definining USE_WIDECHAR_API. |
|
!ifndef USE_WIDECHAR_API |
|
!if $(TCL_VERSION) > 85 |
|
USE_WIDECHAR_API = 1 |
|
!else |
|
USE_WIDECHAR_API = 0 |
|
!endif |
|
!endif |
|
|
|
!if $(USE_WIDECHAR_API) |
|
COMPILERFLAGS = $(COMPILERFLAGS) /DUNICODE /D_UNICODE |
|
!endif |
|
|
|
# Like the TEA system only set this non empty for non-Tk extensions |
|
# Note: some extensions use PACKAGE_NAME and others use PACKAGE_TCLNAME |
|
# so we pass both |
|
!if !$(DOING_TCL) && !$(DOING_TK) |
|
PKGNAMEFLAGS = -DPACKAGE_NAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \ |
|
-DPACKAGE_TCLNAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \ |
|
-DPACKAGE_VERSION="\"$(DOTVERSION)\"" \ |
|
-DMODULE_SCOPE=extern |
|
!endif |
|
|
|
|
|
!if $(MSVCRT) |
|
!if $(DEBUG) && !$(UNCHECKED) |
|
crt = -MDd |
|
!else |
|
crt = -MD |
|
!endif |
|
!else |
|
!if $(DEBUG) && !$(UNCHECKED) |
|
crt = -MTd |
|
!else |
|
crt = -MT |
|
!endif |
|
!endif |
|
|
|
|
|
!if $(DEBUG) |
|
|
|
|
|
cdebug = -Zi -Od $(DEBUGFLAGS) |
|
|
|
!else |
|
|
|
cdebug = $(OPTIMIZATIONS) |
|
!if $(SYMBOLS) |
|
cdebug = $(cdebug) -Zi |
|
!endif |
|
|
|
!endif |
|
|
|
|
|
cwarn = $(WARNINGS) |
|
|
|
!if "$(MACHINE)" == "AMD64" |
|
|
|
|
|
|
|
|
|
|
|
cwarn = $(cwarn) -wd4311 -wd4312 |
|
!endif |
|
|
|
|
|
!if "$(MACHINE)" == "ARM" |
|
carch = -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE |
|
!else |
|
carch = |
|
!endif |
|
|
|
!if $(DEBUG) |
|
|
|
cwarn = $(cwarn) -WX |
|
!endif |
|
|
|
INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES) |
|
!if !$(DOING_TCL) && !$(DOING_TK) |
|
INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WINDIR)" -I"$(COMPATDIR)" |
|
!endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
cflags = -nologo -c $(COMPILERFLAGS) $(carch) $(cwarn) -Fp$(TMP_DIR)^\ $(cdebug) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
appcflags = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES) $(USE_STUBS_DEFS) |
|
appcflags_nostubs = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES) |
|
pkgcflags = $(appcflags) $(PKGNAMEFLAGS) -DBUILD_$(PROJECT) |
|
pkgcflags_nostubs = $(appcflags_nostubs) $(PKGNAMEFLAGS) -DBUILD_$(PROJECT) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stubscflags = $(cflags) $(PKGNAMEFLAGS) $(PRJ_DEFINES) $(OPTDEFINES) -Zl -DSTATIC_BUILD $(INCLUDES) |
|
|
|
|
|
|
|
!if $(DEBUG) |
|
ldebug = -debug -debugtype:cv |
|
!else |
|
ldebug = -release -opt:ref -opt:icf,3 |
|
!if $(SYMBOLS) |
|
ldebug = $(ldebug) -debug -debugtype:cv |
|
!endif |
|
!endif |
|
|
|
|
|
!if $(PROFILE) |
|
ldebug= $(ldebug) -profile |
|
!endif |
|
|
|
|
|
lflags = -nologo -machine:$(MACHINE) $(LINKERFLAGS) $(ldebug) |
|
|
|
!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900 |
|
lflags = $(lflags) -nodefaultlib:libucrt.lib |
|
!endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
!if "$(MACHINE)" == "IX86" && !$(STATIC_BUILD) |
|
!if [nmakehlp -l -opt:nowin98 $(LINKER_TESTFLAGS)] |
|
|
|
lflags = $(lflags) -opt:nowin98 |
|
!endif |
|
!endif |
|
|
|
dlllflags = $(lflags) -dll |
|
conlflags = $(lflags) -subsystem:console |
|
guilflags = $(lflags) -subsystem:windows |
|
|
|
|
|
|
|
winlibs = kernel32.lib advapi32.lib |
|
|
|
!if $(NEED_TK) |
|
winlibs = $(winlibs) gdi32.lib user32.lib uxtheme.lib |
|
!endif |
|
|
|
|
|
|
|
!if "$(MACHINE)" == "AMD64" |
|
!if $(VCVERSION) > 1399 && $(VCVERSION) < 1500 |
|
winlibs = $(winlibs) bufferoverflowU.lib |
|
!endif |
|
!endif |
|
|
|
baselibs = $(winlibs) $(PRJ_LIBS) |
|
|
|
!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900 |
|
baselibs = $(baselibs) ucrt.lib |
|
!endif |
|
|
|
|
|
|
|
|
|
CCPKGCMD = $(cc32) $(pkgcflags) -Fo$(TMP_DIR)^\ |
|
CCAPPCMD = $(cc32) $(appcflags) -Fo$(TMP_DIR)^\ |
|
CCSTUBSCMD = $(cc32) $(stubscflags) -Fo$(TMP_DIR)^\ |
|
|
|
LIBCMD = $(lib32) -nologo $(LINKERFLAGS) -out:$@ |
|
DLLCMD = $(link32) $(dlllflags) -out:$@ $(baselibs) $(tcllibs) $(tklibs) |
|
|
|
CONEXECMD = $(link32) $(conlflags) -out:$@ $(baselibs) $(tcllibs) $(tklibs) |
|
GUIEXECMD = $(link32) $(guilflags) -out:$@ $(baselibs) $(tcllibs) $(tklibs) |
|
RESCMD = $(rc32) -fo $@ -r -i "$(GENERICDIR)" -i "$(TMP_DIR)" \ |
|
$(TCL_INCLUDES) \ |
|
-DDEBUG=$(DEBUG) -d UNCHECKED=$(UNCHECKED) \ |
|
-DCOMMAVERSION=$(DOTVERSION:.=,),0 \ |
|
-DDOTVERSION=\"$(DOTVERSION)\" \ |
|
-DVERSION=\"$(VERSION)\" \ |
|
-DSUFX=\"$(SUFX)\" \ |
|
-DPROJECT=\"$(PROJECT)\" \ |
|
-DPRJLIBNAME=\"$(PRJLIBNAME)\" |
|
|
|
!ifndef DEFAULT_BUILD_TARGET |
|
DEFAULT_BUILD_TARGET = $(PROJECT) |
|
!endif |
|
|
|
default-target: $(DEFAULT_BUILD_TARGET) |
|
|
|
default-pkgindex: |
|
@echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \ |
|
[list load [file join $$dir $(PRJLIBNAME)]] > $(OUT_DIR)\pkgIndex.tcl |
|
|
|
default-pkgindex-tea: |
|
@if exist $(ROOT)\pkgIndex.tcl.in nmakehlp -s << $(ROOT)\pkgIndex.tcl.in > $(OUT_DIR)\pkgIndex.tcl |
|
@PACKAGE_VERSION@ $(DOTVERSION) |
|
@PACKAGE_NAME@ $(PRJ_PACKAGE_TCLNAME) |
|
@PACKAGE_TCLNAME@ $(PRJ_PACKAGE_TCLNAME) |
|
@PKG_LIB_FILE@ $(PRJLIBNAME) |
|
<< |
|
|
|
|
|
default-install: default-install-binaries default-install-libraries |
|
|
|
default-install-binaries: $(PRJLIB) |
|
@echo Installing binaries to '$(SCRIPT_INSTALL_DIR)' |
|
@if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" |
|
@$(CPY) $(PRJLIB) "$(SCRIPT_INSTALL_DIR)" >NUL |
|
|
|
default-install-libraries: $(OUT_DIR)\pkgIndex.tcl |
|
@echo Installing libraries to '$(SCRIPT_INSTALL_DIR)' |
|
@if exist $(LIBDIR) $(CPY) $(LIBDIR)\*.tcl "$(SCRIPT_INSTALL_DIR)" |
|
@echo Installing package index in '$(SCRIPT_INSTALL_DIR)' |
|
@$(CPY) $(OUT_DIR)\pkgIndex.tcl $(SCRIPT_INSTALL_DIR) |
|
|
|
default-install-stubs: |
|
@echo Installing stubs library to '$(SCRIPT_INSTALL_DIR)' |
|
@if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" |
|
@$(CPY) $(PRJSTUBLIB) "$(SCRIPT_INSTALL_DIR)" >NUL |
|
|
|
default-install-docs-html: |
|
@echo Installing documentation files to '$(DOC_INSTALL_DIR)' |
|
@if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)" |
|
@if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.html" "$(DOCDIR)\*.css" "$(DOCDIR)\*.png") do @$(COPY) %f "$(DOC_INSTALL_DIR)" |
|
|
|
default-install-docs-n: |
|
@echo Installing documentation files to '$(DOC_INSTALL_DIR)' |
|
@if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)" |
|
@if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.n") do @$(COPY) %f "$(DOC_INSTALL_DIR)" |
|
|
|
default-install-demos: |
|
@echo Installing demos to '$(DEMO_INSTALL_DIR)' |
|
@if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)" |
|
@if exist $(DEMODIR) $(CPYDIR) "$(DEMODIR)" "$(DEMO_INSTALL_DIR)" |
|
|
|
default-clean: |
|
@echo Cleaning $(TMP_DIR)\* ... |
|
@if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR) |
|
@echo Cleaning $(WINDIR)\nmakehlp.obj, nmakehlp.exe ... |
|
@if exist $(WINDIR)\nmakehlp.obj del $(WINDIR)\nmakehlp.obj |
|
@if exist $(WINDIR)\nmakehlp.exe del $(WINDIR)\nmakehlp.exe |
|
@if exist $(WINDIR)\nmakehlp.out del $(WINDIR)\nmakehlp.out |
|
@echo Cleaning $(WINDIR)\nmhlp-out.txt ... |
|
@if exist $(WINDIR)\nmhlp-out.txt del $(WINDIR)\nmhlp-out.txt |
|
@echo Cleaning $(WINDIR)\_junk.pch ... |
|
@if exist $(WINDIR)\_junk.pch del $(WINDIR)\_junk.pch |
|
@echo Cleaning $(WINDIR)\vercl.x, vercl.i ... |
|
@if exist $(WINDIR)\vercl.x del $(WINDIR)\vercl.x |
|
@if exist $(WINDIR)\vercl.i del $(WINDIR)\vercl.i |
|
@echo Cleaning $(WINDIR)\versions.vc, version.vc ... |
|
@if exist $(WINDIR)\versions.vc del $(WINDIR)\versions.vc |
|
@if exist $(WINDIR)\version.vc del $(WINDIR)\version.vc |
|
|
|
default-hose: default-clean |
|
@echo Hosing $(OUT_DIR)\* ... |
|
@if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR) |
|
|
|
# Only for backward compatibility |
|
default-distclean: default-hose |
|
|
|
default-setup: |
|
@if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) |
|
@if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) |
|
|
|
!if "$(TESTPAT)" != "" |
|
TESTFLAGS = $(TESTFLAGS) -file $(TESTPAT) |
|
!endif |
|
|
|
default-test: default-setup $(PROJECT) |
|
@set TCLLIBPATH=$(OUT_DIR:\=/) |
|
@if exist $(LIBDIR) for %f in ("$(LIBDIR)\*.tcl") do @$(COPY) %f "$(OUT_DIR)" |
|
cd "$(TESTDIR)" && $(DEBUGGER) $(TCLSH) all.tcl $(TESTFLAGS) |
|
|
|
default-shell: default-setup $(PROJECT) |
|
@set TCLLIBPATH=$(OUT_DIR:\=/) |
|
@if exist $(LIBDIR) for %f in ("$(LIBDIR)\*.tcl") do @$(COPY) %f "$(OUT_DIR)" |
|
$(DEBUGGER) $(TCLSH) |
|
|
|
# Generation of Windows version resource |
|
!ifdef RCFILE |
|
|
|
# Note: don't use $** in below rule because there may be other dependencies |
|
# and only the "master" rc must be passed to the resource compiler |
|
$(TMP_DIR)\$(PROJECT).res: $(RCDIR)\$(PROJECT).rc |
|
$(RESCMD) $(RCDIR)\$(PROJECT).rc |
|
|
|
!else |
|
|
|
# If parent makefile has not defined a resource definition file, |
|
# we will generate one from standard template. |
|
$(TMP_DIR)\$(PROJECT).res: $(TMP_DIR)\$(PROJECT).rc |
|
|
|
$(TMP_DIR)\$(PROJECT).rc: |
|
@$(COPY) << $(TMP_DIR)\$(PROJECT).rc |
|
#include <winver.h> |
|
|
|
VS_VERSION_INFO VERSIONINFO |
|
FILEVERSION COMMAVERSION |
|
PRODUCTVERSION COMMAVERSION |
|
FILEFLAGSMASK 0x3fL |
|
#ifdef DEBUG |
|
FILEFLAGS VS_FF_DEBUG |
|
#else |
|
FILEFLAGS 0x0L |
|
#endif |
|
FILEOS VOS_NT_WINDOWS32 |
|
FILETYPE VFT_DLL |
|
FILESUBTYPE 0x0L |
|
BEGIN |
|
BLOCK "StringFileInfo" |
|
BEGIN |
|
BLOCK "040904b0" |
|
BEGIN |
|
VALUE "FileDescription", "Tcl extension " PROJECT |
|
VALUE "OriginalFilename", PRJLIBNAME |
|
VALUE "FileVersion", DOTVERSION |
|
VALUE "ProductName", "Package " PROJECT " for Tcl" |
|
VALUE "ProductVersion", DOTVERSION |
|
END |
|
END |
|
BLOCK "VarFileInfo" |
|
BEGIN |
|
VALUE "Translation", 0x409, 1200 |
|
END |
|
END |
|
|
|
<< |
|
|
|
!endif # ifdef RCFILE |
|
|
|
!ifndef DISABLE_IMPLICIT_RULES |
|
DISABLE_IMPLICIT_RULES = 0 |
|
!endif |
|
|
|
!if !$(DISABLE_IMPLICIT_RULES) |
|
# Implicit rule definitions - only for building library objects. For stubs and |
|
# main application, the master makefile should define explicit rules. |
|
|
|
{$(ROOT)}.c{$(TMP_DIR)}.obj:: |
|
$(CCPKGCMD) @<< |
|
$< |
|
<< |
|
|
|
{$(WINDIR)}.c{$(TMP_DIR)}.obj:: |
|
$(CCPKGCMD) @<< |
|
$< |
|
<< |
|
|
|
{$(GENERICDIR)}.c{$(TMP_DIR)}.obj:: |
|
$(CCPKGCMD) @<< |
|
$< |
|
<< |
|
|
|
{$(COMPATDIR)}.c{$(TMP_DIR)}.obj:: |
|
$(CCPKGCMD) @<< |
|
$< |
|
<< |
|
|
|
{$(RCDIR)}.rc{$(TMP_DIR)}.res: |
|
$(RESCMD) $< |
|
|
|
{$(WINDIR)}.rc{$(TMP_DIR)}.res: |
|
$(RESCMD) $< |
|
|
|
{$(TMP_DIR)}.rc{$(TMP_DIR)}.res: |
|
$(RESCMD) $< |
|
|
|
.SUFFIXES: |
|
.SUFFIXES:.c .rc |
|
|
|
!endif |
|
|
|
################################################################ |
|
# 14. Sanity check selected options against Tcl build options |
|
# When building an extension, certain configuration options should |
|
# match the ones used when Tcl was built. Here we check and |
|
# warn on a mismatch. |
|
!if ! $(DOING_TCL) |
|
|
|
!if $(TCLINSTALL) # Building against an installed Tcl |
|
!if exist("$(_TCLDIR)\lib\nmake\tcl.nmake") |
|
TCLNMAKECONFIG = "$(_TCLDIR)\lib\nmake\tcl.nmake" |
|
!endif |
|
!else # ! $(TCLINSTALL) - building against Tcl source |
|
!if exist("$(OUT_DIR)\tcl.nmake") |
|
TCLNMAKECONFIG = "$(OUT_DIR)\tcl.nmake" |
|
!endif |
|
!endif # TCLINSTALL |
|
|
|
!if $(CONFIG_CHECK) |
|
!ifdef TCLNMAKECONFIG |
|
!include $(TCLNMAKECONFIG) |
|
|
|
!if defined(CORE_MACHINE) && "$(CORE_MACHINE)" != "$(MACHINE)" |
|
!error ERROR: Build target ($(MACHINE)) does not match the Tcl library architecture ($(CORE_MACHINE)). |
|
!endif |
|
!if defined(CORE_USE_THREAD_ALLOC) && $(CORE_USE_THREAD_ALLOC) != $(USE_THREAD_ALLOC) |
|
!message WARNING: Value of USE_THREAD_ALLOC ($(USE_THREAD_ALLOC)) does not match its Tcl core value ($(CORE_USE_THREAD_ALLOC)). |
|
!endif |
|
!if defined(CORE_DEBUG) && $(CORE_DEBUG) != $(DEBUG) |
|
!message WARNING: Value of DEBUG ($(DEBUG)) does not match its Tcl library configuration ($(DEBUG)). |
|
!endif |
|
!endif |
|
|
|
!endif # TCLNMAKECONFIG |
|
|
|
!endif # ! $(DOING_TCL) |
|
|
|
|
|
#---------------------------------------------------------- |
|
# Display stats being used. |
|
#---------------------------------------------------------- |
|
|
|
!if !$(DOING_TCL) |
|
!message *** Building against Tcl at '$(_TCLDIR)' |
|
!endif |
|
!if !$(DOING_TK) && $(NEED_TK) |
|
!message *** Building against Tk at '$(_TKDIR)' |
|
!endif |
|
!message *** Intermediate directory will be '$(TMP_DIR)' |
|
!message *** Output directory will be '$(OUT_DIR)' |
|
!message *** Installation, if selected, will be in '$(_INSTALLDIR)' |
|
!message *** Suffix for binaries will be '$(SUFX)' |
|
!message *** Compiler version $(VCVER). Target $(MACHINE), host $(NATIVE_ARCH). |
|
|
|
!endif # ifdef _RULES_VC |
|
|