bullet3/mk/jam/objects.jam

251 lines
7.5 KiB
Plaintext
Raw Normal View History

#============================================================================
# Rules for compiling a set of sources to object files
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
#
# This library is free software; you can redistribute it and/or modify it
# under the terms of the GNU Library General Public License as published by
# the Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This library is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
# License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this library; if not, write to the Free Software Foundation,
# Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#============================================================================
# These are slightly modified versions of the Object and Objects rules from
# jam. The problem with the original rules in Jambase is the handling of
# custom file types. The solution with the UserObject rule is monolithic, you
# can only have 1 such rule. Thus we construct a more flexible toolkit here
# which let's you register rules for certain filetypes.
## RegisterFileType Rulename : extensions
## Register a rule which is used to compile a filetype into object
## files. The registered rule is called with the name of the
## sourcefile as argument and should return a list of objectfiles which are
## created. You should set the grist of the object files by using the
## DoObjectGrist function.
rule RegisterFileType
{
local suffix ;
for suffix in $(>)
{
FILETYPE_$(suffix) = $(<) ;
}
}
## RegisterHeaderRule rulename : regexpattern : extensions
## Registers a rule and a regular expression which will be used for header
## file scanning of the specified extensions.
rule RegisterHeaderRule
{
local suffix ;
for suffix in $(3)
{
HDRRULE_$(suffix) = $(<) ;
HDRPATTERN_$(suffix) = $(>) ;
}
}
## CompileObjects sources [: objectfileprefix]
## Compile a set of sourcefiles into objectfiles (extension: SUFOBJ,
## usually .o). This rule takes care of setting the SEARCH and LOCATE
## variables to the values of $(SEARCH_SOURCE) and $(LOCATE_TARGET).
## The Application, Plugin and Library rules already use this rule
## internally. You should only use this rule if you have to avoid the
## Application, Plugin or Library rules.
rule CompileObjects
{
local source ;
local targets ;
# Search the source
SEARCH on $(<) = $(SEARCH_SOURCE) ;
for source in $(<)
{
# compile the sourcefile to targetfile
targets += [ CompileObject $(source) : $(>) ] ;
}
# locate the targets
MakeLocate $(targets) : $(LOCATE_TARGET) ;
return $(targets) ;
}
## PrefixSuffix [prefix] : filename : suffix
## Replaces the suffix of 'filename' with 'suffix' and prepends 'prefix' to
## it.
rule PrefixSuffix
{
local prefix = $(1) ;
local name = $(2) ;
local suffix = $(3) ;
if ! $(prefix) { prefix = "" ; }
return $(name:B=$(prefix)$(name:B):S=$(suffix)) ;
}
#----------------------------------------------------------------------------
# private part
# helper rule: Compiles a source file to an object file. Does header file
# scanning, sets LOCATE and SEARCH for source and target, grists the files
# with the current subdir and searches for the correct registered rule.
rule CompileObject
{
# 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).
if $(HDRRULE_$(<:S))
{
HDRSEARCH on $(<) =
$(SEARCH_SOURCE:E) $(SUBDIRHDRS) $(HDRS) $(STDHDRS) ;
HDRGRIST on $(<) = $(HDRGRIST) ;
HDRRULE on $(<) = $(HDRRULE_$(<:S)) ;
HDRSCAN on $(<) = $(HDRPATTERN_$(<:S)) ;
}
local targets ;
# Invoke filetype specific rule
if $(FILETYPE_$(<:S))
{
targets = [ $(FILETYPE_$(<:S)) $(<) : $(>) ] ;
}
else
{
echo Warning: no rules for file type $(<:S) defined (at file $(<)). ;
}
if $(targets)
{
# construct clean target
Clean clean : $(targets) ;
# 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) ;
# propagate target specific-defines
DEFINES on $(<) += $(DEFINES) ;
}
return $(targets) ;
}
## HeaderRule source : headers
## This rule is the default header rule used by the objects rules. You
## might register custom rules with the RegisterHeaderRule rule.
rule HeaderRule
{
# 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 = $(>:G=$(HDRGRIST:E)) ;
Includes $(<) : $(s) ;
SEARCH on $(s) = $(HDRSEARCH) ;
NoCare $(s) ;
local i ;
for i in $(s)
{
HDRGRIST on $(i) = $(HDRGRIST) ;
HDRSEARCH on $(i) = $(HDRSEARCH) ;
HDRRULE on $(i) = [ on $(<) GetVar HDRRULE ] ;
HDRSCAN on $(i) = [ on $(<) GetVar HDRPATTERN ] ;
}
}
if $(JAMVERSION) < 2.5
{
## XXX XXX XXX a bug in jam 2.4 let's the version above fail. I'll let this
## non-optimal version in here until jam 2.5 is out.
rule HeaderRule
{
local s = $(>:G=$(HDRGRIST:E)) ;
Includes $(<) : $(s) ;
SEARCH on $(s) = $(HDRSEARCH) ;
NoCare $(s) ;
local i ;
for i in $(s)
{
if $(HDRRULE_$(i:S))
{
HDRGRIST on $(i) = $(HDRGRIST) ;
HDRSEARCH on $(i) = $(HDRSEARCH) ;
HDRRULE on $(i) = $(HDRRULE_$(i:S)) ;
HDRSCAN on $(i) = $(HDRPATTERN_$(i:S)) ;
}
else if $(JAM_DEBUG)
{
#echo "No Header rule for $(i:S) file $(i) " ;
}
}
}
} # end of if $(JAMVERSION) < 1.5
# Dummy rule: .o files are used as is.
rule UseObjectFile
{
return $(<) ;
}
RegisterFileType UseObjectFile : .o ;
# Ignore header files.
rule UseHeaderFile
{
return ;
}
RegisterFileType UseHeaderFile : .h .hpp ;
RegisterHeaderRule HeaderRule : $(HDRPATTERN) : .h .hpp .inc ;
# Generates a grist suitable for output objects based on
# SUBVARIANT and SUBDIR variable.
rule DoObjectGrist
{
return $(<:G=$(SOURCE_GRIST:E)!$(SUBVARIANT:J=!)) ;
}
# Generates a grist suitable for source files based on SUBDIR variable.
# Doesn't change an existing grist.
rule DoSourceGrist
{
local gristed ;
for g in $(<)
{
local grist ;
if $(g:G)
{
grist = $(g:G) ;
}
gristed += $(g:G=$(grist:E=$(SOURCE_GRIST:E))) ;
}
return $(gristed) ;
}