OSDN Git Service

mrcImageOpticalFlow & mrcImageLucasKanade & mrcImageHornSchunckの変更
[eos/base.git] / util / src / TclTk / tk8.6.12 / win / rules.vc
diff --git a/util/src/TclTk/tk8.6.12/win/rules.vc b/util/src/TclTk/tk8.6.12/win/rules.vc
new file mode 100644 (file)
index 0000000..c24fce3
--- /dev/null
@@ -0,0 +1,1869 @@
+#------------------------------------------------------------- -*- makefile -*-\r
+# rules.vc --\r
+#\r
+# Part of the nmake based build system for Tcl and its extensions.\r
+# This file does all the hard work in terms of parsing build options,\r
+# compiler switches, defining common targets and macros. The Tcl makefile\r
+# directly includes this. Extensions include it via "rules-ext.vc".\r
+#\r
+# See TIP 477 (https://core.tcl-lang.org/tips/doc/main/tip/477.md) for\r
+# detailed documentation.\r
+#\r
+# See the file "license.terms" for information on usage and redistribution\r
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.\r
+#\r
+# Copyright (c) 2001-2003 David Gravereaux.\r
+# Copyright (c) 2003-2008 Patrick Thoyts\r
+# Copyright (c) 2017      Ashok P. Nadkarni\r
+#------------------------------------------------------------------------------\r
+\r
+!ifndef _RULES_VC\r
+_RULES_VC = 1\r
+\r
+# The following macros define the version of the rules.vc nmake build system\r
+# For modifications that are not backward-compatible, you *must* change\r
+# the major version.\r
+RULES_VERSION_MAJOR = 1\r
+RULES_VERSION_MINOR = 9\r
+\r
+# The PROJECT macro must be defined by parent makefile.\r
+!if "$(PROJECT)" == ""\r
+!error *** Error: Macro PROJECT not defined! Please define it before including rules.vc\r
+!endif\r
+\r
+!if "$(PRJ_PACKAGE_TCLNAME)" == ""\r
+PRJ_PACKAGE_TCLNAME = $(PROJECT)\r
+!endif\r
+\r
+# Also special case Tcl and Tk to save some typing later\r
+DOING_TCL = 0\r
+DOING_TK  = 0\r
+!if "$(PROJECT)" == "tcl"\r
+DOING_TCL = 1\r
+!elseif "$(PROJECT)" == "tk"\r
+DOING_TK = 1\r
+!endif\r
+\r
+!ifndef NEED_TK\r
+# Backwards compatibility\r
+!ifdef PROJECT_REQUIRES_TK\r
+NEED_TK = $(PROJECT_REQUIRES_TK)\r
+!else\r
+NEED_TK = 0\r
+!endif\r
+!endif\r
+\r
+!ifndef NEED_TCL_SOURCE\r
+NEED_TCL_SOURCE = 0\r
+!endif\r
+\r
+!ifdef NEED_TK_SOURCE\r
+!if $(NEED_TK_SOURCE)\r
+NEED_TK = 1\r
+!endif\r
+!else\r
+NEED_TK_SOURCE = 0\r
+!endif\r
+\r
+################################################################\r
+# Nmake is a pretty weak environment in syntax and capabilities\r
+# so this file is necessarily verbose. It's broken down into\r
+# the following parts.\r
+#\r
+# 0. Sanity check that compiler environment is set up and initialize\r
+#    any built-in settings from the parent makefile\r
+# 1. First define the external tools used for compiling, copying etc.\r
+#    as this is independent of everything else.\r
+# 2. Figure out our build structure in terms of the directory, whether\r
+#    we are building Tcl or an extension, etc.\r
+# 3. Determine the compiler and linker versions\r
+# 4. Build the nmakehlp helper application\r
+# 5. Determine the supported compiler options and features\r
+# 6. Parse the OPTS macro value for user-specified build configuration\r
+# 7. Parse the STATS macro value for statistics instrumentation\r
+# 8. Parse the CHECKS macro for additional compilation checks\r
+# 9. Extract Tcl, and possibly Tk, version numbers from the headers\r
+# 10. Based on this selected configuration, construct the output\r
+#     directory and file paths\r
+# 11. Construct the paths where the package is to be installed\r
+# 12. Set up the actual options passed to compiler and linker based\r
+#     on the information gathered above.\r
+# 13. Define some standard build targets and implicit rules. These may\r
+#     be optionally disabled by the parent makefile.\r
+# 14. (For extensions only.) Compare the configuration of the target\r
+#     Tcl and the extensions and warn against discrepancies.\r
+#\r
+# One final note about the macro names used. They are as they are\r
+# for historical reasons. We would like legacy extensions to\r
+# continue to work with this make include file so be wary of\r
+# changing them for consistency or clarity.\r
+\r
+# 0. Sanity check compiler environment\r
+\r
+# Check to see we are configured to build with MSVC (MSDEVDIR, MSVCDIR or\r
+# VCINSTALLDIR) or with the MS Platform SDK (MSSDK or WindowsSDKDir)\r
+\r
+!if !defined(MSDEVDIR) && !defined(MSVCDIR) && !defined(VCINSTALLDIR) && !defined(MSSDK) && !defined(WINDOWSSDKDIR)\r
+MSG = ^\r
+Visual C++ compiler environment not initialized.\r
+!error $(MSG)\r
+!endif\r
+\r
+# We need to run from the directory the parent makefile is located in.\r
+# nmake does not tell us what makefile was used to invoke it so parent\r
+# makefile has to set the MAKEFILEVC macro or we just make a guess and\r
+# warn if we think that is not the case.\r
+!if "$(MAKEFILEVC)" == ""\r
+\r
+!if exist("$(PROJECT).vc")\r
+MAKEFILEVC = $(PROJECT).vc\r
+!elseif exist("makefile.vc")\r
+MAKEFILEVC = makefile.vc\r
+!endif\r
+!endif # "$(MAKEFILEVC)" == ""\r
+\r
+!if !exist("$(MAKEFILEVC)")\r
+MSG = ^\r
+You must run nmake from the directory containing the project makefile.^\r
+If you are doing that and getting this message, set the MAKEFILEVC^\r
+macro to the name of the project makefile.\r
+!message WARNING: $(MSG)\r
+!endif\r
+\r
+\r
+################################################################\r
+# 1. Define external programs being used\r
+\r
+#----------------------------------------------------------\r
+# Set the proper copy method to avoid overwrite questions\r
+# to the user when copying files and selecting the right\r
+# "delete all" method.\r
+#----------------------------------------------------------\r
+\r
+RMDIR  = rmdir /S /Q\r
+CPY    = xcopy /i /y >NUL\r
+CPYDIR  = xcopy /e /i /y >NUL\r
+COPY   = copy /y >NUL\r
+MKDIR   = mkdir\r
+\r
+######################################################################\r
+# 2. Figure out our build environment in terms of what we're building.\r
+#\r
+# (a) Tcl itself\r
+# (b) Tk\r
+# (c) a Tcl extension using libraries/includes from an *installed* Tcl\r
+# (d) a Tcl extension using libraries/includes from Tcl source directory\r
+#\r
+# This last is needed because some extensions still need\r
+# some Tcl interfaces that are not publicly exposed.\r
+#\r
+# The fragment will set the following macros:\r
+# ROOT - root of this module sources\r
+# COMPATDIR - source directory that holds compatibility sources\r
+# DOCDIR - source directory containing documentation files\r
+# GENERICDIR - platform-independent source directory\r
+# WIN_DIR - Windows-specific source directory\r
+# TESTDIR - directory containing test files\r
+# TOOLSDIR - directory containing build tools\r
+# _TCLDIR - root of the Tcl installation OR the Tcl sources. Not set\r
+#    when building Tcl itself.\r
+# _INSTALLDIR - native form of the installation path. For Tcl\r
+#    this will be the root of the Tcl installation. For extensions\r
+#    this will be the lib directory under the root.\r
+# TCLINSTALL  - set to 1 if _TCLDIR refers to\r
+#    headers and libraries from an installed Tcl, and 0 if built against\r
+#    Tcl sources. Not set when building Tcl itself. Yes, not very well\r
+#    named.\r
+# _TCL_H - native path to the tcl.h file\r
+#\r
+# If Tk is involved, also sets the following\r
+# _TKDIR - native form Tk installation OR Tk source. Not set if building\r
+#    Tk itself.\r
+# TKINSTALL - set 1 if _TKDIR refers to installed Tk and 0 if Tk sources\r
+# _TK_H - native path to the tk.h file\r
+\r
+# Root directory for sources and assumed subdirectories\r
+ROOT = $(MAKEDIR)\..\r
+# The following paths CANNOT have spaces in them as they appear on the\r
+# left side of implicit rules.\r
+!ifndef COMPATDIR\r
+COMPATDIR      = $(ROOT)\compat\r
+!endif\r
+!ifndef DOCDIR\r
+DOCDIR         = $(ROOT)\doc\r
+!endif\r
+!ifndef GENERICDIR\r
+GENERICDIR     = $(ROOT)\generic\r
+!endif\r
+!ifndef TOOLSDIR\r
+TOOLSDIR       = $(ROOT)\tools\r
+!endif\r
+!ifndef TESTDIR\r
+TESTDIR        = $(ROOT)\tests\r
+!endif\r
+!ifndef LIBDIR\r
+!if exist("$(ROOT)\library")\r
+LIBDIR          = $(ROOT)\library\r
+!else\r
+LIBDIR          = $(ROOT)\lib\r
+!endif\r
+!endif\r
+!ifndef DEMODIR\r
+!if exist("$(LIBDIR)\demos")\r
+DEMODIR                = $(LIBDIR)\demos\r
+!else\r
+DEMODIR                = $(ROOT)\demos\r
+!endif\r
+!endif # ifndef DEMODIR\r
+# Do NOT use WINDIR because it is Windows internal environment\r
+# variable to point to c:\windows!\r
+WIN_DIR                = $(ROOT)\win\r
+\r
+!ifndef RCDIR\r
+!if exist("$(WIN_DIR)\rc")\r
+RCDIR           = $(WIN_DIR)\rc\r
+!else\r
+RCDIR           = $(WIN_DIR)\r
+!endif\r
+!endif\r
+RCDIR = $(RCDIR:/=\)\r
+\r
+# The target directory where the built packages and binaries will be installed.\r
+# INSTALLDIR is the (optional) path specified by the user.\r
+# _INSTALLDIR is INSTALLDIR using the backslash separator syntax\r
+!ifdef INSTALLDIR\r
+### Fix the path separators.\r
+_INSTALLDIR    = $(INSTALLDIR:/=\)\r
+!else\r
+### Assume the normal default.\r
+_INSTALLDIR    = $(HOMEDRIVE)\Tcl\r
+!endif\r
+\r
+!if $(DOING_TCL)\r
+\r
+# BEGIN Case 2(a) - Building Tcl itself\r
+\r
+# Only need to define _TCL_H\r
+_TCL_H = ..\generic\tcl.h\r
+\r
+# END Case 2(a) - Building Tcl itself\r
+\r
+!elseif $(DOING_TK)\r
+\r
+# BEGIN Case 2(b) - Building Tk\r
+\r
+TCLINSTALL = 0 # Tk always builds against Tcl source, not an installed Tcl\r
+!if "$(TCLDIR)" == ""\r
+!if [echo TCLDIR = \> nmakehlp.out] \\r
+   || [nmakehlp -L generic\tcl.h >> nmakehlp.out]\r
+!error *** Could not locate Tcl source directory.\r
+!endif\r
+!include nmakehlp.out\r
+!endif # TCLDIR == ""\r
+\r
+_TCLDIR        = $(TCLDIR:/=\)\r
+_TCL_H  = $(_TCLDIR)\generic\tcl.h\r
+!if !exist("$(_TCL_H)")\r
+!error Could not locate tcl.h. Please set the TCLDIR macro to point to the Tcl *source* directory.\r
+!endif\r
+\r
+_TK_H = ..\generic\tk.h\r
+\r
+# END Case 2(b) - Building Tk\r
+\r
+!else\r
+\r
+# BEGIN Case 2(c) or (d) - Building an extension other than Tk\r
+\r
+# If command line has specified Tcl location through TCLDIR, use it\r
+# else default to the INSTALLDIR setting\r
+!if "$(TCLDIR)" != ""\r
+\r
+_TCLDIR        = $(TCLDIR:/=\)\r
+!if exist("$(_TCLDIR)\include\tcl.h") # Case 2(c) with TCLDIR defined\r
+TCLINSTALL     = 1\r
+_TCL_H          = $(_TCLDIR)\include\tcl.h\r
+!elseif exist("$(_TCLDIR)\generic\tcl.h") # Case 2(d) with TCLDIR defined\r
+TCLINSTALL     = 0\r
+_TCL_H          = $(_TCLDIR)\generic\tcl.h\r
+!endif\r
+\r
+!else  #  # Case 2(c) for extensions with TCLDIR undefined\r
+\r
+# Need to locate Tcl depending on whether it needs Tcl source or not.\r
+# If we don't, check the INSTALLDIR for an installed Tcl first\r
+\r
+!if exist("$(_INSTALLDIR)\include\tcl.h") && !$(NEED_TCL_SOURCE)\r
+\r
+TCLINSTALL     = 1\r
+TCLDIR          = $(_INSTALLDIR)\..\r
+# NOTE: we will be resetting _INSTALLDIR to _INSTALLDIR/lib for extensions\r
+# later so the \.. accounts for the /lib\r
+_TCLDIR                = $(_INSTALLDIR)\..\r
+_TCL_H          = $(_TCLDIR)\include\tcl.h\r
+\r
+!else # exist(...) && !$(NEED_TCL_SOURCE)\r
+\r
+!if [echo _TCLDIR = \> nmakehlp.out] \\r
+   || [nmakehlp -L generic\tcl.h >> nmakehlp.out]\r
+!error *** Could not locate Tcl source directory.\r
+!endif\r
+!include nmakehlp.out\r
+TCLINSTALL      = 0\r
+TCLDIR         = $(_TCLDIR)\r
+_TCL_H          = $(_TCLDIR)\generic\tcl.h\r
+\r
+!endif # exist(...) && !$(NEED_TCL_SOURCE)\r
+\r
+!endif # TCLDIR\r
+\r
+!ifndef _TCL_H\r
+MSG =^\r
+Failed to find tcl.h. The TCLDIR macro is set incorrectly or is not set and default path does not contain tcl.h.\r
+!error $(MSG)\r
+!endif\r
+\r
+# Now do the same to locate Tk headers and libs if project requires Tk\r
+!if $(NEED_TK)\r
+\r
+!if "$(TKDIR)" != ""\r
+\r
+_TKDIR = $(TKDIR:/=\)\r
+!if exist("$(_TKDIR)\include\tk.h")\r
+TKINSTALL      = 1\r
+_TK_H          = $(_TKDIR)\include\tk.h\r
+!elseif exist("$(_TKDIR)\generic\tk.h")\r
+TKINSTALL      = 0\r
+_TK_H          = $(_TKDIR)\generic\tk.h\r
+!endif\r
+\r
+!else # TKDIR not defined\r
+\r
+# Need to locate Tcl depending on whether it needs Tcl source or not.\r
+# If we don't, check the INSTALLDIR for an installed Tcl first\r
+\r
+!if exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE)\r
+\r
+TKINSTALL      = 1\r
+# NOTE: we will be resetting _INSTALLDIR to _INSTALLDIR/lib for extensions\r
+# later so the \.. accounts for the /lib\r
+_TKDIR         = $(_INSTALLDIR)\..\r
+_TK_H          = $(_TKDIR)\include\tk.h\r
+TKDIR          = $(_TKDIR)\r
+\r
+!else # exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE)\r
+\r
+!if [echo _TKDIR = \> nmakehlp.out] \\r
+   || [nmakehlp -L generic\tk.h >> nmakehlp.out]\r
+!error *** Could not locate Tk source directory.\r
+!endif\r
+!include nmakehlp.out\r
+TKINSTALL      = 0\r
+TKDIR          = $(_TKDIR)\r
+_TK_H          = $(_TKDIR)\generic\tk.h\r
+\r
+!endif # exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE)\r
+\r
+!endif # TKDIR\r
+\r
+!ifndef _TK_H\r
+MSG =^\r
+Failed to find tk.h. The TKDIR macro is set incorrectly or is not set and default path does not contain tk.h.\r
+!error $(MSG)\r
+!endif\r
+\r
+!endif # NEED_TK\r
+\r
+!if $(NEED_TCL_SOURCE) && $(TCLINSTALL)\r
+MSG = ^\r
+*** Warning: This extension requires the source distribution of Tcl.^\r
+*** Please set the TCLDIR macro to point to the Tcl sources.\r
+!error $(MSG)\r
+!endif\r
+\r
+!if $(NEED_TK_SOURCE)\r
+!if $(TKINSTALL)\r
+MSG = ^\r
+*** Warning: This extension requires the source distribution of Tk.^\r
+*** Please set the TKDIR macro to point to the Tk sources.\r
+!error $(MSG)\r
+!endif\r
+!endif\r
+\r
+\r
+# If INSTALLDIR set to Tcl installation root dir then reset to the\r
+# lib dir for installing extensions\r
+!if exist("$(_INSTALLDIR)\include\tcl.h")\r
+_INSTALLDIR=$(_INSTALLDIR)\lib\r
+!endif\r
+\r
+# END Case 2(c) or (d) - Building an extension\r
+!endif # if $(DOING_TCL)\r
+\r
+################################################################\r
+# 3. Determine compiler version and architecture\r
+# In this section, we figure out the compiler version and the\r
+# architecture for which we are building. This sets the\r
+# following macros:\r
+# VCVERSION - the internal compiler version as 1200, 1400, 1910 etc.\r
+#     This is also printed by the compiler in dotted form 19.10 etc.\r
+# VCVER - the "marketing version", for example Visual C++ 6 for internal\r
+#     compiler version 1200. This is kept only for legacy reasons as it\r
+#     does not make sense for recent Microsoft compilers. Only used for\r
+#     output directory names.\r
+# ARCH - set to IX86 or AMD64 depending on 32- or 64-bit target\r
+# NATIVE_ARCH - set to IX86 or AMD64 for the host machine\r
+# MACHINE - same as $(ARCH) - legacy\r
+# _VC_MANIFEST_EMBED_{DLL,EXE} - commands for embedding a manifest if needed\r
+\r
+cc32           = $(CC)   # built-in default.\r
+link32         = link\r
+lib32          = lib\r
+rc32           = $(RC)   # built-in default.\r
+\r
+#----------------------------------------------------------------\r
+# Figure out the compiler architecture and version by writing\r
+# the C macros to a file, preprocessing them with the C\r
+# preprocessor and reading back the created file\r
+\r
+_HASH=^#\r
+_VC_MANIFEST_EMBED_EXE=\r
+_VC_MANIFEST_EMBED_DLL=\r
+VCVER=0\r
+!if ![echo VCVERSION=_MSC_VER > vercl.x] \\r
+    && ![echo $(_HASH)if defined(_M_IX86) >> vercl.x] \\r
+    && ![echo ARCH=IX86 >> vercl.x] \\r
+    && ![echo $(_HASH)elif defined(_M_AMD64) >> vercl.x] \\r
+    && ![echo ARCH=AMD64 >> vercl.x] \\r
+    && ![echo $(_HASH)endif >> vercl.x] \\r
+    && ![$(cc32) -nologo -TC -P vercl.x 2>NUL]\r
+!include vercl.i\r
+!if $(VCVERSION) < 1900\r
+!if ![echo VCVER= ^\> vercl.vc] \\r
+    && ![set /a $(VCVERSION) / 100 - 6 >> vercl.vc]\r
+!include vercl.vc\r
+!endif\r
+!else\r
+# The simple calculation above does not apply to new Visual Studio releases\r
+# Keep the compiler version in its native form.\r
+VCVER = $(VCVERSION)\r
+!endif\r
+!endif\r
+\r
+!if ![del 2>NUL /q/f vercl.x vercl.i vercl.vc]\r
+!endif\r
+\r
+#----------------------------------------------------------------\r
+# The MACHINE macro is used by legacy makefiles so set it as well\r
+!ifdef MACHINE\r
+!if "$(MACHINE)" == "x86"\r
+!undef MACHINE\r
+MACHINE = IX86\r
+!elseif "$(MACHINE)" == "x64"\r
+!undef MACHINE\r
+MACHINE = AMD64\r
+!endif\r
+!if "$(MACHINE)" != "$(ARCH)"\r
+!error Specified MACHINE macro $(MACHINE) does not match detected target architecture $(ARCH).\r
+!endif\r
+!else\r
+MACHINE=$(ARCH)\r
+!endif\r
+\r
+#---------------------------------------------------------------\r
+# The PLATFORM_IDENTIFY macro matches the values returned by\r
+# the Tcl platform::identify command\r
+!if "$(MACHINE)" == "AMD64"\r
+PLATFORM_IDENTIFY = win32-x86_64\r
+!else\r
+PLATFORM_IDENTIFY = win32-ix86\r
+!endif\r
+\r
+# The MULTIPLATFORM macro controls whether binary extensions are installed\r
+# in platform-specific directories. Intended to be set/used by extensions.\r
+!ifndef MULTIPLATFORM_INSTALL\r
+MULTIPLATFORM_INSTALL = 0\r
+!endif\r
+\r
+#------------------------------------------------------------\r
+# Figure out the *host* architecture by reading the registry\r
+\r
+!if ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i x86]\r
+NATIVE_ARCH=IX86\r
+!else\r
+NATIVE_ARCH=AMD64\r
+!endif\r
+\r
+# Since MSVC8 we must deal with manifest resources.\r
+!if $(VCVERSION) >= 1400\r
+_VC_MANIFEST_EMBED_EXE=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1\r
+_VC_MANIFEST_EMBED_DLL=if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2\r
+!endif\r
+\r
+################################################################\r
+# 4. Build the nmakehlp program\r
+# This is a helper app we need to overcome nmake's limiting\r
+# environment. We will call out to it to get various bits of\r
+# information about supported compiler options etc.\r
+#\r
+# Tcl itself will always use the nmakehlp.c program which is\r
+# in its own source. It will be kept updated there.\r
+#\r
+# Extensions built against an installed Tcl will use the installed\r
+# copy of Tcl's nmakehlp.c if there is one and their own version\r
+# otherwise. In the latter case, they would also be using their own\r
+# rules.vc. Note that older versions of Tcl do not install nmakehlp.c\r
+# or rules.vc.\r
+#\r
+# Extensions built against Tcl sources will use the one from the Tcl source.\r
+#\r
+# When building an extension using a sufficiently new version of Tcl,\r
+# rules-ext.vc will define NMAKEHLPC appropriately to point to the\r
+# copy of nmakehlp.c to be used.\r
+\r
+!ifndef NMAKEHLPC\r
+# Default to the one in the current directory (the extension's own nmakehlp.c)\r
+NMAKEHLPC = nmakehlp.c\r
+\r
+!if !$(DOING_TCL)\r
+!if $(TCLINSTALL)\r
+!if exist("$(_TCLDIR)\lib\nmake\nmakehlp.c")\r
+NMAKEHLPC = $(_TCLDIR)\lib\nmake\nmakehlp.c\r
+!endif\r
+!else # !$(TCLINSTALL)\r
+!if exist("$(_TCLDIR)\win\nmakehlp.c")\r
+NMAKEHLPC = $(_TCLDIR)\win\nmakehlp.c\r
+!endif\r
+!endif # $(TCLINSTALL)\r
+!endif # !$(DOING_TCL)\r
+\r
+!endif # NMAKEHLPC\r
+\r
+# We always build nmakehlp even if it exists since we do not know\r
+# what source it was built from.\r
+!if [$(cc32) -nologo "$(NMAKEHLPC)" -link -subsystem:console > nul]\r
+!endif\r
+\r
+################################################################\r
+# 5. Test for compiler features\r
+# Visual C++ compiler options have changed over the years. Check\r
+# which options are supported by the compiler in use.\r
+#\r
+# The following macros are set:\r
+# OPTIMIZATIONS - the compiler flags to be used for optimized builds\r
+# DEBUGFLAGS - the compiler flags to be used for debug builds\r
+# LINKERFLAGS - Flags passed to the linker\r
+#\r
+# Note that these are the compiler settings *available*, not those\r
+# that will be *used*. The latter depends on the OPTS macro settings\r
+# which we have not yet parsed.\r
+#\r
+# Also note that some of the flags in OPTIMIZATIONS are not really\r
+# related to optimization. They are placed there only for legacy reasons\r
+# as some extensions expect them to be included in that macro.\r
+\r
+# -Op improves float consistency. Note only needed for older compilers\r
+# Newer compilers do not need or support this option.\r
+!if [nmakehlp -c -Op]\r
+FPOPTS  = -Op\r
+!endif\r
+\r
+# Strict floating point semantics - present in newer compilers in lieu of -Op\r
+!if [nmakehlp -c -fp:strict]\r
+FPOPTS  = $(FPOPTS) -fp:strict\r
+!endif\r
+\r
+!if "$(MACHINE)" == "IX86"\r
+### test for pentium errata\r
+!if [nmakehlp -c -QI0f]\r
+!message *** Compiler has 'Pentium 0x0f fix'\r
+FPOPTS  = $(FPOPTS) -QI0f\r
+!else\r
+!message *** Compiler does not have 'Pentium 0x0f fix'\r
+!endif\r
+!endif\r
+\r
+### test for optimizations\r
+# /O2 optimization includes /Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy as per\r
+# documentation. Note we do NOT want /Gs as that inserts a _chkstk\r
+# stack probe at *every* function entry, not just those with more than\r
+# a page of stack allocation resulting in a performance hit.  However,\r
+# /O2 documentation is misleading as its stack probes are simply the\r
+# default page size locals allocation probes and not what is implied\r
+# by an explicit /Gs option.\r
+\r
+OPTIMIZATIONS = $(FPOPTS)\r
+\r
+!if [nmakehlp -c -O2]\r
+OPTIMIZING = 1\r
+OPTIMIZATIONS   = $(OPTIMIZATIONS) -O2\r
+!else\r
+# Legacy, really. All modern compilers support this\r
+!message *** Compiler does not have 'Optimizations'\r
+OPTIMIZING = 0\r
+!endif\r
+\r
+# Checks for buffer overflows in local arrays\r
+!if [nmakehlp -c -GS]\r
+OPTIMIZATIONS  = $(OPTIMIZATIONS) -GS\r
+!endif\r
+\r
+# Link time optimization. Note that this option (potentially) makes\r
+# generated libraries only usable by the specific VC++ version that\r
+# created it. Requires /LTCG linker option\r
+!if [nmakehlp -c -GL]\r
+OPTIMIZATIONS  = $(OPTIMIZATIONS) -GL\r
+CC_GL_OPT_ENABLED = 1\r
+!else\r
+# In newer compilers -GL and -YX are incompatible.\r
+!if [nmakehlp -c -YX]\r
+OPTIMIZATIONS  = $(OPTIMIZATIONS) -YX\r
+!endif\r
+!endif # [nmakehlp -c -GL]\r
+\r
+DEBUGFLAGS     = $(FPOPTS)\r
+\r
+# Run time error checks. Not available or valid in a release, non-debug build\r
+# RTC is for modern compilers, -GZ is legacy\r
+!if [nmakehlp -c -RTC1]\r
+DEBUGFLAGS     = $(DEBUGFLAGS) -RTC1\r
+!elseif [nmakehlp -c -GZ]\r
+DEBUGFLAGS     = $(DEBUGFLAGS) -GZ\r
+!endif\r
+\r
+#----------------------------------------------------------------\r
+# Linker flags\r
+\r
+# LINKER_TESTFLAGS are for internal use when we call nmakehlp to test\r
+# if the linker supports a specific option. Without these flags link will\r
+# return "LNK1561: entry point must be defined" error compiling from VS-IDE:\r
+# They are not passed through to the actual application / extension\r
+# link rules.\r
+!ifndef LINKER_TESTFLAGS\r
+LINKER_TESTFLAGS = /DLL /NOENTRY /OUT:nmakehlp.out\r
+!endif\r
+\r
+LINKERFLAGS     =\r
+\r
+# If compiler has enabled link time optimization, linker must too with -ltcg\r
+!ifdef CC_GL_OPT_ENABLED\r
+!if [nmakehlp -l -ltcg $(LINKER_TESTFLAGS)]\r
+LINKERFLAGS     = $(LINKERFLAGS) -ltcg\r
+!endif\r
+!endif\r
+\r
+\r
+################################################################\r
+# 6. Extract various version numbers from headers\r
+# For Tcl and Tk, version numbers are extracted from tcl.h and tk.h\r
+# respectively. For extensions, versions are extracted from the\r
+# configure.in or configure.ac from the TEA configuration if it\r
+# exists, and unset otherwise.\r
+# Sets the following macros:\r
+# TCL_MAJOR_VERSION\r
+# TCL_MINOR_VERSION\r
+# TCL_RELEASE_SERIAL\r
+# TCL_PATCH_LEVEL\r
+# TCL_PATCH_LETTER\r
+# TCL_VERSION\r
+# TK_MAJOR_VERSION\r
+# TK_MINOR_VERSION\r
+# TK_RELEASE_SERIAL\r
+# TK_PATCH_LEVEL\r
+# TK_PATCH_LETTER\r
+# TK_VERSION\r
+# DOTVERSION - set as (for example) 2.5\r
+# VERSION - set as (for example 25)\r
+#--------------------------------------------------------------\r
+\r
+!if [echo REM = This file is generated from rules.vc > versions.vc]\r
+!endif\r
+!if [echo TCL_MAJOR_VERSION = \>> versions.vc] \\r
+   && [nmakehlp -V "$(_TCL_H)" TCL_MAJOR_VERSION >> versions.vc]\r
+!endif\r
+!if [echo TCL_MINOR_VERSION = \>> versions.vc] \\r
+   && [nmakehlp -V "$(_TCL_H)" TCL_MINOR_VERSION >> versions.vc]\r
+!endif\r
+!if [echo TCL_RELEASE_SERIAL = \>> versions.vc] \\r
+   && [nmakehlp -V "$(_TCL_H)" TCL_RELEASE_SERIAL >> versions.vc]\r
+!endif\r
+!if [echo TCL_PATCH_LEVEL = \>> versions.vc] \\r
+   && [nmakehlp -V "$(_TCL_H)" TCL_PATCH_LEVEL >> versions.vc]\r
+!endif\r
+\r
+!if defined(_TK_H)\r
+!if [echo TK_MAJOR_VERSION = \>> versions.vc] \\r
+   && [nmakehlp -V $(_TK_H) TK_MAJOR_VERSION >> versions.vc]\r
+!endif\r
+!if [echo TK_MINOR_VERSION = \>> versions.vc] \\r
+   && [nmakehlp -V $(_TK_H) TK_MINOR_VERSION >> versions.vc]\r
+!endif\r
+!if [echo TK_RELEASE_SERIAL = \>> versions.vc] \\r
+   && [nmakehlp -V "$(_TK_H)" TK_RELEASE_SERIAL >> versions.vc]\r
+!endif\r
+!if [echo TK_PATCH_LEVEL = \>> versions.vc] \\r
+   && [nmakehlp -V $(_TK_H) TK_PATCH_LEVEL >> versions.vc]\r
+!endif\r
+!endif # _TK_H\r
+\r
+!include versions.vc\r
+\r
+TCL_VERSION    = $(TCL_MAJOR_VERSION)$(TCL_MINOR_VERSION)\r
+TCL_DOTVERSION = $(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)\r
+!if [nmakehlp -f $(TCL_PATCH_LEVEL) "a"]\r
+TCL_PATCH_LETTER = a\r
+!elseif [nmakehlp -f $(TCL_PATCH_LEVEL) "b"]\r
+TCL_PATCH_LETTER = b\r
+!else\r
+TCL_PATCH_LETTER = .\r
+!endif\r
+\r
+!if defined(_TK_H)\r
+\r
+TK_VERSION     = $(TK_MAJOR_VERSION)$(TK_MINOR_VERSION)\r
+TK_DOTVERSION  = $(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)\r
+!if [nmakehlp -f $(TK_PATCH_LEVEL) "a"]\r
+TK_PATCH_LETTER = a\r
+!elseif [nmakehlp -f $(TK_PATCH_LEVEL) "b"]\r
+TK_PATCH_LETTER = b\r
+!else\r
+TK_PATCH_LETTER = .\r
+!endif\r
+\r
+!endif\r
+\r
+# Set DOTVERSION and VERSION\r
+!if $(DOING_TCL)\r
+\r
+DOTVERSION = $(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)\r
+VERSION = $(TCL_VERSION)\r
+\r
+!elseif $(DOING_TK)\r
+\r
+DOTVERSION = $(TK_DOTVERSION)\r
+VERSION = $(TK_VERSION)\r
+\r
+!else # Doing a non-Tk extension\r
+\r
+# If parent makefile has not defined DOTVERSION, try to get it from TEA\r
+# first from a configure.in file, and then from configure.ac\r
+!ifndef DOTVERSION\r
+!if [echo DOTVERSION = \> versions.vc] \\r
+   || [nmakehlp -V $(ROOT)\configure.in ^[$(PROJECT)^] >> versions.vc]\r
+!if [echo DOTVERSION = \> versions.vc] \\r
+   || [nmakehlp -V $(ROOT)\configure.ac ^[$(PROJECT)^] >> versions.vc]\r
+!error *** Could not figure out extension version. Please define DOTVERSION in parent makefile before including rules.vc.\r
+!endif\r
+!endif\r
+!include versions.vc\r
+!endif # DOTVERSION\r
+VERSION         = $(DOTVERSION:.=)\r
+\r
+!endif # $(DOING_TCL) ... etc.\r
+\r
+# Windows RC files have 3 version components. Ensure this irrespective\r
+# of how many components the package has specified. Basically, ensure\r
+# minimum 4 components by appending 4 0's and then pick out the first 4.\r
+# Also take care of the fact that DOTVERSION may have "a" or "b" instead\r
+# of "." separating the version components.\r
+DOTSEPARATED=$(DOTVERSION:a=.)\r
+DOTSEPARATED=$(DOTSEPARATED:b=.)\r
+!if [echo RCCOMMAVERSION = \> versions.vc] \\r
+  || [for /f "tokens=1,2,3,4,5* delims=." %a in ("$(DOTSEPARATED).0.0.0.0") do echo %a,%b,%c,%d >> versions.vc]\r
+!error *** Could not generate RCCOMMAVERSION ***\r
+!endif\r
+!include versions.vc\r
+\r
+########################################################################\r
+# 7. Parse the OPTS macro to work out the requested build configuration.\r
+# Based on this, we will construct the actual switches to be passed to the\r
+# compiler and linker using the macros defined in the previous section.\r
+# The following macros are defined by this section based on OPTS\r
+# STATIC_BUILD - 0 -> Tcl is to be built as a shared library\r
+#                1 -> build as a static library and shell\r
+# TCL_THREADS - legacy but always 1 on Windows since winsock requires it.\r
+# DEBUG - 1 -> debug build, 0 -> release builds\r
+# SYMBOLS - 1 -> generate PDB's, 0 -> no PDB's\r
+# PROFILE - 1 -> generate profiling info, 0 -> no profiling\r
+# PGO     - 1 -> profile based optimization, 0 -> no\r
+# MSVCRT  - 1 -> link to dynamic C runtime even when building static Tcl build\r
+#           0 -> link to static C runtime for static Tcl build.\r
+#           Does not impact shared Tcl builds (STATIC_BUILD == 0)\r
+#           Default: 1 for Tcl 8.7 and up, 0 otherwise.\r
+# TCL_USE_STATIC_PACKAGES - 1 -> statically link the registry and dde extensions\r
+#           in the Tcl and Wish shell. 0 -> keep them as shared libraries. Does\r
+#           not impact shared Tcl builds. Implied by STATIC_BUILD since Tcl 8.7.\r
+# USE_THREAD_ALLOC - 1 -> Use a shared global free pool for allocation.\r
+#           0 -> Use the non-thread allocator.\r
+# UNCHECKED - 1 -> when doing a debug build with symbols, use the release\r
+#           C runtime, 0 -> use the debug C runtime.\r
+# USE_STUBS - 1 -> compile to use stubs interfaces, 0 -> direct linking\r
+# CONFIG_CHECK - 1 -> check current build configuration against Tcl\r
+#           configuration (ignored for Tcl itself)\r
+# _USE_64BIT_TIME_T - forces a build using 64-bit time_t for 32-bit build\r
+#           (CRT library should support this, not needed for Tcl 9.x)\r
+# TCL_UTF_MAX=4 - forces a build allowing 4-byte UTF-8 sequences internally.\r
+#           (Not needed for Tcl 9.x)\r
+# Further, LINKERFLAGS are modified based on above.\r
+\r
+# Default values for all the above\r
+STATIC_BUILD   = 0\r
+TCL_THREADS    = 1\r
+DEBUG          = 0\r
+SYMBOLS                = 0\r
+PROFILE                = 0\r
+PGO            = 0\r
+MSVCRT         = 1\r
+TCL_USE_STATIC_PACKAGES        = 0\r
+USE_THREAD_ALLOC = 1\r
+UNCHECKED      = 0\r
+CONFIG_CHECK    = 1\r
+!if $(DOING_TCL)\r
+USE_STUBS       = 0\r
+!else\r
+USE_STUBS       = 1\r
+!endif\r
+\r
+# If OPTS is not empty AND does not contain "none" which turns off all OPTS\r
+# set the above macros based on OPTS content\r
+!if "$(OPTS)" != "" && ![nmakehlp -f "$(OPTS)" "none"]\r
+\r
+# OPTS are specified, parse them\r
+\r
+!if [nmakehlp -f $(OPTS) "static"]\r
+!message *** Doing static\r
+STATIC_BUILD   = 1\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "nostubs"]\r
+!message *** Not using stubs\r
+USE_STUBS      = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "nomsvcrt"]\r
+!message *** Doing nomsvcrt\r
+MSVCRT         = 0\r
+!else\r
+!if [nmakehlp -f $(OPTS) "msvcrt"]\r
+!message *** Doing msvcrt\r
+!else\r
+!if $(TCL_MAJOR_VERSION) == 8 && $(TCL_MINOR_VERSION) < 7 && $(STATIC_BUILD)\r
+MSVCRT         = 0\r
+!endif\r
+!endif\r
+!endif # [nmakehlp -f $(OPTS) "nomsvcrt"]\r
+\r
+!if [nmakehlp -f $(OPTS) "staticpkg"] && $(STATIC_BUILD)\r
+!message *** Doing staticpkg\r
+TCL_USE_STATIC_PACKAGES        = 1\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "nothreads"]\r
+!message *** Compile explicitly for non-threaded tcl\r
+TCL_THREADS = 0\r
+USE_THREAD_ALLOC= 0\r
+!endif\r
+\r
+!if $(TCL_MAJOR_VERSION) == 8\r
+!if [nmakehlp -f $(OPTS) "time64bit"]\r
+!message *** Force 64-bit time_t\r
+_USE_64BIT_TIME_T = 1\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "utfmax"]\r
+!message *** Force allowing 4-byte UTF-8 sequences internally\r
+TCL_UTF_MAX = 4\r
+!endif\r
+!endif\r
+\r
+# Yes, it's weird that the "symbols" option controls DEBUG and\r
+# the "pdbs" option controls SYMBOLS. That's historical.\r
+!if [nmakehlp -f $(OPTS) "symbols"]\r
+!message *** Doing symbols\r
+DEBUG          = 1\r
+!else\r
+DEBUG          = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "pdbs"]\r
+!message *** Doing pdbs\r
+SYMBOLS                = 1\r
+!else\r
+SYMBOLS                = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "profile"]\r
+!message *** Doing profile\r
+PROFILE                = 1\r
+!else\r
+PROFILE                = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "pgi"]\r
+!message *** Doing profile guided optimization instrumentation\r
+PGO            = 1\r
+!elseif [nmakehlp -f $(OPTS) "pgo"]\r
+!message *** Doing profile guided optimization\r
+PGO            = 2\r
+!else\r
+PGO            = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "loimpact"]\r
+!message *** Warning: ignoring option "loimpact" - deprecated on modern Windows.\r
+!endif\r
+\r
+# TBD - should get rid of this option\r
+!if [nmakehlp -f $(OPTS) "thrdalloc"]\r
+!message *** Doing thrdalloc\r
+USE_THREAD_ALLOC = 1\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "tclalloc"]\r
+USE_THREAD_ALLOC = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "unchecked"]\r
+!message *** Doing unchecked\r
+UNCHECKED = 1\r
+!else\r
+UNCHECKED = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(OPTS) "noconfigcheck"]\r
+CONFIG_CHECK = 1\r
+!else\r
+CONFIG_CHECK = 0\r
+!endif\r
+\r
+!endif # "$(OPTS)" != ""  && ... parsing of OPTS\r
+\r
+# Set linker flags based on above\r
+\r
+!if $(PGO) > 1\r
+!if [nmakehlp -l -ltcg:pgoptimize $(LINKER_TESTFLAGS)]\r
+LINKERFLAGS    = $(LINKERFLAGS:-ltcg=) -ltcg:pgoptimize\r
+!else\r
+MSG=^\r
+This compiler does not support profile guided optimization.\r
+!error $(MSG)\r
+!endif\r
+!elseif $(PGO) > 0\r
+!if [nmakehlp -l -ltcg:pginstrument $(LINKER_TESTFLAGS)]\r
+LINKERFLAGS    = $(LINKERFLAGS:-ltcg=) -ltcg:pginstrument\r
+!else\r
+MSG=^\r
+This compiler does not support profile guided optimization.\r
+!error $(MSG)\r
+!endif\r
+!endif\r
+\r
+################################################################\r
+# 8. Parse the STATS macro to configure code instrumentation\r
+# The following macros are set by this section:\r
+# TCL_MEM_DEBUG - 1 -> enables memory allocation instrumentation\r
+#                 0 -> disables\r
+# TCL_COMPILE_DEBUG - 1 -> enables byte compiler logging\r
+#                     0 -> disables\r
+\r
+# Default both are off\r
+TCL_MEM_DEBUG      = 0\r
+TCL_COMPILE_DEBUG   = 0\r
+\r
+!if "$(STATS)" != "" && ![nmakehlp -f "$(STATS)" "none"]\r
+\r
+!if [nmakehlp -f $(STATS) "memdbg"]\r
+!message *** Doing memdbg\r
+TCL_MEM_DEBUG      = 1\r
+!else\r
+TCL_MEM_DEBUG      = 0\r
+!endif\r
+\r
+!if [nmakehlp -f $(STATS) "compdbg"]\r
+!message *** Doing compdbg\r
+TCL_COMPILE_DEBUG   = 1\r
+!else\r
+TCL_COMPILE_DEBUG   = 0\r
+!endif\r
+\r
+!endif\r
+\r
+####################################################################\r
+# 9. Parse the CHECKS macro to configure additional compiler checks\r
+# The following macros are set by this section:\r
+# WARNINGS - compiler switches that control the warnings level\r
+# TCL_NO_DEPRECATED - 1 -> disable support for deprecated functions\r
+#                     0 -> enable deprecated functions\r
+\r
+# Defaults - Permit deprecated functions and warning level 3\r
+TCL_NO_DEPRECATED          = 0\r
+WARNINGS                   = -W3\r
+\r
+!if "$(CHECKS)" != "" && ![nmakehlp -f "$(CHECKS)" "none"]\r
+\r
+!if [nmakehlp -f $(CHECKS) "nodep"]\r
+!message *** Doing nodep check\r
+TCL_NO_DEPRECATED          = 1\r
+!endif\r
+\r
+!if [nmakehlp -f $(CHECKS) "fullwarn"]\r
+!message *** Doing full warnings check\r
+WARNINGS                   = -W4\r
+!if [nmakehlp -l -warn:3 $(LINKER_TESTFLAGS)]\r
+LINKERFLAGS                = $(LINKERFLAGS) -warn:3\r
+!endif\r
+!endif\r
+\r
+!if [nmakehlp -f $(CHECKS) "64bit"] && [nmakehlp -c -Wp64]\r
+!message *** Doing 64bit portability warnings\r
+WARNINGS                   = $(WARNINGS) -Wp64\r
+!endif\r
+\r
+!endif\r
+\r
+\r
+################################################################\r
+# 10. Construct output directory and file paths\r
+# Figure-out how to name our intermediate and output directories.\r
+# In order to avoid inadvertent mixing of object files built using\r
+# different compilers, build configurations etc.,\r
+#\r
+# Naming convention (suffixes):\r
+#   t = full thread support. (Not used for Tcl >= 8.7)\r
+#   s = static library (as opposed to an import library)\r
+#   g = linked to the debug enabled C run-time.\r
+#   x = special static build when it links to the dynamic C run-time.\r
+#\r
+# The following macros are set in this section:\r
+# SUFX - the suffix to use for binaries based on above naming convention\r
+# BUILDDIRTOP - the toplevel default output directory\r
+#      is of the form {Release,Debug}[_AMD64][_COMPILERVERSION]\r
+# TMP_DIR - directory where object files are created\r
+# OUT_DIR - directory where output executables are created\r
+# Both TMP_DIR and OUT_DIR are defaulted only if not defined by the\r
+# parent makefile (or command line). The default values are\r
+# based on BUILDDIRTOP.\r
+# STUBPREFIX - name of the stubs library for this project\r
+# PRJIMPLIB - output path of the generated project import library\r
+# PRJLIBNAME - name of generated project library\r
+# PRJLIB     - output path of generated project library\r
+# PRJSTUBLIBNAME - name of the generated project stubs library\r
+# PRJSTUBLIB - output path of the generated project stubs library\r
+# RESFILE - output resource file (only if not static build)\r
+\r
+SUFX       = tsgx\r
+\r
+!if $(DEBUG)\r
+BUILDDIRTOP = Debug\r
+!else\r
+BUILDDIRTOP = Release\r
+!endif\r
+\r
+!if "$(MACHINE)" != "IX86"\r
+BUILDDIRTOP =$(BUILDDIRTOP)_$(MACHINE)\r
+!endif\r
+!if $(VCVER) > 6\r
+BUILDDIRTOP =$(BUILDDIRTOP)_VC$(VCVER)\r
+!endif\r
+\r
+!if !$(DEBUG) || $(TCL_VERSION) > 86 || $(DEBUG) && $(UNCHECKED)\r
+SUFX       = $(SUFX:g=)\r
+!endif\r
+\r
+TMP_DIRFULL = .\$(BUILDDIRTOP)\$(PROJECT)_ThreadedDynamicStaticX\r
+\r
+!if !$(STATIC_BUILD)\r
+TMP_DIRFULL = $(TMP_DIRFULL:Static=)\r
+SUFX       = $(SUFX:s=)\r
+EXT        = dll\r
+TMP_DIRFULL = $(TMP_DIRFULL:X=)\r
+SUFX       = $(SUFX:x=)\r
+!else\r
+TMP_DIRFULL = $(TMP_DIRFULL:Dynamic=)\r
+EXT        = lib\r
+!if !$(MSVCRT)\r
+TMP_DIRFULL = $(TMP_DIRFULL:X=)\r
+SUFX       = $(SUFX:x=)\r
+!endif\r
+!endif\r
+\r
+!if !$(TCL_THREADS) || $(TCL_VERSION) > 86\r
+TMP_DIRFULL = $(TMP_DIRFULL:Threaded=)\r
+SUFX       = $(SUFX:t=)\r
+!endif\r
+\r
+!ifndef TMP_DIR\r
+TMP_DIR            = $(TMP_DIRFULL)\r
+!ifndef OUT_DIR\r
+OUT_DIR            = .\$(BUILDDIRTOP)\r
+!endif\r
+!else\r
+!ifndef OUT_DIR\r
+OUT_DIR            = $(TMP_DIR)\r
+!endif\r
+!endif\r
+\r
+# Relative paths -> absolute\r
+!if [echo OUT_DIR = \> nmakehlp.out] \\r
+   || [nmakehlp -Q "$(OUT_DIR)" >> nmakehlp.out]\r
+!error *** Could not fully qualify path OUT_DIR=$(OUT_DIR)\r
+!endif\r
+!if [echo TMP_DIR = \>> nmakehlp.out] \\r
+   || [nmakehlp -Q "$(TMP_DIR)" >> nmakehlp.out]\r
+!error *** Could not fully qualify path TMP_DIR=$(TMP_DIR)\r
+!endif\r
+!include nmakehlp.out\r
+\r
+# The name of the stubs library for the project being built\r
+STUBPREFIX      = $(PROJECT)stub\r
+\r
+#\r
+# Set up paths to various Tcl executables and libraries needed by extensions\r
+#\r
+\r
+# TIP 430. Unused for 8.6 but no harm defining it to allow a common rules.vc\r
+TCLSCRIPTZIPNAME = libtcl$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)$(TCL_PATCH_LETTER)$(TCL_RELEASE_SERIAL).zip\r
+TKSCRIPTZIPNAME = libtk$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)$(TK_PATCH_LETTER)$(TK_RELEASE_SERIAL).zip\r
+\r
+!if $(DOING_TCL)\r
+TCLSHNAME       = $(PROJECT)sh$(VERSION)$(SUFX).exe\r
+TCLSH          = $(OUT_DIR)\$(TCLSHNAME)\r
+TCLIMPLIB      = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib\r
+TCLLIBNAME     = $(PROJECT)$(VERSION)$(SUFX).$(EXT)\r
+TCLLIB         = $(OUT_DIR)\$(TCLLIBNAME)\r
+TCLSCRIPTZIP    = $(OUT_DIR)\$(TCLSCRIPTZIPNAME)\r
+\r
+TCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib\r
+TCLSTUBLIB     = $(OUT_DIR)\$(TCLSTUBLIBNAME)\r
+TCL_INCLUDES    = -I"$(WIN_DIR)" -I"$(GENERICDIR)"\r
+\r
+!else # !$(DOING_TCL)\r
+\r
+!if $(TCLINSTALL) # Building against an installed Tcl\r
+\r
+# When building extensions, we need to locate tclsh. Depending on version\r
+# of Tcl we are building against, this may or may not have a "t" suffix.\r
+# Try various possibilities in turn.\r
+TCLSH          = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX:t=).exe\r
+!if !exist("$(TCLSH)")\r
+TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX:t=).exe\r
+!endif\r
+\r
+TCLSTUBLIB     = $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib\r
+TCLIMPLIB      = $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).lib\r
+# When building extensions, may be linking against Tcl that does not add\r
+# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.\r
+!if !exist("$(TCLIMPLIB)")\r
+TCLIMPLIB      = $(_TCLDIR)\lib\tcl$(TCL_VERSION)t$(SUFX:t=).lib\r
+!endif\r
+TCL_LIBRARY    = $(_TCLDIR)\lib\r
+TCLREGLIB      = $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib\r
+TCLDDELIB      = $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib\r
+TCLSCRIPTZIP   = $(_TCLDIR)\lib\$(TCLSCRIPTZIPNAME)\r
+TCLTOOLSDIR    = \must\have\tcl\sources\to\build\this\target\r
+TCL_INCLUDES    = -I"$(_TCLDIR)\include"\r
+\r
+!else # Building against Tcl sources\r
+\r
+TCLSH          = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe\r
+!if !exist($(TCLSH))\r
+TCLSH          = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX:t=).exe\r
+!endif\r
+TCLSTUBLIB     = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib\r
+TCLIMPLIB      = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).lib\r
+# When building extensions, may be linking against Tcl that does not add\r
+# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.\r
+!if !exist("$(TCLIMPLIB)")\r
+TCLIMPLIB      = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)t$(SUFX:t=).lib\r
+!endif\r
+TCL_LIBRARY    = $(_TCLDIR)\library\r
+TCLREGLIB      = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib\r
+TCLDDELIB      = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib\r
+TCLSCRIPTZIP   = $(_TCLDIR)\win\$(BUILDDIRTOP)\$(TCLSCRIPTZIPNAME)\r
+TCLTOOLSDIR    = $(_TCLDIR)\tools\r
+TCL_INCLUDES   = -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"\r
+\r
+!endif # TCLINSTALL\r
+\r
+tcllibs = "$(TCLSTUBLIB)" "$(TCLIMPLIB)"\r
+\r
+!endif # $(DOING_TCL)\r
+\r
+# We need a tclsh that will run on the host machine as part of the build.\r
+# IX86 runs on all architectures.\r
+!ifndef TCLSH_NATIVE\r
+!if "$(MACHINE)" == "IX86" || "$(MACHINE)" == "$(NATIVE_ARCH)"\r
+TCLSH_NATIVE   = $(TCLSH)\r
+!else\r
+!error You must explicitly set TCLSH_NATIVE for cross-compilation\r
+!endif\r
+!endif\r
+\r
+# Do the same for Tk and Tk extensions that require the Tk libraries\r
+!if $(DOING_TK) || $(NEED_TK)\r
+WISHNAMEPREFIX = wish\r
+WISHNAME = $(WISHNAMEPREFIX)$(TK_VERSION)$(SUFX).exe\r
+TKLIBNAME8     = tk$(TK_VERSION)$(SUFX).$(EXT)\r
+TKLIBNAME9     = tcl9tk$(TK_VERSION)$(SUFX).$(EXT)\r
+!if $(TCL_MAJOR_VERSION) == 8\r
+TKLIBNAME      = tk$(TK_VERSION)$(SUFX).$(EXT)\r
+TKIMPLIBNAME   = tk$(TK_VERSION)$(SUFX).lib\r
+!else\r
+TKLIBNAME      = tcl9tk$(TK_VERSION)$(SUFX).$(EXT)\r
+TKIMPLIBNAME   = tcl9tk$(TK_VERSION)$(SUFX).lib\r
+!endif\r
+TKSTUBLIBNAME  = tkstub$(TK_VERSION).lib\r
+\r
+!if $(DOING_TK)\r
+WISH           = $(OUT_DIR)\$(WISHNAME)\r
+TKSTUBLIB      = $(OUT_DIR)\$(TKSTUBLIBNAME)\r
+TKIMPLIB       = $(OUT_DIR)\$(TKIMPLIBNAME)\r
+TKLIB          = $(OUT_DIR)\$(TKLIBNAME)\r
+TK_INCLUDES     = -I"$(WIN_DIR)" -I"$(GENERICDIR)"\r
+TKSCRIPTZIP     = $(OUT_DIR)\$(TKSCRIPTZIPNAME)\r
+\r
+!else # effectively NEED_TK\r
+\r
+!if $(TKINSTALL) # Building against installed Tk\r
+WISH           = $(_TKDIR)\bin\$(WISHNAME)\r
+TKSTUBLIB      = $(_TKDIR)\lib\$(TKSTUBLIBNAME)\r
+TKIMPLIB       = $(_TKDIR)\lib\$(TKIMPLIBNAME)\r
+# When building extensions, may be linking against Tk that does not add\r
+# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.\r
+!if !exist("$(TKIMPLIB)")\r
+TKIMPLIBNAME   = tk$(TK_VERSION)$(SUFX:t=).lib\r
+TKIMPLIB       = $(_TKDIR)\lib\$(TKIMPLIBNAME)\r
+!endif\r
+TK_INCLUDES     = -I"$(_TKDIR)\include"\r
+TKSCRIPTZIP     = $(_TKDIR)\lib\$(TKSCRIPTZIPNAME)\r
+\r
+!else # Building against Tk sources\r
+\r
+WISH           = $(_TKDIR)\win\$(BUILDDIRTOP)\$(WISHNAME)\r
+TKSTUBLIB      = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKSTUBLIBNAME)\r
+TKIMPLIB       = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKIMPLIBNAME)\r
+# When building extensions, may be linking against Tk that does not add\r
+# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.\r
+!if !exist("$(TKIMPLIB)")\r
+TKIMPLIBNAME   = tk$(TK_VERSION)$(SUFX:t=).lib\r
+TKIMPLIB       = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKIMPLIBNAME)\r
+!endif\r
+TK_INCLUDES     = -I"$(_TKDIR)\generic" -I"$(_TKDIR)\win" -I"$(_TKDIR)\xlib"\r
+TKSCRIPTZIP     = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKSCRIPTZIPNAME)\r
+\r
+!endif # TKINSTALL\r
+\r
+tklibs = "$(TKSTUBLIB)" "$(TKIMPLIB)"\r
+\r
+!endif # $(DOING_TK)\r
+!endif # $(DOING_TK) || $(NEED_TK)\r
+\r
+# Various output paths\r
+PRJIMPLIB      = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib\r
+PRJLIBNAME8    = $(PROJECT)$(VERSION)$(SUFX).$(EXT)\r
+PRJLIBNAME9    = tcl9$(PROJECT)$(VERSION)$(SUFX).$(EXT)\r
+!if $(TCL_MAJOR_VERSION) == 8\r
+PRJLIBNAME     = $(PRJLIBNAME8)\r
+!else\r
+PRJLIBNAME     = $(PRJLIBNAME9)\r
+!endif\r
+PRJLIB         = $(OUT_DIR)\$(PRJLIBNAME)\r
+\r
+PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib\r
+PRJSTUBLIB     = $(OUT_DIR)\$(PRJSTUBLIBNAME)\r
+\r
+# If extension parent makefile has not defined a resource definition file,\r
+# we will generate one from standard template.\r
+!if !$(DOING_TCL) && !$(DOING_TK) && !$(STATIC_BUILD)\r
+!ifdef RCFILE\r
+RESFILE = $(TMP_DIR)\$(RCFILE:.rc=.res)\r
+!else\r
+RESFILE = $(TMP_DIR)\$(PROJECT).res\r
+!endif\r
+!endif\r
+\r
+###################################################################\r
+# 11. Construct the paths for the installation directories\r
+# The following macros get defined in this section:\r
+# LIB_INSTALL_DIR - where libraries should be installed\r
+# BIN_INSTALL_DIR - where the executables should be installed\r
+# DOC_INSTALL_DIR - where documentation should be installed\r
+# SCRIPT_INSTALL_DIR - where scripts should be installed\r
+# INCLUDE_INSTALL_DIR - where C include files should be installed\r
+# DEMO_INSTALL_DIR - where demos should be installed\r
+# PRJ_INSTALL_DIR - where package will be installed (not set for Tcl and Tk)\r
+\r
+!if $(DOING_TCL) || $(DOING_TK)\r
+LIB_INSTALL_DIR                = $(_INSTALLDIR)\lib\r
+BIN_INSTALL_DIR                = $(_INSTALLDIR)\bin\r
+DOC_INSTALL_DIR                = $(_INSTALLDIR)\doc\r
+!if $(DOING_TCL)\r
+SCRIPT_INSTALL_DIR     = $(_INSTALLDIR)\lib\$(PROJECT)$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)\r
+MODULE_INSTALL_DIR     = $(_INSTALLDIR)\lib\tcl$(TCL_MAJOR_VERSION)\r
+!else # DOING_TK\r
+SCRIPT_INSTALL_DIR     = $(_INSTALLDIR)\lib\$(PROJECT)$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)\r
+!endif\r
+DEMO_INSTALL_DIR       = $(SCRIPT_INSTALL_DIR)\demos\r
+INCLUDE_INSTALL_DIR    = $(_INSTALLDIR)\include\r
+\r
+!else # extension other than Tk\r
+\r
+PRJ_INSTALL_DIR         = $(_INSTALLDIR)\$(PROJECT)$(DOTVERSION)\r
+!if $(MULTIPLATFORM_INSTALL)\r
+LIB_INSTALL_DIR                = $(PRJ_INSTALL_DIR)\$(PLATFORM_IDENTIFY)\r
+BIN_INSTALL_DIR                = $(PRJ_INSTALL_DIR)\$(PLATFORM_IDENTIFY)\r
+!else\r
+LIB_INSTALL_DIR                = $(PRJ_INSTALL_DIR)\r
+BIN_INSTALL_DIR                = $(PRJ_INSTALL_DIR)\r
+!endif\r
+DOC_INSTALL_DIR                = $(PRJ_INSTALL_DIR)\r
+SCRIPT_INSTALL_DIR     = $(PRJ_INSTALL_DIR)\r
+DEMO_INSTALL_DIR       = $(PRJ_INSTALL_DIR)\demos\r
+INCLUDE_INSTALL_DIR    = $(_INSTALLDIR)\..\include\r
+\r
+!endif\r
+\r
+###################################################################\r
+# 12. Set up actual options to be passed to the compiler and linker\r
+# Now we have all the information we need, set up the actual flags and\r
+# options that we will pass to the compiler and linker. The main\r
+# makefile should use these in combination with whatever other flags\r
+# and switches are specific to it.\r
+# The following macros are defined, names are for historical compatibility:\r
+# OPTDEFINES - /Dxxx C macro flags based on user-specified OPTS\r
+# COMPILERFLAGS - /Dxxx C macro flags independent of any configuration opttions\r
+# crt - Compiler switch that selects the appropriate C runtime\r
+# cdebug - Compiler switches related to debug AND optimizations\r
+# cwarn - Compiler switches that set warning levels\r
+# cflags - complete compiler switches (subsumes cdebug and cwarn)\r
+# ldebug - Linker switches controlling debug information and optimization\r
+# lflags - complete linker switches (subsumes ldebug) except subsystem type\r
+# dlllflags - complete linker switches to build DLLs (subsumes lflags)\r
+# conlflags - complete linker switches for console program (subsumes lflags)\r
+# guilflags - complete linker switches for GUI program (subsumes lflags)\r
+# baselibs - minimum Windows libraries required. Parent makefile can\r
+#    define PRJ_LIBS before including rules.rc if additional libs are needed\r
+\r
+OPTDEFINES     = /DSTDC_HEADERS\r
+!if $(VCVERSION) > 1600\r
+OPTDEFINES     = $(OPTDEFINES) /DHAVE_STDINT_H=1\r
+!else\r
+OPTDEFINES     = $(OPTDEFINES) /DMP_NO_STDINT=1\r
+!endif\r
+!if $(VCVERSION) >= 1800\r
+OPTDEFINES     = $(OPTDEFINES) /DHAVE_INTTYPES_H=1 /DHAVE_STDBOOL_H=1\r
+!endif\r
+\r
+!if $(TCL_MEM_DEBUG)\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_MEM_DEBUG\r
+!endif\r
+!if $(TCL_COMPILE_DEBUG)\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_COMPILE_DEBUG /DTCL_COMPILE_STATS\r
+!endif\r
+!if $(TCL_THREADS) && $(TCL_VERSION) < 87\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_THREADS=1\r
+!if $(USE_THREAD_ALLOC) && $(TCL_VERSION) < 87\r
+OPTDEFINES     = $(OPTDEFINES) /DUSE_THREAD_ALLOC=1\r
+!endif\r
+!endif\r
+!if $(STATIC_BUILD)\r
+OPTDEFINES     = $(OPTDEFINES) /DSTATIC_BUILD\r
+!elseif $(TCL_VERSION) > 86\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_WITH_EXTERNAL_TOMMATH\r
+!if "$(MACHINE)" == "AMD64"\r
+OPTDEFINES     = $(OPTDEFINES) /DMP_64BIT\r
+!endif\r
+!endif\r
+!if $(TCL_NO_DEPRECATED)\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_NO_DEPRECATED\r
+!endif\r
+\r
+!if $(USE_STUBS)\r
+# Note we do not define USE_TCL_STUBS even when building tk since some\r
+# test targets in tk do not use stubs\r
+!if !$(DOING_TCL)\r
+USE_STUBS_DEFS  = /DUSE_TCL_STUBS /DUSE_TCLOO_STUBS\r
+!if $(NEED_TK)\r
+USE_STUBS_DEFS  = $(USE_STUBS_DEFS) /DUSE_TK_STUBS\r
+!endif\r
+!endif\r
+!endif # USE_STUBS\r
+\r
+!if !$(DEBUG)\r
+OPTDEFINES     = $(OPTDEFINES) /DNDEBUG\r
+!if $(OPTIMIZING)\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_CFG_OPTIMIZED\r
+!endif\r
+!endif\r
+!if $(PROFILE)\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_CFG_PROFILED\r
+!endif\r
+!if "$(MACHINE)" == "AMD64"\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_CFG_DO64BIT\r
+!endif\r
+!if $(VCVERSION) < 1300\r
+OPTDEFINES     = $(OPTDEFINES) /DNO_STRTOI64=1\r
+!endif\r
+\r
+!if "$(TCL_MAJOR_VERSION)" == "8"\r
+!if "$(_USE_64BIT_TIME_T)" == "1"\r
+OPTDEFINES     = $(OPTDEFINES) /D_USE_64BIT_TIME_T=1\r
+!endif\r
+!if "$(TCL_UTF_MAX)" == "4"\r
+OPTDEFINES     = $(OPTDEFINES) /DTCL_UTF_MAX=4\r
+!endif\r
+\r
+# _ATL_XP_TARGETING - Newer SDK's need this to build for XP\r
+COMPILERFLAGS  = /D_ATL_XP_TARGETING\r
+!endif\r
+\r
+# Like the TEA system only set this non empty for non-Tk extensions\r
+# Note: some extensions use PACKAGE_NAME and others use PACKAGE_TCLNAME\r
+# so we pass both\r
+!if !$(DOING_TCL) && !$(DOING_TK)\r
+PKGNAMEFLAGS = /DPACKAGE_NAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \\r
+               /DPACKAGE_TCLNAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \\r
+               /DPACKAGE_VERSION="\"$(DOTVERSION)\"" \\r
+               /DMODULE_SCOPE=extern\r
+!endif\r
+\r
+# crt picks the C run time based on selected OPTS\r
+!if $(MSVCRT)\r
+!if $(DEBUG) && !$(UNCHECKED)\r
+crt = -MDd\r
+!else\r
+crt = -MD\r
+!endif\r
+!else\r
+!if $(DEBUG) && !$(UNCHECKED)\r
+crt = -MTd\r
+!else\r
+crt = -MT\r
+!endif\r
+!endif\r
+\r
+# cdebug includes compiler options for debugging as well as optimization.\r
+!if $(DEBUG)\r
+\r
+# In debugging mode, optimizations need to be disabled\r
+cdebug = -Zi -Od $(DEBUGFLAGS)\r
+\r
+!else\r
+\r
+cdebug = $(OPTIMIZATIONS)\r
+!if $(SYMBOLS)\r
+cdebug = $(cdebug) -Zi\r
+!endif\r
+\r
+!endif # $(DEBUG)\r
+\r
+# cwarn includes default warning levels.\r
+cwarn = $(WARNINGS)\r
+\r
+!if "$(MACHINE)" == "AMD64"\r
+# Disable pointer<->int warnings related to cast between different sizes\r
+# There are a gadzillion of these due to use of ClientData and\r
+# clutter up compiler\r
+# output increasing chance of a real warning getting lost. So disable them.\r
+# Eventually some day, Tcl will be 64-bit clean.\r
+cwarn = $(cwarn) -wd4311 -wd4312\r
+!endif\r
+\r
+### Common compiler options that are architecture specific\r
+!if "$(MACHINE)" == "ARM"\r
+carch = /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE\r
+!else\r
+carch =\r
+!endif\r
+\r
+!if $(DEBUG)\r
+# Turn warnings into errors\r
+cwarn = $(cwarn) -WX\r
+!endif\r
+\r
+INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES)\r
+!if !$(DOING_TCL) && !$(DOING_TK)\r
+INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WIN_DIR)" -I"$(COMPATDIR)"\r
+!endif\r
+\r
+# These flags are defined roughly in the order of the pre-reform\r
+# rules.vc/makefile.vc to help visually compare that the pre- and\r
+# post-reform build logs\r
+\r
+# cflags contains generic flags used for building practically all object files\r
+cflags = -nologo -c $(COMPILERFLAGS) $(carch) $(cwarn) -Fp$(TMP_DIR)^\ $(cdebug)\r
+\r
+# appcflags contains $(cflags) and flags for building the application\r
+# object files (e.g. tclsh, or wish) pkgcflags contains $(cflags) plus\r
+# flags used for building shared object files The two differ in the\r
+# BUILD_$(PROJECT) macro which should be defined only for the shared\r
+# library *implementation* and not for its caller interface\r
+\r
+appcflags_nostubs = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES)\r
+appcflags = $(appcflags_nostubs) $(USE_STUBS_DEFS)\r
+pkgcflags = $(appcflags) $(PKGNAMEFLAGS) /DBUILD_$(PROJECT)\r
+pkgcflags_nostubs = $(appcflags_nostubs) $(PKGNAMEFLAGS) /DBUILD_$(PROJECT)\r
+\r
+# stubscflags contains $(cflags) plus flags used for building a stubs\r
+# library for the package.  Note: /DSTATIC_BUILD is defined in\r
+# $(OPTDEFINES) only if the OPTS configuration indicates a static\r
+# library. However the stubs library is ALWAYS static hence included\r
+# here irrespective of the OPTS setting.\r
+#\r
+# TBD - tclvfs has a comment that stubs libs should not be compiled with -GL\r
+# without stating why. Tcl itself compiled stubs libs with this flag.\r
+# so we do not remove it from cflags. -GL may prevent extensions\r
+# compiled with one VC version to fail to link against stubs library\r
+# compiled with another VC version. Check for this and fix accordingly.\r
+stubscflags = $(cflags) $(PKGNAMEFLAGS) $(PRJ_DEFINES) $(OPTDEFINES) /Zl /GL- /DSTATIC_BUILD $(INCLUDES) $(USE_STUBS_DEFS)\r
+\r
+# Link flags\r
+\r
+!if $(DEBUG)\r
+ldebug = -debug -debugtype:cv\r
+!else\r
+ldebug = -release -opt:ref -opt:icf,3\r
+!if $(SYMBOLS)\r
+ldebug = $(ldebug) -debug -debugtype:cv\r
+!endif\r
+!endif\r
+\r
+# Note: Profiling is currently only possible with the Visual Studio Enterprise\r
+!if $(PROFILE)\r
+ldebug= $(ldebug) -profile\r
+!endif\r
+\r
+### Declarations common to all linker versions\r
+lflags = -nologo -machine:$(MACHINE) $(LINKERFLAGS) $(ldebug)\r
+\r
+!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900\r
+lflags = $(lflags) -nodefaultlib:libucrt.lib\r
+!endif\r
+\r
+dlllflags = $(lflags) -dll\r
+conlflags = $(lflags) -subsystem:console\r
+guilflags = $(lflags) -subsystem:windows\r
+\r
+# Libraries that are required for every image.\r
+# Extensions should define any additional libraries with $(PRJ_LIBS)\r
+winlibs   = kernel32.lib advapi32.lib\r
+\r
+!if $(NEED_TK)\r
+winlibs = $(winlibs) gdi32.lib user32.lib uxtheme.lib\r
+!endif\r
+\r
+# Avoid 'unresolved external symbol __security_cookie' errors.\r
+# c.f. http://support.microsoft.com/?id=894573\r
+!if "$(MACHINE)" == "AMD64"\r
+!if $(VCVERSION) > 1399 && $(VCVERSION) < 1500\r
+winlibs   = $(winlibs) bufferoverflowU.lib\r
+!endif\r
+!endif\r
+\r
+baselibs = $(winlibs) $(PRJ_LIBS)\r
+\r
+!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900\r
+baselibs   = $(baselibs) ucrt.lib\r
+!endif\r
+\r
+################################################################\r
+# 13. Define standard commands, common make targets and implicit rules\r
+\r
+CCPKGCMD = $(cc32) $(pkgcflags) -Fo$(TMP_DIR)^\\r
+CCAPPCMD = $(cc32) $(appcflags) -Fo$(TMP_DIR)^\\r
+CCSTUBSCMD = $(cc32) $(stubscflags) -Fo$(TMP_DIR)^\\r
+\r
+LIBCMD = $(lib32) -nologo $(LINKERFLAGS) -out:$@\r
+DLLCMD = $(link32) $(dlllflags) -out:$@ $(baselibs) $(tcllibs) $(tklibs)\r
+\r
+CONEXECMD = $(link32) $(conlflags) -out:$@ $(baselibs) $(tcllibs) $(tklibs)\r
+GUIEXECMD = $(link32) $(guilflags) -out:$@ $(baselibs) $(tcllibs) $(tklibs)\r
+RESCMD  = $(rc32) -fo $@ -r -i "$(GENERICDIR)" -i "$(TMP_DIR)" \\r
+           $(TCL_INCLUDES) \\r
+           /DDEBUG=$(DEBUG) -d UNCHECKED=$(UNCHECKED) \\r
+           /DCOMMAVERSION=$(RCCOMMAVERSION) \\r
+           /DDOTVERSION=\"$(DOTVERSION)\" \\r
+           /DVERSION=\"$(VERSION)\" \\r
+           /DSUFX=\"$(SUFX)\" \\r
+           /DPROJECT=\"$(PROJECT)\" \\r
+           /DPRJLIBNAME=\"$(PRJLIBNAME)\"\r
+\r
+!ifndef DEFAULT_BUILD_TARGET\r
+DEFAULT_BUILD_TARGET = $(PROJECT)\r
+!endif\r
+\r
+default-target: $(DEFAULT_BUILD_TARGET)\r
+\r
+!if $(MULTIPLATFORM_INSTALL)\r
+default-pkgindex:\r
+       @echo if {[package vsatisfies [package provide Tcl] 9.0-]} { > $(OUT_DIR)\pkgIndex.tcl\r
+       @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \\r
+           [list load [file join $$dir $(PLATFORM_IDENTIFY) $(PRJLIBNAME9)]] >> $(OUT_DIR)\pkgIndex.tcl\r
+       @echo } else { >> $(OUT_DIR)\pkgIndex.tcl\r
+       @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \\r
+           [list load [file join $$dir $(PLATFORM_IDENTIFY) $(PRJLIBNAME8)]] >> $(OUT_DIR)\pkgIndex.tcl\r
+       @echo } >> $(OUT_DIR)\pkgIndex.tcl\r
+!else\r
+default-pkgindex:\r
+       @echo if {[package vsatisfies [package provide Tcl] 9.0-]} { > $(OUT_DIR)\pkgIndex.tcl\r
+       @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \\r
+           [list load [file join $$dir $(PRJLIBNAME9)]] >> $(OUT_DIR)\pkgIndex.tcl\r
+       @echo } else { >> $(OUT_DIR)\pkgIndex.tcl\r
+       @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \\r
+           [list load [file join $$dir $(PRJLIBNAME8)]] >> $(OUT_DIR)\pkgIndex.tcl\r
+       @echo } >> $(OUT_DIR)\pkgIndex.tcl\r
+!endif\r
+\r
+default-pkgindex-tea:\r
+       @if exist $(ROOT)\pkgIndex.tcl.in nmakehlp -s << $(ROOT)\pkgIndex.tcl.in > $(OUT_DIR)\pkgIndex.tcl\r
+@PACKAGE_VERSION@    $(DOTVERSION)\r
+@PACKAGE_NAME@       $(PRJ_PACKAGE_TCLNAME)\r
+@PACKAGE_TCLNAME@    $(PRJ_PACKAGE_TCLNAME)\r
+@PKG_LIB_FILE@       $(PRJLIBNAME)\r
+@PKG_LIB_FILE8@      $(PRJLIBNAME8)\r
+@PKG_LIB_FILE9@      $(PRJLIBNAME9)\r
+<<\r
+\r
+default-install: default-install-binaries default-install-libraries\r
+!if $(SYMBOLS)\r
+default-install: default-install-pdbs\r
+!endif\r
+\r
+# Again to deal with historical brokenness, there is some confusion\r
+# in terminlogy. For extensions, the "install-binaries" was used to\r
+# locate target directory for *binary shared libraries* and thus\r
+# the appropriate macro is LIB_INSTALL_DIR since BIN_INSTALL_DIR is\r
+# for executables (exes). On the other hand the "install-libraries"\r
+# target is for *scripts* and should have been called "install-scripts".\r
+default-install-binaries: $(PRJLIB)\r
+       @echo Installing binaries to '$(LIB_INSTALL_DIR)'\r
+       @if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"\r
+       @$(CPY) $(PRJLIB) "$(LIB_INSTALL_DIR)" >NUL\r
+\r
+# Alias for default-install-scripts\r
+default-install-libraries: default-install-scripts\r
+\r
+default-install-scripts: $(OUT_DIR)\pkgIndex.tcl\r
+       @echo Installing libraries to '$(SCRIPT_INSTALL_DIR)'\r
+       @if exist $(LIBDIR) $(CPY) $(LIBDIR)\*.tcl "$(SCRIPT_INSTALL_DIR)"\r
+       @echo Installing package index in '$(SCRIPT_INSTALL_DIR)'\r
+       @$(CPY) $(OUT_DIR)\pkgIndex.tcl $(SCRIPT_INSTALL_DIR)\r
+\r
+default-install-stubs:\r
+       @echo Installing stubs library to '$(SCRIPT_INSTALL_DIR)'\r
+       @if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)"\r
+       @$(CPY) $(PRJSTUBLIB) "$(SCRIPT_INSTALL_DIR)" >NUL\r
+\r
+default-install-pdbs:\r
+       @echo Installing PDBs to '$(LIB_INSTALL_DIR)'\r
+       @if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"\r
+       @$(CPY) "$(OUT_DIR)\*.pdb" "$(LIB_INSTALL_DIR)\"\r
+\r
+# "emacs font-lock highlighting fix\r
+\r
+default-install-docs-html:\r
+       @echo Installing documentation files to '$(DOC_INSTALL_DIR)'\r
+       @if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)"\r
+       @if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.html" "$(DOCDIR)\*.css" "$(DOCDIR)\*.png") do @$(COPY) %f "$(DOC_INSTALL_DIR)"\r
+\r
+default-install-docs-n:\r
+       @echo Installing documentation files to '$(DOC_INSTALL_DIR)'\r
+       @if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)"\r
+       @if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.n") do @$(COPY) %f "$(DOC_INSTALL_DIR)"\r
+\r
+default-install-demos:\r
+       @echo Installing demos to '$(DEMO_INSTALL_DIR)'\r
+       @if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)"\r
+       @if exist $(DEMODIR) $(CPYDIR) "$(DEMODIR)" "$(DEMO_INSTALL_DIR)"\r
+\r
+default-clean:\r
+       @echo Cleaning $(TMP_DIR)\* ...\r
+       @if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR)\r
+       @echo Cleaning $(WIN_DIR)\nmakehlp.obj, nmakehlp.exe ...\r
+       @if exist $(WIN_DIR)\nmakehlp.obj del $(WIN_DIR)\nmakehlp.obj\r
+       @if exist $(WIN_DIR)\nmakehlp.exe del $(WIN_DIR)\nmakehlp.exe\r
+       @if exist $(WIN_DIR)\nmakehlp.out del $(WIN_DIR)\nmakehlp.out\r
+       @echo Cleaning $(WIN_DIR)\nmhlp-out.txt ...\r
+       @if exist $(WIN_DIR)\nmhlp-out.txt del $(WIN_DIR)\nmhlp-out.txt\r
+       @echo Cleaning $(WIN_DIR)\_junk.pch ...\r
+       @if exist $(WIN_DIR)\_junk.pch del $(WIN_DIR)\_junk.pch\r
+       @echo Cleaning $(WIN_DIR)\vercl.x, vercl.i ...\r
+       @if exist $(WIN_DIR)\vercl.x del $(WIN_DIR)\vercl.x\r
+       @if exist $(WIN_DIR)\vercl.i del $(WIN_DIR)\vercl.i\r
+       @echo Cleaning $(WIN_DIR)\versions.vc, version.vc ...\r
+       @if exist $(WIN_DIR)\versions.vc del $(WIN_DIR)\versions.vc\r
+       @if exist $(WIN_DIR)\version.vc del $(WIN_DIR)\version.vc\r
+\r
+default-hose: default-clean\r
+       @echo Hosing $(OUT_DIR)\* ...\r
+       @if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR)\r
+\r
+# Only for backward compatibility\r
+default-distclean: default-hose\r
+\r
+default-setup:\r
+       @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR)\r
+       @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR)\r
+\r
+!if "$(TESTPAT)" != ""\r
+TESTFLAGS = $(TESTFLAGS) -file $(TESTPAT)\r
+!endif\r
+\r
+default-test: default-setup $(PROJECT)\r
+       @set TCLLIBPATH=$(OUT_DIR:\=/)\r
+       @if exist $(LIBDIR) for %f in ("$(LIBDIR)\*.tcl") do @$(COPY) %f "$(OUT_DIR)"\r
+       cd "$(TESTDIR)" && $(DEBUGGER) $(TCLSH) all.tcl $(TESTFLAGS)\r
+\r
+default-shell: default-setup $(PROJECT)\r
+       @set TCLLIBPATH=$(OUT_DIR:\=/)\r
+       @if exist $(LIBDIR) for %f in ("$(LIBDIR)\*.tcl") do @$(COPY) %f "$(OUT_DIR)"\r
+       $(DEBUGGER) $(TCLSH)\r
+\r
+# Generation of Windows version resource\r
+!ifdef RCFILE\r
+\r
+# Note: don't use $** in below rule because there may be other dependencies\r
+# and only the "main" rc must be passed to the resource compiler\r
+$(TMP_DIR)\$(PROJECT).res: $(RCDIR)\$(PROJECT).rc\r
+       $(RESCMD) $(RCDIR)\$(PROJECT).rc\r
+\r
+!else\r
+\r
+# If parent makefile has not defined a resource definition file,\r
+# we will generate one from standard template.\r
+$(TMP_DIR)\$(PROJECT).res: $(TMP_DIR)\$(PROJECT).rc\r
+\r
+$(TMP_DIR)\$(PROJECT).rc:\r
+       @$(COPY) << $(TMP_DIR)\$(PROJECT).rc\r
+#include <winver.h>\r
+\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION   COMMAVERSION\r
+ PRODUCTVERSION        COMMAVERSION\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef DEBUG\r
+ FILEFLAGS     VS_FF_DEBUG\r
+#else\r
+ FILEFLAGS     0x0L\r
+#endif\r
+ FILEOS                VOS_NT_WINDOWS32\r
+ FILETYPE      VFT_DLL\r
+ FILESUBTYPE   0x0L\r
+BEGIN\r
+    BLOCK "StringFileInfo"\r
+    BEGIN\r
+        BLOCK "040904b0"\r
+        BEGIN\r
+            VALUE "FileDescription",  "Tcl extension " PROJECT\r
+            VALUE "OriginalFilename", PRJLIBNAME\r
+            VALUE "FileVersion",      DOTVERSION\r
+            VALUE "ProductName",      "Package " PROJECT " for Tcl"\r
+            VALUE "ProductVersion",   DOTVERSION\r
+        END\r
+    END\r
+    BLOCK "VarFileInfo"\r
+    BEGIN\r
+        VALUE "Translation", 0x409, 1200\r
+    END\r
+END\r
+\r
+<<\r
+\r
+!endif # ifdef RCFILE\r
+\r
+!ifndef DISABLE_IMPLICIT_RULES\r
+DISABLE_IMPLICIT_RULES = 0\r
+!endif\r
+\r
+!if !$(DISABLE_IMPLICIT_RULES)\r
+# Implicit rule definitions - only for building library objects. For stubs and\r
+# main application, the makefile should define explicit rules.\r
+\r
+{$(ROOT)}.c{$(TMP_DIR)}.obj::\r
+       $(CCPKGCMD) @<<\r
+$<\r
+<<\r
+\r
+{$(WIN_DIR)}.c{$(TMP_DIR)}.obj::\r
+       $(CCPKGCMD) @<<\r
+$<\r
+<<\r
+\r
+{$(GENERICDIR)}.c{$(TMP_DIR)}.obj::\r
+       $(CCPKGCMD) @<<\r
+$<\r
+<<\r
+\r
+{$(COMPATDIR)}.c{$(TMP_DIR)}.obj::\r
+       $(CCPKGCMD) @<<\r
+$<\r
+<<\r
+\r
+{$(RCDIR)}.rc{$(TMP_DIR)}.res:\r
+       $(RESCMD) $<\r
+\r
+{$(WIN_DIR)}.rc{$(TMP_DIR)}.res:\r
+       $(RESCMD) $<\r
+\r
+{$(TMP_DIR)}.rc{$(TMP_DIR)}.res:\r
+       $(RESCMD) $<\r
+\r
+.SUFFIXES:\r
+.SUFFIXES:.c .rc\r
+\r
+!endif\r
+\r
+################################################################\r
+# 14. Sanity check selected options against Tcl build options\r
+# When building an extension, certain configuration options should\r
+# match the ones used when Tcl was built. Here we check and\r
+# warn on a mismatch.\r
+!if !$(DOING_TCL)\r
+\r
+!if $(TCLINSTALL) # Building against an installed Tcl\r
+!if exist("$(_TCLDIR)\lib\nmake\tcl.nmake")\r
+TCLNMAKECONFIG = "$(_TCLDIR)\lib\nmake\tcl.nmake"\r
+!endif\r
+!else # !$(TCLINSTALL) - building against Tcl source\r
+!if exist("$(_TCLDIR)\win\$(BUILDDIRTOP)\tcl.nmake")\r
+TCLNMAKECONFIG = "$(_TCLDIR)\win\$(BUILDDIRTOP)\tcl.nmake"\r
+!endif\r
+!endif # TCLINSTALL\r
+\r
+!if $(CONFIG_CHECK)\r
+!ifdef TCLNMAKECONFIG\r
+!include $(TCLNMAKECONFIG)\r
+\r
+!if defined(CORE_MACHINE) && "$(CORE_MACHINE)" != "$(MACHINE)"\r
+!error ERROR: Build target ($(MACHINE)) does not match the Tcl library architecture ($(CORE_MACHINE)).\r
+!endif\r
+!if $(TCL_VERSION) < 87 && defined(CORE_USE_THREAD_ALLOC) && $(CORE_USE_THREAD_ALLOC) != $(USE_THREAD_ALLOC)\r
+!message WARNING: Value of USE_THREAD_ALLOC ($(USE_THREAD_ALLOC)) does not match its Tcl core value ($(CORE_USE_THREAD_ALLOC)).\r
+!endif\r
+!if defined(CORE_DEBUG) && $(CORE_DEBUG) != $(DEBUG)\r
+!message WARNING: Value of DEBUG ($(DEBUG)) does not match its Tcl library configuration ($(DEBUG)).\r
+!endif\r
+!endif\r
+\r
+!endif # TCLNMAKECONFIG\r
+\r
+!endif # !$(DOING_TCL)\r
+\r
+\r
+#----------------------------------------------------------\r
+# Display stats being used.\r
+#----------------------------------------------------------\r
+\r
+!if !$(DOING_TCL)\r
+!message *** Building against Tcl at '$(_TCLDIR)'\r
+!endif\r
+!if !$(DOING_TK) && $(NEED_TK)\r
+!message *** Building against Tk at '$(_TKDIR)'\r
+!endif\r
+!message *** Intermediate directory will be '$(TMP_DIR)'\r
+!message *** Output directory will be '$(OUT_DIR)'\r
+!message *** Installation, if selected, will be in '$(_INSTALLDIR)'\r
+!message *** Suffix for binaries will be '$(SUFX)'\r
+!message *** Compiler version $(VCVER). Target $(MACHINE), host $(NATIVE_ARCH).\r
+\r
+!endif # ifdef _RULES_VC\r