#------------------------------------------------------------------------------ # Visual C++ 5.0+ makefile for [Incr Tcl] # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Copyright (c) 1993-1998 Lucent Technologies, Inc. # RCS: $Id: makefile.vc,v 1.35 2007/11/03 17:57:16 davygrvy Exp $ #------------------------------------------------------------------------------ # Do not modify this file! #------------------------------------------------------------------------------ !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 = itcl !include "..\..\rules.vc" !if $(TCLINSTALL) !message *** Warning: [Incr Tcl] requires the source distribution of Tcl to build from, !message *** at this time, sorry. Please set the TCLDIR macro to point to the !message *** sources. !endif !if [nmakehlp -g ..\generic\itcl.h ITCL_VERSION] == 33 ITCL_DOTVERSION = 3.3 !elseif [nmakehlp -g ..\generic\itcl.h ITCL_VERSION] == 34 ITCL_DOTVERSION = 3.4 !elseif [nmakehlp -g ..\generic\itcl.h ITCL_VERSION] == 35 ITCL_DOTVERSION = 3.5 !elseif [nmakehlp -g ..\generic\itcl.h ITCL_VERSION] == 0 MSG =^ Can't get version string from ..\generic\itcl.h !error $(MSG) !endif ITCL_VERSION = $(ITCL_DOTVERSION:.=) BINROOT = . ROOT = .. STUBPREFIX = $(PROJECT)stub PKGINDEX = "$(TMP_DIR)\pkgIndex.tcl" !if $(TCL_DOES_STUBS) ITCLLIBNAME = $(PROJECT)$(ITCL_VERSION)$(SUFX).$(EXT) !else ITCLLIBNAME = $(PROJECT)$(ITCL_VERSION)80$(SUFX).$(EXT) !endif ITCLLIB = "$(OUT_DIR)\$(ITCLLIBNAME)" ITCLIMPLIB = "$(OUT_DIR)\$(PROJECT)$(ITCL_VERSION)$(SUFX).lib" !if $(TCL_DOES_STUBS) ITCLSTUBLIBNAME = $(STUBPREFIX)$(ITCL_VERSION).lib ITCLSTUBLIB = "$(OUT_DIR)\$(ITCLSTUBLIBNAME)" !else ITCLSTUBLIBNAME = ITCLSTUBLIB = TCLSTUBLIB = $(TCLIMPLIB) !endif BIN_INSTALL_DIR = $(_INSTALLDIR)\bin DOC_INSTALL_DIR = $(_INSTALLDIR)\doc LIB_INSTALL_DIR = $(_INSTALLDIR)\lib SCRIPT_INSTALL_DIR = $(_INSTALLDIR)\lib\$(PROJECT)$(ITCL_DOTVERSION) INCLUDE_INSTALL_DIR = $(_INSTALLDIR)\include ITCLOBJS = \ $(TMP_DIR)\itcl_bicmds.obj \ $(TMP_DIR)\itcl_class.obj \ $(TMP_DIR)\itcl_cmds.obj \ $(TMP_DIR)\itcl_ensemble.obj \ $(TMP_DIR)\itcl_linkage.obj \ $(TMP_DIR)\itcl_migrate.obj \ $(TMP_DIR)\itcl_methods.obj \ $(TMP_DIR)\itcl_objects.obj \ $(TMP_DIR)\itcl_parse.obj \ $(TMP_DIR)\itcl_util.obj \ !if $(TCL_DOES_STUBS) $(TMP_DIR)\itclStubInit.obj \ !endif !if !$(STATIC_BUILD) $(TMP_DIR)\dllEntryPoint.obj \ $(TMP_DIR)\itcl.res !endif ITCLSTUBOBJS = \ !if $(TCL_DOES_STUBS) $(TMP_DIR)\itclStubLib.obj !endif GENERICDIR = $(ROOT)\generic DOCDIR = $(ROOT)\doc RCDIR = $(ROOT)\win\rc WINDIR = $(ROOT)\win TOOLSDIR = ..\..\tools #--------------------------------------------------------------------- # 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 ITCL_LFLAGS = $(lflags) -subsystem:windows -dll !if exist("$(TCLDIR)\win\coffbase.txt") ITCL_DLLBASE = -base:@$(TCLDIR)\win\coffbase.txt,itcl !else ITCL_DLLBASE = !endif #--------------------------------------------------------------------- # Compile flags #--------------------------------------------------------------------- !if $(DEBUG) !if "$(MACHINE)" == "IA64" cdebug = -Od -Zi !else cdebug = -Z7 -Od -WX !endif !else # This cranks the optimization level up to max. cdebug = -O2 !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) crt = -MD$(DBGX) !else crt = -MT$(DBGX) !endif !if $(TCLINSTALL) TCL_INCLUDES = -I"$(TCLDIR)\include" !else TCL_INCLUDES = -I"$(TCLDIR)\generic" -I"$(TCLDIR)\win" !endif ITCL_INCLUDES = -I$(WINDIR) -I$(GENERICDIR) ITCL_DEFINES = -DBUILD_itcl -DTCL_THREADS=1 ITCL_STUB_CFLAGS= $(cflags) $(cdebug) $(ITCL_INCLUDES) $(ITCL_DEFINES) $(TCL_INCLUDES) ITCL_DLL_CFLAGS = $(cflags) $(cdebug) $(crt) $(ITCL_INCLUDES) $(ITCL_DEFINES) $(TCL_INCLUDES) $(OPTDEFINES) ### By convention, static builds do not use Stubs. This is just a practice, ### not a technical limitation. !if $(STATIC_BUILD) ITCL_CFLAGS = $(ITCL_DLL_CFLAGS) -DSTATIC_BUILD !elseif $(TCL_DOES_STUBS) ITCL_CFLAGS = $(ITCL_DLL_CFLAGS) -DUSE_TCL_STUBS !else ITCL_CFLAGS = $(ITCL_DLL_CFLAGS) !endif #--------------------------------------------------------------------- # TclTest flags #--------------------------------------------------------------------- !if "$(TESTPAT)" != "" TESTFLAGS = -file $(TESTPAT) !endif #--------------------------------------------------------------------- # Project specific targets #--------------------------------------------------------------------- all : setup $(ITCLLIB) $(ITCLSTUBLIB) release : setup $(ITCLLIB) $(ITCLSTUBLIB) install : install-binaries install-docs setup : @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) $(ITCLLIB): $(ITCLOBJS) !if $(STATIC_BUILD) $(lib32) -nologo -machine:$(MACHINE) -out:$@ @<< $(ITCLOBJS) << !else $(link32) $(ITCL_LFLAGS) $(ITCL_DLLBASE) -out:$@ $(TCLSTUBLIB) @<< $(ITCLOBJS) << -@del $*.exp !endif !if $(TCL_DOES_STUBS) $(ITCLSTUBLIB) : $(ITCLSTUBOBJS) $(lib32) -nologo -out:$@ $(ITCLSTUBOBJS) !endif install-binaries : if not exist "$(_INSTALLDIR)" mkdir "$(_INSTALLDIR)" if not exist "$(BIN_INSTALL_DIR)" mkdir "$(BIN_INSTALL_DIR)" if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)" if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" if not exist "$(INCLUDE_INSTALL_DIR)" mkdir "$(INCLUDE_INSTALL_DIR)" copy $(ITCLLIB) "$(SCRIPT_INSTALL_DIR)" !if ""$(ITCLSTUBLIB)"" != """" copy $(ITCLSTUBLIB) "$(LIB_INSTALL_DIR)" !endif copy $(ROOT)\generic\itcl.h "$(INCLUDE_INSTALL_DIR)" copy $(ROOT)\generic\itclDecls.h "$(INCLUDE_INSTALL_DIR)" copy $(ROOT)\library\*.* "$(SCRIPT_INSTALL_DIR)" echo if {[package vsatisfies 8.0 [package provide Tcl]]} {\ > "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo ^ ^ ^ ^ set add 80>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo } else {>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo ^ ^ ^ ^ set add {}>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo }>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo if {[info exists ::tcl_platform(debug)] ^&^&\ $$::tcl_platform(debug) ^&^& \>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo ^ ^ ^ ^ ^ ^ ^ ^ [file exists [file join $$dir\ $(PROJECT)$(ITCL_VERSION)$${add}g.dll]]}\ {>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo ^ ^ ^ ^ package ifneeded Itcl $(ITCL_DOTVERSION) [list load\ [file join $$dir $(PROJECT)$(ITCL_VERSION)$${add}g.dll]\ Itcl]>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo } else {>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo ^ ^ ^ ^ package ifneeded Itcl $(ITCL_DOTVERSION) [list load\ [file join $$dir $(PROJECT)$(ITCL_VERSION)$${add}.dll]\ Itcl]>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo }>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" echo unset add>> "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" !if $(STATIC_BUILD) test : @echo test target not supported for a static library. !else test : setup $(ITCLLIB) $(ITCLSTUBLIB) $(TCLSH) ..\tests\all.tcl $(TESTFLAGS) -loadfile << set env(ITCL_LIBRARY) [file normalize [file join $(MAKEDIR:\=/) .. library]] load [file normalize [file join $(MAKEDIR:\=/) $(ITCLLIB:\=/)]] << !endif #--------------------------------------------------------------------- # Regenerate the stubs files. #--------------------------------------------------------------------- genstubs: !if $(TCLINSTALL) @echo Need the source distribution to regenerate the Stubs table. !else $(TCLSH) $(TOOLSDIR)\genStubs.tcl $(GENERICDIR) \ $(GENERICDIR)\$(PROJECT).decls $(GENERICDIR)\$(PROJECT)Int.decls !endif #--------------------------------------------------------------------- # Generate the source dependencies. #--------------------------------------------------------------------- depend: !if !exist($(TCLSH)) @echo Build tclsh first! !else $(TCLSH) $(TCLTOOLSDIR)\mkdepend.tcl -vc32 -out:"$(OUT_DIR)\depend.mk" \ -passthru:"-DBUILD_itcl $(ITCL_INCLUDES) $(TCL_INCLUDES)" $(GENERICDIR),$$(GENERICDIR) \ $(WINDIR),$$(WINDIR) @<< $(ITCLOBJS) << !endif #--------------------------------------------------------------------- # Dependency rules #--------------------------------------------------------------------- !if exist("$(OUT_DIR)\depend.mk") !include "$(OUT_DIR)\depend.mk" !message *** Dependency rules in use. !else !message *** Dependency rules are not being used. !endif ### add a spacer in the output !message #--------------------------------------------------------------------- # Special case object file targets #--------------------------------------------------------------------- # The following object is part of the stub library and should not # be built as DLL objects but none of the symbols should be exported # and without reference to any specific C-runtime. $(TMP_DIR)\itclStubLib.obj : $(GENERICDIR)\itclStubLib.c $(cc32) -DSTATIC_BUILD $(ITCL_STUB_CFLAGS) -Zl -Fo$@ $? #--------------------------------------------------------------------- # Inference rules. Use batch-mode when supported. #--------------------------------------------------------------------- {$(WINDIR)}.c{$(TMP_DIR)}.obj :: $(cc32) $(ITCL_CFLAGS) -Fo$(TMP_DIR)\ @<< $< << {$(GENERICDIR)}.c{$(TMP_DIR)}.obj :: $(cc32) $(ITCL_CFLAGS) -Fo$(TMP_DIR)\ @<< $< << {$(RCDIR)}.rc{$(TMP_DIR)}.res : $(rc32) -fo $@ -d DEBUG=$(DEBUG) -d UNCHECKED=$(UNCHECKED) \ $(ITCL_INCLUDES) $(TCL_INCLUDES) $(ITCL_DEFINES) $< #--------------------------------------------------------------------- # Generate the windows help files. #--------------------------------------------------------------------- HLPBASE = $(PROJECT)$(ITCL_VERSION) HELPFILE = $(OUT_DIR)\$(HLPBASE).hlp HELPCNT = $(OUT_DIR)\$(HLPBASE).cnt DOCTMP_DIR = $(OUT_DIR)\$(PROJECT)_docs HELPRTF = $(DOCTMP_DIR)\$(PROJECT).rtf MAN2HELP = $(DOCTMP_DIR)\man2help.tcl MAN2HELP2 = $(DOCTMP_DIR)\man2help2.tcl INDEX = $(DOCTMP_DIR)\index.tcl BMP = $(DOCTMP_DIR)\toaster.bmp BMP_NOPATH = toaster.bmp MAN2TCL = $(DOCTMP_DIR)\man2tcl.exe winhelp: docsetup $(HELPFILE) docsetup: @if not exist $(DOCTMP_DIR)\nul mkdir $(DOCTMP_DIR) $(MAN2HELP) $(MAN2HELP2) $(INDEX): $(TCLTOOLSDIR)\$$(@F) copy $(TCLTOOLSDIR)\$(@F) $(@D) $(BMP): copy $(WINDIR)\$(@F) $(@D) $(HELPFILE): $(HELPRTF) $(BMP) cd $(DOCTMP_DIR) start /wait hcrtf.exe -x <<$(PROJECT).hpj [OPTIONS] COMPRESS=12 Hall Zeck LCID=0x409 0x0 0x0 ; English (United States) TITLE=[Incr Tcl] Reference Manual BMROOT=. CNT=$(@B).cnt HLP=$(@B).hlp [FILES] $(PROJECT).rtf [WINDOWS] main="[Incr Tcl] Reference Manual",,27648,(r15263976),(r65280) [CONFIG] BrowseButtons() CreateButton(1, "Web", ExecFile("http://www.tcl.tk")) CreateButton(2, "SF", ExecFile("http://sf.net/projects/incrtcl")) CreateButton(3, "Wiki", ExecFile("http://wiki.tcl.tk")) CreateButton(4, "FAQ", ExecFile("http://www.purl.org/NET/Tcl-FAQ/")) << cd $(MAKEDIR) copy "$(DOCTMP_DIR)\$(@B).hlp" "$(OUT_DIR)" copy "$(DOCTMP_DIR)\$(@B).cnt" "$(OUT_DIR)" $(MAN2TCL): $(TCLTOOLSDIR)\$$(@B).c $(cc32) -nologo -G4 -ML -O2 -Fo$(@D)\ $(TCLTOOLSDIR)\$(@B).c -link -out:$@ $(HELPRTF): $(MAN2TCL) $(MAN2HELP) $(MAN2HELP2) $(INDEX) $(TCLSH) $(MAN2HELP) -bitmap $(BMP_NOPATH) $(PROJECT) $(ITCL_VERSION) $(DOCDIR:\=/) install-docs: !if exist($(HELPFILE)) @xcopy /i /y "$(HELPFILE)" "$(DOC_INSTALL_DIR)\" @xcopy /i /y "$(HELPCNT)" "$(DOC_INSTALL_DIR)\" $(TCLSH) << puts "Installing $(PROJECT)'s helpfile contents into Tcl's ..." set f [open {$(DOC_INSTALL_DIR:\=/)/tcl$(TCL_VERSION).cnt} r] while {![eof $$f]} { if {[regexp {:Include $(PROJECT)([0-9]{2}).cnt} [gets $$f] dummy ver]} { if {$$ver == $(ITCL_VERSION)} { puts "Already installed." exit } else { # do something here logical to remove (or replace) it. puts "$$ver != $(ITCL_VERSION), unfinished code path, die, die!" exit 1 } } } close $$f set f [open {$(DOC_INSTALL_DIR:\=/)/tcl$(TCL_VERSION).cnt} a] puts $$f {:Include $(HLPBASE).cnt} close $$f << start /wait winhlp32 -g $(DOC_INSTALL_DIR)\tcl$(TCL_VERSION).hlp !endif #--------------------------------------------------------------------- # Clean up #--------------------------------------------------------------------- tidy : -del $(TMP_DIR)\*.pch -del $(TMP_DIR)\*.obj -del $(TMP_DIR)\*.res clean : tidy -del $(OUT_DIR)\*.exp -del $(OUT_DIR)\*.lib -del $(OUT_DIR)\*.dll hose : clean -rmdir $(OUT_DIR) -rmdir $(TMP_DIR)