Chat-O-Matic/build/jam/OverriddenJamRules
2010-05-07 09:47:10 +00:00

219 lines
5.3 KiB
Plaintext

# OverriddenJamRules
#
# Jam rules that need to be overridden for good reasons.
# Overridden to allow for spaces in file names and to support resources.
# Also set the on target LINKFLAGS variable to prevent later changes to
# the global variable from having an effect on the setting for the target.
rule Link
{
local dbg = [ on $(1) return $(DEBUG) ] ;
if $(STRIP_APPS) && $(STRIP_APPS) != 0 && (!$(dbg) || $(dbg) = 0) {
# strip app if requested so and if not in debug mode!
Strip $(1) ;
}
# Note: RESFILES must be set before invocation.
MODE on $(1) = $(EXEMODE) ;
on $(1) XRes $(1) : $(RESFILES) ;
Chmod $(1) ;
MimeSet $(1) ;
LINKFLAGS on $(1) = [ on $(1) return $(LINKFLAGS) ] ;
}
actions Link bind NEEDLIBS
{
$(LINK) $(LINKFLAGS) -o "$(1)" $(UNDEFS) "$(2)" "$(NEEDLIBS)" $(LINKLIBS)
}
# Overridden to allow for spaces in file names.
actions Chmod1
{
$(CHMOD) "$(MODE)" "$(1)"
}
# Overridden to allow for spaces in file names.
actions piecemeal together existing Clean
{
$(RM) -rf "$(>)"
}
# Changes to rules for sake of discrimination between system and non-system
# headers.
if $(OSPLAT) = X86 {
if $(IS_GCC4_PLATFORM) = 1 {
HDRS_INCLUDES_SEPARATOR = -iquote- ;
} else {
HDRS_INCLUDES_SEPARATOR = -I- ;
}
} else {
HDRS_INCLUDES_SEPARATOR = -i- ;
}
rule Cc
{
Depends $(<) : $(>) ;
# If the compiler's -o flag doesn't work, relocate the .o
if $(RELOCATE)
{
CcMv $(<) : $(>) ;
}
# Just to clarify here: this sets the per-target CCFLAGS to
# be the current value of (global) CCFLAGS and SUBDIRCCFLAGS.
# CCHDRS and CCDEFS must be reformatted each time for some
# compiles (VMS, NT) that malign multiple -D or -I flags.
CCFLAGS on $(<) += $(CCFLAGS) $(SUBDIRCCFLAGS) $(OPTIM) ;
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ]
$(HDRS_INCLUDES_SEPARATOR) [ on $(<) FSysIncludes $(SYSHDRS) ] ;
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
}
rule C++
{
Depends $(<) : $(>) ;
if $(RELOCATE)
{
CcMv $(<) : $(>) ;
}
C++FLAGS on $(<) += $(C++FLAGS) $(SUBDIRC++FLAGS) $(OPTIM) ;
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ]
$(HDRS_INCLUDES_SEPARATOR) [ on $(<) FSysIncludes $(SYSHDRS) ] ;
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
}
rule Object
{
# locate object and search for source, if wanted
Clean clean : $(<) ;
MakeLocate $(<) : $(LOCATE_TARGET) ;
SEARCH on $(>) = $(SEARCH_SOURCE) ;
# Save HDRS for -I$(HDRS) on compile.
# We shouldn't need -I$(SEARCH_SOURCE) as cc can find headers
# in the .c file's directory, but generated .c files (from
# yacc, lex, etc) are located in $(LOCATE_TARGET), possibly
# different from $(SEARCH_SOURCE).
HDRS on $(<) = $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) ;
SYSHDRS on $(<) = $(SUBDIRSYSHDRS) $(SYSHDRS) ;
# 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.
# $(SEARCH_SOURCE:E) is where cc first looks for #include
# "foo.h" files. If the source file is in a distant directory,
# look there. Else, look in "" (the current directory).
HDRRULE on $(>) = HdrRule ;
HDRSCAN on $(>) = $(HDRPATTERN) ;
HDRSEARCH on $(>) =
$(SEARCH_SOURCE:E) $(SUBDIRHDRS) $(HDRS) $(SYSHDRS) $(STDHDRS) ;
HDRGRIST on $(>) = $(HDRGRIST) ;
# propagate target specific-defines
DEFINES on $(<) += $(DEFINES) ;
# if source is not .c, generate .c with specific rule
switch $(>:S)
{
case .asm : As $(<) : $(>) ;
case .c : Cc $(<) : $(>) ;
case .C : C++ $(<) : $(>) ;
case .cc : C++ $(<) : $(>) ;
case .cpp : C++ $(<) : $(>) ;
case .f : Fortran $(<) : $(>) ;
case .l : Cc $(<) : $(<:S=.c) ;
LexC++ $(<:S=.c) : $(>) ;
case .s : As $(<) : $(>) ;
case .y : Cc $(<) : $(<:S=.c) ;
Bison $(<:S=.c) : $(>) ;
case * : UserObject $(<) : $(>) ;
}
}
rule ObjectHdrs
{
local s ;
for s in [ FGristFiles $(<:S=$(SUFOBJ)) ] {
HDRS on $(s) += $(>) ;
CCHDRS on $(s) = [ on $(s) FIncludes $(HDRS) ]
$(HDRS_INCLUDES_SEPARATOR) [ on $(s) FSysIncludes $(SYSHDRS) ] ;
}
}
# Override Jam 2.5rc3 MakeLocate and MkDir to deal more intelligently
# with grist set on the supplied directory name.
rule MakeLocate
{
if $(2[1])
{
local dir = $(2[1]) ;
if ! $(dir:G) {
dir = $(dir:G=dir) ;
}
LOCATE on $(1) = $(dir:G=) ;
Depends $(1) : $(dir) ;
MkDir $(dir) ;
}
}
rule MkDir
{
# If dir exists, don't update it
# Do this even for $(DOT).
local dir = $(<) ;
if ! $(dir:G) {
dir = $(dir:G=dir) ;
}
NoUpdate $(dir) ;
if $(dir:G=) != $(DOT) && ! $($(dir:G=)-mkdir) {
local s ;
# Cheesy gate to prevent multiple invocations on same dir
# MkDir1 has the actions
# Arrange for jam dirs
$(dir:G=)-mkdir = true ;
MkDir1 $(dir) ;
Depends dirs : $(dir) ;
# Recursively make parent directories.
# $(dir:P) = $(dir)'s parent, & we recurse until root
s = $(dir:P) ; # parent keeps grist
if $(s:G=) && $(s) != $(dir) {
Depends $(dir) : $(s) ;
MkDir $(s) ;
} else if $(s) {
NotFile $(s) ;
}
}
}
# Add SUBDIRSYSHDRS to the variables that shall be reset automatically by the
# SubDir rule.
SUBDIRRESET += SYSHDRS ;