- #------------------------------------------------------------------------------
- # rules.vc --
- #
- # Microsoft Visual C++ makefile include for decoding the commandline
- # macros. This file does not need editing to build Tcl.
- #
- # 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-2006 Patrick Thoyts
- #
- #------------------------------------------------------------------------------
- # RCS: @(#) $Id: rules.vc,v 1.11.2.7 2007/09/11 00:10:48 patthoyts Exp $
- #------------------------------------------------------------------------------
- !ifndef _RULES_VC
- _RULES_VC = 1
- cc32 = $(CC) # built-in default.
- link32 = link
- lib32 = lib
- rc32 = $(RC) # built-in default.
- !ifndef INSTALLDIR
- ### Assume the normal default.
- _INSTALLDIR = C:Program FilesTcl
- !else
- ### Fix the path separators.
- _INSTALLDIR = $(INSTALLDIR:/=)
- !endif
- !ifndef MACHINE
- !if "$(CPU)" == "" || "$(CPU)" == "i386"
- MACHINE = IX86
- !else
- MACHINE = $(CPU)
- !endif
- !endif
- !ifndef CFG_ENCODING
- CFG_ENCODING = "cp1252"
- !endif
- #----------------------------------------------------------
- # Set the proper copy method to avoid overwrite questions
- # to the user when copying files and selecting the right
- # "delete all" method.
- #----------------------------------------------------------
- !if "$(OS)" == "Windows_NT"
- RMDIR = rmdir /S /Q
- !if ![ver | find "4.0" > nul]
- CPY = echo y | xcopy /i
- !else
- CPY = xcopy /i /y >NUL
- !endif
- !else
- CPY = xcopy /i
- RMDIR = deltree /Y
- !endif
- MKDIR = mkdir
- COPY = copy /y >NUL
- !message ===============================================================================
- #----------------------------------------------------------
- # build the helper app we need to overcome nmake's limiting
- # environment.
- #----------------------------------------------------------
- !if !exist(nmakehlp.exe)
- !if [$(cc32) -nologo nmakehlp.c -link -subsystem:console > nul]
- !endif
- !endif
- #----------------------------------------------------------
- # Test for compiler features
- #----------------------------------------------------------
- ### test for optimizations
- !if [nmakehlp -c -Ot]
- !message *** Compiler has 'Optimizations'
- OPTIMIZING = 1
- !else
- !message *** Compiler doesn't have 'Optimizations'
- OPTIMIZING = 0
- !endif
- OPTIMIZATIONS =
- !if [nmakehlp -c -Ot]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -Ot
- !endif
- !if [nmakehlp -c -Oi]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -Oi
- !endif
- !if [nmakehlp -c -Op]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -Op
- !endif
- !if [nmakehlp -c -fp:strict]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -fp:strict
- !endif
- !if [nmakehlp -c -Gs]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -Gs
- !endif
- !if [nmakehlp -c -GS]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -GS
- !endif
- !if [nmakehlp -c -GL]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -GL
- !endif
- DEBUGFLAGS =
- # the platform SDK has broken headers that break the runtime checks for amd64
- !if "$(MACHINE)" != "AMD64"
- !if [nmakehlp -c -RTC1]
- DEBUGFLAGS = $(DEBUGFLAGS) -RTC1
- !elseif [nmakehlp -c -GZ]
- DEBUGFLAGS = $(DEBUGFLAGS) -GZ
- !endif
- !endif
- COMPILERFLAGS =-W3
- # In v13 -GL and -YX are incompatible.
- !if [nmakehlp -c -YX]
- !if ![nmakehlp -c -GL]
- OPTIMIZATIONS = $(OPTIMIZATIONS) -YX
- !endif
- !endif
- !if "$(MACHINE)" == "IX86"
- ### test for pentium errata
- !if [nmakehlp -c -QI0f]
- !message *** Compiler has 'Pentium 0x0f fix'
- COMPILERFLAGS = $(COMPILERFLAGSS) -QI0f
- !else
- !message *** Compiler doesn't have 'Pentium 0x0f fix'
- !endif
- !endif
- !if "$(MACHINE)" == "IA64"
- ### test for Itanium errata
- !if [nmakehlp -c -QIA64_Bx]
- !message *** Compiler has 'B-stepping errata workarounds'
- COMPILERFLAGS = $(COMPILERFLAGS) -QIA64_Bx
- !else
- !message *** Compiler does not have 'B-stepping errata workarounds'
- !endif
- !endif
- !if "$(MACHINE)" == "IX86"
- ### test for -align:4096, when align:512 will do.
- !if [nmakehlp -l -opt:nowin98]
- !message *** Linker has 'Win98 alignment problem'
- ALIGN98_HACK = 1
- !else
- !message *** Linker doesn't have 'Win98 alignment problem'
- ALIGN98_HACK = 0
- !endif
- !else
- ALIGN98_HACK = 0
- !endif
- LINKERFLAGS =
- !if [nmakehlp -l -ltcg]
- LINKERFLAGS =-ltcg
- !endif
- #----------------------------------------------------------
- # MSVC8 (ships with Visual Studio 2005) generates a manifest
- # file that we should link into the binaries. This is how.
- #----------------------------------------------------------
- _VC_MANIFEST_EMBED_EXE=
- _VC_MANIFEST_EMBED_DLL=
- !if ![cl /Zs /Tc NUL 2>&1 | find "Version 12" > NUL]
- VCVER=6
- !elseif ![cl /Zs /Tc NUL 2>&1 | find "Version 13" > NUL]
- VCVER=7
- !elseif ![cl /Zs /Tc NUL 2>&1 | find "Version 14" > NUL]
- VCVER=8
- _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
- !else
- VCVER=0
- !endif
- #----------------------------------------------------------
- # Decode the options requested.
- #----------------------------------------------------------
- !if "$(OPTS)" == "" || [nmakehlp -f "$(OPTS)" "none"]
- STATIC_BUILD = 0
- TCL_THREADS = 0
- DEBUG = 0
- PROFILE = 0
- MSVCRT = 0
- LOIMPACT = 0
- TCL_USE_STATIC_PACKAGES = 0
- USE_THREAD_ALLOC = 0
- UNCHECKED = 0
- !else
- !if [nmakehlp -f $(OPTS) "static"]
- !message *** Doing static
- STATIC_BUILD = 1
- !else
- STATIC_BUILD = 0
- !endif
- !if [nmakehlp -f $(OPTS) "msvcrt"]
- !message *** Doing msvcrt
- MSVCRT = 1
- !else
- MSVCRT = 0
- !endif
- !if [nmakehlp -f $(OPTS) "staticpkg"]
- !message *** Doing staticpkg
- TCL_USE_STATIC_PACKAGES = 1
- !else
- TCL_USE_STATIC_PACKAGES = 0
- !endif
- !if [nmakehlp -f $(OPTS) "threads"]
- !message *** Doing threads
- TCL_THREADS = 1
- !else
- TCL_THREADS = 0
- !endif
- !if [nmakehlp -f $(OPTS) "symbols"]
- !message *** Doing symbols
- DEBUG = 1
- !else
- DEBUG = 0
- !endif
- !if [nmakehlp -f $(OPTS) "profile"]
- !message *** Doing profile
- PROFILE = 1
- !else
- PROFILE = 0
- !endif
- !if [nmakehlp -f $(OPTS) "loimpact"]
- !message *** Doing loimpact
- LOIMPACT = 1
- !else
- LOIMPACT = 0
- !endif
- !if [nmakehlp -f $(OPTS) "thrdalloc"]
- !message *** Doing thrdalloc
- USE_THREAD_ALLOC = 1
- !else
- USE_THREAD_ALLOC = 0
- !endif
- !if [nmakehlp -f $(OPTS) "unchecked"]
- !message *** Doing unchecked
- UNCHECKED = 1
- !else
- UNCHECKED = 0
- !endif
- !endif
- !if !$(STATIC_BUILD)
- # Make sure we don't build overly fat DLLs.
- MSVCRT = 1
- # We shouldn't statically put the extensions inside the shell when dynamic.
- TCL_USE_STATIC_PACKAGES = 0
- !endif
- #----------------------------------------------------------
- # Figure-out how to name our intermediate and output directories.
- # We wouldn't want different builds to use the same .obj files
- # by accident.
- #----------------------------------------------------------
- #----------------------------------------
- # Naming convention:
- # t = full thread support.
- # s = static library (as opposed to an
- # import library)
- # g = linked to the debug enabled C
- # run-time.
- # x = special static build when it
- # links to the dynamic C run-time.
- #----------------------------------------
- SUFX = tsgx
- !if $(DEBUG)
- BUILDDIRTOP = Debug
- DBGX = g
- !else
- BUILDDIRTOP = Release
- DBGX =
- SUFX = $(SUFX:g=)
- !endif
- !if "$(MACHINE)" != "IX86"
- BUILDDIRTOP =$(BUILDDIRTOP)_$(MACHINE)
- !endif
- !if $(VCVER) > 6
- BUILDDIRTOP =$(BUILDDIRTOP)_VC$(VCVER)
- !endif
- TMP_DIRFULL = .$(BUILDDIRTOP)$(PROJECT)_ThreadedDynamicStaticX
- !if !$(STATIC_BUILD)
- TMP_DIRFULL = $(TMP_DIRFULL:Static=)
- SUFX = $(SUFX:s=)
- EXT = dll
- !if $(MSVCRT)
- TMP_DIRFULL = $(TMP_DIRFULL:X=)
- SUFX = $(SUFX:x=)
- !endif
- !else
- TMP_DIRFULL = $(TMP_DIRFULL:Dynamic=)
- EXT = lib
- !if !$(MSVCRT)
- TMP_DIRFULL = $(TMP_DIRFULL:X=)
- SUFX = $(SUFX:x=)
- !endif
- !endif
- !if !$(TCL_THREADS)
- TMP_DIRFULL = $(TMP_DIRFULL:Threaded=)
- SUFX = $(SUFX:t=)
- !endif
- !ifndef TMP_DIR
- TMP_DIR = $(TMP_DIRFULL)
- !ifndef OUT_DIR
- OUT_DIR = .$(BUILDDIRTOP)
- !endif
- !else
- !ifndef OUT_DIR
- OUT_DIR = $(TMP_DIR)
- !endif
- !endif
- #----------------------------------------------------------
- # Decode the statistics requested.
- #----------------------------------------------------------
- !if "$(STATS)" == "" || [nmakehlp -f "$(STATS)" "none"]
- TCL_MEM_DEBUG = 0
- TCL_COMPILE_DEBUG = 0
- !else
- !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
- #----------------------------------------------------------
- # Decode the checks requested.
- #----------------------------------------------------------
- !if "$(CHECKS)" == "" || [nmakehlp -f "$(CHECKS)" "none"]
- TCL_NO_DEPRECATED = 0
- FULLWARNINGS = 0
- !else
- !if [nmakehlp -f $(CHECKS) "nodep"]
- !message *** Doing nodep check
- TCL_NO_DEPRECATED = 1
- !else
- TCL_NO_DEPRECATED = 0
- !endif
- !if [nmakehlp -f $(CHECKS) "fullwarn"]
- !message *** Doing full warnings check
- FULLWARNINGS = 1
- !else
- FULLWARNINGS = 0
- !endif
- !endif
- #----------------------------------------------------------
- # Set our defines now armed with our options.
- #----------------------------------------------------------
- OPTDEFINES =
- !if $(TCL_MEM_DEBUG)
- OPTDEFINES = $(OPTDEFINES) -DTCL_MEM_DEBUG
- !endif
- !if $(TCL_COMPILE_DEBUG)
- OPTDEFINES = $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
- !endif
- !if $(TCL_THREADS)
- OPTDEFINES = $(OPTDEFINES) -DTCL_THREADS=1
- !if $(USE_THREAD_ALLOC)
- OPTDEFINES = $(OPTDEFINES) -DUSE_THREAD_ALLOC=1
- !endif
- !endif
- !if $(STATIC_BUILD)
- OPTDEFINES = $(OPTDEFINES) -DSTATIC_BUILD
- !endif
- !if $(DEBUG)
- OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_DEBUG
- !elseif $(OPTIMIZING)
- OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_OPTIMIZED
- !endif
- !if $(PROFILE)
- OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_PROFILED
- !endif
- !if "$(MACHINE)" == "IA64" || "$(MACHINE)" == "AMD64"
- OPTDEFINES = $(OPTDEFINES) -DTCL_CFG_DO64BIT
- !endif
- #----------------------------------------------------------
- # Get common info used when building extensions.
- #----------------------------------------------------------
- !if "$(PROJECT)" != "tcl"
- !if !defined(TCLDIR)
- !if exist("$(_INSTALLDIR)includetcl.h")
- TCLH = "$(_INSTALLDIR)includetcl.h"
- TCLINSTALL = 1
- _TCLDIR = $(_INSTALLDIR)
- !else
- MSG=^
- Failed to find tcl.h. Set the TCLDIR macro.
- !error $(MSG)
- !endif
- !else
- _TCLDIR = $(TCLDIR:/=)
- !if exist("$(_TCLDIR)includetcl.h")
- TCLH = "$(_TCLDIR)includetcl.h"
- TCLINSTALL = 1
- !elseif exist("$(_TCLDIR)generictcl.h")
- TCLH = "$(_TCLDIR)generictcl.h"
- TCLINSTALL = 0
- !else
- MSG =^
- Failed to find tcl.h. The TCLDIR macro does not appear correct.
- !error $(MSG)
- !endif
- !endif
- ### TODO: add a command to nmakehlp.c to grep for Tcl's version from tcl.h.
- ### Because nmake can't return a string, we'll need to play games with return
- ### codes. It might look something like this:
- #!if [nmakehlp -g $(TCL.H)] == 81
- #TCL_DOTVERSION = 8.1
- #!elseif [nmakehlp -g $(TCL.H)] == 82
- #TCL_DOTVERSION = 8.2
- #...
- #!endif
- TCL_DOTVERSION = 8.4
- TCL_VERSION = $(TCL_DOTVERSION:.=)
- !if $(TCLINSTALL)
- TCLSH = "$(_INSTALLDIR)bintclsh$(TCL_VERSION)$(SUFX).exe"
- TCLSTUBLIB = "$(_INSTALLDIR)libtclstub$(TCL_VERSION).lib"
- TCLIMPLIB = "$(_INSTALLDIR)libtcl$(TCL_VERSION)$(SUFX).lib"
- TCL_LIBRARY = $(_INSTALLDIR)lib
- TCLREGLIB = "$(_INSTALLDIR)libtclreg11$(SUFX:t=).lib"
- TCLDDELIB = "$(_INSTALLDIR)libtcldde12$(SUFX:t=).lib"
- COFFBASE = musthavetclsourcestobuildthistarget
- TCLTOOLSDIR = musthavetclsourcestobuildthistarget
- !else
- TCLSH = "$(_TCLDIR)win$(BUILDDIRTOP)tclsh$(TCL_VERSION)$(SUFX).exe"
- TCLSTUBLIB = "$(_TCLDIR)win$(BUILDDIRTOP)tclstub$(TCL_VERSION).lib"
- TCLIMPLIB = "$(_TCLDIR)win$(BUILDDIRTOP)tcl$(TCL_VERSION)$(SUFX).lib"
- TCL_LIBRARY = $(_TCLDIR)library
- TCLREGLIB = "$(_TCLDIR)win$(BUILDDIRTOP)tclreg11$(SUFX:t=).lib"
- TCLDDELIB = "$(_TCLDIR)win$(BUILDDIRTOP)tcldde12$(SUFX:t=).lib"
- COFFBASE = "$(_TCLDIR)wincoffbase.txt"
- TCLTOOLSDIR = $(_TCLDIR)tools
- !endif
- !endif
- #----------------------------------------------------------
- # Display stats being used.
- #----------------------------------------------------------
- !message *** Intermediate directory will be '$(TMP_DIR)'
- !message *** Output directory will be '$(OUT_DIR)'
- !message *** Suffix for binaries will be '$(SUFX)'
- !message *** Optional defines are '$(OPTDEFINES)'
- !message *** Compiler version $(VCVER)
- !message *** Compiler options '$(OPTIMIZATIONS) $(DEBUGFLAGS)'
- !message *** Link options '$(LINKERFLAGS)'
- !endif