1# This file is used to build the Bionic library with the Jam build 2# tool. For info, see www.perforce.com/jam/jam.html 3# 4 5BIONIC_TOP ?= $(DOT) ; 6 7DEBUG = 1 ; 8 9# pattern used for automatic heade inclusion detection 10HDRPATTERN = "^[ ]*#[ ]*include[ ]*[<\"]([^\">]*)[\">].*$" ; 11 12 13# debugging support, simply define the DEBUG variable to activate verbose output 14rule Debug 15{ 16 if $(DEBUG) { 17 Echo $(1) ; 18 } 19} 20 21# return all elements from $(1) that are not in $(2) 22rule Filter list : filter 23{ 24 local result = ; 25 local item ; 26 for item in $(list) { 27 if ! $(item) in $(filter) { 28 result += $(item) ; 29 } 30 } 31 return $(result) ; 32} 33 34 35# reverse a list of elements 36rule Reverse list 37{ 38 local result = ; 39 local item ; 40 41 for item in $(list) { 42 result = $(item) $(result) ; 43 } 44 return $(result) ; 45} 46 47 48# decompose a path into a list of elements 49rule PathDecompose dir 50{ 51 local result ; 52 53 while $(dir:D) 54 { 55 if ! $(dir:BS) { # for rooted paths like "/foo" 56 break ; 57 } 58 result = $(dir:BS) $(result) ; 59 dir = $(dir:D) ; 60 } 61 result = $(dir) $(result) ; 62 return $(result) ; 63} 64 65 66# simply a file path, i.e. get rid of . or .. when possible 67rule _PathSimplify dir 68{ 69 local result = ; 70 local dir2 d ; 71 72 dir = [ PathDecompose $(dir) ] ; 73 74 # get rid of any single dot 75 dir2 = ; 76 for d in $(dir) { 77 if $(d) = "." { 78 continue ; 79 } 80 dir2 += $(d) ; 81 } 82 83 # get rid of .. when possible 84 for d in $(dir2) { 85 if $(d) = ".." && $(result) { 86 result = $(result[2-]) ; 87 } 88 else 89 result = $(d) $(result) ; 90 } 91 92 # now invert the result 93 result = [ Reverse $(result) ] ; 94 if ! $(result) { 95 result = "." ; 96 } 97 return $(result:J="/") ; 98} 99 100 101rule PathSimplify dirs 102{ 103 local result ; 104 local d ; 105 for d in $(dirs) { 106 result += [ _PathSimplify $(d) ] ; 107 } 108 return $(result) ; 109} 110 111 112# retrieve list of subdirectories 113rule ListSubDirs paths 114{ 115 local result = ; 116 local entry ; 117 for entry in [ Glob $(paths) : * ] { 118 if ! $(entry:S) { 119 result += $(entry) ; 120 } 121 } 122 return [ PathSimplify $(result) ] ; 123} 124 125 126# retrieve list of sources in a given directory 127rule ListSources path 128{ 129 return [ Glob $(path) : *.S *.c ] ; 130} 131 132 133# find the prebuilt directory 134# 135if ! $(TOP) { 136 Echo "Please define TOP as the root of your device build tree" ; 137 Exit ; 138} 139 140Debug "OS is" $(OS) ; 141Debug "CPU is" $(CPU) ; 142 143if $(OS) = LINUX 144{ 145 PREBUILT = $(TOP)/prebuilt/Linux ; 146} 147else if $(OS) = MACOSX 148{ 149 switch $(CPU) { 150 case i386 : PREBUILT = $(TOP)/prebuilt/darwin-x86 ; break ; 151 case ppc : PREBUILT = $(TOP)/prebuilt/darwin-ppc ; break ; 152 case * : Echo "unsupported CPU" "$(CPU) !!" ; 153 Echo "Please contact digit@google.com for help" ; 154 Exit ; 155 } 156} 157else 158{ 159 Echo "Unsupported operating system" $(OS) ; 160 Echo "Please contact digit@google.com for help" ; 161 Exit ; 162} 163 164Debug "TOP is" $(TOP) ; 165Debug "PREBUILT is" $(PREBUILT) ; 166 167 168# check architectures and setup toolchain variables 169# 170SUPPORTED_ARCHS = x86 arm ; 171 172ARCH ?= $(SUPPORTED_ARCHS) ; 173 174if ! $(ARCH) in $(SUPPORTED_ARCHS) { 175 Echo "The variable ARCH contains an unsupported value, use one or more of these instead" ; 176 Echo "separated by spaces:" $(SUPPORTED_ARCHS) ; 177 Exit ; 178} 179 180x86_TOOLSET_PREFIX ?= "" ; 181arm_TOOLSET_PREFIX ?= $(TOP)/prebuilt/Linux/toolchain-4.1.1/bin/arm-elf- ; 182 183for arch in $(ARCH) { 184 CC_$(arch) = $($(arch)_TOOLSET_PREFIX)gcc ; 185 C++_$(arch) = $($(arch)_TOOLSET_PREFIX)g++ ; 186 AR_$(arch) = $($(arch)_TOOLSET_PREFIX)ar ; 187} 188 189 190# the list of arch-independent source subdirectories 191BIONIC_SRC_SUBDIRS = string ; 192BIONIC_x86_SUBDIRS = ; 193BIONIC_arm_SUBDIRS = ; 194 195CFLAGS = -O0 -g -W ; 196 197 198 199# find sources in a given list of subdirectories 200rule FindSources dirs 201{ 202 local dir ; 203 204 for dir in $(dirs) 205 { 206 local LOCAL_SRC NO_LOCAL_SRC ; 207 208 if [ Glob $(dir) : rules.jam ] { 209 include $(dir)/rules.jam ; 210 if $(LOCAL_SRC) { 211 _sources = $(LOCAL_SRC) ; 212 } 213 else { 214 _sources = [ Glob $(dir) : *.S *.c ] ; 215 _sources = $(_sources:BS) ; 216 } 217 if $(NO_LOCAL_SRC) { 218 _sources = [ Filter $(_sources) : $(NO_LOCAL_SRC) ] ; 219 } 220 sources += $(dir)/$(_sources) ; 221 } 222 else 223 sources += [ ListSources $(dir) ] ; 224 } 225} 226 227# Compile a given object file from a source 228rule Compile object : source 229{ 230 Depends $(object) : $(source) ; 231 Depends bionic : $(object) ; 232 Clean clean : $(object) ; 233 234 MakeLocate $(object) : $(OUT) ; 235 236 237 CC on $(object) = $(CC_$(arch)) ; 238 CFLAGS on $(object) = $(CFLAGS) ; 239 INCLUDES on $(object) = $(INCLUDES) ; 240 DEFINES on $(object) = $(DEFINES) ; 241 242 HDRRULE on $(>) = HdrRule ; 243 HDRSCAN on $(>) = $(HDRPATTERN) ; 244 HDRSEARCH on $(>) = $(INCLUDES) ; 245 HDRGRIST on $(>) = $(HDRGRIST) ; 246} 247 248 249actions Compile 250{ 251 $(CC) -c -o $(1) $(CFLAGS) -I$(INCLUDES) -D$(DEFINES) $(2) 252} 253 254 255rule RmTemps 256{ 257 Temporary $(2) ; 258} 259 260actions quietly updated piecemeal together RmTemps 261{ 262 rm -f $(2) 263} 264 265actions Archive 266{ 267 $(AR) ru $(1) $(2) 268} 269 270rule Library library : objects 271{ 272 local obj ; 273 274 if ! $(library:S) { 275 library = $(library:S=.a) ; 276 } 277 library = $(library:G=<$(arch)>) ; 278 279 Depends all : $(library) ; 280 281 if ! $(library:D) { 282 MakeLocate $(library) $(library)($(objects:BS)) : $(OUT) ; 283 } 284 285 Depends $(library) : $(library)($(objects:BS)) ; 286 for obj in $(objects) { 287 Depends $(library)($(obj:BS)) : $(obj) ; 288 } 289 290 Clean clean : $(library) ; 291 292 AR on $(library) = $(AR_$(arch)) ; 293 Archive $(library) : $(objects) ; 294 295 RmTemps $(library) : $(objects) ; 296} 297 298 299rule ProcessDir 300{ 301 local CFLAGS = $(CFLAGS) ; 302 local DEFINES = $(DEFINES) ; 303 local INCLUDES = $(INCLUDES) ; 304 local local_rules = [ Glob $(1) : rules.jam ] ; 305 local source sources ; 306 307 if $(local_rules) { 308 local LOCAL_CFLAGS LOCAL_DEFINES LOCAL_INCLUDES LOCAL_SRC NO_LOCAL_SRC ; 309 310 include $(local_rules) ; 311 CFLAGS += $(LOCAL_CFLAGS) ; 312 DEFINES += $(LOCAL_DEFINES) ; 313 INCLUDES += $(LOCAL_INCLUDES) ; 314 315 if $(LOCAL_SRC) { 316 sources = $(LOCAL_SRC) ; 317 } 318 else { 319 sources = [ Glob $(1) : *.S *.c ] ; 320 sources = $(sources:BS) ; 321 } 322 323 if $(NO_LOCAL_SRC) { 324 sources = [ Filter $(sources) : $(NO_LOCAL_SRC) ] ; 325 } 326 327 sources = $(1)/$(sources) ; 328 } 329 else 330 sources = [ Glob $(1) : *.S *.c ] ; 331 332 for source in $(sources) { 333 local name = $(source:B) ; 334 335 if $(source:S) = ".S" { 336 # record the list of assembler sources 337 ASSEMBLER_SOURCES += $(name) ; 338 } 339 else if $(source:S) = ".c" && $(name) in $(ASSEMBLER_SOURCES) { 340 # skip C source file if corresponding assembler exists 341 continue ; 342 } 343 344 objname = <$(arch)>$(name).o ; 345 346 Compile $(objname) : $(source) ; 347 ALL_OBJECTS += $(objname) ; 348 } 349} 350 351rule ProcessDirs 352{ 353 local dir ; 354 for dir in $(1) { 355 ProcessDir $(dir) ; 356 } 357} 358 359INCLUDES_x86 = /usr/src/linux/include ; 360 361INCLUDES_arm = ../kernel_headers 362 include/arch/arm 363 include/bits32 364 ; 365 366INCLUDES = include stdio string stdlib . 367 ../msun/include 368 ; 369 370DEFINES = ANDROID_CHANGES 371 USE_LOCKS 372 REALLOC_ZERO_BYTES_FREES 373 _LIBC=1 374 SOFTFLOAT 375 FLOATING_POINT 376 NEED_PSELECT=1 377 ANDROID 378 ; 379 380CFLAGS_x86 = ; 381 382 383for arch in $(ARCH) 384{ 385 local ARCH_DIR = $(BIONIC_TOP)/arch-$(arch) ; 386 local INCLUDES = $(INCLUDES_$(arch)) $(ARCH_DIR)/include $(INCLUDES) ; 387 local DEFINES = $(DEFINES_$(arch)) $(DEFINES) ARCH=$(arch) ; 388 local CFLAGS = $(CFLAGS) $(CFLAGS_$(arch)) ; 389 local OUT = out/$(arch) ; 390 local ASSEMBLER_SOURCES ALL_OBJECTS ; 391 392 ProcessDirs [ ListSubDirs $(ARCH_DIR) ] ; 393 ProcessDirs stdlib stdio unistd string tzcode inet ; 394 ProcessDirs [ ListSubDirs netbsd ] ; 395 ProcessDirs bionic ; 396 397 Library bionic : $(ALL_OBJECTS) ; 398} 399 400BIONIC_SEARCH = $(BIONIC_TOP)/include ; 401 402 403 404# /HdrRule source : headers ; 405# 406# Arranges the proper dependencies when the file _source_ includes the files 407# _headers_ through the #include C preprocessor directive 408# 409# this rule is not intendend to be called explicitely. It is called 410# automatically during header scanning on sources handled by the @Object 411# rule (e.g. sources in @Main or @Library rules) 412# 413rule HdrRule 414{ 415 # HdrRule source : headers ; 416 417 # N.B. This rule is called during binding, potentially after 418 # the fate of many targets has been determined, and must be 419 # used with caution: don't add dependencies to unrelated 420 # targets, and don't set variables on $(<). 421 422 # Tell Jam that anything depending on $(<) also depends on $(>), 423 # set SEARCH so Jam can find the headers, but then say we don't 424 # care if we can't actually find the headers (they may have been 425 # within ifdefs), 426 427 local s = $(>:G=$(HDRGRIST:E)) ; 428 429 Includes $(<) : $(s) ; 430 SEARCH on $(s) = $(HDRSEARCH) ; 431 NoCare $(s) ; 432 433 # Propagate on $(<) to $(>) 434 435 HDRSEARCH on $(s) = $(HDRSEARCH) ; 436 HDRSCAN on $(s) = $(HDRSCAN) ; 437 HDRRULE on $(s) = $(HDRRULE) ; 438 HDRGRIST on $(s) = $(HDRGRIST) ; 439} 440 441 442