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