-#------------------------------------------------------------- -*- makefile -*-
-# rules.vc --
-#
-# Part of the nmake based build system for Tcl and its extensions.
-# This file does all the hard work in terms of parsing build options,
-# compiler switches, defining common targets and macros. The Tcl makefile
-# directly includes this. Extensions include it via "rules-ext.vc".
-#
-# See TIP 477 (https://core.tcl-lang.org/tips/doc/main/tip/477.md) for
-# detailed documentation.
-#
-# See the file "license.terms" for information on usage and redistribution
-# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
-#
-# Copyright (c) 2001-2003 David Gravereaux.
-# Copyright (c) 2003-2008 Patrick Thoyts
-# Copyright (c) 2017 Ashok P. Nadkarni
-#------------------------------------------------------------------------------
-
-!ifndef _RULES_VC
-_RULES_VC = 1
-
-# The following macros define the version of the rules.vc nmake build system
-# For modifications that are not backward-compatible, you *must* change
-# the major version.
-RULES_VERSION_MAJOR = 1
-RULES_VERSION_MINOR = 12
-
-# The PROJECT macro must be defined by parent makefile.
-!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
-
-# Also special case Tcl and Tk to save some typing later
-DOING_TCL = 0
-DOING_TK = 0
-!if "$(PROJECT)" == "tcl"
-DOING_TCL = 1
-!elseif "$(PROJECT)" == "tk"
-DOING_TK = 1
-!endif
-
-!ifndef NEED_TK
-# Backwards compatibility
-!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
-
-################################################################
-# Nmake is a pretty weak environment in syntax and capabilities
-# so this file is necessarily verbose. It's broken down into
-# the following parts.
-#
-# 0. Sanity check that compiler environment is set up and initialize
-# any built-in settings from the parent makefile
-# 1. First define the external tools used for compiling, copying etc.
-# as this is independent of everything else.
-# 2. Figure out our build structure in terms of the directory, whether
-# we are building Tcl or an extension, etc.
-# 3. Determine the compiler and linker versions
-# 4. Build the nmakehlp helper application
-# 5. Determine the supported compiler options and features
-# 6. Extract Tcl, Tk, and possibly extensions, version numbers from the
-# headers
-# 7. Parse the OPTS macro value for user-specified build configuration
-# 8. Parse the STATS macro value for statistics instrumentation
-# 9. Parse the CHECKS macro for additional compilation checks
-# 10. Based on this selected configuration, construct the output
-# directory and file paths
-# 11. Construct the paths where the package is to be installed
-# 12. Set up the actual options passed to compiler and linker based
-# on the information gathered above.
-# 13. Define some standard build targets and implicit rules. These may
-# be optionally disabled by the parent makefile.
-# 14. (For extensions only.) Compare the configuration of the target
-# Tcl and the extensions and warn against discrepancies.
-#
-# One final note about the macro names used. They are as they are
-# for historical reasons. We would like legacy extensions to
-# continue to work with this make include file so be wary of
-# changing them for consistency or clarity.
-
-# 0. Sanity check compiler environment
-
-# Check to see we are configured to build with MSVC (MSDEVDIR, MSVCDIR or
-# VCINSTALLDIR) or with the MS Platform SDK (MSSDK or WindowsSDKDir)
-
-!if !defined(MSDEVDIR) && !defined(MSVCDIR) && !defined(VCINSTALLDIR) && !defined(MSSDK) && !defined(WINDOWSSDKDIR)
-MSG = ^
-Visual C++ compiler environment not initialized.
-!error $(MSG)
-!endif
-
-# We need to run from the directory the parent makefile is located in.
-# nmake does not tell us what makefile was used to invoke it so parent
-# makefile has to set the MAKEFILEVC macro or we just make a guess and
-# warn if we think that is not the case.
-!if "$(MAKEFILEVC)" == ""
-
-!if exist("$(PROJECT).vc")
-MAKEFILEVC = $(PROJECT).vc
-!elseif exist("makefile.vc")
-MAKEFILEVC = makefile.vc
-!endif
-!endif # "$(MAKEFILEVC)" == ""
-
-!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
-
-
-################################################################
-# 1. Define external programs being used
-
-#----------------------------------------------------------
-# Set the proper copy method to avoid overwrite questions
-# to the user when copying files and selecting the right
-# "delete all" method.
-#----------------------------------------------------------
-
-RMDIR = rmdir /S /Q
-CPY = xcopy /i /y >NUL
-CPYDIR = xcopy /e /i /y >NUL
-COPY = copy /y >NUL
-MKDIR = mkdir
-
-######################################################################
-# 2. Figure out our build environment in terms of what we're building.
-#
-# (a) Tcl itself
-# (b) Tk
-# (c) a Tcl extension using libraries/includes from an *installed* Tcl
-# (d) a Tcl extension using libraries/includes from Tcl source directory
-#
-# This last is needed because some extensions still need
-# some Tcl interfaces that are not publicly exposed.
-#
-# The fragment will set the following macros:
-# ROOT - root of this module sources
-# COMPATDIR - source directory that holds compatibility sources
-# DOCDIR - source directory containing documentation files
-# GENERICDIR - platform-independent source directory
-# WIN_DIR - Windows-specific source directory
-# TESTDIR - directory containing test files
-# TOOLSDIR - directory containing build tools
-# _TCLDIR - root of the Tcl installation OR the Tcl sources. Not set
-# when building Tcl itself.
-# _INSTALLDIR - native form of the installation path. For Tcl
-# this will be the root of the Tcl installation. For extensions
-# this will be the lib directory under the root.
-# TCLINSTALL - set to 1 if _TCLDIR refers to
-# headers and libraries from an installed Tcl, and 0 if built against
-# Tcl sources. Not set when building Tcl itself. Yes, not very well
-# named.
-# _TCL_H - native path to the tcl.h file
-#
-# If Tk is involved, also sets the following
-# _TKDIR - native form Tk installation OR Tk source. Not set if building
-# Tk itself.
-# TKINSTALL - set 1 if _TKDIR refers to installed Tk and 0 if Tk sources
-# _TK_H - native path to the tk.h file
-
-# Root directory for sources and assumed subdirectories
-ROOT = $(MAKEDIR)\..
-# The following paths CANNOT have spaces in them as they appear on the
-# left side of implicit rules.
-!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 # ifndef DEMODIR
-# Do NOT use WINDIR because it is Windows internal environment
-# variable to point to c:\windows!
-WIN_DIR = $(ROOT)\win
-
-!ifndef RCDIR
-!if exist("$(WIN_DIR)\rc")
-RCDIR = $(WIN_DIR)\rc
-!else
-RCDIR = $(WIN_DIR)
-!endif
-!endif
-RCDIR = $(RCDIR:/=\)
-
-# The target directory where the built packages and binaries will be installed.
-# INSTALLDIR is the (optional) path specified by the user.
-# _INSTALLDIR is INSTALLDIR using the backslash separator syntax
-!ifdef INSTALLDIR
-### Fix the path separators.
-_INSTALLDIR = $(INSTALLDIR:/=\)
-!else
-### Assume the normal default.
-_INSTALLDIR = $(HOMEDRIVE)\Tcl
-!endif
-
-!if $(DOING_TCL)
-
-# BEGIN Case 2(a) - Building Tcl itself
-
-# Only need to define _TCL_H
-_TCL_H = ..\generic\tcl.h
-
-# END Case 2(a) - Building Tcl itself
-
-!elseif $(DOING_TK)
-
-# BEGIN Case 2(b) - Building Tk
-
-TCLINSTALL = 0 # Tk always builds against Tcl source, not an installed Tcl
-!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 = $(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
-
-# END Case 2(b) - Building Tk
-
-!else
-
-# BEGIN Case 2(c) or (d) - Building an extension other than Tk
-
-# If command line has specified Tcl location through TCLDIR, use it
-# else default to the INSTALLDIR setting
-!if "$(TCLDIR)" != ""
-
-_TCLDIR = $(TCLDIR:/=\)
-!if exist("$(_TCLDIR)\include\tcl.h") # Case 2(c) with TCLDIR defined
-TCLINSTALL = 1
-_TCL_H = $(_TCLDIR)\include\tcl.h
-!elseif exist("$(_TCLDIR)\generic\tcl.h") # Case 2(d) with TCLDIR defined
-TCLINSTALL = 0
-_TCL_H = $(_TCLDIR)\generic\tcl.h
-!endif
-
-!else # # Case 2(c) for extensions with TCLDIR undefined
-
-# Need to locate Tcl depending on whether it needs Tcl source or not.
-# If we don't, check the INSTALLDIR for an installed Tcl first
-
-!if exist("$(_INSTALLDIR)\include\tcl.h") && !$(NEED_TCL_SOURCE)
-
-TCLINSTALL = 1
-TCLDIR = $(_INSTALLDIR)\..
-# NOTE: we will be resetting _INSTALLDIR to _INSTALLDIR/lib for extensions
-# later so the \.. accounts for the /lib
-_TCLDIR = $(_INSTALLDIR)\..
-_TCL_H = $(_TCLDIR)\include\tcl.h
-
-!else # exist(...) && !$(NEED_TCL_SOURCE)
-
-!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 # exist(...) && !$(NEED_TCL_SOURCE)
-
-!endif # TCLDIR
-
-!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
-
-# Now do the same to locate Tk headers and libs if project requires Tk
-!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 # TKDIR not defined
-
-# Need to locate Tcl depending on whether it needs Tcl source or not.
-# If we don't, check the INSTALLDIR for an installed Tcl first
-
-!if exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE)
-
-TKINSTALL = 1
-# NOTE: we will be resetting _INSTALLDIR to _INSTALLDIR/lib for extensions
-# later so the \.. accounts for the /lib
-_TKDIR = $(_INSTALLDIR)\..
-_TK_H = $(_TKDIR)\include\tk.h
-TKDIR = $(_TKDIR)
-
-!else # exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE)
-
-!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 # exist("$(_INSTALLDIR)\include\tk.h") && !$(NEED_TK_SOURCE)
-
-!endif # TKDIR
-
-!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 # NEED_TK
-
-!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 INSTALLDIR set to Tcl installation root dir then reset to the
-# lib dir for installing extensions
-!if exist("$(_INSTALLDIR)\include\tcl.h")
-_INSTALLDIR=$(_INSTALLDIR)\lib
-!endif
-
-# END Case 2(c) or (d) - Building an extension
-!endif # if $(DOING_TCL)
-
-################################################################
-# 3. Determine compiler version and architecture
-# In this section, we figure out the compiler version and the
-# architecture for which we are building. This sets the
-# following macros:
-# VCVERSION - the internal compiler version as 1200, 1400, 1910 etc.
-# This is also printed by the compiler in dotted form 19.10 etc.
-# VCVER - the "marketing version", for example Visual C++ 6 for internal
-# compiler version 1200. This is kept only for legacy reasons as it
-# does not make sense for recent Microsoft compilers. Only used for
-# output directory names.
-# ARCH - set to IX86, ARM64 or AMD64 depending on 32- or 64-bit target
-# NATIVE_ARCH - set to IX86, ARM64 or AMD64 for the host machine
-# MACHINE - same as $(ARCH) - legacy
-# _VC_MANIFEST_EMBED_{DLL,EXE} - commands for embedding a manifest if needed
-
-cc32 = $(CC) # built-in default.
-link32 = link
-lib32 = lib
-rc32 = $(RC) # built-in default.
-
-#----------------------------------------------------------------
-# Figure out the compiler architecture and version by writing
-# the C macros to a file, preprocessing them with the C
-# preprocessor and reading back the created file
-
-_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)elif defined(_M_ARM64) >> vercl.x] \
- && ![echo ARCH=ARM64 >> 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
-# The simple calculation above does not apply to new Visual Studio releases
-# Keep the compiler version in its native form.
-VCVER = $(VCVERSION)
-!endif
-!endif
-
-!if ![del 2>NUL /q/f vercl.x vercl.i vercl.vc]
-!endif
-
-#----------------------------------------------------------------
-# The MACHINE macro is used by legacy makefiles so set it as well
-!ifdef MACHINE
-!if "$(MACHINE)" == "x86"
-!undef MACHINE
-MACHINE = IX86
-!elseif "$(MACHINE)" == "arm64"
-!undef MACHINE
-MACHINE = ARM64
-!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
-
-#---------------------------------------------------------------
-# The PLATFORM_IDENTIFY macro matches the values returned by
-# the Tcl platform::identify command
-!if "$(MACHINE)" == "AMD64"
-PLATFORM_IDENTIFY = win32-x86_64
-!elseif "$(MACHINE)" == "ARM64"
-PLATFORM_IDENTIFY = win32-arm
-!else
-PLATFORM_IDENTIFY = win32-ix86
-!endif
-
-# The MULTIPLATFORM macro controls whether binary extensions are installed
-# in platform-specific directories. Intended to be set/used by extensions.
-!ifndef MULTIPLATFORM_INSTALL
-MULTIPLATFORM_INSTALL = 0
-!endif
-
-#------------------------------------------------------------
-# Figure out the *host* architecture by reading the registry
-
-!if ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i x86]
-NATIVE_ARCH=IX86
-!elseif ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i ARM | findstr /i 64-bit]
-NATIVE_ARCH=ARM64
-!else
-NATIVE_ARCH=AMD64
-!endif
-
-# Since MSVC8 we must deal with manifest resources.
-!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
-
-################################################################
-# 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. It will be kept updated there.
-#
-# 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 "$(MACHINE)" == "IX86" || "$(MACHINE)" == "$(NATIVE_ARCH)"
-!if [$(cc32) -nologo "$(NMAKEHLPC)" -link -subsystem:console > nul]
-!endif
-!else
-!if [copy $(NMAKEHLPC:nmakehlp.c=x86_64-w64-mingw32-nmakehlp.exe) nmakehlp.exe >NUL]
-!endif
-!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. Extract various version numbers from headers
-# 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_RELEASE_SERIAL
-# TCL_PATCH_LEVEL
-# TCL_PATCH_LETTER
-# TCL_VERSION
-# TK_MAJOR_VERSION
-# TK_MINOR_VERSION
-# TK_RELEASE_SERIAL
-# TK_PATCH_LEVEL
-# TK_PATCH_LETTER
-# 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)" "define 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_RELEASE_SERIAL = \>> versions.vc] \
- && [nmakehlp -V "$(_TCL_H)" TCL_RELEASE_SERIAL >> 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) "define 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_RELEASE_SERIAL = \>> versions.vc] \
- && [nmakehlp -V "$(_TK_H)" TK_RELEASE_SERIAL >> 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 [nmakehlp -f $(TCL_PATCH_LEVEL) "a"]
-TCL_PATCH_LETTER = a
-!elseif [nmakehlp -f $(TCL_PATCH_LEVEL) "b"]
-TCL_PATCH_LETTER = b
-!else
-TCL_PATCH_LETTER = .
-!endif
-
-!if defined(_TK_H)
-
-TK_VERSION = $(TK_MAJOR_VERSION)$(TK_MINOR_VERSION)
-TK_DOTVERSION = $(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)
-!if [nmakehlp -f $(TK_PATCH_LEVEL) "a"]
-TK_PATCH_LETTER = a
-!elseif [nmakehlp -f $(TK_PATCH_LEVEL) "b"]
-TK_PATCH_LETTER = b
-!else
-TK_PATCH_LETTER = .
-!endif
-
-!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.
-
-# Windows RC files have 3 version components. Ensure this irrespective
-# of how many components the package has specified. Basically, ensure
-# minimum 4 components by appending 4 0's and then pick out the first 4.
-# Also take care of the fact that DOTVERSION may have "a" or "b" instead
-# of "." separating the version components.
-DOTSEPARATED=$(DOTVERSION:a=.)
-DOTSEPARATED=$(DOTSEPARATED:b=.)
-!if [echo RCCOMMAVERSION = \> versions.vc] \
- || [for /f "tokens=1,2,3,4,5* delims=." %a in ("$(DOTSEPARATED).0.0.0.0") do echo %a,%b,%c,%d >> versions.vc]
-!error *** Could not generate RCCOMMAVERSION ***
-!endif
-!include versions.vc
-
-########################################################################
-# 7. 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)
-# Default: 1 for Tcl 8.7 and up, 0 otherwise.
-# TCL_USE_STATIC_PACKAGES - 1 -> statically link the registry and dde extensions
-# in the Tcl and Wish shell. 0 -> keep them as shared libraries. Does
-# not impact shared Tcl builds. Implied by STATIC_BUILD since Tcl 8.7.
-# 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)
-# _USE_64BIT_TIME_T - forces a build using 64-bit time_t for 32-bit build
-# (CRT library should support this, not needed for Tcl 9.x)
-# 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
-!else
-!if $(TCL_MAJOR_VERSION) == 8 && $(TCL_MINOR_VERSION) < 7 && $(STATIC_BUILD)
-MSVCRT = 0
-!endif
-!endif
-!endif # [nmakehlp -f $(OPTS) "nomsvcrt"]
-
-!if [nmakehlp -f $(OPTS) "staticpkg"] && $(STATIC_BUILD)
-!message *** Doing staticpkg
-TCL_USE_STATIC_PACKAGES = 1
-!endif
-
-!if [nmakehlp -f $(OPTS) "nothreads"]
-!message *** Compile explicitly for non-threaded tcl
-TCL_THREADS = 0
-USE_THREAD_ALLOC= 0
-!endif
-
-!if [nmakehlp -f $(OPTS) "tcl8"]
-!message *** Build for Tcl8
-TCL_BUILD_FOR = 8
-!endif
-
-!if $(TCL_MAJOR_VERSION) == 8
-!if [nmakehlp -f $(OPTS) "time64bit"]
-!message *** Force 64-bit time_t
-_USE_64BIT_TIME_T = 1
-!endif
-!endif
-
-# Yes, it's weird that the "symbols" option controls DEBUG and
-# the "pdbs" option controls SYMBOLS. That's historical.
-!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
-
-################################################################
-# 8. 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
-
-####################################################################
-# 9. 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
-
-
-################################################################
-# 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. (Not used for Tcl >= 8.7)
-# 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) || $(TCL_VERSION) > 86 || $(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) && $(TCL_VERSION) > 86 || !$(MSVCRT) && $(TCL_VERSION) < 87
-TMP_DIRFULL = $(TMP_DIRFULL:X=)
-SUFX = $(SUFX:x=)
-!endif
-!endif
-
-!if !$(TCL_THREADS) || $(TCL_VERSION) > 86
-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
-#
-
-# TIP 430. Unused for 8.6 but no harm defining it to allow a common rules.vc
-TCL_ZIP_FILE = libtcl$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)$(TCL_PATCH_LETTER)$(TCL_RELEASE_SERIAL).zip
-TK_ZIP_FILE = libtk$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)$(TK_PATCH_LETTER)$(TK_RELEASE_SERIAL).zip
-
-!if $(DOING_TCL)
-TCLSHNAME = $(PROJECT)sh$(VERSION)$(SUFX).exe
-TCLSH = $(OUT_DIR)\$(TCLSHNAME)
-TCLIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
-TCLLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT)
-TCLLIB = $(OUT_DIR)\$(TCLLIBNAME)
-TCLSCRIPTZIP = $(OUT_DIR)\$(TCL_ZIP_FILE)
-
-!if $(TCL_MAJOR_VERSION) == 8
-TCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib
-!else
-TCLSTUBLIBNAME = $(STUBPREFIX).lib
-!endif
-TCLSTUBLIB = $(OUT_DIR)\$(TCLSTUBLIBNAME)
-TCL_INCLUDES = -I"$(WIN_DIR)" -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:t=).exe
-!if !exist("$(TCLSH)")
-TCLSH = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX:t=).exe
-!endif
-
-!if $(TCL_MAJOR_VERSION) == 8
-TCLSTUBLIB = $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib
-!else
-TCLSTUBLIB = $(_TCLDIR)\lib\tclstub.lib
-!endif
-TCLIMPLIB = $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).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)t$(SUFX:t=).lib
-!endif
-TCL_LIBRARY = $(_TCLDIR)\lib
-TCLREGLIB = $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib
-TCLDDELIB = $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib
-TCLSCRIPTZIP = $(_TCLDIR)\lib\$(TCL_ZIP_FILE)
-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:t=).exe
-!if !exist($(TCLSH))
-TCLSH = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX:t=).exe
-!endif
-!if $(TCL_MAJOR_VERSION) == 8
-TCLSTUBLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib
-!else
-TCLSTUBLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub.lib
-!endif
-TCLIMPLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).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)t$(SUFX:t=).lib
-!endif
-TCL_LIBRARY = $(_TCLDIR)\library
-TCLREGLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib
-TCLDDELIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib
-TCLSCRIPTZIP = $(_TCLDIR)\win\$(BUILDDIRTOP)\$(TCL_ZIP_FILE)
-TCLTOOLSDIR = $(_TCLDIR)\tools
-TCL_INCLUDES = -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"
-
-!endif # TCLINSTALL
-
-!if !$(STATIC_BUILD) && "$(TCL_BUILD_FOR)" == "8"
-tcllibs = "$(TCLSTUBLIB)"
-!else
-tcllibs = "$(TCLSTUBLIB)" "$(TCLIMPLIB)"
-!endif
-
-!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
-TKLIBNAME8 = tk$(TK_VERSION)$(SUFX).$(EXT)
-TKLIBNAME9 = tcl9tk$(TK_VERSION)$(SUFX).$(EXT)
-!if $(TCL_MAJOR_VERSION) == 8 || "$(TCL_BUILD_FOR)" == "8"
-TKLIBNAME = tk$(TK_VERSION)$(SUFX).$(EXT)
-TKIMPLIBNAME = tk$(TK_VERSION)$(SUFX).lib
-!else
-TKLIBNAME = tcl9tk$(TK_VERSION)$(SUFX).$(EXT)
-TKIMPLIBNAME = tcl9tk$(TK_VERSION)$(SUFX).lib
-!endif
-!if $(TK_MAJOR_VERSION) == 8
-TKSTUBLIBNAME = tkstub$(TK_VERSION).lib
-!else
-TKSTUBLIBNAME = tkstub.lib
-!endif
-
-!if $(DOING_TK)
-WISH = $(OUT_DIR)\$(WISHNAME)
-TKSTUBLIB = $(OUT_DIR)\$(TKSTUBLIBNAME)
-TKIMPLIB = $(OUT_DIR)\$(TKIMPLIBNAME)
-TKLIB = $(OUT_DIR)\$(TKLIBNAME)
-TK_INCLUDES = -I"$(WIN_DIR)" -I"$(GENERICDIR)"
-TKSCRIPTZIP = $(OUT_DIR)\$(TK_ZIP_FILE)
-
-!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"
-TKSCRIPTZIP = $(_TKDIR)\lib\$(TK_ZIP_FILE)
-
-!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"
-TKSCRIPTZIP = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TK_ZIP_FILE)
-
-!endif # TKINSTALL
-
-tklibs = "$(TKSTUBLIB)" "$(TKIMPLIB)"
-
-!endif # $(DOING_TK)
-!endif # $(DOING_TK) || $(NEED_TK)
-
-# Various output paths
-PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
-PRJLIBNAME8 = $(PROJECT)$(VERSION)$(SUFX).$(EXT)
-# Even when building against Tcl 8, PRJLIBNAME9 must not have "t"
-PRJLIBNAME9 = tcl9$(PROJECT)$(VERSION)$(SUFX:t=).$(EXT)
-!if $(TCL_MAJOR_VERSION) == 8 || "$(TCL_BUILD_FOR)" == "8"
-PRJLIBNAME = $(PRJLIBNAME8)
-!else
-PRJLIBNAME = $(PRJLIBNAME9)
-!endif
-PRJLIB = $(OUT_DIR)\$(PRJLIBNAME)
-
-!if $(TCL_MAJOR_VERSION) == 8
-PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib
-!else
-PRJSTUBLIBNAME = $(STUBPREFIX).lib
-!endif
-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)
-MODULE_INSTALL_DIR = $(_INSTALLDIR)\lib\tcl$(TCL_MAJOR_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)
-!if $(MULTIPLATFORM_INSTALL)
-LIB_INSTALL_DIR = $(PRJ_INSTALL_DIR)\$(PLATFORM_IDENTIFY)
-BIN_INSTALL_DIR = $(PRJ_INSTALL_DIR)\$(PLATFORM_IDENTIFY)
-!else
-LIB_INSTALL_DIR = $(PRJ_INSTALL_DIR)
-BIN_INSTALL_DIR = $(PRJ_INSTALL_DIR)
-!endif
-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 options
-# 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 = /DSTDC_HEADERS /DUSE_NMAKE=1
-!if $(VCVERSION) > 1600
-OPTDEFINES = $(OPTDEFINES) /DHAVE_STDINT_H=1
-!else
-OPTDEFINES = $(OPTDEFINES) /DMP_NO_STDINT=1
-!endif
-!if $(VCVERSION) >= 1800
-OPTDEFINES = $(OPTDEFINES) /DHAVE_INTTYPES_H=1 /DHAVE_STDBOOL_H=1
-!endif
-
-!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) && $(TCL_VERSION) < 87
-OPTDEFINES = $(OPTDEFINES) /DTCL_THREADS=1
-!if $(USE_THREAD_ALLOC) && $(TCL_VERSION) < 87
-OPTDEFINES = $(OPTDEFINES) /DUSE_THREAD_ALLOC=1
-!endif
-!endif
-!if $(STATIC_BUILD)
-OPTDEFINES = $(OPTDEFINES) /DSTATIC_BUILD
-!elseif $(TCL_VERSION) > 86
-OPTDEFINES = $(OPTDEFINES) /DTCL_WITH_EXTERNAL_TOMMATH
-!if "$(MACHINE)" == "AMD64" || "$(MACHINE)" == "ARM64"
-OPTDEFINES = $(OPTDEFINES) /DMP_64BIT
-!endif
-!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" || "$(MACHINE)" == "ARM64"
-OPTDEFINES = $(OPTDEFINES) /DTCL_CFG_DO64BIT
-!endif
-!if $(VCVERSION) < 1300
-OPTDEFINES = $(OPTDEFINES) /DNO_STRTOI64=1
-!endif
-
-!if $(TCL_MAJOR_VERSION) == 8
-!if "$(_USE_64BIT_TIME_T)" == "1"
-OPTDEFINES = $(OPTDEFINES) /D_USE_64BIT_TIME_T=1
-!endif
-!endif
-!if "$(TCL_BUILD_FOR)" == "8"
-OPTDEFINES = $(OPTDEFINES) /DTCL_MAJOR_VERSION=8
-!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
-
-# crt picks the C run time based on selected OPTS
-!if $(MSVCRT)
-!if $(DEBUG) && !$(UNCHECKED)
-crt = -MDd
-!else
-crt = -MD
-!endif
-!else
-!if $(DEBUG) && !$(UNCHECKED)
-crt = -MTd
-!else
-crt = -MT
-!endif
-!endif
-
-# cdebug includes compiler options for debugging as well as optimization.
-!if $(DEBUG)
-
-# In debugging mode, optimizations need to be disabled
-cdebug = -Zi -Od $(DEBUGFLAGS)
-
-!else
-
-cdebug = $(OPTIMIZATIONS)
-!if $(SYMBOLS)
-cdebug = $(cdebug) -Zi
-!endif
-
-!endif # $(DEBUG)
-
-# cwarn includes default warning levels, also C4090 (buggy) and C4146 is useless.
-cwarn = $(WARNINGS) -wd4090 -wd4146
-
-!if "$(MACHINE)" == "AMD64" || "$(MACHINE)" == "ARM64"
-# Disable pointer<->int warnings related to cast between different sizes
-# There are a gadzillion of these due to use of ClientData and
-# clutter up compiler
-# output increasing chance of a real warning getting lost. So disable them.
-# Eventually some day, Tcl will be 64-bit clean.
-cwarn = $(cwarn) -wd4311 -wd4312
-!endif
-
-### Common compiler options that are architecture specific
-!if "$(MACHINE)" == "ARM"
-carch = /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE
-!else
-carch =
-!endif
-
-# cpuid is only available on intel machines
-!if "$(MACHINE)" == "IX86" || "$(MACHINE)" == "AMD64"
-carch = $(carch) /DHAVE_CPUID=1
-!endif
-
-!if $(DEBUG)
-# Turn warnings into errors
-cwarn = $(cwarn) -WX
-!endif
-
-INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES)
-!if !$(DOING_TCL) && !$(DOING_TK)
-INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WIN_DIR)" -I"$(COMPATDIR)"
-!endif
-
-# These flags are defined roughly in the order of the pre-reform
-# rules.vc/makefile.vc to help visually compare that the pre- and
-# post-reform build logs
-
-# cflags contains generic flags used for building practically all object files
-cflags = -nologo -c $(COMPILERFLAGS) $(carch) $(cwarn) -Fp$(TMP_DIR)^\ $(cdebug)
-
-!if $(TCL_MAJOR_VERSION) == 8 && $(TCL_MINOR_VERSION) < 7
-cflags = $(cflags) -DTcl_Size=int
-!endif
-
-# appcflags contains $(cflags) and flags for building the application
-# object files (e.g. tclsh, or wish) pkgcflags contains $(cflags) plus
-# flags used for building shared object files The two differ in the
-# BUILD_$(PROJECT) macro which should be defined only for the shared
-# library *implementation* and not for its caller interface
-
-appcflags_nostubs = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES)
-appcflags = $(appcflags_nostubs) $(USE_STUBS_DEFS)
-pkgcflags = $(appcflags) $(PKGNAMEFLAGS) /DBUILD_$(PROJECT)
-pkgcflags_nostubs = $(appcflags_nostubs) $(PKGNAMEFLAGS) /DBUILD_$(PROJECT)
-
-# stubscflags contains $(cflags) plus flags used for building a stubs
-# library for the package. Note: /DSTATIC_BUILD is defined in
-# $(OPTDEFINES) only if the OPTS configuration indicates a static
-# library. However the stubs library is ALWAYS static hence included
-# here irrespective of the OPTS setting.
-#
-# TBD - tclvfs has a comment that stubs libs should not be compiled with -GL
-# without stating why. Tcl itself compiled stubs libs with this flag.
-# so we do not remove it from cflags. -GL may prevent extensions
-# compiled with one VC version to fail to link against stubs library
-# compiled with another VC version. Check for this and fix accordingly.
-stubscflags = $(cflags) $(PKGNAMEFLAGS) $(PRJ_DEFINES) $(OPTDEFINES) /Zl /GL- /DSTATIC_BUILD $(INCLUDES) $(USE_STUBS_DEFS)
-
-# Link flags
-
-!if $(DEBUG)
-ldebug = -debug -debugtype:cv
-!else
-ldebug = -release -opt:ref -opt:icf,3
-!if $(SYMBOLS)
-ldebug = $(ldebug) -debug -debugtype:cv
-!endif
-!endif
-
-# Note: Profiling is currently only possible with the Visual Studio Enterprise
-!if $(PROFILE)
-ldebug= $(ldebug) -profile
-!endif
-
-### Declarations common to all linker versions
-lflags = -nologo -machine:$(MACHINE) $(LINKERFLAGS) $(ldebug)
-
-!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900
-lflags = $(lflags) -nodefaultlib:libucrt.lib
-!endif
-
-dlllflags = $(lflags) -dll
-conlflags = $(lflags) -subsystem:console
-guilflags = $(lflags) -subsystem:windows
-
-# Libraries that are required for every image.
-# Extensions should define any additional libraries with $(PRJ_LIBS)
-winlibs = kernel32.lib advapi32.lib
-
-!if $(NEED_TK)
-winlibs = $(winlibs) gdi32.lib user32.lib uxtheme.lib
-!endif
-
-# Avoid 'unresolved external symbol __security_cookie' errors.
-# c.f. http://support.microsoft.com/?id=894573
-!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
-
-################################################################
-# 13. Define standard commands, common make targets and implicit rules
-
-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) /DSTATIC_BUILD=$(STATIC_BUILD) \
- /DDEBUG=$(DEBUG) -d UNCHECKED=$(UNCHECKED) \
- /DCOMMAVERSION=$(RCCOMMAVERSION) \
- /DDOTVERSION=\"$(DOTVERSION)\" \
- /DVERSION=\"$(VERSION)\" \
- /DSUFX=\"$(SUFX)\" \
- /DPROJECT=\"$(PROJECT)\" \
- /DPRJLIBNAME=\"$(PRJLIBNAME)\"
-
-!ifndef DEFAULT_BUILD_TARGET
-DEFAULT_BUILD_TARGET = $(PROJECT)
-!endif
-
-default-target: $(DEFAULT_BUILD_TARGET)
-
-!if $(MULTIPLATFORM_INSTALL)
-default-pkgindex:
- @echo if {[package vsatisfies [package provide Tcl] 9.0-]} { > $(OUT_DIR)\pkgIndex.tcl
- @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
- [list load [file join $$dir $(PLATFORM_IDENTIFY) $(PRJLIBNAME9)]] >> $(OUT_DIR)\pkgIndex.tcl
- @echo } else { >> $(OUT_DIR)\pkgIndex.tcl
- @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
- [list load [file join $$dir $(PLATFORM_IDENTIFY) $(PRJLIBNAME8)]] >> $(OUT_DIR)\pkgIndex.tcl
- @echo } >> $(OUT_DIR)\pkgIndex.tcl
-!else
-default-pkgindex:
- @echo if {[package vsatisfies [package provide Tcl] 9.0-]} { > $(OUT_DIR)\pkgIndex.tcl
- @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
- [list load [file join $$dir $(PRJLIBNAME9)]] >> $(OUT_DIR)\pkgIndex.tcl
- @echo } else { >> $(OUT_DIR)\pkgIndex.tcl
- @echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
- [list load [file join $$dir $(PRJLIBNAME8)]] >> $(OUT_DIR)\pkgIndex.tcl
- @echo } >> $(OUT_DIR)\pkgIndex.tcl
-!endif
-
-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)
-@PKG_LIB_FILE8@ $(PRJLIBNAME8)
-@PKG_LIB_FILE9@ $(PRJLIBNAME9)
-<<
-
-default-install: default-install-binaries default-install-libraries
-!if $(SYMBOLS)
-default-install: default-install-pdbs
-!endif
-
-# Again to deal with historical brokenness, there is some confusion
-# in terminlogy. For extensions, the "install-binaries" was used to
-# locate target directory for *binary shared libraries* and thus
-# the appropriate macro is LIB_INSTALL_DIR since BIN_INSTALL_DIR is
-# for executables (exes). On the other hand the "install-libraries"
-# target is for *scripts* and should have been called "install-scripts".
-default-install-binaries: $(PRJLIB)
- @echo Installing binaries to '$(LIB_INSTALL_DIR)'
- @if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"
- @$(CPY) $(PRJLIB) "$(LIB_INSTALL_DIR)" >NUL
-
-# Alias for default-install-scripts
-default-install-libraries: default-install-scripts
-
-default-install-scripts: $(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-pdbs:
- @echo Installing PDBs to '$(LIB_INSTALL_DIR)'
- @if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"
- @$(CPY) "$(OUT_DIR)\*.pdb" "$(LIB_INSTALL_DIR)\"
-
-# "emacs font-lock highlighting fix
-
-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 $(WIN_DIR)\nmakehlp.obj, nmakehlp.exe ...
- @if exist $(WIN_DIR)\nmakehlp.obj del $(WIN_DIR)\nmakehlp.obj
- @if exist $(WIN_DIR)\nmakehlp.exe del $(WIN_DIR)\nmakehlp.exe
- @if exist $(WIN_DIR)\nmakehlp.out del $(WIN_DIR)\nmakehlp.out
- @echo Cleaning $(WIN_DIR)\nmhlp-out.txt ...
- @if exist $(WIN_DIR)\nmhlp-out.txt del $(WIN_DIR)\nmhlp-out.txt
- @echo Cleaning $(WIN_DIR)\_junk.pch ...
- @if exist $(WIN_DIR)\_junk.pch del $(WIN_DIR)\_junk.pch
- @echo Cleaning $(WIN_DIR)\vercl.x, vercl.i ...
- @if exist $(WIN_DIR)\vercl.x del $(WIN_DIR)\vercl.x
- @if exist $(WIN_DIR)\vercl.i del $(WIN_DIR)\vercl.i
- @echo Cleaning $(WIN_DIR)\versions.vc, version.vc ...
- @if exist $(WIN_DIR)\versions.vc del $(WIN_DIR)\versions.vc
- @if exist $(WIN_DIR)\version.vc del $(WIN_DIR)\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 "main" 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 makefile should define explicit rules.
-
-{$(ROOT)}.c{$(TMP_DIR)}.obj::
- $(CCPKGCMD) @<<
-$<
-<<
-
-{$(WIN_DIR)}.c{$(TMP_DIR)}.obj::
- $(CCPKGCMD) @<<
-$<
-<<
-
-{$(GENERICDIR)}.c{$(TMP_DIR)}.obj::
- $(CCPKGCMD) @<<
-$<
-<<
-
-{$(COMPATDIR)}.c{$(TMP_DIR)}.obj::
- $(CCPKGCMD) @<<
-$<
-<<
-
-{$(RCDIR)}.rc{$(TMP_DIR)}.res:
- $(RESCMD) $<
-
-{$(WIN_DIR)}.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("$(_TCLDIR)\win\$(BUILDDIRTOP)\tcl.nmake")
-TCLNMAKECONFIG = "$(_TCLDIR)\win\$(BUILDDIRTOP)\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 $(TCL_VERSION) < 87 && 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
+#------------------------------------------------------------- -*- 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 = 14\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. Extract Tcl, Tk, and possibly extensions, version numbers from the\r
+# headers\r
+# 7. Parse the OPTS macro value for user-specified build configuration\r
+# 8. Parse the STATS macro value for statistics instrumentation\r
+# 9. Parse the CHECKS macro for additional compilation checks\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, ARM64 or AMD64 depending on 32- or 64-bit target\r
+# NATIVE_ARCH - set to IX86, ARM64 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)elif defined(_M_ARM64) >> vercl.x] \\r
+ && ![echo ARCH=ARM64 >> 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)" == "arm64"\r
+!undef MACHINE\r
+MACHINE = ARM64\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
+!elseif "$(MACHINE)" == "ARM64"\r
+PLATFORM_IDENTIFY = win32-arm\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
+!elseif ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i ARM | findstr /i 64-bit]\r
+NATIVE_ARCH=ARM64\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 "$(MACHINE)" == "IX86" || "$(MACHINE)" == "$(NATIVE_ARCH)"\r
+!if [$(cc32) -nologo "$(NMAKEHLPC)" -link -subsystem:console > nul]\r
+!endif\r
+!else\r
+!if [copy $(NMAKEHLPC:nmakehlp.c=x86_64-w64-mingw32-nmakehlp.exe) nmakehlp.exe >NUL]\r
+!endif\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)" "define TCL_MAJOR_VERSION" >> versions.vc]\r
+!endif\r
+!if [echo TCL_MINOR_VERSION = \>> versions.vc] \\r
+ && [nmakehlp -V "$(_TCL_H)" "define 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) "define 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
+# 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 [nmakehlp -f $(OPTS) "tcl8"]\r
+!message *** Build for Tcl8\r
+TCL_BUILD_FOR = 8\r
+!endif\r
+!if [nmakehlp -f $(OPTS) "tk8"]\r
+!message *** Build for Tk8\r
+TK_BUILD_FOR = 8\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
+!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) && $(TCL_VERSION) > 86 || !$(MSVCRT) && $(TCL_VERSION) < 87\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
+TCL_ZIP_FILE = libtcl$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)$(TCL_PATCH_LETTER)$(TCL_RELEASE_SERIAL).zip\r
+TK_ZIP_FILE = 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)\$(TCL_ZIP_FILE)\r
+\r
+!if $(TCL_MAJOR_VERSION) == 8\r
+TCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib\r
+!else\r
+TCLSTUBLIBNAME = $(STUBPREFIX).lib\r
+!endif\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
+!if $(TCL_MAJOR_VERSION) == 8\r
+TCLSTUBLIB = $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib\r
+!else\r
+TCLSTUBLIB = $(_TCLDIR)\lib\tclstub.lib\r
+!endif\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\$(TCL_ZIP_FILE)\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
+!if $(TCL_MAJOR_VERSION) == 8\r
+TCLSTUBLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib\r
+!else\r
+TCLSTUBLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub.lib\r
+!endif\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)\$(TCL_ZIP_FILE)\r
+TCLTOOLSDIR = $(_TCLDIR)\tools\r
+TCL_INCLUDES = -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"\r
+\r
+!endif # TCLINSTALL\r
+\r
+!if !$(STATIC_BUILD) && "$(TCL_BUILD_FOR)" == "8"\r
+tcllibs = "$(TCLSTUBLIB)"\r
+!else\r
+tcllibs = "$(TCLSTUBLIB)" "$(TCLIMPLIB)"\r
+!endif\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 || "$(TCL_BUILD_FOR)" == "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
+!if $(TK_MAJOR_VERSION) == 8\r
+TKSTUBLIBNAME = tkstub$(TK_VERSION).lib\r
+!else\r
+TKSTUBLIBNAME = tkstub.lib\r
+!endif\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)\$(TK_ZIP_FILE)\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\$(TK_ZIP_FILE)\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)\$(TK_ZIP_FILE)\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
+# Even when building against Tcl 9, PRJLIBNAME8 must have "t"\r
+PRJLIBNAME8 = $(PROJECT)$(VERSION)t$(SUFX:t=).$(EXT)\r
+# Even when building against Tcl 8, PRJLIBNAME9 must not have "t"\r
+PRJLIBNAME9 = tcl9$(PROJECT)$(VERSION)$(SUFX:t=).$(EXT)\r
+!if $(TCL_MAJOR_VERSION) == 8 || "$(TCL_BUILD_FOR)" == "8"\r
+PRJLIBNAME = $(PRJLIBNAME8)\r
+!else\r
+PRJLIBNAME = $(PRJLIBNAME9)\r
+!endif\r
+PRJLIB = $(OUT_DIR)\$(PRJLIBNAME)\r
+\r
+!if $(TCL_MAJOR_VERSION) == 8\r
+PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib\r
+!else\r
+PRJSTUBLIBNAME = $(STUBPREFIX).lib\r
+!endif\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 options\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 /DUSE_NMAKE=1\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" || "$(MACHINE)" == "ARM64"\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" || "$(MACHINE)" == "ARM64"\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
+!endif\r
+!if "$(TCL_BUILD_FOR)" == "8"\r
+OPTDEFINES = $(OPTDEFINES) /DTCL_MAJOR_VERSION=8\r
+!endif\r
+!if "$(TK_BUILD_FOR)" == "8"\r
+OPTDEFINES = $(OPTDEFINES) /DTK_MAJOR_VERSION=8\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, also C4090 (buggy) and C4146 is useless.\r
+cwarn = $(WARNINGS) -wd4090 -wd4146\r
+\r
+!if "$(MACHINE)" == "AMD64" || "$(MACHINE)" == "ARM64"\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
+# cpuid is only available on intel machines\r
+!if "$(MACHINE)" == "IX86" || "$(MACHINE)" == "AMD64"\r
+carch = $(carch) /DHAVE_CPUID=1\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
+!if $(TCL_MAJOR_VERSION) == 8 && $(TCL_MINOR_VERSION) < 7\r
+cflags = $(cflags) -DTcl_Size=int\r
+!endif\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:ucrt.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) /DSTATIC_BUILD=$(STATIC_BUILD) \\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