- # BhbJambase
- # Copyright (c) 2001 MBruce, all rights reserved
- # $Id: $
-
- # This is the basic Jambase for use in your projects.
-
- ################################################################################
- # Note: This is an architectural difference between "jam" from perforce and #
- # this highly modified version of "jam". This version of "jam" will only #
- # know how to do very few things in it's Jambase. Everything else in included #
- # at runtime from this file. #
- # #
- ################################################################################
-
-
- # -----------
- # Local stuff.
- # -----------
-
- include $(TOP)$(SLASH)Jamvars ;
-
- # ----------------
- # Basic Common variables
- # ----------------
-
- # Customize for your project
- BHBVERSION = "10" ;
-
- # TOP refers to the top of the source tree - in our case this is the
- # branch directory (e.g. ~/dev/bhb10).
- HDRS = $(TOP)$(SLASH)inc ; # Where our standard headers are.
- LIBPATH = $(TOP)$(SLASH)lib ; # Where our libraries go.
- BINPATH = $(TOP)$(SLASH)bin ; # Where our executables go.
-
- # we keep 3rdparty libs elsewhere
- CFLIBDIR = $(CF) ;
- if $(CF) = rbug
- {
- CFLIBDIR = release ;
- }
- 3RDPARTYLIB =
- $(TOP)$(SLASH)3rdparty$(SLASH)lib
- $(TOP)$(SLASH)3rdparty$(SLASH)lib$(SLASH)$(CFLIBDIR)
- ;
-
- # Where the base of the java tree is, in grist and dirs:
- JAVAGRIST = <java> ;
- JAVAROOT = $(TOP:R=$(PWD))$(SLASH)java ;
- JAVA3RDPARTYROOT = $(TOP:R=$(PWD))$(SLASH)3rdparty$(SLASH)java ;
-
- # Java classpath
- CLASSPATH = $(JAVA3RDPARTYROOT) ;
-
- # Variable Meaning
- # -------- -------
- # ARCH Letters to append to lib/exe names to indicate configuration.
- # ARCHDIR Subdirectory where intermediate files go.
- # DEBUGGING Are we debugging at all?
-
- ARCHDIR = $(CF) ;
-
-
- # ------------------------------------------
- # Environmental configuration settings
- # These must come before the "if $(NT)" and "if $(UNIX)" sections.
- # ------------------------------------------
-
- if ! $(TOP)
- {
- ECHO We depend on TOP being the name of the top directory ;
- EXIT As in SubDir TOP foo bar ";" ;
- }
-
- if ! $(CF) || ( $(CF) != debug && $(CF) != release && $(CF) != rbug )
- {
- ECHO Please define a configuration (ie: if you are building debug or release) ;
- ECHO The possible configurations are debug and release. ;
- EXIT The configuration needs to be set in the environment variable 'CF'. ;
- }
-
- if ! $(TEMP)
- {
- ECHO Please set the environment variable "TEMP" to somewhere safe. ;
- ECHO DO NOT set it to /tmp unless you are the only one who uses this machine. ;
- EXIT TYPE: export TEMP=$(HOME)/tmp; mkdir $(HOME)/tmp ;
- }
-
- # uncomment this if you need object store persistable classes
- # if ! $(OSJI_HOME)
- # {
- # ECHO Please set OSJI_HOME to the root path of ObjectStore. ;
- # EXIT You can probably do this by running /opt/release/bhb/bin ;
- # }
-
- if $(FAST)
- {
- ECHO Fast build specified; skipping header dependency analysis. ;
- ECHO C and C++ only ;
- }
-
- if $(PROFILE)
- {
- LINKPROFILE = $(PROFILE) ;
- }
-
- if $(LINKPROFILE)
- {
- ECHO Profiling is enabled. ;
- ECHO Windows NT only at the moment. ;
- }
-
- if $(CF) = rbug
- {
- ECHO Generating debug info in release mode! ;
- # more crappy trunkated debug info in this mode...
- ALLOWWARN = true ;
- ECHO Windows NT only. This stuff works on UNIX. ;
- }
-
- if $(MAPFILE)
- {
- ECHO Generating Mapfile. ;
- ECHO Windows NT only at the moment. ;
- }
-
- # Unit testing is enabled by default...
- if $(NOUNITTEST)
- {
- ECHO Unit testing disabled. ;
- }
-
- if $(VERBOSELINK)
- {
- ECHO Verbose link. ;
- }
-
- if $(ALLOWWARN)
- {
- ECHO Allowing warnings... beware ;
- }
-
- if $(UPDATEINSTALLEXE) && ! $(DEBUGGING)
- {
- if $(INSTALL_DIR)
- {
- ECHO Updating the executables in the bhbInstall directory. ;
- DEPENDS all : install ;
- }
- else
- {
- ECHO Update your $(INSTALL_DIR) ;
- }
- }
-
- if $(NOLINK)
- {
- ECHO Not linking... ;
- }
-
- if ! $(BHBJAM)
- {
- EXIT This Bhbrules needs to be run with bhbjam ;
- }
-
- if $(BROWSE)
- {
- ECHO Building file-by-file browse info. ;
- ECHO To build the .bsc file run \"jam browse\". ;
- }
-
-
- # ------------------------------------------
- # Start decision making.
- # ------------------------------------------
-
- switch $(CF)
- {
- case debug :
- DEBUGGING = true ;
- ARCH = g ;
- case release :
- DEBUGGING = ;
- ARCH = r ;
- case rbug :
- DEBUGGING = true ;
- ARCH = ag ;
- }
-
- if $(DEBUGGING)
- {
- JAVAFLAGS = -g ;
- }
- else
- {
- JAVAFLAGS = -O ;
- }
-
- LCURLY = "{" ;
- RCURLY = "}" ;
-
- if $(UNIX)
- {
- LINKEXECUTABLE += -lstdc++ ;
-
- LINKDLL = $(LINKEXECUTABLE) ;
- LINKMAIN = $(LINKEXECUTABLE) ;
- LINKAPPLICATION = $(LINKEXECUTABLE) ;
- LINKLIBRARY = ;
- SPLITPATH = ":" ;
-
- JAMSHELL = "/bin/ksh" ;
- }
-
- if $(NT)
- {
- SPLITPATH = ";" ;
-
- # /Zi = Generate debug info in a pdb file (used for exes).
- # /Od = Disable optimizations.
- # /GZ = Enable runtime stack checks.
- OPTIMDEBUG = -D"_DEBUG" /Zi /Od /GZ ;
-
- # Inlining:
- # /Ob0 = Disabled.
- # /Ob1 = Only when specified with 'inline'. (/Ob1 also enables the Force.)
- # /Ob2 = Any suitable function.
-
- # Optimization:
- # /O2 = optimize for speed
- OPTIMRELEASE = -D"NDEBUG" -D"BHB_RELEASE_ASSERT" /Ob1 /O2 ;
-
- switch $(CF)
- {
- case debug :
- OBJECTPDBFILE = $(LIBPATH)$(SLASH)objects$(ARCH).pdb ;
- DEBUGLINKFLAGS = /debug /incremental:yes ;
-
- OPTIM = $(OPTIMDEBUG) ;
- case release :
- DEBUGLINKFLAGS = ;
-
- OPTIM = $(OPTIMRELEASE) ;
- case rbug :
- OPTIMRELEASE += /Zi ;
- OPTIMDEBUG = $(OPTIMRELEASE) ;
-
- OBJECTPDBFILE = $(LIBPATH)$(SLASH)objects$(ARCH).pdb ;
- DEBUGLINKFLAGS = /debug ;
-
- OPTIM = $(OPTIMDEBUG) ;
- }
-
- # Unit testing is on unless explicitly turned off.
- if $(NOUNITTEST)
- {
- UNITTESTFLAGS = ;
- }
- else
- {
- UNITTESTFLAGS = /D"_UNITTEST" ;
- }
-
- switch $(CF)
- {
- case debug :
- # Link with MSVCRTD.LIB (meaning AFXDLL),
- # Link with stingray as dlls
- CFCFLAGS default =
- /MDd /D"_AFXDLL"
- /D_CMNDLL /D_SECDLL /D_GXDLL
- /D_BHB_CF_DEBUG
- ;
- case release :
- # Link with MSVCRT.LIB (meaning AFXDLL),
- # Link with stingray as dlls
- CFCFLAGS default =
- /MD /D"_AFXDLL"
- /D_CMNDLL /D_SECDLL /D_GXDLL
- /D_BHB_CF_RELEASE
- ;
- case rbug :
- # Link with MSVCRT.LIB (meaning AFXDLL),
- # Link with stingray as dlls
- CFCFLAGS default =
- /MD /D"_AFXDLL"
- /D_CMNDLL /D_SECDLL /D_GXDLL
- /D_BHB_CF_RELEASE
- ;
- }
-
- # Standard Link flags
- # flags for any EXE (dll, main, app)
- LINKEXECUTABLE =
- /nologo
- $(DEBUGLINKFLAGS)
- /machine:I386
- ;
- if $(LINKPROFILE)
- {
- LINKEXECUTABLE += /profile ;
- }
- if $(MAPFILE)
- {
- LINKEXECUTABLE += /map /mapinfo:lines ;
- }
- if $(VERBOSELINK)
- {
- LINKEXECUTABLE += /verbose ;
- }
- LINKDLL = /dll $(LINKEXECUTABLE) ;
- LINKMAIN = /subsystem:console $(LINKEXECUTABLE) ;
- LINKAPPLICATION = /subsystem:windows $(LINKEXECUTABLE) ;
- LINKLIBRARY = /lib /nologo ;
-
- if $(ALLOWWARN)
- {
- NOWARNINGS = ;
- }
- else
- {
- NOWARNINGS = /WX ; # Warnings are errors
- }
-
- STANDARDCFLAGS =
- /nologo
- /Zp8 # 8-byte struct alignment.
- /W3 # Warning level 3.
- /GX # Enable C++ exception handling.
- /GR # Enable RTTI
- $(NOWARNINGS)
- /D"NOMINMAX"
- /D"WIN32"
- /D"_WINDOWS"
- /D"_MBCS"
- /D_SECNOMSG
- $(UNITTESTFLAGS)
- "/I$(TOP:R=$(PWD))/3rdparty/inc"
- "/I$(TOP:R=$(PWD))/3rdparty/inc/stingray"
- "/I$(TOP:R=$(PWD))/3rdparty/inc/versant"
- /D"_WIN32_IE=0x0400" # Ensures compatibility with comctl32.dll & shell32.dll v4.71 and later
- /c # Compile only (no link).
- /D"_GXNOMSG" # No MSG please! (Objective Grid pragma messages, that is)
- /DODBCXXX_DLL # We're using odbc++.dll
- $(CFCFLAGS)
- ;
- }
-
- # ----------------------------
- # End Basic Configuration
- # ----------------------------
- # You probably don't need to mess with anything below this point.
-
-
- # ----------------
- # Base dependencies
- # ----------------
-
- DEPENDS all : shell lib exe obj java jar ;
- DEPENDS all shell files lib exe obj java : first ;
- DEPENDS veryclean : clean ;
- NOTFILE all first shell files lib exe obj dirs clean uninstall java veryclean ;
- NOTFILE
- all first shell files lib exe obj dirs clean uninstall java veryclean jar ;
- ALWAYS veryclean clean uninstall ;
-
- # Not yet installed grist (to distinguish from the installed file
- PREINSTALL = <preinstall> ;
-
- # Allow a space or tab befor the '#include' when searching
- # for headers.
- HDRPATTERN = "^[ ]*#[ ]*include[ ]*[<\"](.*)[\">].*$" ;
-
- # Names of standard Jam files
- JAMFILE default = Jamfile ;
- JAMRULES default = Bhbrules ;
-
- # since we're using sh for NT, these are general
- AWK default = awk ;
- CHMOD default = chmod ;
- CP default = cp ;
- DOT default = . ;
- DOTDOT default = .. ;
- EXEMODE default = 711 ;
- FILEMODE default = 644 ;
- MKDIR default = mkdir -p ;
- MV default = mv -f ;
- RCP default = rcp ;
- RSH default = rsh ;
- RM default = rm -rf ;
- SED default = sed ;
- SLASH default = / ;
-
- # ---------------------------
- # Platform-specific variables
- # ---------------------------
-
- # Variables such as NT were set when we built jam itself.
-
- # Variable Meaning
- # -------- -------
- # CFCFLAGS Configuration-specific compiler flags (NT only).
- # PRELIB Prefix for library names.
- # PREDLL Prefix for dll names.
- # SUFDLL Suffix for dll names.
- # SUFRES Suffix for compiled resources.
-
- if $(UNIX)
- {
- PRELIB default = lib ;
- PREDLL default = lib ;
- SUFDLL default = .so ;
- SUFLIB default = .a ;
- SUFOBJ default = .o ;
- SUFEXE default = "" ;
- SUFRES default = .res ;
-
- AR default = ar ru ;
- AS default = as ;
- CC default = gcc ;
- C++ default = $(CC) ;
- LINK default = $(CC) ;
-
- if $(OS) = SOLARIS
- {
- # Solaris build are currently working. Allow this.
- }
- else if $(OS) = LINUX
- {
- EXIT Linux build isn't ready yet. ;
- }
- else
- {
- EXIT What unix are you building on? ;
- }
- }
- else if $(NT)
- {
- OS = NT ; # replace Windows_NT
-
- PRELIB default = "" ;
- PREDLL default = $(PRELIB) ;
- SUFDLL default = .dll ;
- SUFLIB default = .lib ;
- SUFOBJ default = .obj ;
- SUFEXE default = .exe ;
- SUFRES default = .res ;
-
- AR default = link /nologo ;
- AS default = masm386 ;
- CC default = cl /nologo ;
- C++ default = $(CC) ;
- LINK default = link ;
-
- RC = rc ; # Resource compiler.
- AR = lib -nologo ; # Archive command.
- }
- else
- {
- EXIT We don't support this platform. ;
- }
-
- # -------------------
- # BhbJam' Markup
- # -------------------
-
- # Markup an exe, lib or dll with our weird markup scheme. E.g.
- #
- # MakeName targ : BhbJam : exe : locate ;
- # targ -> "BhbJam84lg.exe" in $(TOP)/bin
- #
- # MakeName targ : og : dll : nomarkup ;
- #
- # targ -> "og.dll" wherever it's already supposed to be
- #
- # etc.
- rule MakeName
- {
- local _f_result = $(1) ;
- local _f_target = $(2) ;
- local _f_type = $(3) ;
- local _f_flags = $(4) ;
-
- if ! $($(_f_result))
- {
- local _f_path, _f_cfMark, _f_versionMark, _f_suffix, _f_prefix;
-
- local _f_locate = ;
- local _f_depend = ;
- local _f_grist = ;
- local _f_search = ;
-
- _f_suffix = "" ;
- _f_prefix = "" ;
- _f_cfMark = $(ARCH) ;
- _f_versionMark = $(BHBVERSION) ;
-
- switch $(_f_type)
- {
- case exe :
- _f_path = $(BINPATH) ;
- _f_suffix = $(SUFEXE) ;
- # if $(CF) = release { _f_flags += nomarkup ; }
- case dll :
- _f_path = $(LIBPATH) ;
- _f_suffix = $(SUFDLL) ;
- _f_prefix = $(PREDLL) ;
- case lib :
- _f_path = $(LIBPATH) ;
- _f_suffix = $(SUFLIB) ;
- _f_search = true ;
- case obj :
- _f_grist = true ;
- _f_path = $(LOCATE_TARGET) ;
- _f_suffix = $(SUFOBJ) ;
- _f_flags += nomarkup ;
- case pch :
- _f_grist = true ;
- _f_path = $(LOCATE_TARGET) ;
- _f_suffix = $(SUFPCH) ;
- _f_flags += nomarkup ;
- case res :
- _f_grist = true ;
- _f_path = $(LOCATE_TARGET) ;
- _f_suffix = $(SUFRES) ;
- _f_flags += nomarkup ;
- case jar :
- _f_path = $(JAVAROOT) ;
- _f_suffix = ".jar" ;
- _f_flags += nomarkup ;
- case * :
- _f_suffix = "."$(_f_type) ;
- _f_flags += nomarkup ;
- _f_path = $(LOCATE_TARGET) ;
- _f_grist = true ;
- _f_path = $(SUBDIR) ;
- _f_locate = true ;
- }
-
- for _f in $(_f_flags)
- {
- switch $(_f)
- {
- case 3rdparty :
- _f_path = $(3RDPARTYLIB) ;
- _f_versionMark = "" ;
- _f_cfMark = "" ;
- case nomarkup :
- _f_versionMark = "" ;
- _f_cfMark = "" ;
- case locate :
- _f_locate = true ;
- case depend :
- _f_depend = true ;
- case declare :
- _f_locate = true ;
- _f_depend = true ;
- }
- }
-
- local _f_base = $(_f_prefix)$(_f_target)$(_f_versionMark)$(_f_cfMark) ;
- local _f_name ;
-
- if $(_f_grist)
- {
- makeGristedName _f_name : $(_f_base:S=$(_f_suffix)) ;
- }
- else
- {
- _f_name = $(_f_base:S=$(_f_suffix)) ;
- }
-
- if $(_f_locate)
- {
- MakeLocate $(_f_name) : $(_f_path) ;
- }
- else if $(_f_search)
- {
- SEARCH on $(_f_name) = $(_f_path) ;
- }
-
- if $(_f_depend)
- {
- NOTFILE $(_f_target) ;
- DEPENDS $(_f_target) : $(_f_name) ;
- }
-
- $(_f_result) = $(_f_name) ;
- }
- }
-
- # Append to a flag for some stage of the compilation process. e.g.:
- #
- # SetFlag foo.c : obj : CCFLAGS : -Dfoo ;
- #
- # SetFlag bozo : dll : LINKFLAGS : -R /usr/local/lib ;
- #
- rule SetFlag
- {
- local s t ;
-
- # flags for anylib are both lib & dll
- if $(2) = anylib
- {
- MakeName s : $(1) : dll ;
- MakeName t : $(2) : lib ;
- s += t ;
- }
- else
- {
- MakeName s : $(1) : $(2) ;
- }
-
- $(3) on $(s) += $(4) ;
- }
-
-
- # ------------------
- # Global rules
- # ------------------
-
- # Build an application, e.g. BhbJam:
- #
- # Application myFancyProgram : sourcefile.cpp fancyprog.cpp ;
- rule Application
- {
- MainFromObjects $(<) : $(>) : app ;
- Objects $(>) ;
- }
-
- # BuildPch pchfile : cppfileusedtobuild : headerupto ;
- # e.g.
- # BuildPch bhbafx.pch : bhbafx.cpp : bhbafx.h ;
- # or
- # BuildPch cellsafx.pch : cellsafx.cpp : stdafx.h ;
- #
- # the third paramater is optional, but otherwise you need that
- # hdrstop pragma. You should use a cppfile tailored to this purpose;
- # the pchfile will depend on anything it depends on.
- rule BuildPch
- {
- if $(NT)
- {
- local o p h ;
- makeGristedName s : $(>) ;
- makeGristedName o : $(>:S=$(SUFOBJ)) ;
- makeGristedName p : $(<:S=.pch) ;
-
- MakeLocate $(p) : $(LOCATE_TARGET) ;
-
- BuiltByBuildOf $(p) : $(o) ;
-
- if $(3)
- {
- endh = $(3) ;
- }
- else
- {
- endh = "" ;
- }
-
- # /Yc = create precompiled header up to endheader
- C++FLAGS on $(o) = /Yc$(endh) ;
- CCFLAGS on $(o) = /Yc$(endh) ;
- PCHFILE on $(o) = $(p) ;
- $(o)-builds-$(p) = true ;
- }
- }
-
- # This is done on a file-for-file basis at the moment, since it's not
- # normally safe to use it for all files in the dir.
- # Syntax :
- # UsePch file : pchfile : endhdr ;
- # endhdr is optional, but requires #pragma hdrstop
- rule UsePch
- {
- if $(NT)
- {
- local o ;
- local p ;
- makeGristedName o : $(<:S=$(SUFOBJ)) ;
- makeGristedName p : $(>:S=.pch) ;
-
- if $(3)
- {
- endh = $(3) ;
- }
- else
- {
- endh = "" ;
- }
-
- for i in $(o)
- {
- if ! $($(i)-builds-$(p))
- {
- DEPENDS $(i) : $(p) ;
- # /Yu = use pch
- C++FLAGS on $(i) += /Yu$(endh) ;
- CCFLAGS on $(i) += /Yu$(endh) ;
- PCHFILE on $(i) = $(p) ;
- }
- }
- }
- }
-
- # Syntax:
- # SubDirUsePch pchfile : endhdr ;
- # Uses the pch file for all C and C++ files in the directory
- rule SubDirUsePch
- {
- SUBDIR_PCH_FILE = $(<) ;
- SUBDIR_PCH_END = $(>) ;
- }
-
- # Build a browse info file (.bsc) from the sbrs.
- #
- # We will build the .sbr files if $(BROWSE) is set.
- rule BrowseInfo
- {
- NOTFILE browse ;
- DEPENDS browse : $(<) ;
- ALWAYS $(<) ;
- Clean clean : $(<) ;
- Clean clean : $(TOP)$(SLASH)browse ;
- }
-
- # Tells jam that $(<) was built when we built $(>)
- rule BuiltByBuildOf
- {
- DEPENDS $(<) : $(>) ;
- }
-
- rule Cc
- {
- DEPENDS $(<) : $(>) ;
-
- CCFLAGS on $(<) += $(STANDARDCFLAGS) $(CCFLAGS) $(SUBDIRCCFLAGS) ;
-
- CcCommonFlags $(<) : $(>) ;
- }
-
- rule C++
- {
- DEPENDS $(<) : $(>) ;
-
- C++FLAGS on $(<) += $(STANDARDCFLAGS) $(C++FLAGS) $(SUBDIRC++FLAGS) ;
-
- CcCommonFlags $(<) : $(>) ;
- }
-
- rule CcCommonFlags
- {
- if $(NT)
- {
- # precompiled headers
- if $(SUBDIR_PCH_FILE)
- {
- UsePch $(<) : $(SUBDIR_PCH_FILE) : $(SUBDIR_PCH_END) ;
- }
-
- if $(DEBUGGING)
- {
- # all .obj's share a .pdb file -- this is much cleaner and
- # faster than the alternatives. The debugging info will
- # get copied from this .pdb file to the pdb file of the exe's
- # by the linker.
- PDBFILE on $(<) = $(OBJECTPDBFILE) ;
- DEPENDS $(<) : $(OBJECTPDBFILE:D) ;
- MkDir $(OBJECTPDBFILE:D) ;
- Clean veryclean : $(OBJECTPDBFILE) ;
- }
-
- if $(BROWSE) && $(DEBUGGING)
- {
- # build browse info for Visual C++
- C++FLAGS on $(<) += /FR$(TOP)$(SLASH)browse$(SLASH) ;
- CCFLAGS on $(<) += /FR$(TOP)$(SLASH)browse$(SLASH) ;
- DEPENDS $(<) : $(TOP)$(SLASH)browse ;
- MkDir $(TOP)$(SLASH)browse ;
- }
- }
- }
-
- # Add entry(ies) to the classpath
- rule ClassPath
- {
- local path ;
-
- for path in $(<)
- {
- if $(NT)
- {
- CLASSPATH = $(CLASSPATH)";"$(path:R=$(PWD)) ;
- }
- else
- {
- CLASSPATH = $(CLASSPATH)":"$(path:R=$(PWD)) ;
- }
- }
- }
-
- # Clean files from a pattern. This can be useful if you
- # don't quite know what silly files got created.
- # e.g.
- # CleanMany clean : *.class ;
- rule CleanMany
- {
- DEPENDS $(<) : $(>) ;
- NOTFILE $(>) ;
- }
-
- # compile the versant .imp file to an .obj by way of schcomp
- rule DBSchemaCompile
- {
- local _schema _cxx ;
- makeGristedName _schema : $(>:S=.sch) ;
- makeGristedName _cxx : $(>:S=.cxx) ;
- MakeLocate $(_cxx) : $(LOCATE_TARGET) ;
-
- SchComp $(_schema) $(_cxx) : $(>) ;
- Objects $(_cxx) ;
- }
-
- # Build the .sch and the .cxx from the versant Schema .imp file
- # must call with $(schemaName) $(cxxName) as targets in that order!
- rule SchComp
- {
- C++FLAGS on $(<) += $(SUBDIRC++FLAGS) $(C++FLAGS) $(STANDARDCFLAGS) ;
- LOCATE_TARGET on $(<) = $(LOCATE_TARGET) ;
- LOCATE on $(<) = $(LOCATE_TARGET) ;
-
- CcCommonFlags $(<) : $(>) ;
-
- HDRS on $(<) = $(HDRS) $(SUBDIRHDRS) ;
-
- if ! $(FAST)
- {
- HDRRULE on $(>) = HdrRule ;
- HDRSCAN on $(>) = $(HDRPATTERN) ;
- HDRSEARCH on $(>) = $(HDRS) $(SUBDIRHDRS) $(STDHDRS) ;
- HDRGRIST on $(>) = $(HDRGRIST) ;
- }
-
- SEARCH on $(>) = $(SEARCH_SOURCE) ;
-
- NOTFILE schema ;
- DEPENDS schema : $(<) ;
- DEPENDS $(<) : $(>) ;
-
- Clean clean : $(<) ;
- }
-
- # This is used for a define that should be set up if you're compling
- # the file as a DLL. Usually this is guarding some kind of dllexport/
- # dllimport define.
- # e.g.
- # DefineForDLL _INV_FTL_INTERNAL ;
- rule DefineForDLL
- {
- SUBDIRC++FLAGS += "-D"$(<) ;
- SUBDIRCCFLAGS += "-D"$(<) ;
- }
-
- # Use the export library from an executable (and copy it to the lib dir.)
- rule ExportLibrary
- {
- if $(NT) && ! $(NOLINK)
- {
- local exeName libName ;
- MakeName exeName : $(<) : exe ;
- MakeName libName : $(<) : lib : locate ;
-
- DEPENDS lib : $(libName) ;
-
- local libWithExe = $(exeName:G=$(PREINSTALL):S=$(SUFLIB)) ;
- BuiltByBuildOf $(libWithExe) : $(exeName) ;
- LOCATE on $(libWithExe) = $(BINPATH) ;
-
- File $(libName) : $(libWithExe) ;
- NOPROPAGATE $(libName) ;
- Clean clean : $(libName) ;
- }
- }
-
- # Define some preprocessor macro for compliation
- rule Define
- {
- SubDirC++Flags -D$(<) ;
- SubDirCcFlags -D$(<) ;
- }
-
- # Copy a file.
- rule File
- {
- DEPENDS files : $(<) ;
- DEPENDS $(<) : $(>) ;
- SEARCH on $(>) = $(SEARCH_SOURCE) ;
- }
-
- # Files a1 b1 c1 : a b c ;
- #
- # copies a to a1, b to b1, etc.
- rule Files
- {
- if $(<) && $(>)
- {
- RmFile $(<[1]) ;
- File $(<[1]) : $(>[1]) ;
-
- if $(<[2-]) && $(>[2-])
- {
- Files $(<[2-]) : $(>[2-]) ;
- }
- }
- }
-
- rule HdrRule
- {
- # HdrRule source : headers : boundNameOfSource ;
-
- # N.B. This rule is called during binding, potentially after
- # the fate of many targets has been determined, and must be
- # used with caution: don't add dependencies to unrelated
- # targets, and don't set variables on $(<).
-
- # Tell Jam that anything depending on $(<) also depends on $(>),
- # set SEARCH so Jam can find the headers, but then say we don't
- # care if we can't actually find the headers (they may have been
- # within ifdefs),
-
- local s ;
-
- if $(HDRGRIST)
- {
- s = $(>:G=$(HDRGRIST)) ;
- } else {
- s = $(>) ;
- }
-
- # we can use the boundNameOfSource to add the current directory
- # of the source into the search so #includes with quotes can search
- # there (the standard on NT).
-
- local headerDir = $(3:D) ;
-
- INCLUDES $(<) : $(s) ;
- SEARCH on $(s) = $(headerDir) $(HDRSEARCH) ;
- NOCARE $(s) ;
-
- # Propagate on $(<) to $(>)
-
- HDRSEARCH on $(s) = $(HDRSEARCH) ;
- HDRSCAN on $(s) = $(HDRSCAN) ;
- HDRRULE on $(s) = $(HDRRULE) ;
- HDRGRIST on $(s) = $(HDRGRIST) ;
- }
-
- # install everything... The syntax looks like
- #
- # InstallTarget from : ToDir : ToName ;
- #
- # This is really a utility rule for Install
- rule InstallTarget
- {
- local installTarget ;
-
- if $(3)
- {
- installTarget = $(3:G="<install>") ;
- }
- else
- {
- installTarget = $(<:G="<install>") ;
- }
-
- MakeLocate $(installTarget) : $(>:R=$(INSTALL_DIR)) ;
- Files $(installTarget) : $(<) ;
- DEPENDS install : $(installTarget) ;
- }
-
- # Install a decorated name. For example
- #
- # Install BhbJam : exe : bin ;
- # installs BhbJam84lg.exe (or whatever) into $(INSTALL_DIR)/bin
- # Install BhbJam : lib : sdk : sdk.lib ;
- # installs BhbJam84lg.lib (from $(TOP)/lib) into $(INSTALL_DIR)/sdk/sdk.lib
- # Install fdkfuncs.h : installFile : sdk ;
- # isntalls fdkfuncs.h into $(INSTALL_DIR)/sdk
- rule Install
- {
- local file ;
- if $(2) = installFile
- {
- makeGristedName file : $(1) ;
- SEARCH on $(file) = $(SEARCH_SOURCE) ;
- }
- else
- {
- MakeName file : $(1) : $(2) ;
- }
-
- InstallTarget $(file) : $(3) : $(4) ;
- }
-
- # Compiling the package all-in-one, by making a new class that merely
- # includes all of the classes in the package. The point is to reduce
- # the number of costly calls to javac, and to avoid having jam deal
- # with dependencies
- rule JavaPackage
- {
- local s ;
- makeGristedName s : $(>) ;
- LOCATE on $(s) = $(SUBDIR) ;
-
- local jp jc ;
- makeGristedName jp : JamPackage.java ;
- jc = $(jp:S=.class) ;
- LOCATE on $(jp) $(jc) = $(SUBDIR) ;
-
- local pkj ;
-
- if $(<) != ""
- {
- pkj = $(<).JamPackage ;
- }
- else
- {
- pkj = JamPackage ;
- }
-
- PACKAGENAME on $(jp) = $(pkj) ;
-
- JamPackage $(jp) : $(>:S="") ;
-
- INCLUDES $(jp) : $(s) ;
- DEPENDS $(jp) : $(SUBDIR)$(SLASH)Jamfile ;
- DEPENDS $(jp) : $(SUBDIR)$(SLASH)$(>) ;
-
- RootJamPackage $(jp) : $(pkj) ;
-
- Clean clean : $(jc) $(jp) ;
- CleanMany clean : $(SUBDIR)$(SLASH)*.class ;
- }
-
- # build the JamPackage.java file
- rule JamPackage
- {
- NOTFILE $(>) ;
- }
-
- # build the RootJamPackage.java file (only once) and compile it.
- rule RootJamPackage
- {
- local rjp = $(JAVAGRIST)RootJamPackage.java ;
- local rjc = $(rjp:S=.class) ;
-
- LOCATE on $(rjp) $(rjc) = $(JAVAROOT) ;
-
- PACKAGENAME on $(rjp) = RootJamPackage ;
-
- INCLUDES $(rjp) : $(<) ;
-
- DEPENDS $(rjp) : $(<) ;
-
- JamPackage $(rjp) : $(>) ;
-
- Clean clean : $(rjp) $(rjc) ;
-
- if ! $(root-jam-package-initted)
- {
- root-jam-package-initted = true ;
- JavaC $(rjc) : $(rjp) ;
- SUBDIR on $(rjc) = $(JAVAROOT) ;
- }
- }
-
- # compile a java file.
- rule JavaC
- {
- DEPENDS $(<) : $(>) ;
- DEPENDS java : $(<) ;
- # ensure that RootJamPackage is built every time any java
- # file needs to be built. This does two things - 1. get around
- # a bug in 1.2.2's javac 2. creates minimal builds from subdirs
- DEPENDS RootJamPackage : java ;
- }
-
- # build a jar file from various packages.
- # $(2) is from packages that we build
- # $(3) is third party packages.
- # includes subpackages in package
- #
- # so, this looks like:
- # Jar poserver :
- # com.mbruce.poserver
- # com.mbruce.util
- # com.mbruce.db
- # :
- # com.javtech.coppelia
- # org.xml.sax
- # ;
- #
- # optional 4th argument is patterns for files to include.
- # default:
- # *.class *.properties
- rule Jar
- {
- local jarFile ;
- MakeName jarFile : $(<) : jar : declare ;
- DEPENDS $(jarFile) : java ;
- NOTFILE $(2) $(3) ;
- DEPENDS jar : $(<) ;
-
- if $(3)
- {
- JAR3RDPARTY on $(<) = $(3) ;
- JARHAS3RDPARTY on $(<) = true ;
- }
- else
- {
- JAR3RDPARTY on $(<) = foo ;
- JARHAS3RDPARTY on $(<) = false ;
- }
-
- if $(4)
- {
- # -type b == type block-special -- effectively -false
- # for the null condition at the end of the ors
- # so it looks like : -name "*.class" -type b -- effectively
- # -name "*.class"
- JARPATTERNS on $(<) = -type f | egrep '$(4)' ;
- }
- else
- {
- JARPATTERNS on $(<) = -type f | egrep '.*(class|properties|fmt)$' | grep -v JamPackage.class ;
- }
-
- Clean clean : $(jarFile) ;
- }
-
-
- # much like Jar, but runs the persistable object store stuff on
- # the classes first
- rule JarPersistable
- {
- local jarFile ;
- MakeName jarFile : $(<) : jar : declare ;
- DEPENDS $(jarFile) : java ;
- NOTFILE $(2) $(3) ;
- DEPENDS jar : $(<) ;
-
- if $(3)
- {
- JAR3RDPARTY on $(<) = $(3) ;
- JARHAS3RDPARTY on $(<) = true ;
- }
- else
- {
- JAR3RDPARTY on $(<) = foo ;
- JARHAS3RDPARTY on $(<) = false ;
- }
-
- if $(4)
- {
- # -type b == type block-special -- effectively -false
- # for the null condition at the end of the ors
- # so it looks like : -name "*.class" -type b -- effectively
- # -name "*.class"
- JARPATTERNS on $(<) = -type f | egrep '$(4)' ;
- }
- else
- {
- JARPATTERNS on $(<) = -type f | egrep '.*(class)$' | grep -v JamPackage.class ;
- }
-
- Clean clean : $(jarFile) ;
- }
-
-
- # like jar, but obfuscates.
- #
- # Jode pricing :
- # pricing.jos
- # :
- # *.properties resources/*
- # ;
- #
- # i.e. obfuscate with file pricing.jos as a spec. After obfuscation
- # include anything that matches the find pattern.
- rule Jode
- {
- local jarFile ;
- MakeName jarFile : $(<) : jar : declare ;
- DEPENDS $(jarFile) : java ;
- DEPENDS jar : $(<) ;
-
- MakeLocate $(>) : $(JAVAROOT) ;
- DEPENDS $(jarFile) : $(>) ;
-
- if $(3)
- {
- JARHASEXTRAS on $(<) = true ;
- JAREXTRAS on $(<) = -name" "\"$(3)\"" "-o -type b ;
- }
-
- Clean clean : $(jarFile) $(jarFile:S=".tbl") ;
- }
-
- #
- # like jar but makes tar files:
- #
- # Tar wpserver :
- # apacheBhbJam
- # :
- # apache*s.dll
- # ftl*s.dll
- # ;
- #
- rule Tar
- {
- local tarFile ;
- MakeName tarFile : $(<) : tar.gz : declare ;
- DEPENDS $(tarFile) : $(2) ;
- NOTFILE $(2) ;
- TARPATTERNS on $(<) = -name" "\"$(3)\"" "-o -type b ;
-
- Clean clean : $(tarFile) ;
- }
-
- # Build a standard BhbJam library (a dll on nt)
- # Syntax is like application
- # Library mfctool : regkey.cpp font.cpp ... ;
- rule Library
- {
- LibraryOfType $(<) : $(>) : dll ;
- }
-
- # A library that's always static.
- rule StaticLibrary
- {
- LibraryOfType $(<) : $(>) : lib ;
- }
-
- # A library that's always a dll
- rule DynamicLibrary
- {
- LibraryOfType $(<) : $(>) : dll ;
- }
-
- # A library that might be a DLL or a static lib. If it's a DLL, then
- # the export symbols should be defined by a def file that's generated
- # from the objects. (Sparing the code writer some __declspec(dllexport)
- # nonsense). Note that static variables cannot be exported in this
- # fashion.
- rule DefLibrary
- {
- DefDynamicLibrary $(<) : $(>) ;
- }
-
- # a library that's a dll and always uses a generated .def file
- rule DefDynamicLibrary
- {
- if $(NT)
- {
- local libName dllName ;
- MakeName libName : $(<) : lib ;
- MakeName dllName : $(<) : dll ;
-
- local def ;
- makeGristedName def : $(<:S=.def) ;
- MakeLocate $(def) : $(LOCATE_TARGET) ;
-
- DefFile $(def) : $(>) ;
- DEFFILE on $(libName) $(dllName) = $(def) ;
- DEPENDS $(libName) $(dllName) : $(def) ;
- }
-
- LibraryOfType $(<) : $(>) : dll ;
- }
-
- if $(NT)
- {
- # Generate .def file for a library from the .objs
- rule DefFile
- {
- local s ;
- makeGristedName s : $(>:S=$(SUFOBJ)) ;
-
- DEPENDS $(<) : $(s) ;
- DEPENDS $(<) : $(SUBDIR)$(SLASH)Jamfile ;
-
- SUBDIR on $(<) = $(SUBDIR) ;
-
- DefHeader $(<) ;
- DefSymbols $(<) : $(s) ;
-
- Clean clean : $(<) ;
- }
- }
-
- # utility rule for building some form of library
- rule LibraryOfType
- {
- LibraryFromObjects $(<) : $(>) : $(3) ;
- Objects $(>) ;
- }
-
- # Build a .lib or a .dll from the objects. There's a lot to clean
- # up. Note the use of the export library -- it depends on the .dll.
- rule LibraryFromObjects
- {
- local name objName ;
- MakeName name : $(<) : $(3) : declare ;
- MakeName objName : $(>) : obj ;
-
- DEPENDS obj : $(objName) ;
- DEPENDS lib : $(name) ;
-
- DEPENDS $(name) : $(objName) ;
-
- if $(3) = dll && $(NT)
- {
- local exportName ;
- MakeName exportName : $(<) : lib : declare ;
- # building the lib makes the exportName -- tell jam this
- BuiltByBuildOf $(exportName) : $(name) ;
- Clean clean : $(exportName) ;
- NOPROPAGATE $(exportName) ;
- }
-
- if $(3) = dll
- {
- SetFlag $(<) : dll : LINKFLAGS : $(LINKDLL) ;
- SetFlag $(>) : obj : C++FLAGS : $(DLLCOMPILEFLAG) ;
- SetFlag $(>) : obj : CCFLAGS : $(DLLCOMPILEFLAG) ;
-
- if $(DEBUGGING) && $(NT)
- {
- SetFlag $(<) : lib : PDBFILE : $(LIBPATH)$(SLASH)$(name:S=.pdb) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.pdb) ;
- }
-
- if $(NT)
- {
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.map) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.pdb) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.ilk) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.exp) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.lib) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=._ll) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.pbi) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.pbo) ;
- Clean clean : $(LIBPATH)$(SLASH)$(name:S=.pbt) ;
- }
-
- if ! $(NOLINK)
- {
- Link $(name) : $(objName) ;
- }
- }
- else
- {
- SetFlag $(<) : lib : LINKFLAGS : $(LINKLIBRARY) ;
- SetFlag $(>) : obj : C++FLAGS : $(LIBCOMPILEFLAG) ;
- SetFlag $(>) : obj : CCFLAGS : $(LIBCOMPILEFLAG) ;
- if ! $(NOLINK)
- {
- LinkStaticLibrary $(name) : $(objName) ;
- }
- }
-
- Clean clean : $(name) ;
- }
-
- # Link an executable.
- rule Link
- {
- # so we can change directories
- SUBDIR on $(<) = $(SUBDIR) ;
- LOCATE_TARGET on $(<) = $(LOCATE_TARGET) ;
- }
-
- # set some linkflags on an executable or dll
- rule LinkFlags
- {
- SetFlag $(<) : exe : LINKFLAGS : $(>) ;
- SetFlag $(<) : dll : LINKFLAGS : $(>) ;
- }
-
- # Tell the linker which libraries to link an executable too. Note
- # that we need to link for .dll's and .exe's but not for .lib's.
- #
- # LinkLibraries BhbJam : mfctool mdi ... ;
- rule LinkLibraries
- {
- local exeName dllName libraries ;
- MakeName exeName : $(<) : exe ;
- MakeName dllName : $(<) : dll ;
-
- if $(NT)
- {
- MakeName libraries : $(>) : lib : $(3) ;
-
- DEPENDS $(exeName) $(dllName) : $(libraries) ;
- NEEDLIBS on $(exeName) $(dllName) += $(libraries) ;
- }
- else
- {
- # depend on the abstract name of the libraries so we don't have
- # to figure out if the're .so or .a
- NOTFILE $(>) ;
- DEPENDS $(exeName) $(dllName) : $(>) ;
-
- LINKLIBS on $(exeName) $(dllName) +=
- -L$(LIBPATH) -l$(>)$(BHBVERSION)$(ARCH) ;
- }
- }
-
- # Build a command-line program (rather than a gui-based mess)
- #
- # Main putreg : putreg.cpp ;
- rule Main
- {
- MainFromObjects $(<) : $(>) : main ;
- Objects $(>) ;
- }
-
- rule MainFromObjects
- {
- local name objName ;
- MakeName name : $(<) : exe : declare ;
- MakeName objName : $(>) : obj ;
-
- DEPENDS exe : $(name) ;
- DEPENDS $(name) : $(objName) ;
-
- Clean clean : $(name) ;
-
- if $(3) = main
- {
- SetFlag $(<) : exe : LINKFLAGS : $(LINKMAIN) ;
- SetFlag $(>) : obj : C++FLAGS : $(MAINCOMPILEFLAG) ;
- SetFlag $(>) : obj : CCFLAGS : $(MAINCOMPILEFLAG) ;
- }
- else
- {
- SetFlag $(<) : exe : LINKFLAGS : $(LINKAPPLICATION) ;
- SetFlag $(>) : obj : C++FLAGS : $(APPLICATIONCOMPILEFLAG) ;
- SetFlag $(>) : obj : CCFLAGS : $(APPLICATIOCOMPILEFLAG) ;
- }
-
- if $(DEBUGGING)
- {
- SetFlag $(<) : exe : PDBFILE : $(BINPATH)$(SLASH)$(name:S=.pdb) ;
- Clean clean : $(BINPATH)$(SLASH)$(name:S=.pdb) ;
- }
-
- Clean clean : $(BINPATH)$(SLASH)$(name:S=.map) ;
- Clean clean : $(BINPATH)$(SLASH)$(name:S=.pdb) ;
- Clean clean : $(BINPATH)$(SLASH)$(name:S=.ilk) ;
- Clean clean : $(BINPATH)$(SLASH)$(name:S=.exp) ;
- Clean clean : $(BINPATH)$(SLASH)$(name:S=.lib) ;
-
- if ! $(NOLINK)
- {
- Link $(name) : $(objName) ;
- }
- }
-
- # Tell jam where a file goes, and make sure the directory exists.
- rule MakeLocate
- {
- if $(>)
- {
- LOCATE on $(<) = $(>) ;
- Depends $(<) : $(>[1]) ;
- MkDir $(>[1]) ;
- }
- }
-
- # Make sure a directory exists. Note that this is gated, so you
- # can safely call it more than once on the same directory.
- rule MkDir
- {
- if $(<) != $(DOT) && ! $($(<)-mkdir)
- {
- local s ;
-
- # Cheesy gate to prevent multiple invocations on same dir
- # MkDir1 has the actions
- # If dir exists, don't update it
- # Arrange for jam dirs
-
- $(<)-mkdir = true ;
- MkDir1 $(<) ;
- NOUPDATE $(<) ;
- Depends dirs : $(<) ;
-
- # Recursively make parent directories.
- # $(<:P) = $(<)'s parent, & we recurse until root
-
- s = $(<:P) ;
-
- if $(NT)
- {
- switch $(s)
- {
- case *: : s = ;
- case *:\\ : s = ;
- }
- }
-
- if $(s) && $(s) != $(<)
- {
- Depends $(<) : $(s) ;
- MkDir $(s) ;
- }
- else if $(s)
- {
- NOTFILE $(s) ;
- }
- }
- else if $(<) = $(DOT)
- {
- NOUPDATE $(<) ;
- }
- }
-
- # Compile some file into a .obj
- #
- # This assigns the standard $(LOCATE_TARGET), $(SEARCH_SOURCE) stuff
- rule Object
- {
- local h ;
-
- # locate object and search for source, if wanted
-
- Clean clean : $(<) ;
-
- MakeLocate $(<) : $(LOCATE_TARGET) ;
- SEARCH on $(>) = $(SEARCH_SOURCE) ;
-
- # Save HDRS for -I$(HDRS) on compile.
-
- HDRS on $(<) = $(HDRS) $(SUBDIRHDRS) ;
-
- # handle #includes for source: Jam scans for headers with
- # the regexp pattern $(HDRSCAN) and then invokes $(HDRRULE)
- # with the scanned file as the target and the found headers
- # as the sources. HDRSEARCH is the value of SEARCH used for
- # the found header files. Finally, if jam must deal with
- # header files of the same name in different directories,
- # they can be distinguished with HDRGRIST.
-
- if ! $(FAST)
- {
- HDRRULE on $(>) = HdrRule ;
- HDRSCAN on $(>) = $(HDRPATTERN) ;
- HDRSEARCH on $(>) = $(HDRS) $(SUBDIRHDRS) $(STDHDRS) ;
- HDRGRIST on $(>) = $(HDRGRIST) ;
- }
-
- # if source is not .c, generate .c with specific rule
-
- switch $(>:S)
- {
- case .c : Cc $(<) : $(>) ;
- case .C : C++ $(<) : $(>) ;
- case .cc : C++ $(<) : $(>) ;
- case .cpp : C++ $(<) : $(>) ;
- case .cxx : C++ $(<) : $(>) ;
- case .imp : DBSchemaCompile $(<) : $(>) ;
- case * : EXIT "Unknown suffix" $(>:S) "in Object!" ;
- }
- }
-
- # Set flags. Even easier wrappers to SetFlag
- rule ObjectCcFlags { SetFlag $(<) : obj : CCFLAGS : $(>) ; }
- rule ObjectC++Flags { SetFlag $(<) : obj : C++FLAGS : $(>) ; }
- rule ObjectHdrs { SetFlag $(<) : obj : HDRS : $(>) ; }
-
- # This rule loops through the objects and builds them.
- # We build objects only once for a given
- # grist; note that one source file compiled with multiple
- # different flags (for example) should give two gristed names.
- rule Objects
- {
- local i s ;
-
- # Add grist to file names
- makeGristedName s : $(<) ;
-
- for i in $(s)
- {
- if ! $($(i)-object)
- {
- Object $(i:S=$(SUFOBJ)) : $(i) ;
- DEPENDS obj : $(i:S=$(SUFOBJ)) ;
- $(i)-object = true ;
- }
- }
- }
-
- # Say that an application depends on some compiled resources:
- #
- # Resources BhbJam : BhbJam.rc ;
- rule Resources
- {
- # Fully qualify the source and target names according to our convention.
- makeGristedName s : $(>) ;
-
- local te td ;
- MakeName te : $(<) : exe ;
- MakeName td : $(<) : dll ;
- local t = $(te) $(td) ;
-
- # Invoke the ResourceCompiler rule on each .rc file.
- for i in $(s)
- {
- local res = $(i:S=$(SUFRES)) ;
- ResourceCompiler $(res) : $(i) ;
- }
-
- # Specify the link-time dependency of the exe on the compiled resources.
- NEEDRES on $(t) += $(s:S=$(SUFRES)) ;
- DEPENDS $(t) : $(s:S=$(SUFRES)) ;
- }
-
- # This rule is to .rc files what the C++ rule is to .cpp files.
- rule ResourceCompiler
- {
- MakeLocate $(<) : $(LOCATE_TARGET) ;
- SEARCH on $(>) = $(SEARCH_SOURCE) ;
-
- if ! $(FAST)
- {
- HDRRULE on $(>) = HdrRule ;
- HDRSCAN on $(>) = $(HDRPATTERN) ;
- HDRSEARCH on $(>) = $(SEARCH_SOURCE) $(HDRS) $(SUBDIRHDRS) $(STDHDRS) ;
- HDRGRIST on $(>) = $(HDRGRIST) ;
- }
-
- RCFLAGS on $(<) += $(RCFLAGS) ;
- SUBDIRRCFLAGS on $(<) += $(SUBDIRRCFLAGS) ;
-
- Clean clean : $(<) ;
- DEPENDS $(<) : $(>) ;
- }
-
- # Set some resource compilation flags
- #
- # ResourceFlags BhbJam.rc : -I../mfctool ;
- rule ResourceFlags
- {
- SetFlag $(<) : res : RCFLAGS : $(>) ;
- }
-
- rule RmTemps
- {
- TEMPORARY $(>) ;
- }
-
- # Add to the subdirectories of the current directory where jam
- # will go looking for your source files.
- rule Search
- {
- SEARCH_SOURCE += $(SUBDIR)$(SLASH)$(<) ;
- }
-
- rule SubDirCcFlags
- {
- SUBDIRCCFLAGS += $(<) ;
- }
-
- rule SubDirC++Flags
- {
- SUBDIRC++FLAGS += $(<) ;
- }
-
- rule SubDirHdrs
- {
- SUBDIRHDRS += $(<) ;
- }
-
- rule SubInclude
- {
- local s ;
-
- # That's
- # SubInclude TOP d1 [ d2 [ d3 [ d4 ] ] ]
- #
- # to include a subdirectory's Jamfile.
-
- if ! $($(<[1]))
- {
- EXIT Top level of source tree has not been set with $(<[1]) ;
- }
-
- makeDirName s : $(<[2-]) ;
-
- include $(JAMFILE:D=$(s):R=$($(<[1]))) ;
- }
-
- rule UserSubDir
- {
- #
- # d1 ... are the directory elements that lead to this directory
- # from $(TOP). We construct the system dependent path from these
- # directory elements in order to set search&locate stuff.
- #
-
- # Get path to current directory from root using makeSubDir.
- # Save dir tokens for other potential uses.
-
- makeDirName s : $(<[2-]) ;
- SUBDIR = $(s:R=$($(<[1]))) ;
- SUBDIR_TOKENS = $(<[2-]) ;
-
- # Now set up SEARCH_SOURCE, LOCATE_TARGET, SOURCE_GRIST
- # These can be reset if needed. For example, if the source
- # directory should not hold object files, LOCATE_TARGET can
- # subsequently be redefined.
-
- SEARCH_SOURCE = $(SUBDIR) ;
- LOCATE_SOURCE = $(ALL_LOCATE_TARGET) $(SUBDIR) ;
- LOCATE_TARGET = $(SUBDIR)$(SLASH)$(ARCHDIR) ;
- makeGrist SOURCE_GRIST : $(<[2-]) ;
-
- # Reset per-directory ccflags, hdrs
-
- SUBDIRCCFLAGS = ;
- SUBDIRC++FLAGS = ;
- SUBDIRHDRS = ;
- SUBDIR_PCH_FILE = ;
- SUBDIR_PCH_END = ;
-
- SUBDIR_RCFLAGS = ;
- }
-
- # ----------
- # Actions
- # ----------
-
- # We should make sure the timestamp of the the target is the same as the
- # the timestamp of the dependency, so we don't rebuild it by mistake
- actions quietly BuiltByBuildOf
- {
- touch -cf $(>) $(<)
- }
-
- actions together JamPackage
- {
- sh $(TOP)/tools/makepackage.sh $(PACKAGENAME) $(>) > $(<)
- }
-
- if ! $(JIKESPATH)
- {
- actions JavaC
- {
- cd $(SUBDIR)
- javac $(JAVAFLAGS) -classpath "$(CLASSPATH)" -sourcepath "$(JAVAROOT:R=$(PWD))" -J-Xmx256m $(>:BS)
- }
- }
- else
- {
- # note the use of the shell's JIKESPATH, not ours -- because otherwise
- # jam would split it.
- JIKESPATHQUOTE = "$JIKESPATH" ;
- actions together JavaC
- {
- cd $(JAVAROOT)
- if jikes $(JAVAFLAGS) -classpath "$(JAVAROOT:R=$(PWD))$(SPLITPATH)$(CLASSPATH)$(SPLITPATH)$(JIKESPATHQUOTE)" -Xdepend $(>:R=$(PWD))
- then
- exit 0
- else
- rm -f $(<)
- fi
- }
- }
-
- actions Jar
- {
- rm -f $(<:R=$(JAVAROOT):S=.jar)
- touch $(<:R=$(JAVAROOT):S=.jar)
-
- function doPackage
- $(LCURLY)
- package=$1
- path=$2
- dir=`echo $package | sed s,\\\\.,/,g`
- (
- cd $path
- find $dir $(JARPATTERNS) | xargs jar uf $(<:R=$(JAVAROOT):S=.jar)
- )
- $(RCURLY)
-
- for pkg in $(2)
- do
- doPackage $pkg $(JAVAROOT)
- done
-
- if [ " $(JARHAS3RDPARTY) " = " true " ]
- then
- for pkg in $(JAR3RDPARTY)
- do
- doPackage $pkg $(JAVA3RDPARTYROOT)
- done
- fi
- }
-
-
- actions JarPersistable
- {
- rm -f $(<:R=$(JAVAROOT):S=.jar)
- touch $(<:R=$(JAVAROOT):S=.jar)
- rm -f $(<:R=$(JAVAROOT):S=.temp.jar)
- touch $(<:R=$(JAVAROOT):S=.temp.jar)
- rm -rf $(<:R=$(JAVAROOT):S=.osjitemp)
- mkdir $(<:R=$(JAVAROOT):S=.osjitemp)
-
- function doPackage
- $(LCURLY)
- package=$1
- path=$2
- dir=`echo $package | sed s,\\\\.,/,g`
- class=`echo $dir.class`
- (
- cd $path
- jar uf $(<:R=$(JAVAROOT):S=.temp.jar) $class
- )
- $(RCURLY)
-
- for pkg in $(2)
- do
- doPackage $pkg $(JAVAROOT)
- done
-
- if [ " $(JARHAS3RDPARTY) " = " true " ]
- then
- for pkg in $(JAR3RDPARTY)
- do
- doPackage $pkg $(JAVA3RDPARTYROOT)
- done
- fi
-
- # must set the classpath for OSJI to run properly. This next line sux and should go.
- # if anyone thinks of a good way to get rid of it, go for it.
- export CLASSPATH=$(CLASSPATH)
- $(OSJI_HOME)/bin/osjcfp -dest $(<:R=$(JAVAROOT):S=.osjitemp) -classpath $(CLASSPATH) -quiet $(<:R=$(JAVAROOT):S=.temp.jar)
-
- # now take osji's results and put them in the actual jar file, then clean up.
- cd $(<:R=$(JAVAROOT):S=.osjitemp)
- find . -name "*.class" -print | xargs jar uf $(<:R=$(JAVAROOT):S=.jar)
- cd $(JAVAROOT)
- rm -rf $(<:R=$(JAVAROOT):S=.osjitemp)
- rm -f $(<:R=$(JAVAROOT):S=.temp.jar)
- }
-
-
- actions Jode
- {
- cd $(JAVAROOT)
- java -cp ".$(SPLITPATH)$(CLASSPATH)$(SPLITPATH)$(TOP:R=$(PWD))/tools/jode.jar" jode.obfuscator.Main $(>)
- if [ $? = 0 ] && ! [ " $(JARHASEXTRAS) " = " true " ]
- then
- find . $(JAREXTRAS) | xargs jar uf $(<:R=$(JAVAROOT):S=.jar)
- fi
- exit $?
- }
-
- actions Tar
- {
- find $(TOP) $(TARPATTERNS) | xargs tar czf $(<:R=$(TOP):S=.tar.gz)
- }
-
- actions piecemeal together existing Clean
- {
- $(RM) $(>)
- }
-
- actions piecemeal together CleanMany
- {
- $(RM) $(>)
- }
-
- actions File
- {
- $(RM) $(<)
- $(CP) $(>) $(<)
- }
-
- actions GenFile1
- {
- $(>[1]) $(<) $(>[2-])
- }
-
- actions MkDir1
- {
- $(MKDIR) $(<)
- }
-
- actions quietly RmFile
- {
- $(RM) $(<)
- }
-
- actions quietly updated piecemeal together RmTemps
- {
- $(RM) $(>)
- }
-
- actions SchComp
- {
- # cd to where the target files go (we know that's writable)
- cd $(LOCATE_TARGET)
- # run schcomp
- if schcomp $(OPTIM) $(C++FLAGS) -I$(HDRS:R=$(PWD)) $(>:R=$(PWD))
- then
- # that just made .sch and .cxx in locate-target. hopefully they go there.
-
- # OK, the schema compiler erased some all important stuff from xstring.
- # put it back
- sed \
- -e '/^#line 603 .*xstring"$/ {' \
- -e ' n' \
- -e ' /^#pragma warning(disable:4231)$/ {' \
- -e ' r $(TOP:R=$(PWD))/tools/stringexport.h' \
- -e ' }' \
- -e '}' \
- < $(>:B).cxx > $(>:B).tmp
-
- # remove #line directives, which seem to choke the compiler...
- sed 's:^#line://#line:' < $(>:B).tmp > $(>:B).cxx
- rm -f $(>:B).tmp
- else
- exit 1
- fi
- }
-
- # ----------
- # Platform Actions
- # ----------
-
- if $(NT)
- {
- actions Cc bind PCHFILE
- {
- $(CC) /c $(OPTIM) /I$(HDRS) $(CCFLAGS) /Fo$(<[1]) /Fp$(PCHFILE) /Tc$(>[1) /Fd$(PDBFILE)
- }
-
- actions C++ bind PCHFILE
- {
- $(C++) /c $(OPTIM) /I$(HDRS) $(C++FLAGS) /Fo$(<[1]) /Fp$(PCHFILE) /Tp$(>[1]) /Fd$(PDBFILE)
- }
-
- # we need to CD to where the object files are so we don't have to give the
- # full path names of the objects (notice the $(>:BS)) -- otherwise
- # the linker internally runs out of room and dies...
- actions Link bind NEEDLIBS NEEDRES DEFFILE
- {
- cd $(LOCATE_TARGET)
- $(LINK) $(LINKFLAGS) /def:$(DEFFILE:R=$(PWD)) /out:$(<:R=$(PWD)) $(NEEDRES:R=$(PWD)) /pdb:$(PDBFILE:R=$(PWD)) $(UNDEFS) $(>:BS) $(LINKLIBS) $(NEEDLIBS:R=$(PWD)) /LIBPATH:$(3RDPARTYLIB:R=$(PWD))
- }
-
- # nt links libraries in the same way as dlls and exes
- rule LinkStaticLibrary
- {
- Link $(<) : $(>) ;
- }
-
- actions DefHeader
- {
- echo LIBRARY $(<:B)$(BHBVERSION)$(ARCH) > $(<)
- echo >> $(<)
- echo EXPORTS >> $(<)
- }
-
- actions piecemeal DefSymbols
- {
- cd $(SUBDIR)$(SLASH)$(ARCHDIR)
- sh $(TOP:R=$(PWD))/tools/exportsymbols.sh $(>:BS) >> $(<:R=$(PWD))
- }
-
- actions ResourceCompiler
- {
- $(RC) /fo $(<) $(RCFLAGS) $(UNITTESTFLAGS) $(SUBDIRRCFLAGS) $(>)
- }
-
- actions BrowseInfo
- {
- bscmake /nologo /n /o$(<) $(TOP)/browse/*.sbr
- }
-
- if $(BROWSE)
- {
- BrowseInfo $(TOP)$(SLASH)bin$(SLASH)browse.bsc ;
- }
- }
- else
- {
- actions Cc
- {
- $(C++) -c $(C++FLAGS) $(OPTIM) -I$(HDRS) -o $(<) $(>)
- }
-
- actions C++
- {
- $(C++) -c $(C++FLAGS) $(OPTIM) -I$(HDRS) -o $(<) $(>)
- }
-
- actions Link
- {
- $(LINK) $(LINKFLAGS) -o $(<) $(UNDEFS) $(>) $(NEEDLIBS) $(LINKIBS)
- }
-
- actions together LinkStaticLibrary
- {
- $(C++) $(ARCHIVEFLAGS) -o $(<) $(>) ;
- }
-
- actions BrowseInfo
- {
- bscmake /nologo /n /o$(<) $(TOP)/browse/*.sbr
- }
-
- if $(BROWSE)
- {
- BrowseInfo $(TOP)$(SLASH)bin$(SLASH)browse.bsc ;
- }
- }
-
- #
- # Compatibility
- #
- rule BhbLibrary { Library $(<) : $(>) ; }
- rule BhbDefLibrary { Library $(<) : $(>) ; }
- rule BhbDefLibrary { Library $(<) : $(>) ; }
- rule BhbDLLDebugLibraries { LinkLibraries $(<) : $(>) : $(3) ; }
- rule BhbDLLDebugDefine { DefineForDLL $(<) : $(>) ; }
- rule BhbDLLLibraries { LinkLibraries $(<) : $(>) : $(3) ; }
- rule BhbDefine { Define $(<) : $(>) ; }
- rule BhbLinkFlags
- {
- SetFlag $(<) : exe : LINKFLAGS : $(>) ;
- SetFlag $(<) : dll : LINKFLAGS : $(>) ;
- }
- rule BhbDLLLinkFlags { SetFlag $(<) : dll : LINKFLAGS : $(>) ; }
- rule NTSucks_ReorderLibraries
- {
- if $(NT)
- {
- if $(CF) = debug
- {
- BhbLinkFlags $(<) :
- /nodefaultlib:msvcrtd
- /nodefaultlib:libcmtd
- msvcrtd.lib
- libcmtd.lib
- ;
- }
- else if $(CF) = release
- {
- BhbLinkFlags $(<) :
- /nodefaultlib:msvcrt
- /nodefaultlib:libcmt
- msvcrt.lib
- libcmt.lib
- ;
- }
- else if $(CF) = rbug
- {
- BhbLinkFlags $(<) :
- /nodefaultlib:msvcrt
- /nodefaultlib:libcmt
- msvcrt.lib
- libcmt.lib
- ;
- }
- }
- }
- rule BhbMain { Main $(<) : $(>) ; }
- rule BhbApplication { Application $(<) : $(>) ; }
- rule BhbLinkLibraries { LinkLibraries $(<) : $(>) : $(3) ; }
- rule BhbDynamicLibrary { DynamicLibrary $(<) : $(>) ; }
- rule BhbStaticLibrary { StaticLibrary $(<) : $(>) ; }
- rule BhbExeExportLibrary { ExportLibrary $(<) : $(>) ; }
- rule InstallProgram { Install $(<) : exe : $(2) : $(3) ; }
- rule InstallDLL { Install $(<) : dll : $(2) : $(3) ; }
- rule InstallFiles { Install $(<) : installFile : $(2) : $(3) ; }
- rule BhbResources { Resources $(<) : $(>) ; }
- rule BhbSearch { Search $(<) ; }
-