# makefile.vc -- -*- Makefile -*- # # Microsoft Visual C++ makefile for use with nmake.exe v1.62+ (VC++ 5.0+) # # This makefile is based upon the Tcl 8.4 Makefile.vc and modified to # make it suitable as a general package makefile. Look for the word EDIT # which marks sections that may need modification. As a minumum you will # need to change the PROJECT, DOTVERSION and DLLOBJS variables to values # relevant to your package. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Copyright (c) 1995-1996 Sun Microsystems, Inc. # Copyright (c) 1998-2000 Ajuba Solutions. # Copyright (c) 2001 ActiveState Corporation. # Copyright (c) 2001-2002 David Gravereaux. # Copyright (c) 2003 Pat Thoyts # Copyright (c) 2004 Zveno Pty Ltd # #------------------------------------------------------------------------- # RCS: @(#)$Id: makefile.vc,v 1.1.1.1 2009/01/16 22:11:49 joye Exp $ #------------------------------------------------------------------------- !if "$(MSVCDIR)" == "" MSG = ^ You will need to run vcvars32.bat from Developer Studio, first, to setup^ the environment. Jump to this line to read the new instructions. !error $(MSG) !endif #------------------------------------------------------------------------------ # HOW TO USE this makefile: # # 1) It is now necessary to have %MSVCDir% set in the environment. This is # used as a check to see if vcvars32.bat had been run prior to running # nmake or during the installation of Microsoft Visual C++, MSVCDir had # been set globally and the PATH adjusted. Either way is valid. # # You'll need to run vcvars32.bat contained in the MsDev's vc(98)/bin # directory to setup the proper environment, if needed, for your current # setup. This is a needed bootstrap requirement and allows the swapping of # different environments to be easier. # # 2) To use the Platform SDK (not expressly needed), run setenv.bat after # vcvars32.bat according to the instructions for it. This can also turn on # the 64-bit compiler, if your SDK has it. # # 3) Targets are: # all -- Builds everything. # -- Builds the project (eg: nmake sample) # test -- Builds and runs the test suite. # install -- Installs the built binaries and libraries to $(INSTALLDIR) # in an appropriate subdirectory. # clean/realclean/distclean -- varying levels of cleaning. # # 4) Macros usable on the commandline: # INSTALLDIR= # Sets where to install Tcl from the built binaries. # C:\Progra~1\Tcl is assumed when not specified. # # OPTS=static,msvcrt,staticpkg,threads,symbols,profile,loimpact,none # Sets special options for the core. The default is for none. # Any combination of the above may be used (comma separated). # 'none' will over-ride everything to nothing. # # static = Builds a static library of the core instead of a # dll. The shell will be static (and large), as well. # msvcrt = Effects the static option only to switch it from # using libcmt(d) as the C runtime [by default] to # msvcrt(d). This is useful for static embedding # support. # staticpkg = Effects the static option only to switch # tclshXX.exe to have the dde and reg extension linked # inside it. # threads = Turns on full multithreading support. # thrdalloc = Use the thread allocator (shared global free pool). # symbols = Adds symbols for step debugging. # profile = Adds profiling hooks. Map file is assumed. # loimpact = Adds a flag for how NT treats the heap to keep memory # in use, low. This is said to impact alloc performance. # # STATS=memdbg,compdbg,none # Sets optional memory and bytecode compiler debugging code added # to the core. The default is for none. Any combination of the # above may be used (comma separated). 'none' will over-ride # everything to nothing. # # memdbg = Enables the debugging memory allocator. # compdbg = Enables byte compilation logging. # # MACHINE=(IX86|IA64|ALPHA) # Set the machine type used for the compiler, linker, and # resource compiler. This hook is needed to tell the tools # when alternate platforms are requested. IX86 is the default # when not specified. # # TMP_DIR= # OUT_DIR= # Hooks to allow the intermediate and output directories to be # changed. $(OUT_DIR) is assumed to be # $(BINROOT)\(Release|Debug) based on if symbols are requested. # $(TMP_DIR) will de $(OUT_DIR)\ by default. # # TESTPAT= # Reads the tests requested to be run from this file. # # CFG_ENCODING=encoding # name of encoding for configuration information. Defaults # to cp1252 # # 5) Examples: # # Basic syntax of calling nmake looks like this: # nmake [-nologo] -f makefile.vc [target|macrodef [target|macrodef] [...]] # # Standard (no frills) # c:\tcl_src\win\>c:\progra~1\micros~1\vc98\bin\vcvars32.bat # Setting environment for using Microsoft Visual C++ tools. # c:\tcl_src\win\>nmake -f makefile.vc all # c:\tcl_src\win\>nmake -f makefile.vc install INSTALLDIR=c:\progra~1\tcl # # Building for Win64 # c:\tcl_src\win\>c:\progra~1\micros~1\vc98\bin\vcvars32.bat # Setting environment for using Microsoft Visual C++ tools. # c:\tcl_src\win\>c:\progra~1\platfo~1\setenv.bat /pre64 /RETAIL # Targeting Windows pre64 RETAIL # c:\tcl_src\win\>nmake -f makefile.vc MACHINE=IA64 # #------------------------------------------------------------------------------ #============================================================================== ############################################################################### #------------------------------------------------------------------------------ !if !exist("makefile.vc") MSG = ^ You must run this makefile only from the directory it is in.^ Please `cd` to its location first. !error $(MSG) !endif #------------------------------------------------------------------------- # Project specific information (EDIT) # # You should edit this with the name and version of your project. This # information is used to generate the name of the package library and # it's install location. # # For example, the sample extension is going to build sample04.dll and # would install it into $(INSTALLDIR)\lib\sample04 # # You need to specify the object files that need to be linked into your # binary here. # #------------------------------------------------------------------------- PROJECT = Tclxml !include "rules.vc" DOTVERSION = 3.1 VERSION = $(DOTVERSION:.=) STUBPREFIX = $(PROJECT)stub #-- Use this line for VC++ 6.0 #WSOCKLIB = "C:\Program Files\Microsoft Visual Studio\VC98\Lib\WSOCK32.LIB" #-- Use this line for VC++ .NET 2003 WSOCKLIB = "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib\WSOCK32.LIB" DLLOBJS = \ $(TMP_DIR)\tclxml.obj PRJSTUBOBJS = \ $(TMP_DIR)\tclxmlStubInit.obj \ $(TMP_DIR)\tclxmlStubLib.obj EXPATDLLOBJS = \ $(TMP_DIR)\tclexpat.obj \ $(TMP_DIR)\xmltok.obj \ $(TMP_DIR)\xmlrole.obj \ $(TMP_DIR)\xmlwf.obj \ $(TMP_DIR)\xmlfile.obj \ $(TMP_DIR)\codepage.obj \ $(TMP_DIR)\hashtable.obj \ $(TMP_DIR)\win32filemap.obj \ $(TMP_DIR)\xmlparse.obj LIBXML2DLLOBJS = \ $(TMP_DIR)\tcllibxml2.obj \ $(TMP_DIR)\docObj.obj LIBXML2STUBOBJS = \ $(TMP_DIR)\tcllibxml2StubInit.obj #------------------------------------------------------------------------- # Target names and paths ( shouldn't need changing ) #------------------------------------------------------------------------- BINROOT = . ROOT = .. PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib PRJLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT) PRJLIB = $(OUT_DIR)\$(PRJLIBNAME) PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib PRJSTUBLIB = $(OUT_DIR)\$(PRJSTUBLIBNAME) EXPATIMPLIB = $(OUT_DIR)\expat$(VERSION)$(SUFX).lib EXPATLIBNAME = expat$(VERSION)$(SUFX).$(EXT) EXPATLIB = $(OUT_DIR)\$(EXPATLIBNAME) EXPATSTUBLIBNAME = expatstub$(VERSION).lib EXPATSTUBLIB = $(OUT_DIR)\$(EXPATSTUBLIBNAME) LIBXML2IMPLIB = $(OUT_DIR)\tcllibxml2$(VERSION)$(SUFX).lib LIBXML2LIBNAME = tcllibxml2$(VERSION)$(SUFX).$(EXT) LIBXML2LIB = $(OUT_DIR)\$(LIBXML2LIBNAME) LIBXML2STUBLIBNAME = tcllibxml2stub$(VERSION).lib LIBXML2STUBLIB = $(OUT_DIR)\$(LIBXML2STUBLIBNAME) ### Make sure we use backslash only. LIB_INSTALL_DIR = $(_INSTALLDIR)\lib BIN_INSTALL_DIR = $(_INSTALLDIR)\bin DOC_INSTALL_DIR = $(_INSTALLDIR)\doc SCRIPT_INSTALL_DIR = $(_INSTALLDIR)\lib\$(PROJECT)$(DOTVERSION) EXPAT_INSTALL_DIR = $(_INSTALLDIR)\lib\Tclexpat$(DOTVERSION) LIBXML2_INSTALL_DIR = $(_INSTALLDIR)\lib\Tcllibxml$(DOTVERSION) INCLUDE_INSTALL_DIR = $(_INSTALLDIR)\include ### The following paths CANNOT have spaces in them. GENERICDIR = $(ROOT) EXPATDIR = $(ROOT)\expat TCLLIBXML2DIR = $(ROOT)\libxml2 WINDIR = $(ROOT)\win LIBDIR = $(ROOT)\library DOCDIR = $(ROOT)\doc TOOLSDIR = $(ROOT)\tools COMPATDIR = $(ROOT)\compat INCLUDEDIR = $(ROOT)\include ### Find a tclsh for testing and installation. !if !exist("$(TCLSH)") TCLSH = $(BIN_INSTALL_DIR)\tclsh$(TCL_VERSION).exe !endif #--------------------------------------------------------------------- # Compile flags #--------------------------------------------------------------------- !if !$(DEBUG) !if $(OPTIMIZING) ### This cranks the optimization level to maximize speed cdebug = -O2 -Op -Gs !else cdebug = !endif !else if "$(MACHINE)" == "IA64" ### Warnings are too many, can't support warnings into errors. cdebug = -Z7 -Od !else cdebug = -Z7 -WX -Od !endif ### Declarations common to all compiler options cflags = -nologo -c -W3 -YX -Fp$(TMP_DIR)^\ !if $(PENT_0F_ERRATA) cflags = $(cflags) -QI0f !endif !if $(ITAN_B_ERRATA) cflags = $(cflags) -QIA64_Bx !endif !if $(MSVCRT) !if $(DEBUG) crt = -MDd !else crt = -MD !endif !else !if $(DEBUG) crt = -MTd !else crt = -MT !endif !endif #---------------------------------------------------------- # TclXML/libxml2 needs libz, libiconv and libxml2 headers #---------------------------------------------------------- !if !defined(LIBZDIR) MSG=^ Don't know where libz is. Set the LIBZDIR macro. !error $(MSG) !else _LIBZDIR = $(LIBZDIR:/=\) !if !exist("$(_LIBZDIR)\include\zlib.h") MSG=^ Don't know where zlib.h is. The LIBZDIR macro doesn't appear to be correct. !error $(MSG) !endif !endif !if !defined(LIBICONVDIR) MSG=^ Don't know where libiconv is. Set the LIBICONVDIR macro. !error $(MSG) !else _LIBICONVDIR = $(LIBICONVDIR:/=\) !if !exist("$(_LIBICONVDIR)\include\iconv.h") MSG=^ Don't know where iconv.h is. The LIBICONVDIR macro doesn't appear to be correct. !error $(MSG) !endif !endif !if !defined(LIBXML2DIR) MSG=^ Don't know where libxml2 is. Set the LIBXML2DIR macro. !error $(MSG) !else _LIBXML2DIR = $(LIBXML2DIR:/=\) !if !exist("$(_LIBXML2DIR)\include\libxml\tree.h") MSG=^ Don't know where libxml2 tree.h is. The LIBXML2DIR macro doesn't appear to be correct. !error $(MSG) !endif !endif TCL_INCLUDES = -I"$(TCLDIR)\include" -I"$(WINDIR)" -I"$(GENERICDIR)" EXPAT_INCLUDES = -I"$(EXPATDIR)\xmlparse" -I"$(EXPATDIR)\xmltok" LIBXML2_INCLUDES = -I"$(LIBZDIR)\include" -I"$(LIBICONVDIR)\include" -I"$(LIBXML2DIR)\include" BASE_CLFAGS = $(cflags) $(cdebug) $(crt) $(TCL_INCLUDES) -I"..\include" CON_CFLAGS = $(cflags) $(cdebug) $(crt) -DCONSOLE TCL_CFLAGS = -DUSE_TCL_STUBS -DVERSION="\"$(DOTVERSION)\"" $(BASE_CLFAGS) $(OPTDEFINES) LIBXML2_CFLAGS = -DTCLXML_LIBXML2_VERSION="\"$(DOTVERSION)\"" #--------------------------------------------------------------------- # Link flags #--------------------------------------------------------------------- !if $(DEBUG) ldebug = -debug:full -debugtype:cv !else ldebug = -release -opt:ref -opt:icf,3 !endif ### Declarations common to all linker options lflags = -nologo -machine:$(MACHINE) $(ldebug) !if $(PROFILE) lflags = $(lflags) -profile !endif !if $(ALIGN98_HACK) && !$(STATIC_BUILD) ### Align sections for PE size savings. lflags = $(lflags) -opt:nowin98 !else if !$(ALIGN98_HACK) && $(STATIC_BUILD) ### Align sections for speed in loading by choosing the virtual page size. lflags = $(lflags) -align:4096 !endif !if $(LOIMPACT) lflags = $(lflags) -ws:aggressive !endif dlllflags = $(lflags) -dll conlflags = $(lflags) -subsystem:console guilflags = $(lflags) -subsystem:windows baselibs = $(TCLSTUBLIB) #--------------------------------------------------------------------- # TclTest flags #--------------------------------------------------------------------- !IF "$(TESTPAT)" != "" TESTFLAGS = -file $(TESTPAT) !ENDIF #--------------------------------------------------------------------- # Project specific targets (EDIT) #--------------------------------------------------------------------- all: setup $(PROJECT) $(PROJECT): setup $(PRJLIB) $(EXPATLIB) $(LIBXML2LIB) install: install-binaries install-includes install-libraries install-docs test: setup $(PROJECT) set TCL_LIBRARY=$(ROOT)/library !if "$(OS)" == "Windows_NT" || "$(MSVCDIR)" == "IDE" $(TCLSH) "$(ROOT)/tests/all.tcl" $(TESTFLAGS) !else @echo Please wait while the tests are collected... $(TCLSH) "$(ROOT)/tests/all.tcl" $(TESTFLAGS) > tests.log type tests.log | more !endif setup: @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) $(PRJLIB): $(DLLOBJS) $(PRJSTUBOBJS) $(link32) $(dlllflags) -out:$@ $(baselibs) $(DLLOBJS) $(PRJSTUBOBJS) -@del $*.exp $(EXPATLIB): $(EXPATDLLOBJS) $(link32) $(dlllflags) -out:$@ $(baselibs) $(PRJIMPLIB) @<< $** << -@del $*.exp $(LIBXML2LIB): $(LIBXML2DLLOBJS) $(link32) $(dlllflags) -out:$@ $(baselibs) $(PRJIMPLIB) $(LIBZDIR)\lib\zlib.lib $(LIBICONVDIR)\lib\iconv.lib $(LIBXML2DIR)\lib\libxml2.lib $(WSOCKLIB) @<< $** << -@del $*.exp $(PRJSTUBLIB): $(PRJSTUBOBJS) $(lib32) -nologo -out:$@ $(PRJSTUBOBJS) $(EXPATSTUBLIB): $(EXPATSTUBOBJS) $(lib32) -nologo -out:$@ $(EXPATSTUBOBJS) $(LIBXML2STUBLIB): $(LIBXML2STUBOBJS) $(lib32) -nologo -out:$@ $(LIBXML2STUBOBJS) #--------------------------------------------------------------------- # Special case object file targets #--------------------------------------------------------------------- $(TMP_DIR)\tclxml.obj: $(GENERICDIR)\tclxml.c $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\tclexpat.obj: $(GENERICDIR)\tclexpat.c $(cc32) $(TCL_CFLAGS) $(EXPAT_INCLUDES) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\xmltok.obj: $(EXPATDIR)\xmltok\xmltok.c $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\xmlrole.obj: $(EXPATDIR)\xmltok\xmlrole.c $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\xmlwf.obj: $(EXPATDIR)\xmlwf\xmlwf.c $(cc32) $(TCL_CFLAGS) $(EXPAT_INCLUDES) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\xmlfile.obj: $(EXPATDIR)\xmlwf\xmlfile.c $(cc32) $(TCL_CFLAGS) $(EXPAT_INCLUDES) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\codepage.obj: $(EXPATDIR)\xmlwf\codepage.c $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\hashtable.obj: $(EXPATDIR)\xmlparse\hashtable.c $(cc32) $(TCL_CFLAGS) $(EXPAT_INCLUDES) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\win32filemap.obj: $(EXPATDIR)\xmlwf\win32filemap.c $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\xmlparse.obj: $(EXPATDIR)\xmlparse\xmlparse.c $(cc32) $(TCL_CFLAGS) $(EXPAT_INCLUDES) -DBUILD_$(PROJECT) -Fo$@ $? $(TMP_DIR)\tcllibxml2.obj: $(TCLLIBXML2DIR)\tcllibxml2.c $(cc32) $(TCL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBXML2_INCLUDES) -DBUILD_TclXML_libxml2 -Fo$@ $? $(TMP_DIR)\docObj.obj: $(TCLLIBXML2DIR)\docObj.c $(cc32) $(TCL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBXML2_INCLUDES) -DBUILD_TclXML_libxml2 -Fo$@ $? $(TMP_DIR)\tcllibxml2StubInit.obj: $(TCLLIBXML2DIR)\tcllibxml2StubInit.c $(cc32) $(TCL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBXML2_INCLUDES) -DBUILD_TclXML_libxml2 -Fo$@ $? #--------------------------------------------------------------------- # Implicit rules #--------------------------------------------------------------------- {$(WINDIR)}.c{$(TMP_DIR)}.obj:: $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< $< << {$(GENERICDIR)}.c{$(TMP_DIR)}.obj:: $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< $< << {$(COMPATDIR)}.c{$(TMP_DIR)}.obj:: $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< $< << {$(WINDIR)}.rc{$(TMP_DIR)}.res: $(rc32) -fo $@ -r -i "$(GENERICDIR)" -D__WIN32__ \ !if $(DEBUG) -d DEBUG \ !endif !if $(TCL_THREADS) -d TCL_THREADS \ !endif !if $(STATIC_BUILD) -d STATIC_BUILD \ !endif $< .SUFFIXES: .SUFFIXES:.c .rc #--------------------------------------------------------------------- # Installation. (EDIT) # # You may need to modify this section to reflect the final distribution # of your files and possibly to generate documentation. # #--------------------------------------------------------------------- install-binaries: install-tclxml-binaries install-expat-binaries install-libxml2-binaries @echo Installing to '$(SCRIPT_INSTALL_DIR)' install-tclxml-binaries: @if not exist $(SCRIPT_INSTALL_DIR)\nul mkdir $(SCRIPT_INSTALL_DIR) $(CPY) $(PRJLIB) $(SCRIPT_INSTALL_DIR) $(CPY) $(PRJIMPLIB) $(SCRIPT_INSTALL_DIR) install-expat-binaries: @if not exist $(EXPAT_INSTALL_DIR)\nul mkdir $(EXPAT_INSTALL_DIR) $(CPY) $(EXPATLIB) $(EXPAT_INSTALL_DIR) $(CPY) $(EXPATIMPLIB) $(EXPAT_INSTALL_DIR) @echo package ifneeded xml::expat $(DOTVERSION) [list load [file join $$dir $(EXPATLIBNAME)]] > $(EXPAT_INSTALL_DIR)\pkgIndex.tcl install-libxml2-binaries: @if not exist $(LIBXML2_INSTALL_DIR)\nul mkdir $(LIBXML2_INSTALL_DIR) $(CPY) $(LIBXML2LIB) $(LIBXML2_INSTALL_DIR) $(CPY) $(LIBXML2IMPLIB) $(LIBXML2_INSTALL_DIR) @echo package ifneeded xml::libxml2 $(DOTVERSION) [list load [file join $$dir $(LIBXML2LIBNAME)] Tclxml_libxml2] > $(LIBXML2_INSTALL_DIR)\pkgIndex.tcl install-includes: install-tclxml-includes install-expat-includes install-libxml2-includes @echo Installing to '$(INCLUDE_INSTALL_DIR)' @if not exist $(INCLUDE_INSTALL_DIR)\nul mkdir $(INCLUDE_INSTALL_DIR) install-tclxml-includes: @if not exist $(INCLUDE_INSTALL_DIR)\tclxml\nul mkdir $(INCLUDE_INSTALL_DIR)\tclxml $(CPY) $(INCLUDEDIR)\tclxml\*.h $(INCLUDE_INSTALL_DIR)\tclxml install-expat-includes: install-libxml2-includes: @if not exist $(INCLUDE_INSTALL_DIR)\tclxml-libxml2\nul mkdir $(INCLUDE_INSTALL_DIR)\tclxml-libxml2 $(CPY) $(INCLUDEDIR)\tclxml-libxml2\*.h $(INCLUDE_INSTALL_DIR)\tclxml-libxml2 install-libraries: @echo Installing to '$(SCRIPT_INSTALL_DIR)' @if exist $(LIBDIR)\nul $(CPY) $(LIBDIR)\*.tcl $(SCRIPT_INSTALL_DIR) $(TCLSH) $(WINDIR)\mkPkgIndex.tcl $(LIBDIR)\pkgIndex.tcl.in $(SCRIPT_INSTALL_DIR)\pkgIndex.tcl VERSION=$(DOTVERSION) Tclxml_LIB_FILE=$(PRJLIBNAME) install-docs: #--------------------------------------------------------------------- # Clean up #--------------------------------------------------------------------- clean: @if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR) realclean: clean @if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR) distclean: realclean @if exist $(WINDIR)\nmakehlp.exe del $(WINDIR)\nmakehlp.exe @if exist $(WINDIR)\nmakehlp.obj del $(WINDIR)\nmakehlp.obj