1 # Copyright (C) 2009 The Android Open Source Project 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 # 15 # Common definitions for the Android NDK build system 16 # 17 18 # We use the GNU Make Standard Library 19 include $(NDK_ROOT)/build/gmsl/gmsl 20 21 include $(BUILD_SYSTEM)/definitions-tests.mk 22 include $(BUILD_SYSTEM)/definitions-utils.mk 23 include $(BUILD_SYSTEM)/definitions-host.mk 24 include $(BUILD_SYSTEM)/definitions-graph.mk 25 26 # ----------------------------------------------------------------------------- 27 # Macro : this-makefile 28 # Returns : the name of the current Makefile in the inclusion stack 29 # Usage : $(this-makefile) 30 # ----------------------------------------------------------------------------- 31 this-makefile = $(lastword $(MAKEFILE_LIST)) 32 33 # ----------------------------------------------------------------------------- 34 # Macro : local-makefile 35 # Returns : the name of the last parsed Android.mk file 36 # Usage : $(local-makefile) 37 # ----------------------------------------------------------------------------- 38 local-makefile = $(lastword $(filter %Android.mk,$(MAKEFILE_LIST))) 39 40 # ----------------------------------------------------------------------------- 41 # Function : assert-defined 42 # Arguments: 1: list of variable names 43 # Returns : None 44 # Usage : $(call assert-defined, VAR1 VAR2 VAR3...) 45 # Rationale: Checks that all variables listed in $1 are defined, or abort the 46 # build 47 # ----------------------------------------------------------------------------- 48 assert-defined = $(foreach __varname,$(strip $1),\ 49 $(if $(strip $($(__varname))),,\ 50 $(call __ndk_error, Assertion failure: $(__varname) is not defined)\ 51 )\ 52 ) 53 54 # ----------------------------------------------------------------------------- 55 # Function : check-required-vars 56 # Arguments: 1: list of variable names 57 # 2: file where the variable(s) should be defined 58 # Returns : None 59 # Usage : $(call check-required-vars, VAR1 VAR2 VAR3..., <file>) 60 # Rationale: Checks that all required vars listed in $1 were defined by $2 61 # or abort the build with an error 62 # ----------------------------------------------------------------------------- 63 check-required-vars = $(foreach __varname,$1,\ 64 $(if $(strip $($(__varname))),,\ 65 $(call __ndk_info, Required variable $(__varname) is not defined by $2)\ 66 $(call __ndk_error,Aborting)\ 67 )\ 68 ) 69 70 # The list of default C++ extensions supported by GCC. 71 default-c++-extensions := .cc .cp .cxx .cpp .CPP .c++ .C 72 73 # ----------------------------------------------------------------------------- 74 # Function : generate-dir 75 # Arguments: 1: directory path 76 # Returns : Generate a rule, but not dependency, to create a directory with 77 # host-mkdir. 78 # Usage : $(call generate-dir,<path>) 79 # ----------------------------------------------------------------------------- 80 define ev-generate-dir 81 __ndk_dir := $1 82 ifeq (,$$(__ndk_dir_flag__$$(__ndk_dir))) 83 # Note that the following doesn't work because path in windows may contain 84 # ':' if ndk-build is called inside jni/ directory when path is expanded 85 # to full-path, eg. C:/path/to/project/jni/ 86 # 87 # __ndk_dir_flag__$1 := true 88 # 89 __ndk_dir_flag__$$(__ndk_dir) := true 90 $1: 91 @$$(call host-mkdir,$$@) 92 endif 93 endef 94 95 generate-dir = $(eval $(call ev-generate-dir,$1)) 96 97 # ----------------------------------------------------------------------------- 98 # Function : generate-file-dir 99 # Arguments: 1: file path 100 # Returns : Generate a dependency and a rule to ensure that the parent 101 # directory of the input file path will be created before it. 102 # This is used to enforce a call to host-mkdir. 103 # Usage : $(call generate-file-dir,<file>) 104 # Rationale: Many object files will be stored in the same output directory. 105 # Introducing a dependency on the latter avoids calling mkdir -p 106 # for every one of them. 107 # 108 # ----------------------------------------------------------------------------- 109 110 define ev-generate-file-dir 111 __ndk_file_dir := $(call parent-dir,$1) 112 $$(call generate-dir,$$(__ndk_file_dir)) 113 $1:| $$(__ndk_file_dir) 114 endef 115 116 generate-file-dir = $(eval $(call ev-generate-file-dir,$1)) 117 118 # ----------------------------------------------------------------------------- 119 # Function : generate-list-file 120 # Arguments: 1: list of strings (possibly very long) 121 # 2: file name 122 # Returns : write the content of a possibly very long string list to a file. 123 # this shall be used in commands and will work around limitations 124 # of host command-line lengths. 125 # Usage : $(call host-echo-to-file,<string-list>,<file>) 126 # Rationale: When there is a very large number of objects and/or libraries at 127 # link time, the size of the command becomes too large for the 128 # host system's maximum. Various tools however support the 129 # @<listfile> syntax, where <listfile> is the path of a file 130 # which content will be parsed as if they were options. 131 # 132 # This function is used to generate such a list file from a long 133 # list of strings in input. 134 # 135 # ----------------------------------------------------------------------------- 136 137 # Helper functions because the GNU Make $(word ...) function does 138 # not accept a 0 index, so we need to bump any of these to 1 when 139 # we find them. 140 # 141 index-is-zero = $(filter 0 00 000 0000 00000 000000 0000000,$1) 142 bump-0-to-1 = $(if $(call index-is-zero,$1),1,$1) 143 144 -test-bump-0-to-1 = \ 145 $(call test-expect,$(call bump-0-to-1))\ 146 $(call test-expect,1,$(call bump-0-to-1,0))\ 147 $(call test-expect,1,$(call bump-0-to-1,1))\ 148 $(call test-expect,2,$(call bump-0-to-1,2))\ 149 $(call test-expect,1,$(call bump-0-to-1,00))\ 150 $(call test-expect,1,$(call bump-0-to-1,000))\ 151 $(call test-expect,1,$(call bump-0-to-1,0000))\ 152 $(call test-expect,1,$(call bump-0-to-1,00000))\ 153 $(call test-expect,1,$(call bump-0-to-1,000000))\ 154 $(call test-expect,10,$(call bump-0-to-1,10))\ 155 $(call test-expect,100,$(call bump-0-to-1,100)) 156 157 # Same as $(wordlist ...) except the start index, if 0, is bumped to 1 158 index-word-list = $(wordlist $(call bump-0-to-1,$1),$2,$3) 159 160 -test-index-word-list = \ 161 $(call test-expect,,$(call index-word-list,1,1))\ 162 $(call test-expect,a b,$(call index-word-list,0,2,a b c d))\ 163 $(call test-expect,b c,$(call index-word-list,2,3,a b c d))\ 164 165 # NOTE: With GNU Make $1 and $(1) are equivalent, which means 166 # that $10 is equivalent to $(1)0, and *not* $(10). 167 168 # Used to generate a slice of up to 10 items starting from index $1, 169 # If $1 is 0, it will be bumped to 1 (and only 9 items will be printed) 170 # $1: start (tenth) index. Can be 0 171 # $2: word list 172 # 173 define list-file-start-gen-10 174 $$(hide) $$(HOST_ECHO_N) "$(call index-word-list,$10,$19,$2) " >> $$@ 175 endef 176 177 # Used to generate a slice of always 10 items starting from index $1 178 # $1: start (tenth) index. CANNOT BE 0 179 # $2: word list 180 define list-file-always-gen-10 181 $$(hide) $$(HOST_ECHO_N) "$(wordlist $10,$19,$2) " >> $$@ 182 endef 183 184 # Same as list-file-always-gen-10, except that the word list might be 185 # empty at position $10 (i.e. $(1)0) 186 define list-file-maybe-gen-10 187 ifneq ($(word $10,$2),) 188 $$(hide) $$(HOST_ECHO_N) "$(wordlist $10,$19,$2) " >> $$@ 189 endif 190 endef 191 192 define list-file-start-gen-100 193 $(call list-file-start-gen-10,$10,$2) 194 $(call list-file-always-gen-10,$11,$2) 195 $(call list-file-always-gen-10,$12,$2) 196 $(call list-file-always-gen-10,$13,$2) 197 $(call list-file-always-gen-10,$14,$2) 198 $(call list-file-always-gen-10,$15,$2) 199 $(call list-file-always-gen-10,$16,$2) 200 $(call list-file-always-gen-10,$17,$2) 201 $(call list-file-always-gen-10,$18,$2) 202 $(call list-file-always-gen-10,$19,$2) 203 endef 204 205 define list-file-always-gen-100 206 $(call list-file-always-gen-10,$10,$2) 207 $(call list-file-always-gen-10,$11,$2) 208 $(call list-file-always-gen-10,$12,$2) 209 $(call list-file-always-gen-10,$13,$2) 210 $(call list-file-always-gen-10,$14,$2) 211 $(call list-file-always-gen-10,$15,$2) 212 $(call list-file-always-gen-10,$16,$2) 213 $(call list-file-always-gen-10,$17,$2) 214 $(call list-file-always-gen-10,$18,$2) 215 $(call list-file-always-gen-10,$19,$2) 216 endef 217 218 define list-file-maybe-gen-100 219 ifneq ($(word $(call bump-0-to-1,$100),$2),) 220 ifneq ($(word $199,$2),) 221 $(call list-file-start-gen-10,$10,$2) 222 $(call list-file-always-gen-10,$11,$2) 223 $(call list-file-always-gen-10,$12,$2) 224 $(call list-file-always-gen-10,$13,$2) 225 $(call list-file-always-gen-10,$14,$2) 226 $(call list-file-always-gen-10,$15,$2) 227 $(call list-file-always-gen-10,$16,$2) 228 $(call list-file-always-gen-10,$17,$2) 229 $(call list-file-always-gen-10,$18,$2) 230 $(call list-file-always-gen-10,$19,$2) 231 else 232 ifneq ($(word $150,$2),) 233 $(call list-file-start-gen-10,$10,$2) 234 $(call list-file-always-gen-10,$11,$2) 235 $(call list-file-always-gen-10,$12,$2) 236 $(call list-file-always-gen-10,$13,$2) 237 $(call list-file-always-gen-10,$14,$2) 238 $(call list-file-maybe-gen-10,$15,$2) 239 $(call list-file-maybe-gen-10,$16,$2) 240 $(call list-file-maybe-gen-10,$17,$2) 241 $(call list-file-maybe-gen-10,$18,$2) 242 $(call list-file-maybe-gen-10,$19,$2) 243 else 244 $(call list-file-start-gen-10,$10,$2) 245 $(call list-file-maybe-gen-10,$11,$2) 246 $(call list-file-maybe-gen-10,$12,$2) 247 $(call list-file-maybe-gen-10,$13,$2) 248 $(call list-file-maybe-gen-10,$14,$2) 249 endif 250 endif 251 endif 252 endef 253 254 define list-file-maybe-gen-1000 255 ifneq ($(word $(call bump-0-to-1,$1000),$2),) 256 ifneq ($(word $1999,$2),) 257 $(call list-file-start-gen-100,$10,$2) 258 $(call list-file-always-gen-100,$11,$2) 259 $(call list-file-always-gen-100,$12,$2) 260 $(call list-file-always-gen-100,$13,$2) 261 $(call list-file-always-gen-100,$14,$2) 262 $(call list-file-always-gen-100,$15,$2) 263 $(call list-file-always-gen-100,$16,$2) 264 $(call list-file-always-gen-100,$17,$2) 265 $(call list-file-always-gen-100,$18,$2) 266 $(call list-file-always-gen-100,$19,$2) 267 else 268 ifneq ($(word $1500,$2),) 269 $(call list-file-start-gen-100,$10,$2) 270 $(call list-file-always-gen-100,$11,$2) 271 $(call list-file-always-gen-100,$12,$2) 272 $(call list-file-always-gen-100,$13,$2) 273 $(call list-file-always-gen-100,$14,$2) 274 $(call list-file-maybe-gen-100,$15,$2) 275 $(call list-file-maybe-gen-100,$16,$2) 276 $(call list-file-maybe-gen-100,$17,$2) 277 $(call list-file-maybe-gen-100,$18,$2) 278 $(call list-file-maybe-gen-100,$19,$2) 279 else 280 $(call list-file-start-gen-100,$10,$2) 281 $(call list-file-maybe-gen-100,$11,$2) 282 $(call list-file-maybe-gen-100,$12,$2) 283 $(call list-file-maybe-gen-100,$13,$2) 284 $(call list-file-maybe-gen-100,$14,$2) 285 endif 286 endif 287 endif 288 endef 289 290 291 define generate-list-file-ev 292 __list_file := $2 293 294 .PHONY: $$(__list_file).tmp 295 296 $$(call generate-file-dir,$$(__list_file).tmp) 297 298 $$(__list_file).tmp: 299 $$(hide) $$(HOST_ECHO_N) "" > $$@ 300 $(call list-file-maybe-gen-1000,0,$1) 301 $(call list-file-maybe-gen-1000,1,$1) 302 $(call list-file-maybe-gen-1000,2,$1) 303 $(call list-file-maybe-gen-1000,3,$1) 304 $(call list-file-maybe-gen-1000,4,$1) 305 $(call list-file-maybe-gen-1000,5,$1) 306 307 $$(__list_file): $$(__list_file).tmp 308 $$(hide) $$(call host-copy-if-differ,$$@.tmp,$$@) 309 $$(hide) $$(call host-rm,$$@.tmp) 310 311 endef 312 313 generate-list-file = $(eval $(call generate-list-file-ev,$1,$2)) 314 315 # ----------------------------------------------------------------------------- 316 # Function : link-whole-archives 317 # Arguments: 1: list of whole static libraries 318 # Returns : linker flags to use the whole static libraries 319 # Usage : $(call link-whole-archives,<libraries>) 320 # Rationale: This function is used to put the list of whole static libraries 321 # inside a -Wl,--whole-archive ... -Wl,--no-whole-archive block. 322 # If the list is empty, it returns an empty string. 323 # This function also calls host-path to translate the library 324 # paths. 325 # ----------------------------------------------------------------------------- 326 link-whole-archives = $(if $(strip $1),$(call link-whole-archive-flags,$1)) 327 link-whole-archive-flags = -Wl,--whole-archive $(call host-path,$1) -Wl,--no-whole-archive 328 329 -test-link-whole-archive = \ 330 $(call test-expect,,$(call link-whole-archives))\ 331 $(eval _start := -Wl,--whole-archive)\ 332 $(eval _end := -Wl,--no-whole-archive)\ 333 $(call test-expect,$(_start) foo $(_end),$(call link-whole-archives,foo))\ 334 $(call test-expect,$(_start) foo bar $(_end),$(call link-whole-archives,foo bar)) 335 336 # ============================================================================= 337 # 338 # Modules database 339 # 340 # The following declarations are used to manage the list of modules 341 # defined in application's Android.mk files. 342 # 343 # Technical note: 344 # We use __ndk_modules to hold the list of all modules corresponding 345 # to a given application. 346 # 347 # For each module 'foo', __ndk_modules.foo.<field> is used 348 # to store module-specific information. 349 # 350 # type -> type of module (e.g. 'static', 'shared', ...) 351 # depends -> list of other modules this module depends on 352 # 353 # Also, LOCAL_XXXX values defined for a module are recorded in XXXX, e.g.: 354 # 355 # PATH -> recorded LOCAL_PATH for the module 356 # CFLAGS -> recorded LOCAL_CFLAGS for the module 357 # ... 358 # 359 # Some of these are created by build scripts like BUILD_STATIC_LIBRARY: 360 # 361 # MAKEFILE -> The Android.mk where the module is defined. 362 # LDFLAGS -> Final linker flags 363 # OBJECTS -> List of module objects 364 # BUILT_MODULE -> location of module built file (e.g. obj/<app>/<abi>/libfoo.so) 365 # 366 # Note that some modules are never installed (e.g. static libraries). 367 # 368 # ============================================================================= 369 370 # The list of LOCAL_XXXX variables that are recorded for each module definition 371 # These are documented by docs/ANDROID-MK.TXT. Exception is LOCAL_MODULE 372 # 373 modules-LOCALS := \ 374 MODULE \ 375 MODULE_FILENAME \ 376 PATH \ 377 SRC_FILES \ 378 CPP_EXTENSION \ 379 C_INCLUDES \ 380 CFLAGS \ 381 CXXFLAGS \ 382 CPPFLAGS \ 383 STATIC_LIBRARIES \ 384 WHOLE_STATIC_LIBRARIES \ 385 SHARED_LIBRARIES \ 386 LDLIBS \ 387 ALLOW_UNDEFINED_SYMBOLS \ 388 ARM_MODE \ 389 ARM_NEON \ 390 DISABLE_NO_EXECUTE \ 391 DISABLE_RELRO \ 392 DISABLE_FORMAT_STRING_CHECKS \ 393 EXPORT_CFLAGS \ 394 EXPORT_CPPFLAGS \ 395 EXPORT_LDLIBS \ 396 EXPORT_C_INCLUDES \ 397 FILTER_ASM \ 398 CPP_FEATURES \ 399 SHORT_COMMANDS \ 400 BUILT_MODULE_NOT_COPIED \ 401 THIN_ARCHIVE \ 402 403 # The following are generated by the build scripts themselves 404 405 # LOCAL_MAKEFILE will contain the path to the Android.mk defining the module 406 modules-LOCALS += MAKEFILE 407 408 # LOCAL_LDFLAGS will contain the set of final linker flags for the module 409 modules-LOCALS += LDFLAGS 410 411 # LOCAL_OBJECTS will contain the list of object files generated from the 412 # module's sources, if any. 413 modules-LOCALS += OBJECTS 414 415 # LOCAL_BUILT_MODULE will contain the location of the symbolic version of 416 # the generated module (i.e. the one containing all symbols used during 417 # native debugging). It is generally under $PROJECT/obj/local/ 418 modules-LOCALS += BUILT_MODULE 419 420 # LOCAL_OBJS_DIR will contain the location where the object files for 421 # this module will be stored. Usually $PROJECT/obj/local/<module>/obj 422 modules-LOCALS += OBJS_DIR 423 424 # LOCAL_INSTALLED will contain the location of the installed version 425 # of the module. Usually $PROJECT/libs/<abi>/<prefix><module><suffix> 426 # where <prefix> and <suffix> depend on the module class. 427 modules-LOCALS += INSTALLED 428 429 # LOCAL_MODULE_CLASS will contain the type of the module 430 # (e.g. STATIC_LIBRARY, SHARED_LIBRARY, etc...) 431 modules-LOCALS += MODULE_CLASS 432 433 # the list of managed fields per module 434 modules-fields = depends \ 435 $(modules-LOCALS) 436 437 # ----------------------------------------------------------------------------- 438 # Function : modules-clear 439 # Arguments: None 440 # Returns : None 441 # Usage : $(call modules-clear) 442 # Rationale: clears the list of defined modules known by the build system 443 # ----------------------------------------------------------------------------- 444 modules-clear = \ 445 $(foreach __mod,$(__ndk_modules),\ 446 $(foreach __field,$(modules-fields),\ 447 $(eval __ndk_modules.$(__mod).$(__field) := $(empty))\ 448 )\ 449 )\ 450 $(eval __ndk_modules := $(empty_set)) \ 451 $(eval __ndk_top_modules := $(empty)) \ 452 $(eval __ndk_import_list := $(empty)) \ 453 $(eval __ndk_import_depth := $(empty)) 454 455 # ----------------------------------------------------------------------------- 456 # Function : modules-get-list 457 # Arguments: None 458 # Returns : The list of all recorded modules 459 # Usage : $(call modules-get-list) 460 # ----------------------------------------------------------------------------- 461 modules-get-list = $(__ndk_modules) 462 463 # ----------------------------------------------------------------------------- 464 # Function : modules-get-top-list 465 # Arguments: None 466 # Returns : The list of all recorded non-imported modules 467 # Usage : $(call modules-get-top-list) 468 # ----------------------------------------------------------------------------- 469 modules-get-top-list = $(__ndk_top_modules) 470 471 # ----------------------------------------------------------------------------- 472 # Function : module-add 473 # Arguments: 1: module name 474 # Returns : None 475 # Usage : $(call module-add,<modulename>) 476 # Rationale: add a new module. If it is already defined, print an error message 477 # and abort. This will record all LOCAL_XXX variables for the module. 478 # ----------------------------------------------------------------------------- 479 module-add = \ 480 $(call assert-defined,LOCAL_MAKEFILE LOCAL_BUILT_MODULE LOCAL_OBJS_DIR LOCAL_MODULE_CLASS)\ 481 $(if $(call set_is_member,$(__ndk_modules),$1),\ 482 $(call __ndk_info,Trying to define local module '$1' in $(LOCAL_MAKEFILE).)\ 483 $(call __ndk_info,But this module was already defined by $(__ndk_modules.$1.MAKEFILE).)\ 484 $(call __ndk_error,Aborting.)\ 485 )\ 486 $(eval __ndk_modules := $(call set_insert,$(__ndk_modules),$1))\ 487 $(if $(strip $(__ndk_import_depth)),,\ 488 $(eval __ndk_top_modules := $(call set_insert,$(__ndk_top_modules),$1))\ 489 )\ 490 $(if $(call module-class-is-installable,$(LOCAL_MODULE_CLASS)),\ 491 $(eval LOCAL_INSTALLED := $(NDK_APP_DST_DIR)/$(notdir $(LOCAL_BUILT_MODULE))),\ 492 $(eval LOCAL_INSTALLED := $(LOCAL_BUILT_MODULE))\ 493 )\ 494 $(foreach __field,STATIC_LIBRARIES WHOLE_STATIC_LIBRARIES SHARED_LIBRARIES,\ 495 $(eval LOCAL_$(__field) := $(call strip-lib-prefix,$(LOCAL_$(__field)))))\ 496 $(foreach __local,$(modules-LOCALS),\ 497 $(eval __ndk_modules.$1.$(__local) := $(LOCAL_$(__local)))\ 498 )\ 499 $(call module-handle-c++-features,$1) 500 501 502 # Retrieve the class of module $1 503 module-get-class = $(__ndk_modules.$1.MODULE_CLASS) 504 505 # Retrieve built location of module $1 506 module-get-built = $(__ndk_modules.$1.BUILT_MODULE) 507 508 # Returns $(true) is module $1 is installable 509 # An installable module is one that will be copied to $PROJECT/libs/<abi>/ 510 # (e.g. shared libraries). 511 # 512 module-is-installable = $(call module-class-is-installable,$(call module-get-class,$1)) 513 514 # Returns $(true) if module $1 is a copyable prebuilt 515 # A copyable prebuilt module is one that will be copied to $NDK_OUT/<abi>/ 516 # at build time. At the moment, this is only used for prebuilt shared 517 # libraries, since it helps ndk-gdb. 518 # 519 module-is-copyable = $(call module-class-is-copyable,$(call module-get-class,$1)) 520 521 # ----------------------------------------------------------------------------- 522 # Function : module-get-export 523 # Arguments: 1: module name 524 # 2: export variable name without LOCAL_EXPORT_ prefix (e.g. 'CFLAGS') 525 # Returns : Exported value 526 # Usage : $(call module-get-export,<modulename>,<varname>) 527 # Rationale: Return the recorded value of LOCAL_EXPORT_$2, if any, for module $1 528 # ----------------------------------------------------------------------------- 529 module-get-export = $(__ndk_modules.$1.EXPORT_$2) 530 531 # ----------------------------------------------------------------------------- 532 # Function : module-get-listed-export 533 # Arguments: 1: list of module names 534 # 2: export variable name without LOCAL_EXPORT_ prefix (e.g. 'CFLAGS') 535 # Returns : Exported values 536 # Usage : $(call module-get-listed-export,<module-list>,<varname>) 537 # Rationale: Return the recorded value of LOCAL_EXPORT_$2, if any, for modules 538 # listed in $1. 539 # ----------------------------------------------------------------------------- 540 module-get-listed-export = $(strip \ 541 $(foreach __listed_module,$1,\ 542 $(call module-get-export,$(__listed_module),$2)\ 543 )) 544 545 # ----------------------------------------------------------------------------- 546 # Function : modules-restore-locals 547 # Arguments: 1: module name 548 # Returns : None 549 # Usage : $(call module-restore-locals,<modulename>) 550 # Rationale: Restore the recorded LOCAL_XXX definitions for a given module. 551 # ----------------------------------------------------------------------------- 552 module-restore-locals = \ 553 $(foreach __local,$(modules-LOCALS),\ 554 $(eval LOCAL_$(__local) := $(__ndk_modules.$1.$(__local)))\ 555 ) 556 557 # Dump all module information. Only use this for debugging 558 modules-dump-database = \ 559 $(info Modules [$(TARGET_ARCH_ABI)]: $(__ndk_modules)) \ 560 $(foreach __mod,$(__ndk_modules),\ 561 $(info $(space4)$(__mod):)\ 562 $(foreach __field,$(modules-fields),\ 563 $(eval __fieldval := $(strip $(__ndk_modules.$(__mod).$(__field))))\ 564 $(if $(__fieldval),\ 565 $(if $(filter 1,$(words $(__fieldval))),\ 566 $(info $(space4)$(space4)$(__field): $(__fieldval)),\ 567 $(info $(space4)$(space4)$(__field): )\ 568 $(foreach __fielditem,$(__fieldval),\ 569 $(info $(space4)$(space4)$(space4)$(__fielditem))\ 570 )\ 571 )\ 572 )\ 573 )\ 574 )\ 575 $(info Top modules: $(__ndk_top_modules))\ 576 $(info --- end of modules list) 577 578 579 # ----------------------------------------------------------------------------- 580 # Function : module-add-static-depends 581 # Arguments: 1: module name 582 # 2: list/set of static library modules this module depends on. 583 # Returns : None 584 # Usage : $(call module-add-static-depends,<modulename>,<list of module names>) 585 # Rationale: Record that a module depends on a set of static libraries. 586 # Use module-get-static-dependencies to retrieve final list. 587 # ----------------------------------------------------------------------------- 588 module-add-static-depends = \ 589 $(call module-add-depends-any,$1,$2,depends) \ 590 591 # ----------------------------------------------------------------------------- 592 # Function : module-add-shared-depends 593 # Arguments: 1: module name 594 # 2: list/set of shared library modules this module depends on. 595 # Returns : None 596 # Usage : $(call module-add-shared-depends,<modulename>,<list of module names>) 597 # Rationale: Record that a module depends on a set of shared libraries. 598 # Use modulge-get-shared-dependencies to retrieve final list. 599 # ----------------------------------------------------------------------------- 600 module-add-shared-depends = \ 601 $(call module-add-depends-any,$1,$2,depends) \ 602 603 # Used internally by module-add-static-depends and module-add-shared-depends 604 # NOTE: this function must not modify the existing dependency order when new depends are added. 605 # 606 module-add-depends-any = \ 607 $(eval __ndk_modules.$1.$3 += $(filter-out $(__ndk_modules.$1.$3),$2)) 608 609 610 # ----------------------------------------------------------------------------- 611 # Returns non-empty if a module is a static library 612 # Arguments: 1: module name 613 # Returns : non-empty iff the module is a static library. 614 # Usage : $(if $(call module-is-static-library,<name>),...) 615 # ----------------------------------------------------------------------------- 616 module-is-static-library = $(strip \ 617 $(filter STATIC_LIBRARY PREBUILT_STATIC_LIBRARY,\ 618 $(call module-get-class,$1))) 619 620 # ----------------------------------------------------------------------------- 621 # Returns non-empty if a module is a shared library 622 # Arguments: 1: module name 623 # Returns : non-empty iff the module is a shared library. 624 # Usage : $(if $(call module-is-shared-library,<name>),...) 625 # ----------------------------------------------------------------------------- 626 module-is-shared-library = $(strip \ 627 $(filter SHARED_LIBRARY PREBUILT_SHARED_LIBRARY,\ 628 $(call module-get-class,$1))) 629 630 # ----------------------------------------------------------------------------- 631 # Filter a list of module names to retain only the static libraries. 632 # Arguments: 1: module name list 633 # Returns : input list modules which are static libraries. 634 # ----------------------------------------------------------------------------- 635 module-filter-static-libraries = $(call filter-by,$1,module-is-static-library) 636 637 # ----------------------------------------------------------------------------- 638 # Filter a list of module names to retain only the shared libraries. 639 # Arguments: 1: module name list 640 # Returns : input list modules which are shared libraries. 641 # ----------------------------------------------------------------------------- 642 module-filter-shared-libraries = $(call filter-by,$1,module-is-shared-library) 643 644 # ----------------------------------------------------------------------------- 645 # Return the LOCAL_STATIC_LIBRARIES for a given module. 646 # Arguments: 1: module name 647 # Returns : List of static library modules. 648 # ----------------------------------------------------------------------------- 649 module-get-static-libs = $(__ndk_modules.$1.STATIC_LIBRARIES) 650 651 # ----------------------------------------------------------------------------- 652 # Return the LOCAL_WHOLE_STATIC_LIBRARIES for a given module. 653 # Arguments: 1: module name 654 # Returns : List of whole static library modules. 655 # ----------------------------------------------------------------------------- 656 module-get-whole-static-libs = $(__ndk_modules.$1.WHOLE_STATIC_LIBRARIES) 657 658 # ----------------------------------------------------------------------------- 659 # Return all static libraries for a given module. 660 # Arguments: 1: module name 661 # Returns : List of static library modules (whole or not). 662 # ----------------------------------------------------------------------------- 663 module-get-all-static-libs = $(strip \ 664 $(__ndk_modules.$1.STATIC_LIBRARIES) \ 665 $(__ndk_modules.$1.WHOLE_STATIC_LIBRARIES)) 666 667 # ----------------------------------------------------------------------------- 668 # Return the list of LOCAL_SHARED_LIBRARIES for a given module. 669 # Arguments: 1: module name 670 # Returns : List of shared library modules. 671 # ----------------------------------------------------------------------------- 672 module-get-shared-libs = $(__ndk_modules.$1.SHARED_LIBRARIES) 673 674 # ----------------------------------------------------------------------------- 675 # Return the list of all libraries a modules depends directly on. 676 # This is the concatenation of its LOCAL_STATIC_LIBRARIES, 677 # LOCAL_WHOLE_STATIC_LIBRARIES, and LOCAL_SHARED_LIBRARIES variables. 678 # Arguments: 1: module name 679 # Returns : List of library modules (static or shared). 680 # ----------------------------------------------------------------------------- 681 module-get-direct-libs = $(strip \ 682 $(__ndk_modules.$1.STATIC_LIBRARIES) \ 683 $(__ndk_modules.$1.WHOLE_STATIC_LIBRARIES) \ 684 $(__ndk_modules.$1.SHARED_LIBRARIES)) 685 686 687 # ----------------------------------------------------------------------------- 688 # Computes the full closure of a module and its dependencies. Order is 689 # defined by a breadth-first walk of the graph. 690 # $1 will be the first item in the result. 691 # 692 # Arguments: 1: module name 693 # Returns : List of all modules $1 depends on. 694 # 695 # Note: Do not use this to determine build dependencies. The returned list 696 # is much too large for this. For example consider the following 697 # dependency graph: 698 # 699 # main.exe -> libA.a -> libfoo.so -> libB.a 700 # 701 # This function will return all four modules in the result, while 702 # at link time building main.exe only requires the first three. 703 # 704 # ----------------------------------------------------------------------------- 705 module-get-all-dependencies = $(call -ndk-mod-get-closure,$1,module-get-depends) 706 707 # ----------------------------------------------------------------------------- 708 # Compute the list of all static and shared libraries required to link a 709 # given module. 710 # 711 # Note that the result is topologically ordered, i.e. if library A depends 712 # on library B, then A will always appear after B in the result. 713 # 714 # Arguments: 1: module name 715 # Returns : List of all library $1 depends at link time. 716 # 717 # Note: This doesn't differentiate between regular and whole static 718 # libraries. Use module-extract-whole-static-libs to filter the 719 # result returned by this function. 720 # ----------------------------------------------------------------------------- 721 module-get-link-libs = $(strip \ 722 $(eval _ndk_mod_link_module := $1) \ 723 $(call -ndk-mod-get-topological-depends,$1,-ndk-mod-link-deps)) 724 725 # Special dependency function used by module-get-link-libs. 726 # The rules to follow are the following: 727 # - if $1 is the link module, or if it is a static library, then all 728 # direct dependencies. 729 # - otherwise, the module is a shared library, don't add build deps. 730 -ndk-mod-link-deps = \ 731 $(if $(call seq,$1,$(_ndk_mod_link_module))$(call module-is-static-library,$1),\ 732 $(call module-get-direct-libs,$1)) 733 734 # ----------------------------------------------------------------------------- 735 # This function is used to extract the list of static libraries that need 736 # to be linked as whole, i.e. placed in a special section on the final 737 # link command. 738 # Arguments: $1: module name. 739 # $2: list of all static link-time libraries (regular or whole). 740 # Returns : list of static libraries from '$2' that need to be linked 741 # as whole. 742 # ----------------------------------------------------------------------------- 743 module-extract-whole-static-libs = $(strip \ 744 $(eval _ndk_mod_whole_all := $(call map,module-get-whole-static-libs,$1 $2))\ 745 $(eval _ndk_mod_whole_result := $(filter $(_ndk_mod_whole_all),$2))\ 746 $(_ndk_mod_whole_result)) 747 748 # Used to recompute all dependencies once all module information has been recorded. 749 # 750 modules-compute-dependencies = \ 751 $(foreach __module,$(__ndk_modules),\ 752 $(call module-compute-depends,$(__module))\ 753 ) 754 755 module-compute-depends = \ 756 $(call module-add-static-depends,$1,$(__ndk_modules.$1.STATIC_LIBRARIES))\ 757 $(call module-add-static-depends,$1,$(__ndk_modules.$1.WHOLE_STATIC_LIBRARIES))\ 758 $(call module-add-shared-depends,$1,$(__ndk_modules.$1.SHARED_LIBRARIES))\ 759 760 module-get-installed = $(__ndk_modules.$1.INSTALLED) 761 762 module-get-depends = $(__ndk_modules.$1.depends) 763 764 # ----------------------------------------------------------------------------- 765 # Function : modules-get-all-installable 766 # Arguments: 1: list of module names 767 # Returns : List of all the installable modules $1 depends on transitively. 768 # Usage : $(call modules-all-get-installable,<list of module names>) 769 # Rationale: This computes the closure of all installable module dependencies starting from $1 770 # ----------------------------------------------------------------------------- 771 # For now, only the closure of LOCAL_SHARED_LIBRARIES is enough 772 modules-get-all-installable = $(strip \ 773 $(foreach __alldep,$(call module-get-all-dependencies,$1),\ 774 $(if $(call module-is-installable,$(__alldep)),$(__alldep))\ 775 )) 776 777 # Return the C++ extension(s) of a given module 778 # $1: module name 779 module-get-c++-extensions = $(strip \ 780 $(if $(__ndk_modules.$1.CPP_EXTENSION),\ 781 $(__ndk_modules.$1.CPP_EXTENSION),\ 782 $(default-c++-extensions)\ 783 )) 784 785 # Return the list of C++ sources of a given module 786 # 787 module-get-c++-sources = \ 788 $(eval __files := $(__ndk_modules.$1.SRC_FILES:%.neon=%)) \ 789 $(eval __files := $(__files:%.arm=%)) \ 790 $(eval __extensions := $(call module-get-c++-extensions,$1))\ 791 $(filter $(foreach __extension,$(__extensions),%$(__extension)),$(__files)) 792 793 # Returns true if a module has C++ sources 794 # 795 module-has-c++-sources = $(strip $(call module-get-c++-sources,$1)) 796 797 798 # Add C++ dependencies to any module that has C++ sources. 799 # $1: list of C++ runtime static libraries (if any) 800 # $2: list of C++ runtime shared libraries (if any) 801 # 802 modules-add-c++-dependencies = \ 803 $(foreach __module,$(__ndk_modules),\ 804 $(if $(call module-has-c++-sources,$(__module)),\ 805 $(call ndk_log,Module '$(__module)' has C++ sources)\ 806 $(call module-add-c++-deps,$(__module),$1,$2),\ 807 )\ 808 ) 809 810 811 # Return the compiler flags used to compile a C++ module 812 # Order matters and should match the one used by the build command 813 module-get-c++-flags = $(strip \ 814 $(__ndk_modules.$1.CFLAGS) \ 815 $(__ndk_modules.$1.CPPFLAGS) \ 816 $(__ndk_modules.$1.CXXFLAGS)) 817 818 # This function is used to remove certain flags from a module compiler flags 819 # $1: Module name 820 # $2: List of flags to remove 821 # 822 module-filter-out-compiler-flags = \ 823 $(eval __ndk_modules.$1.CFLAGS := $(filter-out $2,$(__ndk_modules.$1.CFLAGS)))\ 824 $(eval __ndk_modules.$1.CPPFLAGS := $(filter-out $2,$(__ndk_modules.$1.CPPFLAGS)))\ 825 $(eval __ndk_modules.$1.CXXFLAGS := $(filter-out $2,$(__ndk_modules.$1.CXXFLAGS))) 826 827 # Return true if a module's compiler flags enable rtti 828 # We just look at -frtti and -fno-rtti on the command-line 829 # and keep the last one of these flags. 830 module-flags-have-rtti = $(strip \ 831 $(filter -frtti,\ 832 $(lastword $(filter -frtti -fno-rtti,$(call module-get-c++-flags,$1)))\ 833 )\ 834 ) 835 836 # Same with C++ exception support (i.e. -fexceptions and -fno-exceptions) 837 # 838 module-flags-have-exceptions = $(strip \ 839 $(filter -fexceptions,\ 840 $(lastword $(filter -fexceptions -fno-execeptions,$(call module-get-c++-flags,$1)))\ 841 )\ 842 ) 843 844 # Handle the definition of LOCAL_CPP_FEATURES, i.e.: 845 # 846 # - If it is defined, check that it only contains valid values 847 # - If it is undefined, try to compute its value automatically by 848 # looking at the C++ compiler flags used to build the module 849 # 850 # After this, we remove all features flags from the module's command-line 851 # And add only the correct ones back in LOCAL_CPP_FLAGS 852 # 853 module-handle-c++-features = \ 854 $(if $(strip $(__ndk_modules.$1.CPP_FEATURES)),\ 855 $(eval __cxxbad := $(filter-out rtti exceptions,$(__ndk_modules.$1.CPP_FEATURES)))\ 856 $(if $(__cxxbad),\ 857 $(call __ndk_info,WARNING: Ignoring invalid values in LOCAL_CPP_FEATURES definition in $(__ndk_modules.$1.MAKEFILE): $(__cxxbad))\ 858 $(eval __ndk_modules.$1.CPP_FEATURES := $(strip $(filter-out $(__cxxbad),$(__ndk_modules.$1.CPP_FEATURES))))\ 859 )\ 860 ,\ 861 $(eval __ndk_modules.$1.CPP_FEATURES := $(strip \ 862 $(if $(call module-flags-have-rtti,$1),rtti) \ 863 $(if $(call module-flags-have-exceptions,$1),exceptions) \ 864 )) \ 865 )\ 866 $(call module-filter-out-compiler-flags,$1,-frtti -fno-rtti -fexceptions -fno-exceptions)\ 867 868 # Returns true if a module or its dependencies have specific C++ features 869 # (i.e. RTTI or Exceptions) 870 # 871 # $1: module name 872 # $2: list of features (e.g. 'rtti' or 'exceptions') 873 # 874 module-has-c++-features = $(strip \ 875 $(eval __cxxdeps := $(call module-get-all-dependencies,$1))\ 876 $(eval __cxxflags := $(foreach __cxxdep,$(__cxxdeps),$(__ndk_modules.$(__cxxdep).CPP_FEATURES)))\ 877 $(if $(filter $2,$(__cxxflags)),true,)\ 878 ) 879 880 # Add standard C++ dependencies to a given module 881 # 882 # $1: module name 883 # $2: list of C++ runtime static libraries (if any) 884 # $3: list of C++ runtime shared libraries (if any) 885 # 886 module-add-c++-deps = \ 887 $(if $(call strip,$2),$(call ndk_log,Add dependency '$(call strip,$2)' to module '$1'))\ 888 $(eval __ndk_modules.$1.STATIC_LIBRARIES += $(2))\ 889 $(if $(call strip,$3),$(call ndk_log,Add dependency '$(call strip,$3)' to module '$1'))\ 890 $(eval __ndk_modules.$1.SHARED_LIBRARIES += $(3)) 891 892 893 # ============================================================================= 894 # 895 # Utility functions 896 # 897 # ============================================================================= 898 899 # ----------------------------------------------------------------------------- 900 # Function : pretty-dir 901 # Arguments: 1: path 902 # Returns : Remove NDK_PROJECT_PATH prefix from a given path. This can be 903 # used to perform pretty-printing for logs. 904 # ----------------------------------------------------------------------------- 905 pretty-dir = $(patsubst $(NDK_ROOT)/%,<NDK>/%,\ 906 $(patsubst $(NDK_PROJECT_PATH)/%,%,$1)) 907 908 # Note: NDK_PROJECT_PATH is typically defined after this test is run. 909 -test-pretty-dir = \ 910 $(eval NDK_PROJECT_PATH ?= .)\ 911 $(call test-expect,foo,$(call pretty-dir,foo))\ 912 $(call test-expect,foo,$(call pretty-dir,$(NDK_PROJECT_PATH)/foo))\ 913 $(call test-expect,foo/bar,$(call pretty-dir,$(NDK_PROJECT_PATH)/foo/bar))\ 914 $(call test-expect,<NDK>/foo,$(call pretty-dir,$(NDK_ROOT)/foo))\ 915 $(call test-expect,<NDK>/foo/bar,$(call pretty-dir,$(NDK_ROOT)/foo/bar)) 916 917 # ----------------------------------------------------------------------------- 918 # Function : check-user-define 919 # Arguments: 1: name of variable that must be defined by the user 920 # 2: name of Makefile where the variable should be defined 921 # 3: name/description of the Makefile where the check is done, which 922 # must be included by $2 923 # Returns : None 924 # ----------------------------------------------------------------------------- 925 check-user-define = $(if $(strip $($1)),,\ 926 $(call __ndk_error,Missing $1 before including $3 in $2)) 927 928 # ----------------------------------------------------------------------------- 929 # This is used to check that LOCAL_MODULE is properly defined by an Android.mk 930 # file before including one of the $(BUILD_SHARED_LIBRARY), etc... files. 931 # 932 # Function : check-user-LOCAL_MODULE 933 # Arguments: 1: name/description of the included build Makefile where the 934 # check is done 935 # Returns : None 936 # Usage : $(call check-user-LOCAL_MODULE, BUILD_SHARED_LIBRARY) 937 # ----------------------------------------------------------------------------- 938 check-defined-LOCAL_MODULE = \ 939 $(call check-user-define,LOCAL_MODULE,$(local-makefile),$(1)) \ 940 $(if $(call seq,$(words $(LOCAL_MODULE)),1),,\ 941 $(call __ndk_info,LOCAL_MODULE definition in $(local-makefile) must not contain space)\ 942 $(call __ndk_error,Please correct error. Aborting)\ 943 ) 944 945 # ----------------------------------------------------------------------------- 946 # This is used to check that LOCAL_MODULE_FILENAME, if defined, is correct. 947 # 948 # Function : check-user-LOCAL_MODULE_FILENAME 949 # Returns : None 950 # Usage : $(call check-user-LOCAL_MODULE_FILENAME) 951 # ----------------------------------------------------------------------------- 952 check-LOCAL_MODULE_FILENAME = \ 953 $(if $(strip $(LOCAL_MODULE_FILENAME)),\ 954 $(if $(call seq,$(words $(LOCAL_MODULE_FILENAME)),1),,\ 955 $(call __ndk_info,$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain spaces)\ 956 $(call __ndk_error,Plase correct error. Aborting)\ 957 )\ 958 $(if $(filter %$(TARGET_LIB_EXTENSION) %$(TARGET_SONAME_EXTENSION),$(LOCAL_MODULE_FILENAME)),\ 959 $(call __ndk_info,$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_MODULE_FILENAME should not include file extensions)\ 960 )\ 961 ) 962 963 # ----------------------------------------------------------------------------- 964 # Function : handle-module-filename 965 # Arguments : 1: default file prefix 966 # 2: file suffix 967 # Returns : None 968 # Usage : $(call handle-module-filename,<prefix>,<suffix>) 969 # Rationale : To be used to check and or set the module's filename through 970 # the LOCAL_MODULE_FILENAME variable. 971 # ----------------------------------------------------------------------------- 972 handle-module-filename = $(eval $(call ev-handle-module-filename,$1,$2)) 973 974 # 975 # Check that LOCAL_MODULE_FILENAME is properly defined 976 # - with one single item 977 # - without a library file extension 978 # - with no directory separators 979 # 980 define ev-check-module-filename 981 ifneq (1,$$(words $$(LOCAL_MODULE_FILENAME))) 982 $$(call __ndk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain any space) 983 $$(call __ndk_error,Aborting) 984 endif 985 ifneq (,$$(filter %$$(TARGET_LIB_EXTENSION) %$$(TARGET_SONAME_EXTENSION),$$(LOCAL_MODULE_FILENAME))) 986 $$(call __ndk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain a file extension) 987 $$(call __ndk_error,Aborting) 988 endif 989 ifneq (1,$$(words $$(subst /, ,$$(LOCAL_MODULE_FILENAME)))) 990 $$(call __ndk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain directory separators) 991 $$(call __ndk_error,Aborting) 992 endif 993 endef 994 995 # 996 # Check the definition of LOCAL_MODULE_FILENAME. If none exists, 997 # infer it from the LOCAL_MODULE name. 998 # 999 # $1: default file prefix 1000 # $2: default file suffix 1001 # 1002 define ev-handle-module-filename 1003 LOCAL_MODULE_FILENAME := $$(strip $$(LOCAL_MODULE_FILENAME)) 1004 ifndef LOCAL_MODULE_FILENAME 1005 LOCAL_MODULE_FILENAME := $1$$(LOCAL_MODULE) 1006 endif 1007 $$(eval $$(call ev-check-module-filename)) 1008 LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME)$2 1009 endef 1010 1011 handle-prebuilt-module-filename = $(eval $(call ev-handle-prebuilt-module-filename,$1)) 1012 1013 # 1014 # Check the definition of LOCAL_MODULE_FILENAME for a _prebuilt_ module. 1015 # If none exists, infer it from $(LOCAL_SRC_FILES) 1016 # 1017 # $1: default file suffix 1018 # 1019 define ev-handle-prebuilt-module-filename 1020 LOCAL_MODULE_FILENAME := $$(strip $$(LOCAL_MODULE_FILENAME)) 1021 ifndef LOCAL_MODULE_FILENAME 1022 LOCAL_MODULE_FILENAME := $$(notdir $(LOCAL_SRC_FILES)) 1023 LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME:%$$(TARGET_LIB_EXTENSION)=%) 1024 LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME:%$$(TARGET_SONAME_EXTENSION)=%) 1025 endif 1026 LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME)$1 1027 $$(eval $$(call ev-check-module-filename)) 1028 endef 1029 1030 1031 # ----------------------------------------------------------------------------- 1032 # Function : handle-module-built 1033 # Returns : None 1034 # Usage : $(call handle-module-built) 1035 # Rationale : To be used to automatically compute the location of the generated 1036 # binary file, and the directory where to place its object files. 1037 # ----------------------------------------------------------------------------- 1038 handle-module-built = \ 1039 $(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(LOCAL_MODULE_FILENAME))\ 1040 $(eval LOCAL_OBJS_DIR := $(TARGET_OBJS)/$(LOCAL_MODULE)) 1041 1042 # ----------------------------------------------------------------------------- 1043 # Compute the real path of a prebuilt file. 1044 # 1045 # Function : local-prebuilt-path 1046 # Arguments: 1: prebuilt path (as listed in $(LOCAL_SRC_FILES)) 1047 # Returns : full path. If $1 begins with a /, the path is considered 1048 # absolute and returned as-is. Otherwise, $(LOCAL_PATH)/$1 is 1049 # returned instead. 1050 # Usage : $(call local-prebuilt-path,$(LOCAL_SRC_FILES)) 1051 # ----------------------------------------------------------------------------- 1052 local-prebuilt-path = $(call local-source-file-path,$1) 1053 1054 # ----------------------------------------------------------------------------- 1055 # This is used to strip any lib prefix from LOCAL_MODULE, then check that 1056 # the corresponding module name is not already defined. 1057 # 1058 # Function : check-user-LOCAL_MODULE 1059 # Arguments: 1: path of Android.mk where this LOCAL_MODULE is defined 1060 # Returns : None 1061 # Usage : $(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE)) 1062 # ----------------------------------------------------------------------------- 1063 check-LOCAL_MODULE = \ 1064 $(eval LOCAL_MODULE := $$(call strip-lib-prefix,$$(LOCAL_MODULE))) 1065 1066 # ----------------------------------------------------------------------------- 1067 # Macro : my-dir 1068 # Returns : the directory of the current Makefile 1069 # Usage : $(my-dir) 1070 # ----------------------------------------------------------------------------- 1071 my-dir = $(call parent-dir,$(lastword $(MAKEFILE_LIST))) 1072 1073 # ----------------------------------------------------------------------------- 1074 # Function : all-makefiles-under 1075 # Arguments: 1: directory path 1076 # Returns : a list of all makefiles immediately below some directory 1077 # Usage : $(call all-makefiles-under, <some path>) 1078 # ----------------------------------------------------------------------------- 1079 all-makefiles-under = $(wildcard $1/*/Android.mk) 1080 1081 # ----------------------------------------------------------------------------- 1082 # Macro : all-subdir-makefiles 1083 # Returns : list of all makefiles in subdirectories of the current Makefile's 1084 # location 1085 # Usage : $(all-subdir-makefiles) 1086 # ----------------------------------------------------------------------------- 1087 all-subdir-makefiles = $(call all-makefiles-under,$(call my-dir)) 1088 1089 # ============================================================================= 1090 # 1091 # Source file tagging support. 1092 # 1093 # Each source file listed in LOCAL_SRC_FILES can have any number of 1094 # 'tags' associated to it. A tag name must not contain space, and its 1095 # usage can vary. 1096 # 1097 # For example, the 'debug' tag is used to sources that must be built 1098 # in debug mode, the 'arm' tag is used for sources that must be built 1099 # using the 32-bit instruction set on ARM platforms, and 'neon' is used 1100 # for sources that must be built with ARM Advanced SIMD (a.k.a. NEON) 1101 # support. 1102 # 1103 # More tags might be introduced in the future. 1104 # 1105 # LOCAL_SRC_TAGS contains the list of all tags used (initially empty) 1106 # LOCAL_SRC_FILES contains the list of all source files. 1107 # LOCAL_SRC_TAG.<tagname> contains the set of source file names tagged 1108 # with <tagname> 1109 # LOCAL_SRC_FILES_TAGS.<filename> contains the set of tags for a given 1110 # source file name 1111 # 1112 # Tags are processed by a toolchain-specific function (e.g. TARGET-compute-cflags) 1113 # which will call various functions to compute source-file specific settings. 1114 # These are currently stored as: 1115 # 1116 # LOCAL_SRC_FILES_TARGET_CFLAGS.<filename> contains the list of 1117 # target-specific C compiler flags used to compile a given 1118 # source file. This is set by the function TARGET-set-cflags 1119 # defined in the toolchain's setup.mk script. 1120 # 1121 # LOCAL_SRC_FILES_TEXT.<filename> contains the 'text' that will be 1122 # displayed along the label of the build output line. For example 1123 # 'thumb' or 'arm ' with ARM-based toolchains. 1124 # 1125 # ============================================================================= 1126 1127 # ----------------------------------------------------------------------------- 1128 # Macro : clear-all-src-tags 1129 # Returns : remove all source file tags and associated data. 1130 # Usage : $(clear-all-src-tags) 1131 # ----------------------------------------------------------------------------- 1132 clear-all-src-tags = \ 1133 $(foreach __tag,$(LOCAL_SRC_TAGS), \ 1134 $(eval LOCAL_SRC_TAG.$(__tag) := $(empty)) \ 1135 ) \ 1136 $(foreach __src,$(LOCAL_SRC_FILES), \ 1137 $(eval LOCAL_SRC_FILES_TAGS.$(__src) := $(empty)) \ 1138 $(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) := $(empty)) \ 1139 $(eval LOCAL_SRC_FILES_TEXT.$(__src) := $(empty)) \ 1140 ) \ 1141 $(eval LOCAL_SRC_TAGS := $(empty_set)) 1142 1143 # ----------------------------------------------------------------------------- 1144 # Macro : tag-src-files 1145 # Arguments: 1: list of source files to tag 1146 # 2: tag name (must not contain space) 1147 # Usage : $(call tag-src-files,<list-of-source-files>,<tagname>) 1148 # Rationale: Add a tag to a list of source files 1149 # ----------------------------------------------------------------------------- 1150 tag-src-files = \ 1151 $(eval LOCAL_SRC_TAGS := $(call set_insert,$2,$(LOCAL_SRC_TAGS))) \ 1152 $(eval LOCAL_SRC_TAG.$2 := $(call set_union,$1,$(LOCAL_SRC_TAG.$2))) \ 1153 $(foreach __src,$1, \ 1154 $(eval LOCAL_SRC_FILES_TAGS.$(__src) += $2) \ 1155 ) 1156 1157 # ----------------------------------------------------------------------------- 1158 # Macro : get-src-files-with-tag 1159 # Arguments: 1: tag name 1160 # Usage : $(call get-src-files-with-tag,<tagname>) 1161 # Return : The list of source file names that have been tagged with <tagname> 1162 # ----------------------------------------------------------------------------- 1163 get-src-files-with-tag = $(LOCAL_SRC_TAG.$1) 1164 1165 # ----------------------------------------------------------------------------- 1166 # Macro : get-src-files-without-tag 1167 # Arguments: 1: tag name 1168 # Usage : $(call get-src-files-without-tag,<tagname>) 1169 # Return : The list of source file names that have NOT been tagged with <tagname> 1170 # ----------------------------------------------------------------------------- 1171 get-src-files-without-tag = $(filter-out $(LOCAL_SRC_TAG.$1),$(LOCAL_SRC_FILES)) 1172 1173 # ----------------------------------------------------------------------------- 1174 # Macro : set-src-files-target-cflags 1175 # Arguments: 1: list of source files 1176 # 2: list of compiler flags 1177 # Usage : $(call set-src-files-target-cflags,<sources>,<flags>) 1178 # Rationale: Set or replace the set of compiler flags that will be applied 1179 # when building a given set of source files. This function should 1180 # normally be called from the toolchain-specific function that 1181 # computes all compiler flags for all source files. 1182 # ----------------------------------------------------------------------------- 1183 set-src-files-target-cflags = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) := $2)) 1184 1185 # ----------------------------------------------------------------------------- 1186 # Macro : add-src-files-target-cflags 1187 # Arguments: 1: list of source files 1188 # 2: list of compiler flags 1189 # Usage : $(call add-src-files-target-cflags,<sources>,<flags>) 1190 # Rationale: A variant of set-src-files-target-cflags that can be used 1191 # to append, instead of replace, compiler flags for specific 1192 # source files. 1193 # ----------------------------------------------------------------------------- 1194 add-src-files-target-cflags = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) += $2)) 1195 1196 # ----------------------------------------------------------------------------- 1197 # Macro : get-src-file-target-cflags 1198 # Arguments: 1: single source file name 1199 # Usage : $(call get-src-file-target-cflags,<source>) 1200 # Rationale: Return the set of target-specific compiler flags that must be 1201 # applied to a given source file. These must be set prior to this 1202 # call using set-src-files-target-cflags or add-src-files-target-cflags 1203 # ----------------------------------------------------------------------------- 1204 get-src-file-target-cflags = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$1) 1205 1206 # ----------------------------------------------------------------------------- 1207 # Macro : set-src-files-text 1208 # Arguments: 1: list of source files 1209 # 2: text 1210 # Usage : $(call set-src-files-text,<sources>,<text>) 1211 # Rationale: Set or replace the 'text' associated to a set of source files. 1212 # The text is a very short string that complements the build 1213 # label. For example, it will be either 'thumb' or 'arm ' for 1214 # ARM-based toolchains. This function must be called by the 1215 # toolchain-specific functions that processes all source files. 1216 # ----------------------------------------------------------------------------- 1217 set-src-files-text = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TEXT.$(__src) := $2)) 1218 1219 # ----------------------------------------------------------------------------- 1220 # Macro : get-src-file-text 1221 # Arguments: 1: single source file 1222 # Usage : $(call get-src-file-text,<source>) 1223 # Rationale: Return the 'text' associated to a given source file when 1224 # set-src-files-text was called. 1225 # ----------------------------------------------------------------------------- 1226 get-src-file-text = $(LOCAL_SRC_FILES_TEXT.$1) 1227 1228 # This should only be called for debugging the source files tagging system 1229 dump-src-file-tags = \ 1230 $(info LOCAL_SRC_TAGS := $(LOCAL_SRC_TAGS)) \ 1231 $(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES)) \ 1232 $(foreach __tag,$(LOCAL_SRC_TAGS),$(info LOCAL_SRC_TAG.$(__tag) = $(LOCAL_SRC_TAG.$(__tag)))) \ 1233 $(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TAGS.$(__src) = $(LOCAL_SRC_FILES_TAGS.$(__src)))) \ 1234 $(info WITH arm = $(call get-src-files-with-tag,arm)) \ 1235 $(info WITHOUT arm = $(call get-src-files-without-tag,arm)) \ 1236 $(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src)))) \ 1237 $(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TEXT.$(__src) = $(LOCAL_SRC_FILES_TEXT.$(__src)))) \ 1238 1239 1240 # ============================================================================= 1241 # 1242 # Application.mk support 1243 # 1244 # ============================================================================= 1245 1246 # the list of variables that *must* be defined in Application.mk files 1247 NDK_APP_VARS_REQUIRED := 1248 1249 # the list of variables that *may* be defined in Application.mk files 1250 NDK_APP_VARS_OPTIONAL := APP_OPTIM APP_CPPFLAGS APP_CFLAGS APP_CXXFLAGS APP_LDFLAGS \ 1251 APP_PLATFORM APP_BUILD_SCRIPT APP_ABI APP_MODULES \ 1252 APP_PROJECT_PATH APP_STL APP_SHORT_COMMANDS \ 1253 APP_PIE APP_THIN_ARCHIVE 1254 1255 # the list of all variables that may appear in an Application.mk file 1256 # or defined by the build scripts. 1257 NDK_APP_VARS := $(NDK_APP_VARS_REQUIRED) \ 1258 $(NDK_APP_VARS_OPTIONAL) \ 1259 APP_DEBUG \ 1260 APP_DEBUGGABLE \ 1261 APP_MANIFEST 1262 1263 # ============================================================================= 1264 # 1265 # Android.mk support 1266 # 1267 # ============================================================================= 1268 1269 # ============================================================================= 1270 # 1271 # Build commands support 1272 # 1273 # ============================================================================= 1274 1275 get-object-name = $(strip \ 1276 $(subst ../,__/,\ 1277 $(eval __obj := $1)\ 1278 $(foreach __ext,.c .s .S $(LOCAL_CPP_EXTENSION),\ 1279 $(eval __obj := $(__obj:%$(__ext)=%$(TARGET_OBJ_EXTENSION)))\ 1280 )\ 1281 $(__obj)\ 1282 )) 1283 1284 -test-get-object-name = \ 1285 $(eval TARGET_OBJ_EXTENSION=.o)\ 1286 $(eval LOCAL_CPP_EXTENSION ?= .cpp)\ 1287 $(call test-expect,foo.o,$(call get-object-name,foo.c))\ 1288 $(call test-expect,bar.o,$(call get-object-name,bar.s))\ 1289 $(call test-expect,zoo.o,$(call get-object-name,zoo.S))\ 1290 $(call test-expect,tot.o,$(call get-object-name,tot.cpp)) 1291 1292 # ----------------------------------------------------------------------------- 1293 # Macro : hide 1294 # Returns : nothing 1295 # Usage : $(hide)<make commands> 1296 # Rationale: To be used as a prefix for Make build commands to hide them 1297 # by default during the build. To show them, set V=1 in your 1298 # environment or command-line. 1299 # 1300 # For example: 1301 # 1302 # foo.o: foo.c 1303 # -->|$(hide) <build-commands> 1304 # 1305 # Where '-->|' stands for a single tab character. 1306 # 1307 # ----------------------------------------------------------------------------- 1308 ifeq ($(V),1) 1309 hide = $(empty) 1310 else 1311 hide = @ 1312 endif 1313 1314 1315 # ----------------------------------------------------------------------------- 1316 # Function : local-source-file-path 1317 # Parameters: $1: source file (as listed in LOCAL_SRC_FILES) 1318 # Returns : full source file path of $1 1319 # Usage : $(call local-source-file-path,$1) 1320 # Rationale : Used to compute the full path of a source listed in 1321 # LOCAL_SRC_FILES. If it is an absolute path, then this 1322 # returns the input, otherwise, prepends $(LOCAL_PATH)/ 1323 # to the result. 1324 # ----------------------------------------------------------------------------- 1325 local-source-file-path = $(if $(call host-path-is-absolute,$1),$1,$(LOCAL_PATH)/$1) 1326 1327 # cmd-convert-deps 1328 # 1329 # On Cygwin, we need to convert the .d dependency file generated by 1330 # the gcc toolchain by transforming any Windows paths inside it into 1331 # Cygwin paths that GNU Make can understand (i.e. C:/Foo => /cygdrive/c/Foo) 1332 # 1333 # To do that, we will force the compiler to write the dependency file to 1334 # <foo>.d.org, which will will later convert through a clever sed script 1335 # that is auto-generated by our build system. 1336 # 1337 # The script is invoked with: 1338 # 1339 # $(NDK_DEPENDENCIES_CONVERTER) foo.d 1340 # 1341 # It will look if foo.d.org exists, and if so, process it 1342 # to generate foo.d, then remove the original foo.d.org. 1343 # 1344 # On other systems, we simply tell the compiler to write to the .d file directly. 1345 # 1346 # NOTE: In certain cases, no dependency file will be generated by the 1347 # compiler (e.g. when compiling an assembly file as foo.s) 1348 # 1349 # convert-deps is used to compute the name of the compiler-generated dependency file 1350 # cmd-convert-deps is a command used to convert it to a Cygwin-specific path 1351 # 1352 ifeq ($(HOST_OS),cygwin) 1353 convert-deps = $1.org 1354 cmd-convert-deps = && $(NDK_DEPENDENCIES_CONVERTER) $1 1355 else 1356 convert-deps = $1 1357 cmd-convert-deps = 1358 endif 1359 1360 # This assumes that many variables have been pre-defined: 1361 # _SRC: source file 1362 # _OBJ: destination file 1363 # _CC: 'compiler' command 1364 # _FLAGS: 'compiler' flags 1365 # _TEXT: Display text (e.g. "Compile++ thumb", must be EXACTLY 15 chars long) 1366 # 1367 define ev-build-file 1368 $$(_OBJ): PRIVATE_SRC := $$(_SRC) 1369 $$(_OBJ): PRIVATE_OBJ := $$(_OBJ) 1370 $$(_OBJ): PRIVATE_DEPS := $$(call host-path,$$(_OBJ).d) 1371 $$(_OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE) 1372 $$(_OBJ): PRIVATE_TEXT := "$$(_TEXT)" 1373 $$(_OBJ): PRIVATE_CC := $$(_CC) 1374 $$(_OBJ): PRIVATE_CFLAGS := $$(_FLAGS) 1375 1376 ifeq ($$(LOCAL_SHORT_COMMANDS),true) 1377 _OPTIONS_LISTFILE := $$(_OBJ).cflags 1378 $$(_OBJ): $$(call generate-list-file,$$(_FLAGS),$$(_OPTIONS_LISTFILE)) 1379 $$(_OBJ): PRIVATE_CFLAGS := @$$(call host-path,$$(_OPTIONS_LISTFILE)) 1380 $$(_OBJ): $$(_OPTIONS_LISTFILE) 1381 endif 1382 1383 $$(call generate-file-dir,$$(_OBJ)) 1384 1385 $$(_OBJ): $$(_SRC) $$(LOCAL_MAKEFILE) $$(NDK_APP_APPLICATION_MK) $$(NDK_DEPENDENCIES_CONVERTER) 1386 @$$(HOST_ECHO) "$$(PRIVATE_TEXT) : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))" 1387 $$(hide) $$(PRIVATE_CC) -MMD -MP -MF $$(call convert-deps,$$(PRIVATE_DEPS)) $$(PRIVATE_CFLAGS) $$(call host-path,$$(PRIVATE_SRC)) -o $$(call host-path,$$(PRIVATE_OBJ)) \ 1388 $$(call cmd-convert-deps,$$(PRIVATE_DEPS)) 1389 endef 1390 1391 # This assumes the same things than ev-build-file, but will handle 1392 # the definition of LOCAL_FILTER_ASM as well. 1393 define ev-build-source-file 1394 LOCAL_DEPENDENCY_DIRS += $$(dir $$(_OBJ)) 1395 ifndef LOCAL_FILTER_ASM 1396 # Trivial case: Directly generate an object file 1397 $$(eval $$(call ev-build-file)) 1398 else 1399 # This is where things get hairy, we first transform 1400 # the source into an assembler file, send it to the 1401 # filter, then generate a final object file from it. 1402 # 1403 1404 # First, remember the original settings and compute 1405 # the location of our temporary files. 1406 # 1407 _ORG_SRC := $$(_SRC) 1408 _ORG_OBJ := $$(_OBJ) 1409 _ORG_FLAGS := $$(_FLAGS) 1410 _ORG_TEXT := $$(_TEXT) 1411 1412 _OBJ_ASM_ORIGINAL := $$(patsubst %$$(TARGET_OBJ_EXTENSION),%.s,$$(_ORG_OBJ)) 1413 _OBJ_ASM_FILTERED := $$(patsubst %$$(TARGET_OBJ_EXTENSION),%.filtered.s,$$(_ORG_OBJ)) 1414 1415 # If the source file is a plain assembler file, we're going to 1416 # use it directly in our filter. 1417 ifneq (,$$(filter %.s,$$(_SRC))) 1418 _OBJ_ASM_ORIGINAL := $$(_SRC) 1419 endif 1420 1421 #$$(info SRC=$$(_SRC) OBJ=$$(_OBJ) OBJ_ORIGINAL=$$(_OBJ_ASM_ORIGINAL) OBJ_FILTERED=$$(_OBJ_ASM_FILTERED)) 1422 1423 # We need to transform the source into an assembly file, instead of 1424 # an object. The proper way to do that depends on the file extension. 1425 # 1426 # For C and C++ source files, simply replace the -c by an -S in the 1427 # compilation command (this forces the compiler to generate an 1428 # assembly file). 1429 # 1430 # For assembler templates (which end in .S), replace the -c with -E 1431 # to send it to the preprocessor instead. 1432 # 1433 # Don't do anything for plain assembly files (which end in .s) 1434 # 1435 ifeq (,$$(filter %.s,$$(_SRC))) 1436 _OBJ := $$(_OBJ_ASM_ORIGINAL) 1437 ifneq (,$$(filter %.S,$$(_SRC))) 1438 _FLAGS := $$(patsubst -c,-E,$$(_ORG_FLAGS)) 1439 else 1440 _FLAGS := $$(patsubst -c,-S,$$(_ORG_FLAGS)) 1441 endif 1442 $$(eval $$(call ev-build-file)) 1443 endif 1444 1445 # Next, process the assembly file with the filter 1446 $$(_OBJ_ASM_FILTERED): PRIVATE_SRC := $$(_OBJ_ASM_ORIGINAL) 1447 $$(_OBJ_ASM_FILTERED): PRIVATE_DST := $$(_OBJ_ASM_FILTERED) 1448 $$(_OBJ_ASM_FILTERED): PRIVATE_FILTER := $$(LOCAL_FILTER_ASM) 1449 $$(_OBJ_ASM_FILTERED): PRIVATE_MODULE := $$(LOCAL_MODULE) 1450 $$(_OBJ_ASM_FILTERED): $$(_OBJ_ASM_ORIGINAL) 1451 @$$(HOST_ECHO) "AsmFilter : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))" 1452 $$(hide) $$(PRIVATE_FILTER) $$(PRIVATE_SRC) $$(PRIVATE_DST) 1453 1454 # Then, generate the final object, we need to keep assembler-specific 1455 # flags which look like -Wa,<option>: 1456 _SRC := $$(_OBJ_ASM_FILTERED) 1457 _OBJ := $$(_ORG_OBJ) 1458 _FLAGS := $$(filter -Wa%,$$(_ORG_FLAGS)) -c 1459 _TEXT := "Assembly " 1460 $$(eval $$(call ev-build-file)) 1461 endif 1462 endef 1463 1464 # ----------------------------------------------------------------------------- 1465 # Template : ev-compile-c-source 1466 # Arguments : 1: single C source file name (relative to LOCAL_PATH) 1467 # 2: target object file (without path) 1468 # Returns : None 1469 # Usage : $(eval $(call ev-compile-c-source,<srcfile>,<objfile>) 1470 # Rationale : Internal template evaluated by compile-c-source and 1471 # compile-s-source 1472 # ----------------------------------------------------------------------------- 1473 define ev-compile-c-source 1474 _SRC:=$$(call local-source-file-path,$(1)) 1475 _OBJ:=$$(LOCAL_OBJS_DIR:%/=%)/$(2) 1476 1477 _FLAGS := $$($$(my)CFLAGS) \ 1478 $$(call get-src-file-target-cflags,$(1)) \ 1479 $$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(LOCAL_PATH)) \ 1480 $$(LOCAL_CFLAGS) \ 1481 $$(NDK_APP_CFLAGS) \ 1482 $$(call host-c-includes,$$($(my)C_INCLUDES)) \ 1483 -c \ 1484 1485 _TEXT := "Compile $$(call get-src-file-text,$1)" 1486 _CC := $$(NDK_CCACHE) $$(TARGET_CC) 1487 1488 $$(eval $$(call ev-build-source-file)) 1489 endef 1490 1491 # ----------------------------------------------------------------------------- 1492 # Function : compile-c-source 1493 # Arguments : 1: single C source file name (relative to LOCAL_PATH) 1494 # 2: object file 1495 # Returns : None 1496 # Usage : $(call compile-c-source,<srcfile>,<objfile>) 1497 # Rationale : Setup everything required to build a single C source file 1498 # ----------------------------------------------------------------------------- 1499 compile-c-source = $(eval $(call ev-compile-c-source,$1,$2)) 1500 1501 # ----------------------------------------------------------------------------- 1502 # Function : compile-s-source 1503 # Arguments : 1: single Assembly source file name (relative to LOCAL_PATH) 1504 # 2: object file 1505 # Returns : None 1506 # Usage : $(call compile-s-source,<srcfile>,<objfile>) 1507 # Rationale : Setup everything required to build a single Assembly source file 1508 # ----------------------------------------------------------------------------- 1509 compile-s-source = $(eval $(call ev-compile-c-source,$1,$2)) 1510 1511 1512 # ----------------------------------------------------------------------------- 1513 # Template : ev-compile-cpp-source 1514 # Arguments : 1: single C++ source file name (relative to LOCAL_PATH) 1515 # 2: target object file (without path) 1516 # Returns : None 1517 # Usage : $(eval $(call ev-compile-cpp-source,<srcfile>,<objfile>) 1518 # Rationale : Internal template evaluated by compile-cpp-source 1519 # ----------------------------------------------------------------------------- 1520 1521 define ev-compile-cpp-source 1522 _SRC:=$$(call local-source-file-path,$(1)) 1523 _OBJ:=$$(LOCAL_OBJS_DIR:%/=%)/$(2) 1524 _FLAGS := $$($$(my)CXXFLAGS) \ 1525 $$(call get-src-file-target-cflags,$(1)) \ 1526 $$(call host-c-includes, $$(LOCAL_C_INCLUDES) $$(LOCAL_PATH)) \ 1527 $$(LOCAL_CFLAGS) \ 1528 $$(LOCAL_CPPFLAGS) \ 1529 $$(LOCAL_CXXFLAGS) \ 1530 $$(NDK_APP_CFLAGS) \ 1531 $$(NDK_APP_CPPFLAGS) \ 1532 $$(NDK_APP_CXXFLAGS) \ 1533 $$(call host-c-includes,$$($(my)C_INCLUDES)) \ 1534 -c \ 1535 1536 _CC := $$(NDK_CCACHE) $$($$(my)CXX) 1537 _TEXT := "Compile++ $$(call get-src-file-text,$1)" 1538 1539 $$(eval $$(call ev-build-source-file)) 1540 endef 1541 1542 # ----------------------------------------------------------------------------- 1543 # Function : compile-cpp-source 1544 # Arguments : 1: single C++ source file name (relative to LOCAL_PATH) 1545 # : 2: object file name 1546 # Returns : None 1547 # Usage : $(call compile-c-source,<srcfile>) 1548 # Rationale : Setup everything required to build a single C++ source file 1549 # ----------------------------------------------------------------------------- 1550 compile-cpp-source = $(eval $(call ev-compile-cpp-source,$1,$2)) 1551 1552 # 1553 # Module imports 1554 # 1555 1556 # Initialize import list 1557 import-init = $(eval __ndk_import_dirs :=) 1558 1559 # Add an optional single directory to the list of import paths 1560 # 1561 import-add-path-optional = \ 1562 $(if $(strip $(wildcard $1)),\ 1563 $(call ndk_log,Adding import directory: $1)\ 1564 $(eval __ndk_import_dirs += $1)\ 1565 )\ 1566 1567 # Add a directory to the list of import paths 1568 # This will warn if the directory does not exist 1569 # 1570 import-add-path = \ 1571 $(if $(strip $(wildcard $1)),\ 1572 $(call ndk_log,Adding import directory: $1)\ 1573 $(eval __ndk_import_dirs += $1)\ 1574 ,\ 1575 $(call __ndk_info,WARNING: Ignoring unknown import directory: $1)\ 1576 )\ 1577 1578 import-find-module = $(strip \ 1579 $(eval __imported_module :=)\ 1580 $(foreach __import_dir,$(__ndk_import_dirs),\ 1581 $(if $(__imported_module),,\ 1582 $(call ndk_log, Probing $(__import_dir)/$1/Android.mk)\ 1583 $(if $(strip $(wildcard $(__import_dir)/$1/Android.mk)),\ 1584 $(eval __imported_module := $(__import_dir)/$1)\ 1585 )\ 1586 )\ 1587 )\ 1588 $(__imported_module)\ 1589 ) 1590 1591 # described in docs/IMPORT-MODULE.TXT 1592 # $1: tag name for the lookup 1593 # 1594 # Small technical note on __ndk_import_depth: we use this variable to 1595 # record the depth of recursive import-module calls. The variable is 1596 # initially empty, and we append a "x" to it each time import-module is 1597 # called. I.e. for three recursive calls to import-module, we would get 1598 # the values: 1599 # 1600 # first call: x 1601 # second call: xx 1602 # third call: xxx 1603 # 1604 # This is used in module-add to add the top-level modules (i.e. those 1605 # that are not added with import-module) to __ndk_top_modules, corresponding 1606 # to the default list of wanted modules (see setup-toolchain.mk). 1607 # 1608 import-module = \ 1609 $(eval __import_tag := $(strip $1))\ 1610 $(if $(call seq,$(words $(__import_tag)),1),,\ 1611 $(call __ndk_info,$(call local-makefile): Cannot import module with spaces in tag: '$(__import_tag)')\ 1612 )\ 1613 $(if $(call set_is_member,$(__ndk_import_list),$(__import_tag)),\ 1614 $(call ndk_log,Skipping duplicate import for module with tag '$(__import_tag)')\ 1615 ,\ 1616 $(call ndk_log,Looking for imported module with tag '$(__import_tag)')\ 1617 $(eval __imported_path := $(call import-find-module,$(__import_tag)))\ 1618 $(if $(__imported_path),\ 1619 $(call ndk_log, Found in $(__imported_path))\ 1620 $(eval __ndk_import_depth := $(__ndk_import_depth)x) \ 1621 $(eval __ndk_import_list := $(call set_insert,$(__ndk_import_list),$(__import_tag)))\ 1622 $(eval include $(__imported_path)/Android.mk)\ 1623 $(eval __ndk_import_depth := $(__ndk_import_depth:%x=%))\ 1624 ,\ 1625 $(call __ndk_info,$(call local-makefile): Cannot find module with tag '$(__import_tag)' in import path)\ 1626 $(call __ndk_info,Are you sure your NDK_MODULE_PATH variable is properly defined ?)\ 1627 $(call __ndk_info,The following directories were searched:)\ 1628 $(for __import_dir,$(__ndk_import_dirs),\ 1629 $(call __ndk_info, $(__import_dir))\ 1630 )\ 1631 $(call __ndk_error,Aborting.)\ 1632 )\ 1633 ) 1634 1635 # Only used for debugging 1636 # 1637 import-debug = \ 1638 $(info IMPORT DIRECTORIES:)\ 1639 $(foreach __dir,$(__ndk_import_dirs),\ 1640 $(info -- $(__dir))\ 1641 )\ 1642 1643 # 1644 # Module classes 1645 # 1646 NDK_MODULE_CLASSES := 1647 1648 # Register a new module class 1649 # $1: class name (e.g. STATIC_LIBRARY) 1650 # $2: optional file prefix (e.g. 'lib') 1651 # $3: optional file suffix (e.g. '.so') 1652 # 1653 module-class-register = \ 1654 $(eval NDK_MODULE_CLASSES += $1) \ 1655 $(eval NDK_MODULE_CLASS.$1.FILE_PREFIX := $2) \ 1656 $(eval NDK_MODULE_CLASS.$1.FILE_SUFFIX := $3) \ 1657 $(eval NDK_MODULE_CLASS.$1.INSTALLABLE := $(false)) \ 1658 1659 # Same a module-class-register, for installable modules 1660 # 1661 # An installable module is one that will be copied to $PROJECT/libs/<abi>/ 1662 # during the NDK build. 1663 # 1664 # $1: class name 1665 # $2: optional file prefix 1666 # $3: optional file suffix 1667 # 1668 module-class-register-installable = \ 1669 $(call module-class-register,$1,$2,$3) \ 1670 $(eval NDK_MODULE_CLASS.$1.INSTALLABLE := $(true)) 1671 1672 # Returns $(true) if $1 is a valid/registered LOCAL_MODULE_CLASS value 1673 # 1674 module-class-check = $(call set_is_member,$(NDK_MODULE_CLASSES),$1) 1675 1676 # Returns $(true) if $1 corresponds to an installable module class 1677 # 1678 module-class-is-installable = $(if $(NDK_MODULE_CLASS.$1.INSTALLABLE),$(true),$(false)) 1679 1680 # Returns $(true) if $1 corresponds to a copyable prebuilt module class 1681 # 1682 module-class-is-copyable = $(if $(call seq,$1,PREBUILT_SHARED_LIBRARY),$(true),$(false)) 1683 1684 # 1685 # Register valid module classes 1686 # 1687 1688 # static libraries: 1689 # <foo> -> lib<foo>.a by default 1690 $(call module-class-register,STATIC_LIBRARY,lib,$(TARGET_LIB_EXTENSION)) 1691 1692 # shared libraries: 1693 # <foo> -> lib<foo>.so 1694 # a shared library is installable. 1695 $(call module-class-register-installable,SHARED_LIBRARY,lib,$(TARGET_SONAME_EXTENSION)) 1696 1697 # executable 1698 # <foo> -> <foo> 1699 # an executable is installable. 1700 $(call module-class-register-installable,EXECUTABLE,,) 1701 1702 # prebuilt shared library 1703 # <foo> -> <foo> (we assume it is already well-named) 1704 # it is installable 1705 $(call module-class-register-installable,PREBUILT_SHARED_LIBRARY,,) 1706 1707 # prebuilt static library 1708 # <foo> -> <foo> (we assume it is already well-named) 1709 $(call module-class-register,PREBUILT_STATIC_LIBRARY,,) 1710 1711 # 1712 # C++ STL support 1713 # 1714 1715 # The list of registered STL implementations we support 1716 NDK_STL_LIST := 1717 1718 # Used internally to register a given STL implementation, see below. 1719 # 1720 # $1: STL name as it appears in APP_STL (e.g. system) 1721 # $2: STL module name (e.g. cxx-stl/system) 1722 # $3: list of static libraries all modules will depend on 1723 # $4: list of shared libraries all modules will depend on 1724 # 1725 ndk-stl-register = \ 1726 $(eval __ndk_stl := $(strip $1)) \ 1727 $(eval NDK_STL_LIST += $(__ndk_stl)) \ 1728 $(eval NDK_STL.$(__ndk_stl).IMPORT_MODULE := $(strip $2)) \ 1729 $(eval NDK_STL.$(__ndk_stl).STATIC_LIBS := $(strip $(call strip-lib-prefix,$3))) \ 1730 $(eval NDK_STL.$(__ndk_stl).SHARED_LIBS := $(strip $(call strip-lib-prefix,$4))) 1731 1732 # Called to check that the value of APP_STL is a valid one. 1733 # $1: STL name as it apperas in APP_STL (e.g. 'system') 1734 # 1735 ndk-stl-check = \ 1736 $(if $(call set_is_member,$(NDK_STL_LIST),$1),,\ 1737 $(call __ndk_info,Invalid APP_STL value: $1)\ 1738 $(call __ndk_info,Please use one of the following instead: $(NDK_STL_LIST))\ 1739 $(call __ndk_error,Aborting)) 1740 1741 # Called before the top-level Android.mk is parsed to 1742 # select the STL implementation. 1743 # $1: STL name as it appears in APP_STL (e.g. system) 1744 # 1745 ndk-stl-select = \ 1746 $(call import-module,$(NDK_STL.$1.IMPORT_MODULE)) 1747 1748 # Called after all Android.mk files are parsed to add 1749 # proper STL dependencies to every C++ module. 1750 # $1: STL name as it appears in APP_STL (e.g. system) 1751 # 1752 ndk-stl-add-dependencies = \ 1753 $(call modules-add-c++-dependencies,\ 1754 $(NDK_STL.$1.STATIC_LIBS),\ 1755 $(NDK_STL.$1.SHARED_LIBS)) 1756 1757 # 1758 # 1759 1760 # Register the 'system' STL implementation 1761 # 1762 $(call ndk-stl-register,\ 1763 system,\ 1764 cxx-stl/system,\ 1765 libstdc++,\ 1766 ) 1767 1768 # Register the 'stlport_static' STL implementation 1769 # 1770 $(call ndk-stl-register,\ 1771 stlport_static,\ 1772 cxx-stl/stlport,\ 1773 stlport_static,\ 1774 ) 1775 1776 # Register the 'stlport_shared' STL implementation 1777 # 1778 $(call ndk-stl-register,\ 1779 stlport_shared,\ 1780 cxx-stl/stlport,\ 1781 ,\ 1782 stlport_shared\ 1783 ) 1784 1785 # Register the 'gnustl_static' STL implementation 1786 # 1787 $(call ndk-stl-register,\ 1788 gnustl_static,\ 1789 cxx-stl/gnu-libstdc++,\ 1790 gnustl_static,\ 1791 \ 1792 ) 1793 1794 $(call ndk-stl-register,\ 1795 gnustl_shared,\ 1796 cxx-stl/gnu-libstdc++,\ 1797 ,\ 1798 gnustl_shared\ 1799 ) 1800 1801 # Register the static version of the GAbi++ C++ runtime 1802 # 1803 $(call ndk-stl-register,\ 1804 gabi++_static,\ 1805 cxx-stl/gabi++,\ 1806 gabi++_static,\ 1807 ) 1808 1809 # Register the shared version of the GAbi++ C++ runtime 1810 # 1811 $(call ndk-stl-register,\ 1812 gabi++_shared,\ 1813 cxx-stl/gabi++,\ 1814 gabi++_shared,\ 1815 ) 1816 1817 # The 'none' APP_STL value corresponds to no C++ support at 1818 # all. Used by some of the STLport and GAbi++ test projects. 1819 # 1820 $(call ndk-stl-register,\ 1821 none,\ 1822 cxx-stl/system,\ 1823 ) 1824 1825 ifneq (,$(NDK_UNIT_TESTS)) 1826 $(call ndk-run-all-tests) 1827 endif 1828