diff options
-rw-r--r-- | win/.cvsignore | 1 | ||||
-rwxr-xr-x | win/buildall.vc.bat | 9 | ||||
-rw-r--r-- | win/coffbase.txt | 4 | ||||
-rw-r--r-- | win/makefile.vc | 311 | ||||
-rw-r--r-- | win/nmakehlp.c | 297 | ||||
-rw-r--r-- | win/rules.vc | 58 |
6 files changed, 513 insertions, 167 deletions
diff --git a/win/.cvsignore b/win/.cvsignore index b981097..b986cda 100644 --- a/win/.cvsignore +++ b/win/.cvsignore @@ -11,4 +11,5 @@ Release Makefile tcl.hpj tclConfig.sh +nmakehlp.exe .#* diff --git a/win/buildall.vc.bat b/win/buildall.vc.bat index 74c6e29..c7709f5 100755 --- a/win/buildall.vc.bat +++ b/win/buildall.vc.bat @@ -4,13 +4,13 @@ :: edit this (or make your own) for your needs and wants using :: the instructions for calling makefile.vc found in makefile.vc :: -:: RCS: @(#) $Id: buildall.vc.bat,v 1.3 2002/02/20 19:06:53 davygrvy Exp $ +:: RCS: @(#) $Id: buildall.vc.bat,v 1.4 2002/03/27 21:15:43 davygrvy Exp $ -echo Sit back and have a couple cups of coffee while this grinds through ;) +echo Sit back and have a cup of coffee while this grinds through ;) echo You asked for *everything*, remember? echo. -if "%MSVCDir%" == "" call C:\progra~1\micros~4\vc98\bin\vcvars32.bat +if "%MSVCDir%" == "" call C:\dev\devstudio60\vc98\bin\vcvars32.bat set INSTALLDIR=C:\progra~1\tcl nmake -nologo -f makefile.vc release winhelp OPTS=none @@ -28,7 +28,8 @@ if errorlevel 1 goto error goto end :error -echo **BOOM!** +echo *** BOOM! *** :end +echo done! pause diff --git a/win/coffbase.txt b/win/coffbase.txt index 3a86392..3ab33ff 100644 --- a/win/coffbase.txt +++ b/win/coffbase.txt @@ -10,9 +10,9 @@ ; the /headers option to get the "size of image" data (already in hex). If the ; maximum size is too small a linker warning will occur. Modules can overlap when ; they're mutually exclusive. This info is placed in the DLL's PE header by the -; linker when the `-base:@$(TCLDIR)\win\coffbase.txt,XXX` option is used. +; linker with the `-base:@$(TCLDIR)\win\coffbase.txt,<key>` option. ; -; RCS: @(#) $Id: coffbase.txt,v 1.3 2002/02/22 03:29:05 davygrvy Exp $ +; RCS: @(#) $Id: coffbase.txt,v 1.4 2002/03/27 21:15:43 davygrvy Exp $ tcl 0x10000000 0x00200000 tcldde 0x10200000 0x00010000 diff --git a/win/makefile.vc b/win/makefile.vc index ed5bd31..d552759 100644 --- a/win/makefile.vc +++ b/win/makefile.vc @@ -9,10 +9,10 @@ # Copyright (c) 1995-1996 Sun Microsystems, Inc. # Copyright (c) 1998-2000 Ajuba Solutions. # Copyright (c) 2001 ActiveState Corporation. -# Copyright (c) 2001 Tomasoft Engineering. +# Copyright (c) 2001-2002 David Gravereaux. # #------------------------------------------------------------------------------ -# RCS: @(#) $Id: makefile.vc,v 1.83 2002/02/21 22:00:58 davygrvy Exp $ +# RCS: @(#) $Id: makefile.vc,v 1.84 2002/03/27 21:15:43 davygrvy Exp $ #------------------------------------------------------------------------------ !if "$(MSVCDIR)" == "" @@ -40,28 +40,31 @@ the environment. Jump to this line to read the new instructions. # the 64-bit compiler, if your SDK has it. # # 3) Targets are: -# release -- builds the core, the shell and the dlls. (default) -# dlls -- just builds the windows extensions and the 16-bit DOS -# pipe/thunk driver. +# release -- Builds the core, the shell and the dlls. (default) +# dlls -- Just builds the windows extensions and the 16-bit DOS +# pipe/thunk helper app. # shell -- Just builds the shell and the core. -# core -- Only builds the core. -# all -- builds everything. -# test -- builds and runs the test suite. -# tcltest -- just builds the binaries for the test suite. -# install -- installs the built binaries and libraries to $(INSTALLDIR) +# core -- Only builds the core [tclXX.(dll|lib)]. +# all -- Builds everything. +# test -- Builds and runs the test suite. +# tcltest -- Just builds the test shell. +# install -- Installs the built binaries and libraries to $(INSTALLDIR) # as the root of the install tree. -# plugin -- [currently out-dated]. -# clean -- removes the contents of $(TMP_DIR) and $(OUT_DIR) -# genstubs -- rebuilds the Stubs table and support files (dev only). -# winhelp -- builds the windows .hlp file for Tcl from the troff man -# files. +# tidy/clean/hose -- varying levels of cleaning. +# genstubs -- Rebuilds the Stubs table and support files (dev only). +# depend -- Generates an accurate set of source dependancies for this +# makefile. Helpful to avoid problems when the sources are +# refreshed and you rebuild, but can "overbuild" when common +# headers like tclInt.h just get small changes. +# winhelp -- Builds the windows .hlp file for Tcl from the troff man +# files found in $(ROOT)\doc . # # 4) Macros usable on the commandline: # INSTALLDIR=<path> # Sets where to install Tcl from the built binaries. # C:\Progra~1\Tcl is assumed when not specified. # -# OPTS=static,msvcrt,linkexten,threads,symbols,profile,none +# OPTS=static,msvcrt,linkexten,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. @@ -144,7 +147,7 @@ the environment. Jump to this line to read the new instructions. MSG = ^ You must run this makefile only from the directory it is in.^ Please `cd` to its location first. -!error $(MSG) +!error $(MSG) !endif PROJECT = tcl @@ -176,11 +179,11 @@ TCLSH = $(OUT_DIR)\$(TCLSHNAME) TCLPIPEDLLNAME = $(PROJECT)pip$(VERSION).dll TCLPIPEDLL = $(OUT_DIR)\$(TCLPIPEDLLNAME) -TCLREGDLLNAME = $(PROJECT)reg$(REGVERSION)$(SUFX:t=).$(EXT) -TCLREGDLL = $(OUT_DIR)\$(TCLREGDLLNAME) +TCLREGLIBNAME = $(PROJECT)reg$(REGVERSION)$(SUFX:t=).$(EXT) +TCLREGLIB = $(OUT_DIR)\$(TCLREGLIBNAME) -TCLDDEDLLNAME = $(PROJECT)dde$(DDEVERSION)$(SUFX:t=).$(EXT) -TCLDDEDLL = $(OUT_DIR)\$(TCLDDEDLLNAME) +TCLDDELIBNAME = $(PROJECT)dde$(DDEVERSION)$(SUFX:t=).$(EXT) +TCLDDELIB = $(OUT_DIR)\$(TCLDDELIBNAME) TCLHLPBASE = $(PROJECT)$(VERSION) TCLHLP = $(OUT_DIR)\$(TCLHLPBASE).hlp @@ -211,6 +214,10 @@ TCLTESTOBJS = \ $(TMP_DIR)\tclTestProcBodyObj.obj \ $(TMP_DIR)\tclThreadTest.obj \ $(TMP_DIR)\tclWinTest.obj \ +!if $(TCL_LINKWITHEXTENSIONS) + $(TMP_DIR)\tclWinReg.obj \ + $(TMP_DIR)\tclWinDde.obj \ +!endif $(TMP_DIR)\testMain.obj TCLOBJS = \ @@ -300,6 +307,7 @@ TCLOBJS = \ TCLSTUBOBJS = $(TMP_DIR)\tclStubLib.obj +### The following paths CANNOT have spaces in them. COMPATDIR = $(ROOT)\compat GENERICDIR = $(ROOT)\generic TOOLSDIR = $(ROOT)\tools @@ -321,7 +329,7 @@ cdebug = -O2 -Op -Gs cdebug = !endif !else if "$(MACHINE)" == "IA64" -# Warnings are too many to support warnings into errors. +# Warnings are too many, can't support warnings into errors. cdebug = -Z7 -Od !else cdebug = -Z7 -WX -Od @@ -418,10 +426,8 @@ test: setup $(TCLTEST) dlls $(CAT32) !endif setup: - @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) &\ - echo *** Created directory '$(OUT_DIR)' - @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) &\ - echo *** Created directory '$(TMP_DIR)' + @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) + @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) !if !$(STATIC_BUILD) $(TCLIMPLIB): $(TCLLIB) @@ -433,159 +439,121 @@ $(TCLLIB): $(TCLOBJS) $** << !else - $(link32) $(dlllflags) -base:@$(WINDIR)\coffbase.txt,tcl -out:$@ $(baselibs) @<< + $(link32) $(dlllflags) -base:@$(WINDIR)\coffbase.txt,tcl -out:$@ \ + $(baselibs) @<< $** << -@del $*.exp !endif - $(TCLSTUBLIB): $(TCLSTUBOBJS) $(lib32) -nologo -out:$@ $(TCLSTUBOBJS) $(TCLSH): $(TCLSHOBJS) $(TCLIMPLIB) - $(link32) $(conlflags) -stack:2300000 -out:$@ $(baselibs) @<< -$** -<< - + $(link32) $(conlflags) -stack:2300000 -out:$@ $(baselibs) $** $(TCLTEST): $(TCLTESTOBJS) $(TCLIMPLIB) - $(link32) $(conlflags) -stack:2300000 -out:$@ $(baselibs) @<< -$** -<< - + $(link32) $(conlflags) -stack:2300000 -out:$@ $(baselibs) $** $(TCLPIPEDLL): $(WINDIR)\stub16.c $(cc32) $(CON_CFLAGS) -Fo$(TMP_DIR)\ $(WINDIR)\stub16.c $(link32) $(conlflags) -out:$@ $(TMP_DIR)\stub16.obj $(baselibs) - !if $(STATIC_BUILD) -$(TCLDDEDLL): $(TMP_DIR)\tclWinDde.obj +$(TCLDDELIB): $(TMP_DIR)\tclWinDde.obj $(lib32) -nologo -out:$@ $(TMP_DIR)\tclWinDde.obj !else -$(TCLDDEDLL): $(TMP_DIR)\tclWinDde.obj $(TCLSTUBLIB) - $(link32) $(dlllflags) -base:@$(WINDIR)\coffbase.txt,tcldde -out:$@ $** $(baselibs) +$(TCLDDELIB): $(TMP_DIR)\tclWinDde.obj $(TCLSTUBLIB) + $(link32) $(dlllflags) -base:@$(WINDIR)\coffbase.txt,tcldde -out:$@ \ + $** $(baselibs) -@del $*.exp -@del $*.lib !endif - !if $(STATIC_BUILD) -$(TCLREGDLL): $(TMP_DIR)\tclWinReg.obj +$(TCLREGLIB): $(TMP_DIR)\tclWinReg.obj $(lib32) -nologo -out:$@ $(TMP_DIR)\tclWinReg.obj !else -$(TCLREGDLL): $(TMP_DIR)\tclWinReg.obj $(TCLSTUBLIB) - $(link32) $(dlllflags) -base:@$(WINDIR)\coffbase.txt,tclreg -out:$@ $** $(baselibs) +$(TCLREGLIB): $(TMP_DIR)\tclWinReg.obj $(TCLSTUBLIB) + $(link32) $(dlllflags) -base:@$(WINDIR)\coffbase.txt,tclreg -out:$@ \ + $** $(baselibs) -@del $*.exp -@del $*.lib !endif - $(CAT32): $(WINDIR)\cat.c $(cc32) $(CON_CFLAGS) -Fo$(TMP_DIR)\ $? $(link32) $(conlflags) -out:$@ -stack:16384 $(TMP_DIR)\cat.obj \ $(baselibs) -install-binaries: - @echo installing $(TCLLIBNAME) -!if "$(TCLLIB)" != "$(TCLIMPLIB)" - @xcopy /i /y "$(TCLLIB)" "$(BIN_INSTALL_DIR)\" -!endif - @xcopy /i /y "$(TCLIMPLIB)" "$(LIB_INSTALL_DIR)\" -!if exist($(TCLSH)) - @echo installing $(TCLSHNAME) - @xcopy /i /y "$(TCLSH)" "$(BIN_INSTALL_DIR)\" -!endif -!if exist($(TCLPIPEDLL)) - @echo installing $(TCLPIPEDLLNAME) - @xcopy /i /y "$(TCLPIPEDLL)" "$(BIN_INSTALL_DIR)\" -!endif - @echo installing $(TCLSTUBLIBNAME) - @xcopy /i /y "$(TCLSTUBLIB)" "$(LIB_INSTALL_DIR)\" -!if exist($(TCLHLP)) - @xcopy /i /y "$(TCLHLP)" "$(DOC_INSTALL_DIR)\" - @xcopy /i /y "$(TCLHLPCNT)" "$(DOC_INSTALL_DIR)\" -!endif -install-libraries: - @echo installing http1.0 - @xcopy /i /y "$(ROOT)\library\http1.0\*.tcl" \ - "$(SCRIPT_INSTALL_DIR)\http1.0\" - @echo installing http2.4 - @xcopy /i /y "$(ROOT)\library\http\*.tcl" \ - "$(SCRIPT_INSTALL_DIR)\http2.4\" - @echo installing opt0.4 - @xcopy /i /y "$(ROOT)\library\opt\*.tcl" \ - "$(SCRIPT_INSTALL_DIR)\opt0.4\" - @echo installing msgcat1.2 - @xcopy /i /y "$(ROOT)\library\msgcat\*.tcl" \ - "$(SCRIPT_INSTALL_DIR)\msgcat1.2\" - @echo installing $(TCLDDEDLLNAME) -!if $(STATIC_BUILD) - @xcopy /i /y "$(TCLDDEDLL)" "$(LIB_INSTALL_DIR)\" -!else - @xcopy /i /y "$(TCLDDEDLL)" "$(LIB_INSTALL_DIR)\dde$(DDEDOTVERSION)\" - @xcopy /i /y "$(ROOT)\library\dde\pkgIndex.tcl" \ - "$(LIB_INSTALL_DIR)\dde$(DDEDOTVERSION)\" -!endif - @echo installing $(TCLREGDLLNAME) -!if $(STATIC_BUILD) - @xcopy /i /y "$(TCLREGDLL)" "$(LIB_INSTALL_DIR)\" +#--------------------------------------------------------------------- +# Regenerate the stubs files. [Development use only] +#--------------------------------------------------------------------- + +genstubs: +!if !exist($(TCLSH)) + @echo Build tclsh first! !else - @xcopy /i /y "$(TCLREGDLL)" "$(LIB_INSTALL_DIR)\reg$(REGDOTVERSION)\" - @xcopy /i /y "$(ROOT)\library\reg\pkgIndex.tcl" \ - "$(LIB_INSTALL_DIR)\reg$(REGDOTVERSION)\" + $(TCLSH) $(TOOLSDIR)\genStubs.tcl $(GENERICDIR) \ + $(GENERICDIR)\tcl.decls $(GENERICDIR)\tclInt.decls !endif - @echo installing encoding files - @xcopy /i /y "$(ROOT)\library\encoding\*.enc" \ - "$(SCRIPT_INSTALL_DIR)\encoding\" - @echo installing library files - @xcopy /i /y "$(GENERICDIR)\tcl.h" "$(INCLUDE_INSTALL_DIR)\" - @xcopy /i /y "$(GENERICDIR)\tclDecls.h" "$(INCLUDE_INSTALL_DIR)\" - @xcopy /i /y "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\init.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\ldAout.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\parray.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\safe.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\tclIndex" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\word.tcl" "$(SCRIPT_INSTALL_DIR)\" - @xcopy /i /y "$(ROOT)\library\auto.tcl" "$(SCRIPT_INSTALL_DIR)\" #--------------------------------------------------------------------- -# Regenerate the stubs files. +# Generate the makefile depedancies. #--------------------------------------------------------------------- -genstubs: - tclsh$(VERSION) $(ROOT)\tools\genStubs.tcl $(GENERICDIR) \ - $(GENERICDIR)\tcl.decls $(GENERICDIR)\tclInt.decls +depend: +!if !exist($(TCLSH)) + @echo Build tclsh first! +!else + echo $(TCL_INCLUDES) + $(TCLSH) $(TOOLSDIR)\mkdepend.tcl -vc32 -out:"$(OUT_DIR)\depend.mk" \ + -passthru:"-DBUILD_tcl $(TCL_INCLUDES:"="")" $(GENERICDIR) \ + $(COMPATDIR) $(WINDIR) @<< +$(TCLOBJS) +<< +!endif #--------------------------------------------------------------------- -# Regenerate the windows help files. +# Build the windows help file. #--------------------------------------------------------------------- MAN2TCL = $(TOOLSDIR)\man2tcl -TCLRTF = $(TOOLSDIR)\tcl.rtf +TCLRTF = $(TOOLSDIR)\$(PROJECT).rtf MAN2HELP = $(TOOLSDIR)\man2help.tcl -TCLHPJ = $(TOOLSDIR)\tcl.hpj winhelp: $(TCLHLP) $(TCLHLP): $(TCLRTF) cd $(TOOLSDIR) - start /wait hcrtf.exe -x tcl.hpj + start /wait hcrtf.exe -x <<$(PROJECT).hpj +[OPTIONS] +COMPRESS=12 Hall Zeck +LCID=0x409 0x0 0x0 ; English (United States) +TITLE=Tcl/Tk Reference Manual +CNT=$(TCLHLPBASE).cnt +HLP=$(TCLHLPBASE).hlp + +[FILES] +$(PROJECT).rtf + +[WINDOWS] +main="Tcl/Tk Reference Manual",,0 + +[CONFIG] +BrowseButtons() +CreateButton(1, "Main Web Site", ExecFile("http://www.tcl.tk")) +CreateButton(2, "Sourceforge", ExecFile("http://sf.net/projects/tcl")) +CreateButton(3, "Wiki", ExecFile("http://wiki.tcl.tk")) +<< cd $(MAKEDIR) copy $(TOOLSDIR)\$(TCLHLPBASE).hlp $(OUT_DIR) copy $(TOOLSDIR)\$(TCLHLPBASE).cnt $(OUT_DIR) -$(TCLHPJ): $(TCLHPJ).in - copy $(TCLHPJ).in $(TCLHPJ) - -$(MAN2TCL).exe: $(MAN2TCL).obj +$(MAN2TCL).exe: cd $(TOOLSDIR) $(cc32) -nologo -G4 -ML -O2 $(MAN2TCL).c cd $(MAKEDIR) @@ -623,7 +591,7 @@ $(TMP_DIR)\tclAppInit.obj: $(WINDIR)\tclAppInit.c $(cc32) $(TCL_CFLAGS) -Fo$@ $? !endif -# The following objects should be built using the stub interfaces +### The following objects should be built using the stub interfaces $(TMP_DIR)\tclWinReg.obj: $(WINDIR)\tclWinReg.c !if $(STATIC_BUILD) @@ -641,8 +609,8 @@ $(TMP_DIR)\tclWinDde.obj: $(WINDIR)\tclWinDde.c !endif -# The following objects are part of the stub library and should not -# be built as DLL objects but none of the symbols should be exported +### The following objects are part of the stub library and should not +### be built as DLL objects but none of the symbols should be exported $(TMP_DIR)\tclStubLib.obj: $(GENERICDIR)\tclStubLib.c $(cc32) $(cdebug) $(cflags) -Zl -DSTATIC_BUILD $(TCL_INCLUDES) -Fo$@ $? @@ -671,6 +639,16 @@ $(GENERICDIR)\regfree.c: $(GENERICDIR)\regguts.h $(GENERICDIR)\regfronts.c: $(GENERICDIR)\regguts.h $(GENERICDIR)\regguts.h: $(GENERICDIR)\regcustom.h +!if exist("$(OUT_DIR)\depend.mk") +!include "$(OUT_DIR)\depend.mk" +!message *** Dependency rules in effect. +!else +!message *** Dependency rules are not being used. +!endif + +### add a spacer in the output +!message + #--------------------------------------------------------------------- # Implicit rules @@ -692,7 +670,7 @@ $< << {$(WINDIR)}.rc{$(TMP_DIR)}.res: - $(rc32) -fo $@ -r -i $(GENERICDIR) -D__WIN32__ \ + $(rc32) -fo $@ -r -i "$(GENERICDIR)" -D__WIN32__ \ !if $(DEBUG) -d DEBUG \ !endif @@ -704,6 +682,81 @@ $< !endif $< +.SUFFIXES: +.SUFFIXES:.c .rc + + +#--------------------------------------------------------------------- +# Installation. +#--------------------------------------------------------------------- + +install-binaries: + @echo installing $(TCLLIBNAME) +!if "$(TCLLIB)" != "$(TCLIMPLIB)" + @xcopy /i /y "$(TCLLIB)" "$(BIN_INSTALL_DIR)\" +!endif + @xcopy /i /y "$(TCLIMPLIB)" "$(LIB_INSTALL_DIR)\" +!if exist($(TCLSH)) + @echo installing $(TCLSHNAME) + @xcopy /i /y "$(TCLSH)" "$(BIN_INSTALL_DIR)\" +!endif +!if exist($(TCLPIPEDLL)) + @echo installing $(TCLPIPEDLLNAME) + @xcopy /i /y "$(TCLPIPEDLL)" "$(BIN_INSTALL_DIR)\" +!endif + @echo installing $(TCLSTUBLIBNAME) + @xcopy /i /y "$(TCLSTUBLIB)" "$(LIB_INSTALL_DIR)\" +!if exist($(TCLHLP)) + @xcopy /i /y "$(TCLHLP)" "$(DOC_INSTALL_DIR)\" + @xcopy /i /y "$(TCLHLPCNT)" "$(DOC_INSTALL_DIR)\" +!endif + +install-libraries: + @echo installing http1.0 + @xcopy /i /y "$(ROOT)\library\http1.0\*.tcl" \ + "$(SCRIPT_INSTALL_DIR)\http1.0\" + @echo installing http2.4 + @xcopy /i /y "$(ROOT)\library\http\*.tcl" \ + "$(SCRIPT_INSTALL_DIR)\http2.4\" + @echo installing opt0.4 + @xcopy /i /y "$(ROOT)\library\opt\*.tcl" \ + "$(SCRIPT_INSTALL_DIR)\opt0.4\" + @echo installing msgcat1.2 + @xcopy /i /y "$(ROOT)\library\msgcat\*.tcl" \ + "$(SCRIPT_INSTALL_DIR)\msgcat1.2\" + @echo installing $(TCLDDELIBNAME) +!if $(STATIC_BUILD) + @xcopy /i /y "$(TCLDDELIB)" "$(LIB_INSTALL_DIR)\" +!else + @xcopy /i /y "$(TCLDDELIB)" "$(LIB_INSTALL_DIR)\dde$(DDEDOTVERSION)\" + @xcopy /i /y "$(ROOT)\library\dde\pkgIndex.tcl" \ + "$(LIB_INSTALL_DIR)\dde$(DDEDOTVERSION)\" +!endif + @echo installing $(TCLREGLIBNAME) +!if $(STATIC_BUILD) + @xcopy /i /y "$(TCLREGLIB)" "$(LIB_INSTALL_DIR)\" +!else + @xcopy /i /y "$(TCLREGLIB)" "$(LIB_INSTALL_DIR)\reg$(REGDOTVERSION)\" + @xcopy /i /y "$(ROOT)\library\reg\pkgIndex.tcl" \ + "$(LIB_INSTALL_DIR)\reg$(REGDOTVERSION)\" +!endif + @echo installing encoding files + @xcopy /i /y "$(ROOT)\library\encoding\*.enc" \ + "$(SCRIPT_INSTALL_DIR)\encoding\" + @echo installing library files + @xcopy /i /y "$(GENERICDIR)\tcl.h" "$(INCLUDE_INSTALL_DIR)\" + @xcopy /i /y "$(GENERICDIR)\tclDecls.h" "$(INCLUDE_INSTALL_DIR)\" + @xcopy /i /y "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\init.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\ldAout.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\parray.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\safe.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\tclIndex" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\word.tcl" "$(SCRIPT_INSTALL_DIR)\" + @xcopy /i /y "$(ROOT)\library\auto.tcl" "$(SCRIPT_INSTALL_DIR)\" + #--------------------------------------------------------------------- # Clean up @@ -713,15 +766,11 @@ tidy: -del $(TCLLIB) -del $(TCLSH) -del $(TCLTEST) - -del $(TCLDDEDLL) - -del $(TCLREGDLL) + -del $(TCLDDELIB) + -del $(TCLREGLIB) -clean: +clean: tidy -@$(RMDIR) $(TMP_DIR) hose: clean -@$(RMDIR) $(OUT_DIR) - - -.SUFFIXES: -.SUFFIXES:.c .rc diff --git a/win/nmakehlp.c b/win/nmakehlp.c new file mode 100644 index 0000000..4906303 --- /dev/null +++ b/win/nmakehlp.c @@ -0,0 +1,297 @@ +/* ---------------------------------------------------------------------------- + * nmakehlp.c -- + * + * This is used to fix limitations within nmake and the environment. + * + * Copyright (c) 2002 by David Gravereaux. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * ---------------------------------------------------------------------------- + * RCS: @(#) $Id: nmakehlp.c,v 1.1 2002/03/27 21:15:43 davygrvy Exp $ + * ---------------------------------------------------------------------------- + */ +#include <windows.h> +#pragma comment (lib, "user32.lib") +#pragma comment (lib, "kernel32.lib") + +/* protos */ +int CheckForCompilerFeature (const char *option); +int CheckForLinkerFeature (const char *option); +int IsIn (const char *string, const char *substring); +DWORD WINAPI ReadFromPipe (LPVOID args); + +/* globals */ +typedef struct { + HANDLE pipe; + char buffer[1000]; +} pipeinfo; + +pipeinfo Out = {INVALID_HANDLE_VALUE, '\0'}; +pipeinfo Err = {INVALID_HANDLE_VALUE, '\0'}; + + + +/* exitcodes: 0 == no, 1 == yes, 2 == error */ +int +main (int argc, char *argv[]) +{ + char msg[300]; + DWORD dwWritten; + int chars; + + if (argc > 1 && *argv[1] == '-') { + switch (*(argv[1]+1)) { + case 'c': + if (argc != 3) { + chars = wsprintf(msg, "usage: %s -c <compiler option>\n" + "Tests for whether cl.exe supports an option\n" + "exitcodes: 0 == no, 1 == yes, 2 == error\n", argv[0]); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, chars, &dwWritten, NULL); + return 2; + } + return CheckForCompilerFeature(argv[2]); + case 'l': + if (argc != 3) { + chars = wsprintf(msg, "usage: %s -l <linker option>\n" + "Tests for whether link.exe supports an option\n" + "exitcodes: 0 == no, 1 == yes, 2 == error\n", argv[0]); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, chars, &dwWritten, NULL); + return 2; + } + return CheckForLinkerFeature(argv[2]); + case 'f': + if (argc == 2) { + chars = wsprintf(msg, "usage: %s -f <string> <substring>\n" + "Find a substring within another\n" + "exitcodes: 0 == no, 1 == yes, 2 == error\n", argv[0]); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, chars, &dwWritten, NULL); + return 2; + } else if (argc == 3) { + /* if the string is blank, there is no match */ + return 0; + } else { + return IsIn(argv[2], argv[3]); + } + } + } + chars = wsprintf(msg, "usage: %s -c|-l|-f ...\n" + "This is a little helper app to equalize shell differences between WinNT and\n" + "Win9x and get nmake.exe to accomplish its job.\n", + argv[0]); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, chars, &dwWritten, NULL); + return 2; +} + +int +CheckForCompilerFeature (const char *option) +{ + STARTUPINFO si; + PROCESS_INFORMATION pi; + SECURITY_ATTRIBUTES sa; + DWORD threadID; + char msg[300]; + BOOL ok; + HANDLE hProcess, h, pipeThreads[2]; + char cmdline[100]; + + hProcess = GetCurrentProcess(); + + ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = INVALID_HANDLE_VALUE; + + ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = FALSE; + + /* create a non-inheritible pipe. */ + CreatePipe(&Out.pipe, &h, &sa, 0); + + /* dupe the write side, make it inheritible, and close the original. */ + DuplicateHandle(hProcess, h, hProcess, &si.hStdOutput, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + + /* Same as above, but for the error side. */ + CreatePipe(&Err.pipe, &h, &sa, 0); + DuplicateHandle(hProcess, h, hProcess, &si.hStdError, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + + /* base command line */ + strcpy(cmdline, "cl.exe -nologo -c -TC -Fdtemp "); + /* append our option for testing */ + strcat(cmdline, option); + /* filename to compile, which exists, but is nothing and empty. */ + strcat(cmdline, " nul"); + + ok = CreateProcess( + NULL, /* Module name. */ + cmdline, /* Command line. */ + NULL, /* Process handle not inheritable. */ + NULL, /* Thread handle not inheritable. */ + TRUE, /* yes, inherit handles. */ + DETACHED_PROCESS, /* No console for you. */ + NULL, /* Use parent's environment block. */ + NULL, /* Use parent's starting directory. */ + &si, /* Pointer to STARTUPINFO structure. */ + &pi); /* Pointer to PROCESS_INFORMATION structure. */ + + if (!ok) { + DWORD err = GetLastError(); + int chars = wsprintf(msg, "Tried to launch: \"%s\", but got error [%u]: ", cmdline, err); + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0, (LPVOID) &msg[chars], + (300-chars), 0); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, strlen(msg), &err, NULL); + return 2; + } + + /* close our references to the write handles that have now been inherited. */ + CloseHandle(si.hStdOutput); + CloseHandle(si.hStdError); + + WaitForInputIdle(pi.hProcess, 5000); + CloseHandle(pi.hThread); + + /* start the pipe reader threads. */ + pipeThreads[0] = CreateThread(NULL, 0, ReadFromPipe, &Out, 0, &threadID); + pipeThreads[1] = CreateThread(NULL, 0, ReadFromPipe, &Err, 0, &threadID); + + /* block waiting for the process to end. */ + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + + /* clean up temporary files before returning */ + DeleteFile("temp.idb"); + DeleteFile("temp.pdb"); + + /* wait for our pipe to get done reading, should it be a little slow. */ + WaitForMultipleObjects(2, pipeThreads, TRUE, 500); + CloseHandle(pipeThreads[0]); + CloseHandle(pipeThreads[1]); + + /* look for the commandline warning code in both streams. */ + return !(strstr(Out.buffer, "D4002") != NULL || strstr(Err.buffer, "D4002") != NULL); +} + +int +CheckForLinkerFeature (const char *option) +{ + STARTUPINFO si; + PROCESS_INFORMATION pi; + SECURITY_ATTRIBUTES sa; + DWORD threadID; + char msg[300]; + BOOL ok; + HANDLE hProcess, h, pipeThreads[2]; + char cmdline[100]; + + hProcess = GetCurrentProcess(); + + ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = INVALID_HANDLE_VALUE; + + ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + /* create a non-inheritible pipe. */ + CreatePipe(&Out.pipe, &h, &sa, 0); + + /* dupe the write side, make it inheritible, and close the original. */ + DuplicateHandle(hProcess, h, hProcess, &si.hStdOutput, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + + /* Same as above, but for the error side. */ + CreatePipe(&Err.pipe, &h, &sa, 0); + DuplicateHandle(hProcess, h, hProcess, &si.hStdError, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + + /* base command line */ + strcpy(cmdline, "link.exe -nologo "); + /* append our option for testing */ + strcat(cmdline, option); + /* filename to compile, which exists, but is nothing and empty. */ +// strcat(cmdline, " nul"); + + ok = CreateProcess( + NULL, /* Module name. */ + cmdline, /* Command line. */ + NULL, /* Process handle not inheritable. */ + NULL, /* Thread handle not inheritable. */ + TRUE, /* yes, inherit handles. */ + DETACHED_PROCESS, /* No console for you. */ + NULL, /* Use parent's environment block. */ + NULL, /* Use parent's starting directory. */ + &si, /* Pointer to STARTUPINFO structure. */ + &pi); /* Pointer to PROCESS_INFORMATION structure. */ + + if (!ok) { + DWORD err = GetLastError(); + int chars = wsprintf(msg, "Tried to launch: \"%s\", but got error [%u]: ", cmdline, err); + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0, (LPVOID) &msg[chars], + (300-chars), 0); + WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, strlen(msg), &err, NULL); + return 2; + } + + /* close our references to the write handles that have now been inherited. */ + CloseHandle(si.hStdOutput); + CloseHandle(si.hStdError); + + WaitForInputIdle(pi.hProcess, 5000); + CloseHandle(pi.hThread); + + /* start the pipe reader threads. */ + pipeThreads[0] = CreateThread(NULL, 0, ReadFromPipe, &Out, 0, &threadID); + pipeThreads[1] = CreateThread(NULL, 0, ReadFromPipe, &Err, 0, &threadID); + + /* block waiting for the process to end. */ + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + + /* wait for our pipe to get done reading, should it be a little slow. */ + WaitForMultipleObjects(2, pipeThreads, TRUE, 500); + CloseHandle(pipeThreads[0]); + CloseHandle(pipeThreads[1]); + + /* look for the commandline warning code in the stderr stream. */ + return !(strstr(Out.buffer, "LNK1117") != NULL || strstr(Err.buffer, "LNK1117") != NULL); +} + +DWORD WINAPI +ReadFromPipe (LPVOID args) +{ + pipeinfo *pi = (pipeinfo *) args; + char *lastBuf = pi->buffer; + DWORD dwRead; + BOOL ok; + +again: + ok = ReadFile(pi->pipe, lastBuf, 25, &dwRead, 0L); + if (!ok || dwRead == 0) { + CloseHandle(pi->pipe); + return 0; + } + lastBuf += dwRead; + goto again; + + return 0; /* makes the compiler happy */ +} + +int +IsIn (const char *string, const char *substring) +{ + return (strstr(string, substring) != NULL); +} diff --git a/win/rules.vc b/win/rules.vc index 00e4255..1c0db8e 100644 --- a/win/rules.vc +++ b/win/rules.vc @@ -7,10 +7,10 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# Copyright (c) 2001 Tomasoft Engineering. +# Copyright (c) 2001-2002 David Gravereaux. # #------------------------------------------------------------------------------ -# RCS: @(#) $Id: rules.vc,v 1.6 2002/02/21 18:37:27 davygrvy Exp $ +# RCS: @(#) $Id: rules.vc,v 1.7 2002/03/27 21:15:43 davygrvy Exp $ #------------------------------------------------------------------------------ !ifndef _RULES_VC @@ -31,19 +31,22 @@ MACHINE = IX86 !message =============================================================================== - #---------------------------------------------------------- -# Test for compiler features +# build the helper app we need to overcome nmake's limiting +# environment. #---------------------------------------------------------- -### Just display the compiler and linker versions to the output -!if [$(cc32) 2>&1 | find "(R)"] +!if !exist(nmakehlp.exe) +!if [$(cc32) -nologo -ML nmakehlp.c -link -subsystem:console > nul] !endif -!if [$(link32) 2>&1 | find "(R)"] !endif +#---------------------------------------------------------- +# Test for compiler features +#---------------------------------------------------------- + ### test for optimizations -!if [$(cc32) -Ox -nologo -c -Zs -TC -Fdtemp nul 2>&1 | find "D4002" > nul] +!if [nmakehlp -c -Ox] !message *** Compiler has 'Optimizations' OPTIMIZING = 1 !else @@ -51,16 +54,17 @@ OPTIMIZING = 1 OPTIMIZING = 0 !endif -### test for pentium errata !if "$(MACHINE)" == "IX86" -!if [$(cc32) -QI0f -nologo -c -Zs -TC -Fdtemp nul 2>&1 | find "D4002" > nul] +### test for pentium errata +!if [nmakehlp -c -QI0f] !message *** Compiler has 'Pentium 0x0f fix' PENT_0F_ERRATA = 1 !else !message *** Compiler doesn't have 'Pentium 0x0f fix' PENT_0F_ERRATA = 0 !endif -!if [$(link32) -nologo -opt:nowin98 2>&1 | find "LNK1117" > nul] +### test for -align:4096, when align:512 will do. +!if [nmakehlp -l -opt:nowin98] !message *** Linker has 'Win98 alignment problem' ALIGN98_HACK = 1 !else @@ -72,9 +76,9 @@ PENT_0F_ERRATA = 0 ALIGN98_HACK = 0 !endif -### test for Itanium errata !if "$(MACHINE)" == "IA64" -!if [$(cc32) -QIA64_Bx -nologo -c -Zs -TC -Fdtemp nul 2>&1 | find "D4002" > nul] +### test for Itanium errata +!if [nmakehlp -c -QIA64_Bx] !message *** Compiler has 'B-stepping errata workarounds' ITAN_B_ERRATA = 1 !else @@ -85,16 +89,11 @@ ITAN_B_ERRATA = 0 ITAN_B_ERRATA = 0 !endif -### Clean-up temp files after tests. -!if [@for %d in (temp.idb temp.pdb) do @if exist %d del %d] -!endif - - #---------------------------------------------------------- # Decode the options requested. #---------------------------------------------------------- -!if "$(OPTS)" == "" || ![echo "$(OPTS)" | find /i "none" > nul] +!if "$(OPTS)" == "" || [nmakehlp -f "$(OPTS)" "none"] STATIC_BUILD = 0 TCL_THREADS = 0 DEBUG = 0 @@ -103,43 +102,43 @@ MSVCRT = 0 LOIMPACT = 0 TCL_LINKWITHEXTENSIONS = 0 !else -!if ![echo $(OPTS) | find /i "static" > nul] +!if [nmakehlp -f $(OPTS) "static"] !message *** Doing static STATIC_BUILD = 1 !else STATIC_BUILD = 0 !endif -!if ![echo $(OPTS) | find /i "msvcrt" > nul] +!if [nmakehlp -f $(OPTS) "msvcrt"] !message *** Doing msvcrt MSVCRT = 1 !else MSVCRT = 0 !endif -!if ![echo $(OPTS) | find /i "linkexten" > nul] +!if [nmakehlp -f $(OPTS) "linkexten"] !message *** Doing linkexten TCL_LINKWITHEXTENSIONS = 1 !else TCL_LINKWITHEXTENSIONS = 0 !endif -!if ![echo $(OPTS) | find /i "threads" > nul] +!if [nmakehlp -f $(OPTS) "threads"] !message *** Doing threads TCL_THREADS = 1 !else TCL_THREADS = 0 !endif -!if ![echo $(OPTS) | find /i "symbols" > nul] +!if [nmakehlp -f $(OPTS) "symbols"] !message *** Doing symbols DEBUG = 1 !else DEBUG = 0 !endif -!if ![echo $(OPTS) | find /i "profile" > nul] +!if [nmakehlp -f $(OPTS) "profile"] !message *** Doing profile PROFILE = 1 !else PROFILE = 0 !endif -!if ![echo $(OPTS) | find /i "loimpact" > nul] +!if [nmakehlp -f $(OPTS) "loimpact"] !message *** Doing loimpact LOIMPACT = 1 !else @@ -213,17 +212,17 @@ OUT_DIR = $(TMP_DIR) # Decode the statistics requested. #---------------------------------------------------------- -!if "$(STATS)" == "" || ![echo "$(STATS)" | find /i "none" > nul] +!if "$(STATS)" == "" || [nmakehlp -f "$(STATS)" "none"] TCL_MEM_DEBUG = 0 TCL_COMPILE_DEBUG = 0 !else -!if ![echo $(STATS) | find /i "memdbg" > nul] +!if [nmakehlp -f $(STATS) "memdbg"] !message *** Doing memdbg TCL_MEM_DEBUG = 1 !else TCL_MEM_DEBUG = 0 !endif -!if ![echo $(STATS) | find /i "compdbg" > nul] +!if [nmakehlp -f $(STATS) "compdbg"] !message *** Doing compdbg TCL_COMPILE_DEBUG = 1 !else @@ -259,6 +258,5 @@ OPTDEFINES = $(OPTDEFINES) -DSTATIC_BUILD !message *** Output directory will be '$(OUT_DIR)' !message *** Suffix for binaries will be '$(SUFX)' !message *** Optional defines are '$(OPTDEFINES)' -!message !endif |