Merged changes from branch build_system_redesign at revision 14573.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14574 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,463 @@
|
||||
|
||||
rule AddSharedObjectGlueCode
|
||||
{
|
||||
# AddSharedObjectGlueCode <target> : <isExecutable> ;
|
||||
|
||||
# we link with -nostdlib and add the required libs manually, when building
|
||||
# for Haiku
|
||||
if [ on $(1) return $(PLATFORM) ] = haiku {
|
||||
local stdLibs = libroot.so ;
|
||||
local beginGlue ;
|
||||
local endGlue ;
|
||||
if $(2) = true {
|
||||
beginGlue += $(HAIKU_EXECUTABLE_BEGIN_GLUE_CODE) ;
|
||||
endGlue += $(HAIKU_EXECUTABLE_END_GLUE_CODE) ;
|
||||
} else {
|
||||
beginGlue += $(HAIKU_LIBRARY_BEGIN_GLUE_CODE) ;
|
||||
endGlue += $(HAIKU_LIBRARY_END_GLUE_CODE) ;
|
||||
|
||||
# special case for libroot: don't link it against itself
|
||||
if $(1) = libroot.so {
|
||||
stdLibs = ;
|
||||
}
|
||||
}
|
||||
|
||||
LINK_BEGIN_GLUE on $(1) = $(beginGlue) ;
|
||||
LINK_END_GLUE on $(1) = $(endGlue) ;
|
||||
|
||||
NEEDLIBS on $(1) = $(stdLibs) [ on $(1) return $(NEEDLIBS) ] ;
|
||||
Depends $(1) : $(stdLibs) $(beginGlue) $(endGlue) ;
|
||||
LINKFLAGS on $(1) = [ on $(1) return $(LINKFLAGS) ] -nostdlib ;
|
||||
}
|
||||
}
|
||||
|
||||
rule Executable
|
||||
{
|
||||
# Executable <name> : <sources> : <libraries> : <res> ;
|
||||
#
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
AddResources $(1) : $(4) ;
|
||||
Main $(1) : $(2) ;
|
||||
LinkAgainst $(1) : $(3) ;
|
||||
LINKFLAGS on $(1) = [ on $(1) return $(LINKFLAGS) ]
|
||||
-Xlinker -soname=_APP_ ;
|
||||
|
||||
# we link with -nostdlib and add the required libs manually, when building
|
||||
# for Haiku
|
||||
AddSharedObjectGlueCode $(1) : true ;
|
||||
}
|
||||
|
||||
rule Application
|
||||
{
|
||||
# Application <name> : <sources> : <libraries> : <res> ;
|
||||
Executable $(1) : $(2) : $(3) : $(4) ;
|
||||
}
|
||||
|
||||
rule BinCommand
|
||||
{
|
||||
# BinCommand <name> : <sources> : <libraries> : <res> ;
|
||||
Executable $(1) : $(2) : $(3) : $(4) ;
|
||||
}
|
||||
|
||||
rule StdBinCommands
|
||||
{
|
||||
# StdBinCommands <sources> : <libs> : <res> ;
|
||||
local libs = $(2) ;
|
||||
local ress = $(3) ;
|
||||
local source ;
|
||||
for source in $(1)
|
||||
{
|
||||
local target = $(source:S=) ;
|
||||
|
||||
BinCommand $(target) : $(source) : $(libs) : $(ress) ;
|
||||
}
|
||||
}
|
||||
|
||||
rule Preference
|
||||
{
|
||||
# Preference <name> : <sources> : <libraries> : <res> ;
|
||||
Executable $(1) : $(2) : $(3) : $(4) ;
|
||||
}
|
||||
|
||||
rule Server
|
||||
{
|
||||
# Server <name> : <sources> : <libraries> : <res> ;
|
||||
|
||||
Executable $(1) : $(2) : $(3) : $(4) ;
|
||||
}
|
||||
|
||||
rule Addon
|
||||
{
|
||||
# Addon <name> : <relpath> : <sources> : <is executable> : <libraries> ;
|
||||
# <name>: Name of the add-on.
|
||||
# <relpath>: Path where the add-on shall live relative to the add-on dir.
|
||||
# <sources>: Source files.
|
||||
# <is executable>: true, if the target shall be executable as well.
|
||||
# <libraries>: Libraries to be linked against.
|
||||
# TODO: <relpath> is no longer needed
|
||||
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
local isExecutable = $(4) ;
|
||||
|
||||
Main $(1) : $(3) ;
|
||||
|
||||
local linkFlags = -Xlinker -soname=\"$(1)\" ;
|
||||
if $(isExecutable) != true {
|
||||
linkFlags = -nostart $(linkFlags) ;
|
||||
}
|
||||
LINKFLAGS on $(1) = [ on $(1) return $(LINKFLAGS) ] $(linkFlags) ;
|
||||
LinkAgainst $(1) : $(5) ;
|
||||
|
||||
AddSharedObjectGlueCode $(1) : $(isExecutable) ;
|
||||
}
|
||||
|
||||
rule Translator
|
||||
{
|
||||
# Translator <name> : <sources> : <libraries> ;
|
||||
# TODO: Although they currently all are, translators don't need to be
|
||||
# executable. Introduce a flag as for Addon.
|
||||
Addon $(1) : Translators : $(2) : true : $(3) ;
|
||||
}
|
||||
|
||||
rule ScreenSaver
|
||||
{
|
||||
# ScreenSaver <name> : <sources> : <libraries> ;
|
||||
Addon $(1) : screen_savers : $(2) : false : $(3) ;
|
||||
}
|
||||
|
||||
rule StaticLibrary
|
||||
{
|
||||
# StaticLibrary <lib> : <sources> ;
|
||||
# Creates a static library from sources.
|
||||
# <lib>: The static library to be built.
|
||||
# <source>: List of source files.
|
||||
#
|
||||
local lib = $(1) ;
|
||||
local sources = [ FGristFiles $(2) ] ;
|
||||
local objects = $(sources:S=$(SUFOBJ)) ;
|
||||
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
InheritPlatform $(objects) : $(lib) ;
|
||||
|
||||
StaticLibraryFromObjects $(lib) : $(objects) ;
|
||||
Objects $(2) ;
|
||||
}
|
||||
|
||||
rule StaticLibraryFromObjects
|
||||
{
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
LibraryFromObjects $(1) : $(2) ;
|
||||
}
|
||||
|
||||
rule MergeObjectFromObjects
|
||||
{
|
||||
# MergeObjectFromObjects <name> : <objects> : <other objects> ;
|
||||
# Merges object files to an object file.
|
||||
# <name>: Name of the object file to create. No grist will be added.
|
||||
# <objects>: Object files to be merged. Grist will be added.
|
||||
# <other objects>: Object files or static libraries to be merged. No grist
|
||||
# will be added.
|
||||
#
|
||||
local objects = [ FGristFiles $(2) ] ;
|
||||
|
||||
on $(1) {
|
||||
if ! $(PLATFORM) in $(SUPPORTED_PLATFORMS) {
|
||||
return ;
|
||||
}
|
||||
|
||||
if $(PLATFORM) = host {
|
||||
LINK on $(1) = $(HOST_LD) ;
|
||||
} else {
|
||||
LINK on $(1) = $(TARGET_LD) ;
|
||||
}
|
||||
}
|
||||
|
||||
MakeLocateDebug $(1) ;
|
||||
Depends $(1) : $(objects) ;
|
||||
Depends $(1) : $(3) ;
|
||||
LocalDepends obj : $(1) ;
|
||||
MergeObjectFromObjects1 $(1) : $(objects) $(3) ;
|
||||
}
|
||||
|
||||
actions MergeObjectFromObjects1
|
||||
{
|
||||
$(LINK) -r $(2) -o $(1) ;
|
||||
}
|
||||
|
||||
rule MergeObject
|
||||
{
|
||||
# MergeObject <name> : <sources> : <other objects> ;
|
||||
# Compiles source files and merges the object files to an object file.
|
||||
# <name>: Name of the object file to create. No grist will be added.
|
||||
# <sources>: Sources to be compiled. Grist will be added.
|
||||
# <other objects>: Object files or static libraries to be merged. No grist
|
||||
# will be added.
|
||||
#
|
||||
local target = $(1) ;
|
||||
local sources = [ FGristFiles $(2) ] ;
|
||||
local otherObjects = $(3) ;
|
||||
local objects = $(sources:S=$(SUFOBJ)) ;
|
||||
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
InheritPlatform $(objects) : $(target) ;
|
||||
Objects $(sources) ;
|
||||
MergeObjectFromObjects $(target) : $(objects) : $(otherObjects) ;
|
||||
}
|
||||
|
||||
rule SharedLibraryFromObjects
|
||||
{
|
||||
# SharedLibraryFromObjects <lib> : <objects> : <libraries> ;
|
||||
#
|
||||
local _lib = $(1) ;
|
||||
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
MainFromObjects $(_lib) : $(2) ;
|
||||
LINKFLAGS on $(_lib) = [ on $(_lib) return $(LINKFLAGS) ]
|
||||
-nostart -Xlinker -soname=\"$(_lib)\" ;
|
||||
LinkAgainst $(_lib) : $(3) ;
|
||||
|
||||
AddSharedObjectGlueCode $(_lib) : false ;
|
||||
}
|
||||
|
||||
rule SharedLibrary
|
||||
{
|
||||
# SharedLibrary <lib> : <sources> : <libraries> ;
|
||||
local lib = $(1) ;
|
||||
local sources = [ FGristFiles $(2) ] ;
|
||||
local objects = $(sources:S=$(SUFOBJ)) ;
|
||||
local libs = $(3) ;
|
||||
|
||||
if ! [ IsPlatformSupportedForTarget $(1) ] {
|
||||
return ;
|
||||
}
|
||||
|
||||
InheritPlatform $(objects) : $(lib) ;
|
||||
Objects $(sources) ;
|
||||
SharedLibraryFromObjects $(lib) : $(objects) : $(libs) ;
|
||||
}
|
||||
|
||||
rule LinkAgainst
|
||||
{
|
||||
# LinkAgainst <name> : <libs> ;
|
||||
# Valid elements for <libs> are e.g. "be" or "libopenbeos.so" or
|
||||
# "/boot/.../libfoo.so". If the basename starts with "lib" or the thingy
|
||||
# has a dirname or grist, it is added to the NEEDLIBS variable (i.e. the
|
||||
# file will be bound!), otherwise it is prefixed "-l" and added to
|
||||
# LINKLIBS. If you want to specify a target that isn't a library and
|
||||
# also has neither grist nor a dirname, you can prepend "<nogrist>" as
|
||||
# grist; it will be stripped by this rule.
|
||||
#
|
||||
local target = $(1) ;
|
||||
local libs = $(2) ;
|
||||
local mapLibs = $(3) ;
|
||||
|
||||
on $(target) {
|
||||
# map libraries, if desired and target platform is Haiku
|
||||
if $(PLATFORM) = haiku {
|
||||
local mappedLibs ;
|
||||
|
||||
for i in $(libs) {
|
||||
local mapped = $(HAIKU_LIBRARY_NAME_MAP_$(i)) ;
|
||||
mapped ?= $(i) ;
|
||||
mappedLibs += $(mapped) ;
|
||||
}
|
||||
|
||||
libs = $(mappedLibs) ;
|
||||
}
|
||||
|
||||
local linkLibs ;
|
||||
local needLibs ;
|
||||
|
||||
for i in $(libs)
|
||||
{
|
||||
local isfile = ;
|
||||
if $(i:D) || $(i:G) {
|
||||
isfile = true ;
|
||||
if $(i:G) = <nogrist> {
|
||||
i = $(i:G=) ;
|
||||
}
|
||||
} else {
|
||||
switch $(i:B)
|
||||
{
|
||||
# XXX: _APP_ and _KERNEL_ should not be needed for ELF.
|
||||
case _APP_ : isfile = true ;
|
||||
case _KERNEL_ : isfile = true ;
|
||||
case lib* : isfile = true ;
|
||||
case * : isfile = ;
|
||||
}
|
||||
if ! $(isfile) && ( $(i:S) = .so || $(i:S) = .a ) {
|
||||
isfile = true ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(isfile) {
|
||||
needLibs += $(i) ;
|
||||
} else {
|
||||
linkLibs += $(i) ;
|
||||
}
|
||||
}
|
||||
|
||||
NEEDLIBS on $(1) = $(NEEDLIBS) $(needLibs) ;
|
||||
LINKLIBS on $(1) = $(LINKLIBS) -l$(linkLibs) ;
|
||||
|
||||
if $(needLibs) && ! $(NO_LIBRARY_DEPENDENCIES) {
|
||||
Depends $(1) : $(needLibs) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rule AddResources
|
||||
{
|
||||
# AddResources <name> : <resourcefiles> ;
|
||||
|
||||
# add grist to the resource files which don't have any yet
|
||||
local resfiles ;
|
||||
local file ;
|
||||
for file in $(2) {
|
||||
if ! $(file:G) {
|
||||
file = [ FGristFiles $(file) ] ;
|
||||
}
|
||||
resfiles += $(file) ;
|
||||
}
|
||||
|
||||
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 BuildPlatformObjects
|
||||
{
|
||||
# Usage BuildPlatformObjects <sources> ;
|
||||
# <sources> The sources.
|
||||
#
|
||||
local sources = [ FGristFiles $(1) ] ;
|
||||
local objects = [ FGristFiles $(sources:S=$(SUFOBJ)) ] ;
|
||||
|
||||
PLATFORM on $(objects) = host ;
|
||||
SUPPORTED_PLATFORMS on $(objects) = host ;
|
||||
|
||||
Objects $(sources) ;
|
||||
}
|
||||
|
||||
rule BuildPlatformMain
|
||||
{
|
||||
# Usage BuildPlatformMain <target> : <sources> : <libraries> ;
|
||||
# <target> The executable/library.
|
||||
# <sources> The sources.
|
||||
# <libraries> Libraries to link against.
|
||||
#
|
||||
local target = $(1) ;
|
||||
local sources = $(2) ;
|
||||
local libs = $(3) ;
|
||||
local objects = [ FGristFiles $(sources:S=$(SUFOBJ)) ] ;
|
||||
|
||||
PLATFORM on $(target) = host ;
|
||||
SUPPORTED_PLATFORMS on $(target) = host ;
|
||||
DONT_USE_BEOS_RULES on $(target) = true ;
|
||||
|
||||
local usesBeAPI = [ on $(target) return $(USES_BE_API) ] ;
|
||||
if $(usesBeAPI) {
|
||||
# propagate the flag to the objects
|
||||
USES_BE_API on $(objects) = $(usesBeAPI) ;
|
||||
|
||||
# add the build libroot
|
||||
if ! $(HOST_PLATFORM_BEOS_COMPATIBLE) {
|
||||
Depends $(target) : $(HOST_LIBROOT) ;
|
||||
NEEDLIBS on $(target) += $(HOST_LIBROOT) ;
|
||||
}
|
||||
}
|
||||
|
||||
Main $(target) : $(sources) ;
|
||||
LinkAgainst $(target) : $(libs) ;
|
||||
}
|
||||
|
||||
rule BuildPlatformSharedLibrary
|
||||
{
|
||||
# Usage BuildPlatformSharedLibrary <target> : <sources> : <libraries> ;
|
||||
# <target> The library.
|
||||
# <sources> The sources.
|
||||
# <libraries> Libraries to link against.
|
||||
#
|
||||
local target = $(1) ;
|
||||
local sources = $(2) ;
|
||||
local libs = $(3) ;
|
||||
|
||||
BuildPlatformMain $(target) : $(sources) : $(libs) ;
|
||||
LINKFLAGS on $(target) = [ on $(target) return $(LINKFLAGS) ]
|
||||
-shared -Xlinker -soname=\"$(target)\" ;
|
||||
}
|
||||
|
||||
rule BuildPlatformMergeObject
|
||||
{
|
||||
# BuildPlatformMergeObject <name> : <sources> : <other objects> ;
|
||||
# Compiles source files and merges the object files to an object file.
|
||||
# <name>: Name of the object file to create. No grist will be added.
|
||||
# <sources>: Sources to be compiled. Grist will be added.
|
||||
# <other objects>: Object files or static libraries to be merged. No grist
|
||||
# will be added.
|
||||
#
|
||||
local target = $(1) ;
|
||||
local sources = $(2) ;
|
||||
local otherObjects = $(3) ;
|
||||
local objects = [ FGristFiles $(sources:S=$(SUFOBJ)) ] ;
|
||||
|
||||
PLATFORM on $(target) = host ;
|
||||
SUPPORTED_PLATFORMS on $(target) = host ;
|
||||
|
||||
local usesBeAPI = [ on $(target[1]) return $(USES_BE_API) ] ;
|
||||
if $(usesBeAPI) {
|
||||
# propagate the flag to the objects
|
||||
USES_BE_API on $(objects) = $(usesBeAPI) ;
|
||||
}
|
||||
|
||||
MergeObject $(target) : $(sources) : $(otherObjects) ;
|
||||
}
|
||||
|
||||
rule BuildPlatformStaticLibrary
|
||||
{
|
||||
# BuildPlatformStaticLibrary <lib> : <sources> ;
|
||||
# Creates a static library from sources.
|
||||
# <lib>: The library.
|
||||
# <sources>: List of source files.
|
||||
|
||||
local lib = $(1) ;
|
||||
local sources = $(2) ;
|
||||
local objects = [ FGristFiles $(sources:S=$(SUFOBJ)) ] ;
|
||||
|
||||
PLATFORM on $(lib) = host ;
|
||||
SUPPORTED_PLATFORMS on $(lib) = host ;
|
||||
|
||||
local usesBeAPI = [ on $(lib) return $(USES_BE_API) ] ;
|
||||
if $(usesBeAPI) {
|
||||
# propagate the flag to the objects
|
||||
USES_BE_API on $(objects) = $(usesBeAPI) ;
|
||||
}
|
||||
|
||||
StaticLibrary $(lib) : $(sources) ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user