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