diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:28:35 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:28:35 -0800 |
commit | 1dc9e472e19acfe6dc7f41e429236e7eef7ceda1 (patch) | |
tree | 3be0c520fae17689bbf5584e1136fb820caef26f /libc/Jamfile | |
parent | 1767f908af327fa388b1c66883760ad851267013 (diff) | |
download | bionic-1dc9e472e19acfe6dc7f41e429236e7eef7ceda1.zip bionic-1dc9e472e19acfe6dc7f41e429236e7eef7ceda1.tar.gz bionic-1dc9e472e19acfe6dc7f41e429236e7eef7ceda1.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'libc/Jamfile')
-rw-r--r-- | libc/Jamfile | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/libc/Jamfile b/libc/Jamfile new file mode 100644 index 0000000..a65be5d --- /dev/null +++ b/libc/Jamfile @@ -0,0 +1,441 @@ +# This file is used to build the Bionic library with the Jam build +# tool. For info, see www.perforce.com/jam/jam.html +# + +BIONIC_TOP ?= $(DOT) ; + +DEBUG = 1 ; + +# pattern used for automatic heade inclusion detection +HDRPATTERN = "^[ ]*#[ ]*include[ ]*[<\"]([^\">]*)[\">].*$" ; + + +# debugging support, simply define the DEBUG variable to activate verbose output +rule Debug +{ + if $(DEBUG) { + Echo $(1) ; + } +} + +# return all elements from $(1) that are not in $(2) +rule Filter list : filter +{ + local result = ; + local item ; + for item in $(list) { + if ! $(item) in $(filter) { + result += $(item) ; + } + } + return $(result) ; +} + + +# reverse a list of elements +rule Reverse list +{ + local result = ; + local item ; + + for item in $(list) { + result = $(item) $(result) ; + } + return $(result) ; +} + + +# decompose a path into a list of elements +rule PathDecompose dir +{ + local result ; + + while $(dir:D) + { + if ! $(dir:BS) { # for rooted paths like "/foo" + break ; + } + result = $(dir:BS) $(result) ; + dir = $(dir:D) ; + } + result = $(dir) $(result) ; + return $(result) ; +} + + +# simply a file path, i.e. get rid of . or .. when possible +rule _PathSimplify dir +{ + local result = ; + local dir2 d ; + + dir = [ PathDecompose $(dir) ] ; + + # get rid of any single dot + dir2 = ; + for d in $(dir) { + if $(d) = "." { + continue ; + } + dir2 += $(d) ; + } + + # get rid of .. when possible + for d in $(dir2) { + if $(d) = ".." && $(result) { + result = $(result[2-]) ; + } + else + result = $(d) $(result) ; + } + + # now invert the result + result = [ Reverse $(result) ] ; + if ! $(result) { + result = "." ; + } + return $(result:J="/") ; +} + + +rule PathSimplify dirs +{ + local result ; + local d ; + for d in $(dirs) { + result += [ _PathSimplify $(d) ] ; + } + return $(result) ; +} + + +# retrieve list of subdirectories +rule ListSubDirs paths +{ + local result = ; + local entry ; + for entry in [ Glob $(paths) : * ] { + if ! $(entry:S) { + result += $(entry) ; + } + } + return [ PathSimplify $(result) ] ; +} + + +# retrieve list of sources in a given directory +rule ListSources path +{ + return [ Glob $(path) : *.S *.c ] ; +} + + +# find the prebuilt directory +# +if ! $(TOP) { + Echo "Please define TOP as the root of your device build tree" ; + Exit ; +} + +Debug "OS is" $(OS) ; +Debug "CPU is" $(CPU) ; + +if $(OS) = LINUX +{ + PREBUILT = $(TOP)/prebuilt/Linux ; +} +else if $(OS) = MACOSX +{ + switch $(CPU) { + case i386 : PREBUILT = $(TOP)/prebuilt/darwin-x86 ; break ; + case ppc : PREBUILT = $(TOP)/prebuilt/darwin-ppc ; break ; + case * : Echo "unsupported CPU" "$(CPU) !!" ; + Echo "Please contact digit@google.com for help" ; + Exit ; + } +} +else +{ + Echo "Unsupported operating system" $(OS) ; + Echo "Please contact digit@google.com for help" ; + Exit ; +} + +Debug "TOP is" $(TOP) ; +Debug "PREBUILT is" $(PREBUILT) ; + + +# check architectures and setup toolchain variables +# +SUPPORTED_ARCHS = x86 arm ; + +ARCH ?= $(SUPPORTED_ARCHS) ; + +if ! $(ARCH) in $(SUPPORTED_ARCHS) { + Echo "The variable ARCH contains an unsupported value, use one or more of these instead" ; + Echo "separated by spaces:" $(SUPPORTED_ARCHS) ; + Exit ; +} + +x86_TOOLSET_PREFIX ?= "" ; +arm_TOOLSET_PREFIX ?= $(TOP)/prebuilt/Linux/toolchain-4.1.1/bin/arm-elf- ; + +for arch in $(ARCH) { + CC_$(arch) = $($(arch)_TOOLSET_PREFIX)gcc ; + C++_$(arch) = $($(arch)_TOOLSET_PREFIX)g++ ; + AR_$(arch) = $($(arch)_TOOLSET_PREFIX)ar ; +} + + +# the list of arch-independent source subdirectories +BIONIC_SRC_SUBDIRS = string ; +BIONIC_x86_SUBDIRS = ; +BIONIC_arm_SUBDIRS = ; + +CFLAGS = -O0 -g -W ; + + + +# find sources in a given list of subdirectories +rule FindSources dirs +{ + local dir ; + + for dir in $(dirs) + { + local LOCAL_SRC NO_LOCAL_SRC ; + + if [ Glob $(dir) : rules.jam ] { + include $(dir)/rules.jam ; + if $(LOCAL_SRC) { + _sources = $(LOCAL_SRC) ; + } + else { + _sources = [ Glob $(dir) : *.S *.c ] ; + _sources = $(_sources:BS) ; + } + if $(NO_LOCAL_SRC) { + _sources = [ Filter $(_sources) : $(NO_LOCAL_SRC) ] ; + } + sources += $(dir)/$(_sources) ; + } + else + sources += [ ListSources $(dir) ] ; + } +} + +# Compile a given object file from a source +rule Compile object : source +{ + Depends $(object) : $(source) ; + Depends bionic : $(object) ; + Clean clean : $(object) ; + + MakeLocate $(object) : $(OUT) ; + + + CC on $(object) = $(CC_$(arch)) ; + CFLAGS on $(object) = $(CFLAGS) ; + INCLUDES on $(object) = $(INCLUDES) ; + DEFINES on $(object) = $(DEFINES) ; + + HDRRULE on $(>) = HdrRule ; + HDRSCAN on $(>) = $(HDRPATTERN) ; + HDRSEARCH on $(>) = $(INCLUDES) ; + HDRGRIST on $(>) = $(HDRGRIST) ; +} + + +actions Compile +{ + $(CC) -c -o $(1) $(CFLAGS) -I$(INCLUDES) -D$(DEFINES) $(2) +} + + +rule RmTemps +{ + Temporary $(2) ; +} + +actions quietly updated piecemeal together RmTemps +{ + rm -f $(2) +} + +actions Archive +{ + $(AR) ru $(1) $(2) +} + +rule Library library : objects +{ + local obj ; + + if ! $(library:S) { + library = $(library:S=.a) ; + } + library = $(library:G=<$(arch)>) ; + + Depends all : $(library) ; + + if ! $(library:D) { + MakeLocate $(library) $(library)($(objects:BS)) : $(OUT) ; + } + + Depends $(library) : $(library)($(objects:BS)) ; + for obj in $(objects) { + Depends $(library)($(obj:BS)) : $(obj) ; + } + + Clean clean : $(library) ; + + AR on $(library) = $(AR_$(arch)) ; + Archive $(library) : $(objects) ; + + RmTemps $(library) : $(objects) ; +} + + +rule ProcessDir +{ + local CFLAGS = $(CFLAGS) ; + local DEFINES = $(DEFINES) ; + local INCLUDES = $(INCLUDES) ; + local local_rules = [ Glob $(1) : rules.jam ] ; + local source sources ; + + if $(local_rules) { + local LOCAL_CFLAGS LOCAL_DEFINES LOCAL_INCLUDES LOCAL_SRC NO_LOCAL_SRC ; + + include $(local_rules) ; + CFLAGS += $(LOCAL_CFLAGS) ; + DEFINES += $(LOCAL_DEFINES) ; + INCLUDES += $(LOCAL_INCLUDES) ; + + if $(LOCAL_SRC) { + sources = $(LOCAL_SRC) ; + } + else { + sources = [ Glob $(1) : *.S *.c ] ; + sources = $(sources:BS) ; + } + + if $(NO_LOCAL_SRC) { + sources = [ Filter $(sources) : $(NO_LOCAL_SRC) ] ; + } + + sources = $(1)/$(sources) ; + } + else + sources = [ Glob $(1) : *.S *.c ] ; + + for source in $(sources) { + local name = $(source:B) ; + + if $(source:S) = ".S" { + # record the list of assembler sources + ASSEMBLER_SOURCES += $(name) ; + } + else if $(source:S) = ".c" && $(name) in $(ASSEMBLER_SOURCES) { + # skip C source file if corresponding assembler exists + continue ; + } + + objname = <$(arch)>$(name).o ; + + Compile $(objname) : $(source) ; + ALL_OBJECTS += $(objname) ; + } +} + +rule ProcessDirs +{ + local dir ; + for dir in $(1) { + ProcessDir $(dir) ; + } +} + +INCLUDES_x86 = /usr/src/linux/include ; + +INCLUDES_arm = ../kernel_headers + include/arch/arm + include/bits32 + ; + +INCLUDES = include stdio string stdlib . + ../msun/include + ; + +DEFINES = ANDROID_CHANGES + USE_LOCKS + REALLOC_ZERO_BYTES_FREES + _LIBC=1 + SOFTFLOAT + FLOATING_POINT + NEED_PSELECT=1 + ANDROID + ; + +CFLAGS_x86 = ; + + +for arch in $(ARCH) +{ + local ARCH_DIR = $(BIONIC_TOP)/arch-$(arch) ; + local INCLUDES = $(INCLUDES_$(arch)) $(ARCH_DIR)/include $(INCLUDES) ; + local DEFINES = $(DEFINES_$(arch)) $(DEFINES) ARCH=$(arch) ; + local CFLAGS = $(CFLAGS) $(CFLAGS_$(arch)) ; + local OUT = out/$(arch) ; + local ASSEMBLER_SOURCES ALL_OBJECTS ; + + ProcessDirs [ ListSubDirs $(ARCH_DIR) ] ; + ProcessDirs stdlib stdio unistd string tzcode inet ; + ProcessDirs [ ListSubDirs netbsd ] ; + ProcessDirs bionic ; + + Library bionic : $(ALL_OBJECTS) ; +} + +BIONIC_SEARCH = $(BIONIC_TOP)/include ; + + + +# /HdrRule source : headers ; +# +# Arranges the proper dependencies when the file _source_ includes the files +# _headers_ through the #include C preprocessor directive +# +# this rule is not intendend to be called explicitely. It is called +# automatically during header scanning on sources handled by the @Object +# rule (e.g. sources in @Main or @Library rules) +# +rule HdrRule +{ + # HdrRule source : headers ; + + # 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) ; + + # Propagate on $(<) to $(>) + + HDRSEARCH on $(s) = $(HDRSEARCH) ; + HDRSCAN on $(s) = $(HDRSCAN) ; + HDRRULE on $(s) = $(HDRRULE) ; + HDRGRIST on $(s) = $(HDRGRIST) ; +} + + |