# # Jamfile to build Jam (a make(1)-like program) # # There are no user-serviceable parts in this file. # # Put executables in platform-specific subdirectory. if $(VMS) { LOCATE_TARGET ?= [.binvms] ; } else if $(MAC) { LOCATE_TARGET ?= :bin.mac ; } else { LOCATE_TARGET ?= bin.$(OSFULL[1]:L) ; } if $(BUILD_J) { LOCATE_TARGET = j$(LOCATE_TARGET) ; } # Leave generated source in current directory; it would be nice to use # these lines below to build the source into the platform-specific # directory, but getting scan.c to include the right jambase.h is # hard: with ""'s, it always gets the bootstrap version; with <>'s, # it won't find the bootstrap version. # SEARCH_SOURCE ?= $(LOCATE_TARGET) $(DOT) ; # LOCATE_SOURCE ?= $(LOCATE_TARGET) ; # # We have some different files for UNIX, VMS, and NT. # if $(NT) { code = execunix.c filent.c pathunix.c ; } else if $(MINGW) { code = execunix.c filent.c pathunix.c ; } else if $(OS2) { code = execunix.c fileos2.c pathunix.c ; } else if $(VMS) { code = execvms.c filevms.c pathvms.c ; } else if $(MAC) { code = execmac.c filemac.c pathmac.c ; } else { code = execunix.c fileunix.c pathunix.c ; } # For jam profiling/debugging. if $(PROFILE) { CCFLAGS += -pg ; LINKFLAGS += -pg ; LOCATE_TARGET = $(LOCATE_TARGET)/pg ; } if $(DEBUG) { if $(OS) != NT { CCFLAGS += -g ; LINKFLAGS += -g ; } LOCATE_TARGET = $(LOCATE_TARGET)-g ; OPTIM = ; } # We have to signal jam.h for these if $(OS) = NT { CCFLAGS += /DNT ; } # Do we know yacc? if $(YACC) { code += jamgram.y ; } else { code += jamgram.c ; } ### LOCAL CHANGE # ALL_OPTIONS = ; rule Option { LOCAL_DEFINES += $(1) ; if $(2) = yes { local match = [ MATCH "^OPT_(.*)$" : $(1) ] ; if ! $(match) { EXIT "Invalid option $(1)" ; } local match2 = [ MATCH "^(.*)_EXT$" : $(match) ] ; if $(match2) { match = $(match2) ; } ALL_OPTIONS += $(match) ; } } rule Join1 { local list = $(1) ; local accum = $(2) ; if $(list) { return [ Join1 $(list[2-]) : "$(list[1]):$(accum)" ] ; } else { return $(accum) ; } } rule Join { local list = $(1) ; if $(list) { return [ Join1 $(list[2-]) : $(list[1]) ] ; } else { return "" ; } } if $(BUILD_J) { # Improvements grabbed from //guest/craig_mcpheeters/jam/src/ on the # Perforce public depot (some heavily modified). Option OPT_HEADER_CACHE_EXT ; Option OPT_IMPROVED_WARNINGS_EXT ; Option OPT_INTERRUPT_FIX ; Option OPT_GRAPH_DEBUG_EXT ; Option OPT_SERIAL_OUTPUT_EXT ; # Bug Fixes Option OPT_FIX_TEMPFILE_CRASH ; Option OPT_FIX_NOTFILE_NEWESTFIRST ; Option OPT_FIX_NT_ARSCAN_LEAK ; # Improvements developed locally. Option OPT_PIECEMEAL_PUNT_EXT ; # Improvements Option OPT_IMPROVED_MEMUSE_EXT ; Option OPT_IMPROVED_PATIENCE_EXT ; Option OPT_IMPROVED_PROGRESS_EXT ; Option OPT_PRINT_TOTAL_TIME_EXT ; Option OPT_IMPROVE_DEBUG_LEVEL_HELP_EXT ; Option OPT_IMPROVE_DEBUG_COMPILE_EXT ; Option OPT_DEBUG_MAKE_PRINT_TARGET_NAME ; Option OPT_DEBUG_MEM_TOTALS_EXT ; # Features Option OPT_PATCHED_VERSION_VAR_EXT ; Option OPT_HDRRULE_BOUNDNAME_ARG_EXT : yes ; # No longer in the source. # Option OPT_BUILTIN_PWD_EXT : yes ; Option OPT_VAR_CWD_EXT : yes ; Option OPT_RESPONSE_FILES : yes ; Option OPT_BUILTIN_MD5_EXT : yes ; if $(OS) = NT { # No longer in the source. # Option OPT_BUILTIN_W32_GETREG_EXT : yes ; # Option OPT_BUILTIN_W32_SHORTNAME_EXT : yes ; } Option OPT_EXPAND_RULE_NAMES_EXT : yes ; local options = [ Join $(ALL_OPTIONS) ] ; LOCAL_DEFINES += JAM_OPTIONS=$(options) ; if $(OS) = NT { CCFLAGS += /nologo /W3 ; CCFLAGS += /DNT ; #CCFLAGS += /D_CONSOLE /D_MBCS ; if $(DEBUG) { CCFLAGS += /Zi /MLd /Od ; LINKFLAGS += /DEBUG ; } else { CCFLAGS += /ML /O2 ; } LINKFLAGS += /nologo /subsystem:console /machine:I386 ; LINKLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ; DEFINEFLAG ?= /D ; } else if $(UNIX) { CC = gcc ; LINK = gcc ; if ! $(DEBUG) { OPTIM = -O3 -fomit-frame-pointer -fstrength-reduce ; } CCFLAGS += -Wall ; DEFINEFLAG ?= -D ; } else { EXIT "Not configured for non-UNIX non-Windows targets" ; } # if $(DEBUG) { # CCFLAGS += $(DEFINEFLAG)DEBUG ; # } CCFLAGS += $(DEFINEFLAG)$(LOCAL_DEFINES) ; CCFLAGS += $(DEFINEFLAG)YYSTACKSIZE=5000 ; } if $(UNIX) && $(PURE) { LOCATE_TARGET = $(LOCATE_TARGET)/pure ; CCFLAGS += $(DEFINEFLAG)PURE ; LINK = /usr/local/bin/purify cc ; } if $(NT) && $(PURE) { LOCATE_TARGET = $(LOCATE_TARGET)-pure ; CCFLAGS += $(DEFINEFLAG)PURE ; } # ### LOCAL CHANGE # # Build the jamgram.y from the jamgram.yy # yyacc is a slippery script that makes grammars a little # easier to read/maintain. # if $(YACC) && $(SUFEXE) = "" { GenFile jamgram.y jamgramtab.h : yyacc jamgram.yy ; } ### LOCAL CHANGE # # These files contain locally developed improvements. # if $(BUILD_J) { # code += pwd.c w32_getreg.c w32_shortname.c ; if OPT_BUILTIN_MD5_EXT in $(LOCAL_DEFINES) { code += md5c.c ; } if OPT_IMPROVED_PROGRESS_EXT in $(LOCAL_DEFINES) { code += progress.c ; } if OPT_IMPROVED_MEMUSE_EXT in $(LOCAL_DEFINES) { code += mempool.c ; } # code primarily not written locally, but grabbed from the net code += hcache.c tmpunix.c ; } # ### LOCAL CHANGE # # How to build the compiled in jambase. # Main mkjambase : mkjambase.c ; if $(VMS) { CC = cxx ; LINK = cxxlink ; CCFLAGS += /define=VMS ; } # # The guts of the Jamfile: how to build Jam # if $(BUILD_J) { Main j : jam.c jambase-j.c ; LinkLibraries j : libjam.a ; GenFile jambase-j.c : mkjambase Jambase-j ; } else { Main jam : jam.c jambase.c ; LinkLibraries jam : libjam.a ; GenFile jambase.c : mkjambase Jambase ; } Library libjam.a : builtins.c command.c compile.c $(code) expand.c glob.c hash.c headers.c lists.c make.c make1.c newstr.c option.c parse.c regexp.c rules.c scan.c search.c timestamp.c variable.c ; if $(BINDIR) { InstallBin $(BINDIR) : jam ; } # # Distribution making from here on out. # ALLSOURCE = Build.com Build.mpw Jam.html Jambase Jambase.html Jamfile Jamfile.html Makefile Porting README RELNOTES builtins.c builtins.h command.c command.h compile.c compile.h execcmd.h execmac.c execunix.c execvms.c expand.c expand.h filemac.c filent.c fileos2.c filesys.h fileunix.c filevms.c glob.c hash.c hash.h headers.c headers.h jam.c jam.h jambase.c jambase.h jamgram.c jamgram.h jamgram.y jamgram.yy jamgramtab.h lists.c lists.h make.c make.h make1.c mkjambase.c newstr.c newstr.h option.c option.h parse.c parse.h patchlevel.h pathmac.c pathsys.h pathunix.c pathvms.c regexp.c regexp.h rules.c rules.h scan.c scan.h search.c search.h timestamp.c timestamp.h variable.c variable.h yyacc ; ### LOCAL CHANGE # ALLSOURCE += LOCAL_DIFFERENCES.txt ; # ### LOCAL CHANGE rule Ball { NotFile balls ; Depends balls : $(<) ; DEPENDS $(<) : $(>) ; switch $(<) { case *.tar : Tar $(<) : $(>) ; case *.shar : Shar $(<) : $(>) ; case *.zip : Zip $(<) : $(>) ; } } VERSION = jam-2.5rc1 ; actions Tar { ln -s . $(VERSION) tar cvhf $(<) $(VERSION)/$(>) rm $(VERSION) } actions Shar { shar $(>) > $(<) } actions Zip { zip $(<) $(>) } Ball $(VERSION).shar : $(ALLSOURCE) ; Ball $(VERSION).tar : $(ALLSOURCE) ; Ball $(VERSION).zip : $(ALLSOURCE) ;