* Added a Bison and a LexC++ rule.

* Override the Jambase version of the Object rule to optionally generate
  intermediate .cpp instead of .c files for .y and .l input. The
  GENERATE_C++ variable must be set to enable that behavior.
* Added a ResComp rule using the shiny new rc to compile .rdef files into
  .rsrc files.
* Adjusted AddResources to accept both, .rsrc and .rdef files. The rule
  also grists the input files now, avoiding problems with equally named
  resource files in different directories.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2739 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2003-02-17 17:08:34 +00:00
parent cf838755a9
commit 8d3308d9aa
+123 -4
View File
@@ -183,6 +183,57 @@ rule SetupR5Includes
# Things Jam needs in order to work :)
#-------------------------------------------------------------------------------
rule Object
{
# This is basically the original Jambase 2.4 Object rule stripped by
# comments. Only the final switch statement has been changed to allow
# intermediate C++ files for Yacc and Lex.
LocalClean clean : $(<) ;
MakeLocate $(<) : $(LOCATE_TARGET) ;
SEARCH on $(>) = $(SEARCH_SOURCE) ;
HDRS on $(<) = $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) ;
HDRRULE on $(>) = HdrRule ;
HDRSCAN on $(>) = $(HDRPATTERN) ;
HDRSEARCH on $(>) =
$(SEARCH_SOURCE:E) $(SUBDIRHDRS) $(HDRS) $(STDHDRS) ;
HDRGRIST on $(>) = $(HDRGRIST) ;
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 : if [ on $(2) return $(GENERATE_C++) ] {
C++ $(<) : $(<:S=.cpp) ;
LexC++ $(<:S=.cpp) : $(>) ;
} else {
Cc $(<) : $(<:S=.c) ;
Lex $(<:S=.c) : $(>) ;
}
case .s : As $(<) : $(>) ;
case .y : if [ on $(2) return $(GENERATE_C++) ] {
C++ $(<) : $(<:S=.cpp) ;
Bison $(<:S=.cpp) : $(>) ;
} else {
Cc $(<) : $(<:S=$(YACCGEN)) ;
Yacc $(<:S=$(YACCGEN)) : $(>) ;
}
case * : UserObject $(<) : $(>) ;
}
}
rule UserObject
{
switch $(2)
@@ -665,22 +716,23 @@ rule MergeObject
rule SharedLibraryFromObjects
{
# SharedLibraryFromObjects <name> : <objects> ;
# SharedLibraryFromObjects <name> : <objects> : <libraries> ;
local _lib = lib$(1).so ;
MainFromObjects $(_lib) : $(2) ;
MakeLocate $(_lib) : $(OBOS_SHLIB_DIR) ;
LINKFLAGS on $(_lib) = [ on $(_lib) return $(LINKFLAGS) ]
-nostart -Xlinker -soname=\"$(_lib)\" ;
LinkSharedOSLibs $(_lib) : $(3) ;
}
rule SharedLibrary
{
# SharedLibrary <name> : <sources> ;
# SharedLibrary <name> : <sources> : <libraries> ;
SetupIncludes ;
SetupObjectsDir ;
MakeLocateObjects $(2) ;
Objects $(2) ;
SharedLibraryFromObjects $(1) : $(2:S=$(SUFOBJ)) ;
SharedLibraryFromObjects $(1) : $(2:S=$(SUFOBJ)) : $(3) ;
}
rule LinkSharedOSLibs
@@ -731,8 +783,37 @@ rule AddResources
{
# AddResources <name> : <resourcefiles> ;
local resfiles = [ FGristFiles $(2) ] ;
SEARCH on $(resfiles) += $(SEARCH_SOURCE) ;
for file in $(resfiles) {
if $(file:S) = .rdef {
local rdef = $(file) ;
file = $(rdef:S=.rsrc) ;
ResComp $(file) : $(rdef) ;
}
RESFILES on $(1) += $(file) ;
}
}
rule ResComp
{
# ResComp <resource file> : <rdef file> ;
#
# <resource file> and <rdef file> must be gristed.
SetupObjectsDir ;
SEARCH on $(2) += $(SEARCH_SOURCE) ;
RESFILES on $(1) += $(2) ;
MakeLocate $(1) : $(LOCATE_TARGET) ;
Depends $(1) : $(2) rc ;
LocalClean clean : $(1) ;
ResComp1 $(1) : rc $(2) ;
}
actions ResComp1
{
$(2[1]) -o $(1:S=) $(2[2-])
}
rule SourceHdrs
@@ -1034,6 +1115,9 @@ rule SetupObjectsDir
# do not want to include that :)
rel_objectsdir = [ FDirName $(SUBDIR_TOKENS[2-]) ] ;
LOCATE_TARGET = [ FDirName $(OBOS_OBJECT_TARGET) $(rel_objectsdir) ] ;
LOCATE_SOURCE = $(LOCATE_TARGET) ;
SEARCH_SOURCE = [ Filter $(SEARCH_SOURCE) : $(LOCATE_TARGET) ]
$(LOCATE_TARGET) ;
}
#-------------------------------------------------------------------------------
@@ -1056,6 +1140,41 @@ actions Link bind NEEDLIBS
$(LINK) $(LINKFLAGS) -o "$(1)" $(UNDEFS) "$(2)" "$(NEEDLIBS)" $(LINKLIBS) ;
}
rule LexC++
{
Depends $(1) : $(2) ;
MakeLocate $(1) : $(LOCATE_SOURCE) ;
LocalClean clean : $(1) ;
}
actions LexC++
{
$(LEX) -o$(1) $(2)
}
rule Bison
{
local _h ;
_h = $(1).h ;
MakeLocate $(<) $(_h) : $(LOCATE_SOURCE) ;
Depends $(<) $(_h) : $(>) ;
Bison1 $(<) $(_h) : $(>) ;
LocalClean clean : $(<) $(_h) ;
# make sure someone includes $(_h) else it will be
# a deadly independent target
Includes $(<) : $(_h) ;
}
actions Bison1
{
bison $(YACCFLAGS) -o $(1[1]) $(2)
}
# BeOS specific rules
rule XRes