Home | History | Annotate | Download | only in core
      1 # We use the GNU Make Standard Library
      2 include $(GDK_ROOT)/build/gmsl/gmsl
      3 
      4 # -----------------------------------------------------------------------------
      5 # Macro    : empty
      6 # Returns  : an empty macro
      7 # Usage    : $(empty)
      8 # -----------------------------------------------------------------------------
      9 empty :=
     10 
     11 # -----------------------------------------------------------------------------
     12 # Macro    : space
     13 # Returns  : a single space
     14 # Usage    : $(space)
     15 # -----------------------------------------------------------------------------
     16 space  := $(empty) $(empty)
     17 
     18 # -----------------------------------------------------------------------------
     19 # Function : last2
     20 # Arguments: a list
     21 # Returns  : the penultimate (next-to-last) element of a list
     22 # Usage    : $(call last2, <LIST>)
     23 # -----------------------------------------------------------------------------
     24 last2 = $(word $(words $1), x $1)
     25 
     26 # -----------------------------------------------------------------------------
     27 # Function : last3
     28 # Arguments: a list
     29 # Returns  : the antepenultimate (second-next-to-last) element of a list
     30 # Usage    : $(call last3, <LIST>)
     31 # -----------------------------------------------------------------------------
     32 last3 = $(word $(words $1), x x $1)
     33 
     34 # -----------------------------------------------------------------------------
     35 # Function : remove-duplicates
     36 # Arguments: a list
     37 # Returns  : the list with duplicate items removed, order is preserved.
     38 # Usage    : $(call remove-duplicates, <LIST>)
     39 # Note     : This is equivalent to the 'uniq' function provided by GMSL,
     40 #            however this implementation is non-recursive and *much*
     41 #            faster. It will also not explode the stack with a lot of
     42 #            items like 'uniq' does.
     43 # -----------------------------------------------------------------------------
     44 remove-duplicates = $(strip \
     45   $(eval __uniq_ret :=) \
     46   $(foreach __uniq_item,$1,\
     47     $(if $(findstring $(__uniq_item),$(__uniq_ret)),,\
     48       $(eval __uniq_ret += $(__uniq_item))\
     49     )\
     50   )\
     51   $(__uniq_ret))
     52 
     53 # -----------------------------------------------------------------------------
     54 # Macro    : this-makefile
     55 # Returns  : the name of the current Makefile in the inclusion stack
     56 # Usage    : $(this-makefile)
     57 # -----------------------------------------------------------------------------
     58 this-makefile = $(lastword $(MAKEFILE_LIST))
     59 
     60 # -----------------------------------------------------------------------------
     61 # Macro    : local-makefile
     62 # Returns  : the name of the last parsed Android-portable.mk file
     63 # Usage    : $(local-makefile)
     64 # -----------------------------------------------------------------------------
     65 local-makefile = $(lastword $(filter %Android-portable.mk,$(MAKEFILE_LIST)))
     66 
     67 # -----------------------------------------------------------------------------
     68 # Function : assert-defined
     69 # Arguments: 1: list of variable names
     70 # Returns  : None
     71 # Usage    : $(call assert-defined, VAR1 VAR2 VAR3...)
     72 # Rationale: Checks that all variables listed in $1 are defined, or abort the
     73 #            build
     74 # -----------------------------------------------------------------------------
     75 assert-defined = $(foreach __varname,$(strip $1),\
     76   $(if $(strip $($(__varname))),,\
     77     $(call __gdk_error, Assertion failure: $(__varname) is not defined)\
     78   )\
     79 )
     80 
     81 # -----------------------------------------------------------------------------
     82 # Function : clear-vars
     83 # Arguments: 1: list of variable names
     84 #            2: file where the variable should be defined
     85 # Returns  : None
     86 # Usage    : $(call clear-vars, VAR1 VAR2 VAR3...)
     87 # Rationale: Clears/undefines all variables in argument list
     88 # -----------------------------------------------------------------------------
     89 clear-vars = $(foreach __varname,$1,$(eval $(__varname) := $(empty)))
     90 
     91 # -----------------------------------------------------------------------------
     92 # Function : check-required-vars
     93 # Arguments: 1: list of variable names
     94 #            2: file where the variable(s) should be defined
     95 # Returns  : None
     96 # Usage    : $(call check-required-vars, VAR1 VAR2 VAR3..., <file>)
     97 # Rationale: Checks that all required vars listed in $1 were defined by $2
     98 #            or abort the build with an error
     99 # -----------------------------------------------------------------------------
    100 check-required-vars = $(foreach __varname,$1,\
    101   $(if $(strip $($(__varname))),,\
    102     $(call __gdk_info, Required variable $(__varname) is not defined by $2)\
    103     $(call __gdk_error,Aborting)\
    104   )\
    105 )
    106 
    107 # -----------------------------------------------------------------------------
    108 # Function : host-path
    109 # Arguments: 1: file path
    110 # Returns  : file path, as understood by the host file system
    111 # Usage    : $(call host-path,<path>)
    112 # Rationale: This function is used to translate Cygwin paths into
    113 #            Windows-specific ones. On other platforms, it will just
    114 #            return its argument.
    115 # -----------------------------------------------------------------------------
    116 ifeq ($(HOST_OS),windows)
    117 host-path = $(if $(strip $1),$(call cygwin-to-host-path,$1))
    118 else
    119 host-path = $1
    120 endif
    121 
    122 # -----------------------------------------------------------------------------
    123 # Function : host-c-includes
    124 # Arguments: 1: list of file paths (e.g. "foo bar")
    125 # Returns  : list of include compiler options (e.g. "-Ifoo -Ibar")
    126 # Usage    : $(call host-c-includes,<paths>)
    127 # Rationale: This function is used to translate Cygwin paths into
    128 #            Windows-specific ones. On other platforms, it will just
    129 #            return its argument.
    130 # -----------------------------------------------------------------------------
    131 ifeq ($(HOST_OS),windows)
    132 host-c-includes = $(patsubst %,-I%,$(call host-path,$1))
    133 else
    134 host-c-includes = $(1:%=-I%)
    135 endif
    136 
    137 
    138 # -----------------------------------------------------------------------------
    139 # Function : link-whole-archives
    140 # Arguments: 1: list of whole static libraries
    141 # Returns  : linker flags to use the whole static libraries
    142 # Usage    : $(call link-whole-archives,<libraries>)
    143 # Rationale: This function is used to put the list of whole static libraries
    144 #            inside a -Wl,--whole-archive ... -Wl,--no-whole-archive block.
    145 #            If the list is empty, it returns an empty string.
    146 #            This function also calls host-path to translate the library
    147 #            paths.
    148 # -----------------------------------------------------------------------------
    149 link-whole-archives = $(if $(strip $1),$(call link-whole-archive-flags,$1))
    150 link-whole-archive-flags = -Wl,--whole-archive $(call host-path,$1) -Wl,--no-whole-archive
    151 
    152 # =============================================================================
    153 #
    154 # Modules database
    155 #
    156 # The following declarations are used to manage the list of modules
    157 # defined in application's Android-portable.mk files.
    158 #
    159 # Technical note:
    160 #    We use __gdk_modules to hold the list of all modules corresponding
    161 #    to a given application.
    162 #
    163 #    For each module 'foo', __gdk_modules.foo.<field> is used
    164 #    to store module-specific information.
    165 #
    166 #        type         -> type of module (e.g. 'static', 'shared', ...)
    167 #        depends      -> list of other modules this module depends on
    168 #
    169 #    Also, LOCAL_XXXX values defined for a module are recorded in XXXX, e.g.:
    170 #
    171 #        PATH   -> recorded LOCAL_PATH for the module
    172 #        CFLAGS -> recorded LOCAL_CFLAGS for the module
    173 #        ...
    174 #
    175 #    Some of these are created by build scripts like BUILD_STATIC_LIBRARY:
    176 #
    177 #        MAKEFILE -> The Android-portable.mk where the module is defined.
    178 #        LDFLAGS  -> Final linker flags
    179 #        OBJECTS  -> List of module objects
    180 #        BUILT_MODULE -> location of module built file (e.g. obj/<app>/<abi>/libfoo.so)
    181 #
    182 #    Note that some modules are never installed (e.g. static libraries).
    183 #
    184 # =============================================================================
    185 
    186 # The list of LOCAL_XXXX variables that are recorded for each module definition
    187 # These are documented by docs/ANDROID-MK.TXT. Exception is LOCAL_MODULE
    188 #
    189 modules-LOCALS := \
    190     MODULE \
    191     MODULE_FILENAME \
    192     PATH \
    193     SRC_FILES \
    194     CPP_EXTENSION \
    195     C_INCLUDES \
    196     CFLAGS \
    197     CXXFLAGS \
    198     CPPFLAGS
    199 
    200 # The following are generated by the build scripts themselves
    201 
    202 # LOCAL_MAKEFILE will contain the path to the Android-portable.mk defining the module
    203 modules-LOCALS += MAKEFILE
    204 
    205 # LOCAL_OBJECTS will contain the list of object files generated from the
    206 # module's sources, if any.
    207 modules-LOCALS += OBJECTS
    208 
    209 # LOCAL_BUILT_MODULE will contain the location of the symbolic version of
    210 # the generated module (i.e. the one containing all symbols used during
    211 # native debugging). It is generally under $PROJECT/obj/local/
    212 modules-LOCALS += BUILT_MODULE
    213 
    214 # LOCAL_OBJS_DIR will contain the location where the object files for
    215 # this module will be stored. Usually $PROJECT/obj/local/<module>/obj
    216 modules-LOCALS += OBJS_DIR
    217 
    218 # LOCAL_INSTALLED will contain the location of the installed version
    219 # of the module. Usually $PROJECT/libs/<abi>/<prefix><module><suffix>
    220 # where <prefix> and <suffix> depend on the module class.
    221 modules-LOCALS += INSTALLED
    222 
    223 # LOCAL_MODULE_CLASS will contain the type of the module
    224 # (e.g. STATIC_LIBRARY, SHARED_LIBRARY, etc...)
    225 modules-LOCALS += MODULE_CLASS
    226 
    227 # the list of managed fields per module
    228 modules-fields = depends \
    229                  $(modules-LOCALS)
    230 
    231 # -----------------------------------------------------------------------------
    232 # Function : modules-clear
    233 # Arguments: None
    234 # Returns  : None
    235 # Usage    : $(call modules-clear)
    236 # Rationale: clears the list of defined modules known by the build system
    237 # -----------------------------------------------------------------------------
    238 modules-clear = \
    239     $(foreach __mod,$(__gdk_modules),\
    240         $(foreach __field,$(modules-fields),\
    241             $(eval __gdk_modules.$(__mod).$(__field) := $(empty))\
    242         )\
    243     )\
    244     $(eval __gdk_modules := $(empty_set)) \
    245     $(eval __gdk_top_modules := $(empty)) \
    246     $(eval __gdk_import_list := $(empty)) \
    247     $(eval __gdk_import_depth := $(empty))
    248 
    249 # -----------------------------------------------------------------------------
    250 # Function : modules-get-list
    251 # Arguments: None
    252 # Returns  : The list of all recorded modules
    253 # Usage    : $(call modules-get-list)
    254 # -----------------------------------------------------------------------------
    255 modules-get-list = $(__gdk_modules)
    256 
    257 # -----------------------------------------------------------------------------
    258 # Function : modules-get-top-list
    259 # Arguments: None
    260 # Returns  : The list of all recorded non-imported modules
    261 # Usage    : $(call modules-get-top-list)
    262 # -----------------------------------------------------------------------------
    263 modules-get-top-list = $(__gdk_top_modules)
    264 
    265 # -----------------------------------------------------------------------------
    266 # Function : module-add
    267 # Arguments: 1: module name
    268 # Returns  : None
    269 # Usage    : $(call module-add,<modulename>)
    270 # Rationale: add a new module. If it is already defined, print an error message
    271 #            and abort. This will record all LOCAL_XXX variables for the module.
    272 # -----------------------------------------------------------------------------
    273 module-add = \
    274   $(call assert-defined,LOCAL_MAKEFILE LOCAL_BUILT_MODULE LOCAL_OBJS_DIR LOCAL_MODULE_CLASS)\
    275   $(if $(call set_is_member,$(__gdk_modules),$1),\
    276     $(call __gdk_info,Trying to define local module '$1' in $(LOCAL_MAKEFILE).)\
    277     $(call __gdk_info,But this module was already defined by $(__gdk_modules.$1.MAKEFILE).)\
    278     $(call __gdk_error,Aborting.)\
    279   )\
    280   $(eval __gdk_modules := $(call set_insert,$(__gdk_modules),$1))\
    281   $(if $(strip $(__gdk_import_depth)),,\
    282     $(eval __gdk_top_modules := $(call set_insert,$(__gdk_top_modules),$1))\
    283   )\
    284   $(if $(call module-class-is-installable,$(LOCAL_MODULE_CLASS)),\
    285     $(eval LOCAL_INSTALLED := $(GDK_APP_DST_DIR)/$(notdir $(LOCAL_BUILT_MODULE)))\
    286   )\
    287   $(foreach __local,$(modules-LOCALS),\
    288     $(eval __gdk_modules.$1.$(__local) := $(LOCAL_$(__local)))\
    289   )
    290 
    291 
    292 # Retrieve the class of module $1
    293 module-get-class = $(__gdk_modules.$1.MODULE_CLASS)
    294 
    295 # Retrieve built location of module $1
    296 module-get-built = $(__gdk_modules.$1.BUILT_MODULE)
    297 
    298 # Returns $(true) is module $1 is installable
    299 # An installable module is one that will be copied to $PROJECT/libs/<abi>/
    300 # (e.g. shared libraries).
    301 #
    302 module-is-installable = $(call module-class-is-installable,$(call module-get-class,$1))
    303 
    304 # Returns $(true) if module $1 is prebuilt
    305 # A prebuilt module is one declared with BUILD_PREBUILT_SHARED_LIBRARY or
    306 # BUILD_PREBUILT_STATIC_LIBRARY
    307 #
    308 module-is-prebuilt = $(call module-class-is-prebuilt,$(call module-get-class,$1))
    309 
    310 # -----------------------------------------------------------------------------
    311 # Function : module-get-export
    312 # Arguments: 1: module name
    313 #            2: export variable name without LOCAL_EXPORT_ prefix (e.g. 'CFLAGS')
    314 # Returns  : Exported value
    315 # Usage    : $(call module-get-export,<modulename>,<varname>)
    316 # Rationale: Return the recorded value of LOCAL_EXPORT_$2, if any, for module $1
    317 # -----------------------------------------------------------------------------
    318 module-get-export = $(__gdk_modules.$1.EXPORT_$2)
    319 
    320 # -----------------------------------------------------------------------------
    321 # Function : module-get-listed-export
    322 # Arguments: 1: list of module names
    323 #            2: export variable name without LOCAL_EXPORT_ prefix (e.g. 'CFLAGS')
    324 # Returns  : Exported values
    325 # Usage    : $(call module-get-listed-export,<module-list>,<varname>)
    326 # Rationale: Return the recorded value of LOCAL_EXPORT_$2, if any, for modules
    327 #            listed in $1.
    328 # -----------------------------------------------------------------------------
    329 module-get-listed-export = $(strip \
    330     $(foreach __listed_module,$1,\
    331         $(call module-get-export,$(__listed_module),$2)\
    332     ))
    333 
    334 # -----------------------------------------------------------------------------
    335 # Function : modules-restore-locals
    336 # Arguments: 1: module name
    337 # Returns  : None
    338 # Usage    : $(call module-restore-locals,<modulename>)
    339 # Rationale: Restore the recorded LOCAL_XXX definitions for a given module.
    340 # -----------------------------------------------------------------------------
    341 module-restore-locals = \
    342     $(foreach __local,$(modules-LOCALS),\
    343         $(eval LOCAL_$(__local) := $(__gdk_modules.$1.$(__local)))\
    344     )
    345 
    346 # Dump all module information. Only use this for debugging
    347 modules-dump-database = \
    348     $(info Modules: $(__gdk_modules)) \
    349     $(foreach __mod,$(__gdk_modules),\
    350         $(info $(space)$(space)$(__mod):)\
    351         $(foreach __field,$(modules-fields),\
    352             $(info $(space)$(space)$(space)$(space)$(__field): $(__gdk_modules.$(__mod).$(__field)))\
    353         )\
    354     )\
    355     $(info --- end of modules list)
    356 
    357 
    358 # -----------------------------------------------------------------------------
    359 # Function : module-add-static-depends
    360 # Arguments: 1: module name
    361 #            2: list/set of static library modules this module depends on.
    362 # Returns  : None
    363 # Usage    : $(call module-add-static-depends,<modulename>,<list of module names>)
    364 # Rationale: Record that a module depends on a set of static libraries.
    365 #            Use module-get-static-dependencies to retrieve final list.
    366 # -----------------------------------------------------------------------------
    367 module-add-static-depends = \
    368     $(call module-add-depends-any,$1,$2,depends) \
    369 
    370 # -----------------------------------------------------------------------------
    371 # Function : module-add-shared-depends
    372 # Arguments: 1: module name
    373 #            2: list/set of shared library modules this module depends on.
    374 # Returns  : None
    375 # Usage    : $(call module-add-shared-depends,<modulename>,<list of module names>)
    376 # Rationale: Record that a module depends on a set of shared libraries.
    377 #            Use modulge-get-shared-dependencies to retrieve final list.
    378 # -----------------------------------------------------------------------------
    379 module-add-shared-depends = \
    380     $(call module-add-depends-any,$1,$2,depends) \
    381 
    382 # Used internally by module-add-static-depends and module-add-shared-depends
    383 # NOTE: this function must not modify the existing dependency order when new depends are added.
    384 #
    385 module-add-depends-any = \
    386     $(eval __gdk_modules.$1.$3 += $(filter-out $(__gdk_modules.$1.$3),$(call strip-lib-prefix,$2)))
    387 
    388 # Used to recompute all dependencies once all module information has been recorded.
    389 #
    390 modules-compute-dependencies = \
    391     $(foreach __module,$(__gdk_modules),\
    392         $(call module-compute-depends,$(__module))\
    393     )
    394 
    395 module-compute-depends = \
    396     $(call module-add-static-depends,$1,$(__gdk_modules.$1.STATIC_LIBRARIES))\
    397     $(call module-add-static-depends,$1,$(__gdk_modules.$1.WHOLE_STATIC_LIBRARIES))\
    398     $(call module-add-shared-depends,$1,$(__gdk_modules.$1.SHARED_LIBRARIES))\
    399 
    400 module-get-installed = $(__gdk_modules.$1.INSTALLED)
    401 
    402 # -----------------------------------------------------------------------------
    403 # Function : modules-get-all-dependencies
    404 # Arguments: 1: list of module names
    405 # Returns  : List of all the modules $1 depends on transitively.
    406 # Usage    : $(call modules-all-get-dependencies,<list of module names>)
    407 # Rationale: This computes the closure of all module dependencies starting from $1
    408 # -----------------------------------------------------------------------------
    409 module-get-all-dependencies = \
    410     $(strip $(call modules-get-closure,$1,depends))
    411 
    412 modules-get-closure = \
    413     $(eval __closure_deps  := $(strip $1)) \
    414     $(eval __closure_wq    := $(__closure_deps)) \
    415     $(eval __closure_field := $(strip $2)) \
    416     $(call modules-closure)\
    417     $(__closure_deps)
    418 
    419 # Used internally by modules-get-dependencies
    420 # Note the tricky use of conditional recursion to work around the fact that
    421 # the GNU Make language does not have any conditional looping construct
    422 # like 'while'.
    423 #
    424 modules-closure = \
    425     $(eval __closure_mod := $(call first,$(__closure_wq))) \
    426     $(eval __closure_wq  := $(call rest,$(__closure_wq))) \
    427     $(eval __closure_new := $(filter-out $(__closure_deps),$(__gdk_modules.$(__closure_mod).$(__closure_field))))\
    428     $(eval __closure_deps += $(__closure_new)) \
    429     $(eval __closure_wq   := $(strip $(__closure_wq) $(__closure_new)))\
    430     $(if $(__closure_wq),$(call modules-closure)) \
    431 
    432 # Return the C++ extension of a given module
    433 #
    434 module-get-cpp-extension = $(strip \
    435     $(if $(__gdk_modules.$1.CPP_EXTENSION),\
    436         $(__gdk_modules.$1.CPP_EXTENSION),\
    437         .cpp\
    438     ))
    439 
    440 # Return the list of C++ sources of a given module
    441 #
    442 module-get-c++-sources = \
    443     $(filter %$(call module-get-cpp-extension,$1),$(__gdk_modules.$1.SRC_FILES))
    444 
    445 # Returns true if a module has C++ sources
    446 #
    447 module-has-c++ = $(strip $(call module-get-c++-sources,$1))
    448 
    449 # Add C++ dependencies to any module that has C++ sources.
    450 # $1: list of C++ runtime static libraries (if any)
    451 # $2: list of C++ runtime shared libraries (if any)
    452 #
    453 modules-add-c++-dependencies = \
    454     $(foreach __module,$(__gdk_modules),\
    455         $(if $(call module-has-c++,$(__module)),\
    456             $(call gdk_log,Module '$(__module)' has C++ sources)\
    457             $(call module-add-c++-deps,$(__module),$1,$2),\
    458         )\
    459     )
    460 
    461 # Add standard C++ dependencies to a given module
    462 #
    463 # $1: module name
    464 # $2: list of C++ runtime static libraries (if any)
    465 # $3: list of C++ runtime shared libraries (if any)
    466 #
    467 module-add-c++-deps = \
    468     $(eval __gdk_modules.$1.STATIC_LIBRARIES += $(2))\
    469     $(eval __gdk_modules.$1.SHARED_LIBRARIES += $(3))
    470 
    471 
    472 # =============================================================================
    473 #
    474 # Utility functions
    475 #
    476 # =============================================================================
    477 
    478 # -----------------------------------------------------------------------------
    479 # Function : parent-dir
    480 # Arguments: 1: path
    481 # Returns  : Parent dir or path of $1, with final separator removed.
    482 # -----------------------------------------------------------------------------
    483 parent-dir = $(patsubst %/,%,$(dir $1))
    484 
    485 
    486 # -----------------------------------------------------------------------------
    487 # Function : pretty-dir
    488 # Arguments: 1: path
    489 # Returns  : Remove GDK_PROJECT_PATH prefix from a given path. This can be
    490 #            used to perform pretty-printing for logs.
    491 # -----------------------------------------------------------------------------
    492 pretty-dir = $(patsubst $(GDK_ROOT)/%,<GDK>/%,\
    493                  $(patsubst $(GDK_PROJECT_PATH)/%,%,$1))
    494 
    495 # -----------------------------------------------------------------------------
    496 # Function : check-user-define
    497 # Arguments: 1: name of variable that must be defined by the user
    498 #            2: name of Makefile where the variable should be defined
    499 #            3: name/description of the Makefile where the check is done, which
    500 #               must be included by $2
    501 # Returns  : None
    502 # -----------------------------------------------------------------------------
    503 check-user-define = $(if $(strip $($1)),,\
    504   $(call __gdk_error,Missing $1 before including $3 in $2))
    505 
    506 # -----------------------------------------------------------------------------
    507 # This is used to check that LOCAL_MODULE is properly defined by an Android-portable.mk
    508 # file before including one of the $(BUILD_SHARED_LIBRARY), etc... files.
    509 #
    510 # Function : check-user-LOCAL_MODULE
    511 # Arguments: 1: name/description of the included build Makefile where the
    512 #               check is done
    513 # Returns  : None
    514 # Usage    : $(call check-user-LOCAL_MODULE, BUILD_SHARED_LIBRARY)
    515 # -----------------------------------------------------------------------------
    516 check-defined-LOCAL_MODULE = \
    517   $(call check-user-define,LOCAL_MODULE,$(local-makefile),$(1)) \
    518   $(if $(call seq,$(words $(LOCAL_MODULE)),1),,\
    519     $(call __gdk_info,LOCAL_MODULE definition in $(local-makefile) must not contain space)\
    520     $(call __gdk_error,Please correct error. Aborting)\
    521   )
    522 
    523 # -----------------------------------------------------------------------------
    524 # This is used to check that LOCAL_MODULE_FILENAME, if defined, is correct.
    525 #
    526 # Function : check-user-LOCAL_MODULE_FILENAME
    527 # Returns  : None
    528 # Usage    : $(call check-user-LOCAL_MODULE_FILENAME)
    529 # -----------------------------------------------------------------------------
    530 check-LOCAL_MODULE_FILENAME = \
    531   $(if $(strip $(LOCAL_MODULE_FILENAME)),\
    532     $(if $(call seq,$(words $(LOCAL_MODULE_FILENAME)),1),,\
    533         $(call __gdk_info,$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain spaces)\
    534         $(call __gdk_error,Plase correct error. Aborting)\
    535     )\
    536     $(if $(filter %.a %.so,$(LOCAL_MODULE_FILENAME)),\
    537         $(call __gdk_info,$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_MODULE_FILENAME should not include file extensions)\
    538     )\
    539   )
    540 
    541 # -----------------------------------------------------------------------------
    542 # Function  : handle-module-filename
    543 # Arguments : 1: default file prefix
    544 #             2: file suffix
    545 # Returns   : None
    546 # Usage     : $(call handle-module-filename,<prefix>,<suffix>)
    547 # Rationale : To be used to check and or set the module's filename through
    548 #             the LOCAL_MODULE_FILENAME variable.
    549 # -----------------------------------------------------------------------------
    550 handle-module-filename = $(eval $(call ev-handle-module-filename,$1,$2))
    551 
    552 #
    553 # Check that LOCAL_MODULE_FILENAME is properly defined
    554 # - with one single item
    555 # - without a library file extension
    556 # - with no directory separators
    557 #
    558 define ev-check-module-filename
    559 ifneq (1,$$(words $$(LOCAL_MODULE_FILENAME)))
    560     $$(call __gdk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain any space)
    561     $$(call __gdk_error,Aborting)
    562 endif
    563 ifneq (,$$(filter %.a %.so,$$(LOCAL_MODULE_FILENAME)))
    564     $$(call __gdk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain a file extension)
    565     $$(call __gdk_error,Aborting)
    566 endif
    567 ifneq (1,$$(words $$(subst /, ,$$(LOCAL_MODULE_FILENAME))))
    568     $$(call __gdk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain directory separators)
    569     $$(call __gdk_error,Aborting)
    570 endif
    571 endef
    572 
    573 #
    574 # Check the definition of LOCAL_MODULE_FILENAME. If none exists,
    575 # infer it from the LOCAL_MODULE name.
    576 #
    577 # $1: default file prefix
    578 # $2: default file suffix
    579 #
    580 define ev-handle-module-filename
    581 LOCAL_MODULE_FILENAME := $$(strip $$(LOCAL_MODULE_FILENAME))
    582 ifndef LOCAL_MODULE_FILENAME
    583     LOCAL_MODULE_FILENAME := $1$$(LOCAL_MODULE)
    584 endif
    585 $$(eval $$(call ev-check-module-filename))
    586 LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME)$2
    587 endef
    588 
    589 handle-prebuilt-module-filename = $(eval $(call ev-handle-prebuilt-module-filename,$1))
    590 
    591 #
    592 # Check the definition of LOCAL_MODULE_FILENAME for a _prebuilt_ module.
    593 # If none exists, infer it from $(LOCAL_SRC_FILES)
    594 #
    595 # $1: default file suffix
    596 #
    597 define ev-handle-prebuilt-module-filename
    598 LOCAL_MODULE_FILENAME := $$(strip $$(LOCAL_MODULE_FILENAME))
    599 ifndef LOCAL_MODULE_FILENAME
    600     LOCAL_MODULE_FILENAME := $$(notdir $(LOCAL_SRC_FILES))
    601     LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME:%.a=%)
    602     LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME:%.so=%)
    603 endif
    604 LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME)$1
    605 $$(eval $$(call ev-check-module-filename))
    606 endef
    607 
    608 
    609 # -----------------------------------------------------------------------------
    610 # Function  : handle-module-built
    611 # Returns   : None
    612 # Usage     : $(call handle-module-built)
    613 # Rationale : To be used to automatically compute the location of the generated
    614 #             binary file, and the directory where to place its object files.
    615 # -----------------------------------------------------------------------------
    616 handle-module-built = \
    617     $(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(LOCAL_MODULE_FILENAME))\
    618     $(eval LOCAL_OBJS_DIR     := $(TARGET_OBJS)/$(LOCAL_MODULE))
    619 
    620 # -----------------------------------------------------------------------------
    621 # Strip any 'lib' prefix in front of a given string.
    622 #
    623 # Function : strip-lib-prefix
    624 # Arguments: 1: module name
    625 # Returns  : module name, without any 'lib' prefix if any
    626 # Usage    : $(call strip-lib-prefix,$(LOCAL_MODULE))
    627 # -----------------------------------------------------------------------------
    628 strip-lib-prefix = $(1:lib%=%)
    629 
    630 # -----------------------------------------------------------------------------
    631 # This is used to strip any lib prefix from LOCAL_MODULE, then check that
    632 # the corresponding module name is not already defined.
    633 #
    634 # Function : check-user-LOCAL_MODULE
    635 # Arguments: 1: path of Android-portable.mk where this LOCAL_MODULE is defined
    636 # Returns  : None
    637 # Usage    : $(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
    638 # -----------------------------------------------------------------------------
    639 check-LOCAL_MODULE = \
    640   $(eval LOCAL_MODULE := $$(call strip-lib-prefix,$$(LOCAL_MODULE)))
    641 
    642 # -----------------------------------------------------------------------------
    643 # Macro    : my-dir
    644 # Returns  : the directory of the current Makefile
    645 # Usage    : $(my-dir)
    646 # -----------------------------------------------------------------------------
    647 my-dir = $(call parent-dir,$(lastword $(MAKEFILE_LIST)))
    648 
    649 # -----------------------------------------------------------------------------
    650 # Function : all-makefiles-under
    651 # Arguments: 1: directory path
    652 # Returns  : a list of all makefiles immediately below some directory
    653 # Usage    : $(call all-makefiles-under, <some path>)
    654 # -----------------------------------------------------------------------------
    655 all-makefiles-under = $(wildcard $1/*/Android-portable.mk)
    656 
    657 # -----------------------------------------------------------------------------
    658 # Macro    : all-subdir-makefiles
    659 # Returns  : list of all makefiles in subdirectories of the current Makefile's
    660 #            location
    661 # Usage    : $(all-subdir-makefiles)
    662 # -----------------------------------------------------------------------------
    663 all-subdir-makefiles = $(call all-makefiles-under,$(call my-dir))
    664 
    665 # =============================================================================
    666 #
    667 # Source file tagging support.
    668 #
    669 # Each source file listed in LOCAL_SRC_FILES can have any number of
    670 # 'tags' associated to it. A tag name must not contain space, and its
    671 # usage can vary.
    672 #
    673 # For example, the 'debug' tag is used to sources that must be built
    674 # in debug mode, the 'arm' tag is used for sources that must be built
    675 # using the 32-bit instruction set on ARM platforms, and 'neon' is used
    676 # for sources that must be built with ARM Advanced SIMD (a.k.a. NEON)
    677 # support.
    678 #
    679 # More tags might be introduced in the future.
    680 #
    681 #  LOCAL_SRC_TAGS contains the list of all tags used (initially empty)
    682 #  LOCAL_SRC_FILES contains the list of all source files.
    683 #  LOCAL_SRC_TAG.<tagname> contains the set of source file names tagged
    684 #      with <tagname>
    685 #  LOCAL_SRC_FILES_TAGS.<filename> contains the set of tags for a given
    686 #      source file name
    687 #
    688 # Tags are processed by a toolchain-specific function (e.g. TARGET-compute-cflags)
    689 # which will call various functions to compute source-file specific settings.
    690 # These are currently stored as:
    691 #
    692 #  LOCAL_SRC_FILES_TARGET_CFLAGS.<filename> contains the list of
    693 #      target-specific C compiler flags used to compile a given
    694 #      source file. This is set by the function TARGET-set-cflags
    695 #      defined in the toolchain's setup.mk script.
    696 #
    697 #  LOCAL_SRC_FILES_TEXT.<filename> contains the 'text' that will be
    698 #      displayed along the label of the build output line. For example
    699 #      'thumb' or 'arm  ' with ARM-based toolchains.
    700 #
    701 # =============================================================================
    702 
    703 # -----------------------------------------------------------------------------
    704 # Macro    : clear-all-src-tags
    705 # Returns  : remove all source file tags and associated data.
    706 # Usage    : $(clear-all-src-tags)
    707 # -----------------------------------------------------------------------------
    708 clear-all-src-tags = \
    709 $(foreach __tag,$(LOCAL_SRC_TAGS), \
    710     $(eval LOCAL_SRC_TAG.$(__tag) := $(empty)) \
    711 ) \
    712 $(foreach __src,$(LOCAL_SRC_FILES), \
    713     $(eval LOCAL_SRC_FILES_TAGS.$(__src) := $(empty)) \
    714     $(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) := $(empty)) \
    715     $(eval LOCAL_SRC_FILES_TEXT.$(__src) := $(empty)) \
    716 ) \
    717 $(eval LOCAL_SRC_TAGS := $(empty_set))
    718 
    719 # -----------------------------------------------------------------------------
    720 # Macro    : tag-src-files
    721 # Arguments: 1: list of source files to tag
    722 #            2: tag name (must not contain space)
    723 # Usage    : $(call tag-src-files,<list-of-source-files>,<tagname>)
    724 # Rationale: Add a tag to a list of source files
    725 # -----------------------------------------------------------------------------
    726 tag-src-files = \
    727 $(eval LOCAL_SRC_TAGS := $(call set_insert,$2,$(LOCAL_SRC_TAGS))) \
    728 $(eval LOCAL_SRC_TAG.$2 := $(call set_union,$1,$(LOCAL_SRC_TAG.$2))) \
    729 $(foreach __src,$1, \
    730     $(eval LOCAL_SRC_FILES_TAGS.$(__src) += $2) \
    731 )
    732 
    733 # -----------------------------------------------------------------------------
    734 # Macro    : get-src-files-with-tag
    735 # Arguments: 1: tag name
    736 # Usage    : $(call get-src-files-with-tag,<tagname>)
    737 # Return   : The list of source file names that have been tagged with <tagname>
    738 # -----------------------------------------------------------------------------
    739 get-src-files-with-tag = $(LOCAL_SRC_TAG.$1)
    740 
    741 # -----------------------------------------------------------------------------
    742 # Macro    : get-src-files-without-tag
    743 # Arguments: 1: tag name
    744 # Usage    : $(call get-src-files-without-tag,<tagname>)
    745 # Return   : The list of source file names that have NOT been tagged with <tagname>
    746 # -----------------------------------------------------------------------------
    747 get-src-files-without-tag = $(filter-out $(LOCAL_SRC_TAG.$1),$(LOCAL_SRC_FILES))
    748 
    749 # -----------------------------------------------------------------------------
    750 # Macro    : set-src-files-target-cflags
    751 # Arguments: 1: list of source files
    752 #            2: list of compiler flags
    753 # Usage    : $(call set-src-files-target-cflags,<sources>,<flags>)
    754 # Rationale: Set or replace the set of compiler flags that will be applied
    755 #            when building a given set of source files. This function should
    756 #            normally be called from the toolchain-specific function that
    757 #            computes all compiler flags for all source files.
    758 # -----------------------------------------------------------------------------
    759 set-src-files-target-cflags = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) := $2))
    760 
    761 # -----------------------------------------------------------------------------
    762 # Macro    : add-src-files-target-cflags
    763 # Arguments: 1: list of source files
    764 #            2: list of compiler flags
    765 # Usage    : $(call add-src-files-target-cflags,<sources>,<flags>)
    766 # Rationale: A variant of set-src-files-target-cflags that can be used
    767 #            to append, instead of replace, compiler flags for specific
    768 #            source files.
    769 # -----------------------------------------------------------------------------
    770 add-src-files-target-cflags = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) += $2))
    771 
    772 # -----------------------------------------------------------------------------
    773 # Macro    : get-src-file-target-cflags
    774 # Arguments: 1: single source file name
    775 # Usage    : $(call get-src-file-target-cflags,<source>)
    776 # Rationale: Return the set of target-specific compiler flags that must be
    777 #            applied to a given source file. These must be set prior to this
    778 #            call using set-src-files-target-cflags or add-src-files-target-cflags
    779 # -----------------------------------------------------------------------------
    780 get-src-file-target-cflags = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$1)
    781 
    782 # -----------------------------------------------------------------------------
    783 # Macro    : set-src-files-text
    784 # Arguments: 1: list of source files
    785 #            2: text
    786 # Usage    : $(call set-src-files-text,<sources>,<text>)
    787 # Rationale: Set or replace the 'text' associated to a set of source files.
    788 #            The text is a very short string that complements the build
    789 #            label. For example, it will be either 'thumb' or 'arm  ' for
    790 #            ARM-based toolchains. This function must be called by the
    791 #            toolchain-specific functions that processes all source files.
    792 # -----------------------------------------------------------------------------
    793 set-src-files-text = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TEXT.$(__src) := $2))
    794 
    795 # -----------------------------------------------------------------------------
    796 # Macro    : get-src-file-text
    797 # Arguments: 1: single source file
    798 # Usage    : $(call get-src-file-text,<source>)
    799 # Rationale: Return the 'text' associated to a given source file when
    800 #            set-src-files-text was called.
    801 # -----------------------------------------------------------------------------
    802 get-src-file-text = $(LOCAL_SRC_FILES_TEXT.$1)
    803 
    804 # This should only be called for debugging the source files tagging system
    805 dump-src-file-tags = \
    806 $(info LOCAL_SRC_TAGS := $(LOCAL_SRC_TAGS)) \
    807 $(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES)) \
    808 $(foreach __tag,$(LOCAL_SRC_TAGS),$(info LOCAL_SRC_TAG.$(__tag) = $(LOCAL_SRC_TAG.$(__tag)))) \
    809 $(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TAGS.$(__src) = $(LOCAL_SRC_FILES_TAGS.$(__src)))) \
    810 $(info WITH arm = $(call get-src-files-with-tag,arm)) \
    811 $(info WITHOUT arm = $(call get-src-files-without-tag,arm)) \
    812 $(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src)))) \
    813 $(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TEXT.$(__src) = $(LOCAL_SRC_FILES_TEXT.$(__src)))) \
    814 
    815 
    816 # =============================================================================
    817 #
    818 # Application.mk support
    819 #
    820 # =============================================================================
    821 
    822 # the list of variables that *must* be defined in Application.mk files
    823 GDK_APP_VARS_REQUIRED :=
    824 
    825 # the list of variables that *may* be defined in Application.mk files
    826 GDK_APP_VARS_OPTIONAL := APP_OPTIM APP_CPPFLAGS APP_CFLAGS APP_CXXFLAGS \
    827                          APP_PLATFORM APP_BUILD_SCRIPT APP_ABI APP_MODULES \
    828                          APP_PROJECT_PATH APP_STL
    829 
    830 # the list of all variables that may appear in an Application.mk file
    831 # or defined by the build scripts.
    832 GDK_APP_VARS := $(GDK_APP_VARS_REQUIRED) \
    833                 $(GDK_APP_VARS_OPTIONAL) \
    834                 APP_DEBUG \
    835                 APP_DEBUGGABLE \
    836                 APP_MANIFEST
    837 
    838 # =============================================================================
    839 #
    840 # Android.mk support
    841 #
    842 # =============================================================================
    843 
    844 # =============================================================================
    845 #
    846 # Build commands support
    847 #
    848 # =============================================================================
    849 
    850 # -----------------------------------------------------------------------------
    851 # Macro    : hide
    852 # Returns  : nothing
    853 # Usage    : $(hide)<make commands>
    854 # Rationale: To be used as a prefix for Make build commands to hide them
    855 #            by default during the build. To show them, set V=1 in your
    856 #            environment or command-line.
    857 #
    858 #            For example:
    859 #
    860 #                foo.o: foo.c
    861 #                -->|$(hide) <build-commands>
    862 #
    863 #            Where '-->|' stands for a single tab character.
    864 #
    865 # -----------------------------------------------------------------------------
    866 ifeq ($(V),1)
    867 hide = $(empty)
    868 else
    869 hide = @
    870 endif
    871 
    872 # cmd-convert-deps
    873 #
    874 # Commands used to copy/convert the .d.org depency file generated by the
    875 # compiler into its final .d version.
    876 #
    877 # On windows, this myst convert the Windows paths to a format that our
    878 # Cygwin-based GNU Make can understand (i.e. C:/Foo => /cygdrive/c/Foo)
    879 #
    880 # On other platforms, this simply renames the file.
    881 #
    882 # NOTE: In certain cases, no dependency file will be generated by the
    883 #       compiler (e.g. when compiling an assembly file as foo.s)
    884 #
    885 ifeq ($(HOST_OS),windows)
    886 cmd-convert-deps = \
    887     ( if [ -f "$1.org" ]; then \
    888           $(HOST_AWK) -f $(BUILD_AWK)/convert-deps-to-cygwin.awk $1.org > $1 && \
    889           rm -f $1.org; \
    890       fi )
    891 else
    892 cmd-convert-deps = \
    893     ( if [ -f "$1.org" ]; then \
    894           rm -f $1 && \
    895           mv $1.org $1; \
    896       fi )
    897 endif
    898 
    899 # This assumes that many variables have been pre-defined:
    900 # _SRC: source file
    901 # _OBJ: destination file
    902 # _CC: 'compiler' command
    903 # _FLAGS: 'compiler' flags
    904 # _TEXT: Display text (e.g. "Compile++ thumb", must be EXACTLY 17 chars long)
    905 #
    906 define ev-build-file
    907 $$(_OBJ): PRIVATE_SRC      := $$(_SRC)
    908 $$(_OBJ): PRIVATE_OBJ      := $$(_OBJ)
    909 $$(_OBJ): PRIVATE_DEPS     := $$(call host-path,$$(_OBJ).d)
    910 $$(_OBJ): PRIVATE_MODULE   := $$(LOCAL_MODULE)
    911 $$(_OBJ): PRIVATE_TEXT     := "$$(_TEXT)"
    912 $$(_OBJ): PRIVATE_CC       := $$(_CC)
    913 $$(_OBJ): PRIVATE_CFLAGS   := $$(_FLAGS)
    914 $$(_OBJ): $$(_SRC) $$(LOCAL_MAKEFILE) $$(GDK_APP_APPLICATION_MK)
    915 	@mkdir -p $$(dir $$(PRIVATE_OBJ))
    916 	@echo "$$(PRIVATE_TEXT): $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))"
    917 	$(hide) $$(PRIVATE_CC) $$(PRIVATE_CFLAGS) $$(call host-path,$$(PRIVATE_SRC)) -o $$(call host-path,$$(PRIVATE_OBJ))
    918 endef
    919 
    920 # This assumes the same things than ev-build-file, but will handle
    921 # the definition of LOCAL_FILTER_ASM as well.
    922 define ev-build-source-file
    923 LOCAL_DEPENDENCY_DIRS += $$(dir $$(_OBJ))
    924 ifndef LOCAL_FILTER_ASM
    925   # Trivial case: Directly generate an object file
    926   $$(eval $$(call ev-build-file))
    927 else
    928   # This is where things get hairy, we first transform
    929   # the source into an assembler file, send it to the
    930   # filter, then generate a final object file from it.
    931   #
    932 
    933   # First, remember the original settings and compute
    934   # the location of our temporary files.
    935   #
    936   _ORG_SRC := $$(_SRC)
    937   _ORG_OBJ := $$(_OBJ)
    938   _ORG_FLAGS := $$(_FLAGS)
    939   _ORG_TEXT  := $$(_TEXT)
    940 
    941   _OBJ_ASM_ORIGINAL := $$(patsubst %.o,%.s,$$(_ORG_OBJ))
    942   _OBJ_ASM_FILTERED := $$(patsubst %.o,%.filtered.s,$$(_ORG_OBJ))
    943 
    944   # If the source file is a plain assembler file, we're going to
    945   # use it directly in our filter.
    946   ifneq (,$$(filter %.s,$$(_SRC)))
    947     _OBJ_ASM_ORIGINAL := $$(_SRC)
    948   endif
    949 
    950   #$$(info SRC=$$(_SRC) OBJ=$$(_OBJ) OBJ_ORIGINAL=$$(_OBJ_ASM_ORIGINAL) OBJ_FILTERED=$$(_OBJ_ASM_FILTERED))
    951 
    952   # We need to transform the source into an assembly file, instead of
    953   # an object. The proper way to do that depends on the file extension.
    954   #
    955   # For C and C++ source files, simply replace the -c by an -S in the
    956   # compilation command (this forces the compiler to generate an
    957   # assembly file).
    958   #
    959   # For assembler templates (which end in .S), replace the -c with -E
    960   # to send it to the preprocessor instead.
    961   #
    962   # Don't do anything for plain assembly files (which end in .s)
    963   #
    964   ifeq (,$$(filter %.s,$$(_SRC)))
    965     _OBJ   := $$(_OBJ_ASM_ORIGINAL)
    966     ifneq (,$$(filter %.S,$$(_SRC)))
    967       _FLAGS := $$(patsubst -c,-E,$$(_ORG_FLAGS))
    968     else
    969       _FLAGS := $$(patsubst -c,-S,$$(_ORG_FLAGS))
    970     endif
    971     $$(eval $$(call ev-build-file))
    972   endif
    973 
    974   # Next, process the assembly file with the filter
    975   $$(_OBJ_ASM_FILTERED): PRIVATE_SRC    := $$(_OBJ_ASM_ORIGINAL)
    976   $$(_OBJ_ASM_FILTERED): PRIVATE_DST    := $$(_OBJ_ASM_FILTERED)
    977   $$(_OBJ_ASM_FILTERED): PRIVATE_FILTER := $$(LOCAL_FILTER_ASM)
    978   $$(_OBJ_ASM_FILTERED): PRIVATE_MODULE := $$(LOCAL_MODULE)
    979   $$(_OBJ_ASM_FILTERED): $$(_OBJ_ASM_ORIGINAL)
    980 	@echo "AsmFilter      : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))"
    981 	$(hide) $$(PRIVATE_FILTER) $$(PRIVATE_SRC) $$(PRIVATE_DST)
    982 
    983   # Then, generate the final object, we need to keep assembler-specific
    984   # flags which look like -Wa,<option>:
    985   _SRC   := $$(_OBJ_ASM_FILTERED)
    986   _OBJ   := $$(_ORG_OBJ)
    987   _FLAGS := $$(filter -Wa%,$$(_ORG_FLAGS)) -c
    988   _TEXT  := "Assembly     "
    989   $$(eval $$(call ev-build-file))
    990 endif
    991 endef
    992 
    993 # -----------------------------------------------------------------------------
    994 # Template  : ev-compile-c-source
    995 # Arguments : 1: single C source file name (relative to LOCAL_PATH)
    996 #             2: target object file (without path)
    997 # Returns   : None
    998 # Usage     : $(eval $(call ev-compile-c-source,<srcfile>,<objfile>)
    999 # Rationale : Internal template evaluated by compile-c-source and
   1000 #             compile-s-source
   1001 # -----------------------------------------------------------------------------
   1002 define  ev-compile-c-source
   1003 _SRC:=$$(LOCAL_PATH)/$(1)
   1004 _OBJ:=$$(LOCAL_OBJS_DIR)/$(2)
   1005 
   1006 _FLAGS := $$($$(my)CFLAGS) \
   1007           $$(call get-src-file-target-cflags,$(1)) \
   1008           $$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(LOCAL_PATH)) \
   1009           $$(LOCAL_CFLAGS) \
   1010           $$(GDK_APP_CFLAGS) \
   1011           $$(call host-c-includes,$$($(my)C_INCLUDES)) \
   1012           -c \
   1013 
   1014 _TEXT := "Compile Bitcode  "
   1015 _CC   := $$(TARGET_CC)
   1016 
   1017 $$(eval $$(call ev-build-source-file))
   1018 endef
   1019 
   1020 # -----------------------------------------------------------------------------
   1021 # Function  : compile-c-source
   1022 # Arguments : 1: single C source file name (relative to LOCAL_PATH)
   1023 # Returns   : None
   1024 # Usage     : $(call compile-c-source,<srcfile>)
   1025 # Rationale : Setup everything required to build a single C source file
   1026 # -----------------------------------------------------------------------------
   1027 compile-c-source = $(eval $(call ev-compile-c-source,$1,$(1:%.c=%.bc)))
   1028 
   1029 # -----------------------------------------------------------------------------
   1030 # Function  : compile-s-source
   1031 # Arguments : 1: single Assembly source file name (relative to LOCAL_PATH)
   1032 # Returns   : None
   1033 # Usage     : $(call compile-s-source,<srcfile>)
   1034 # Rationale : Setup everything required to build a single Assembly source file
   1035 # -----------------------------------------------------------------------------
   1036 compile-s-source = $(eval $(call ev-compile-c-source,$1,$(patsubst %.s,%.o,$(patsubst %.S,%.o,$1))))
   1037 
   1038 
   1039 # -----------------------------------------------------------------------------
   1040 # Template  : ev-compile-cpp-source
   1041 # Arguments : 1: single C++ source file name (relative to LOCAL_PATH)
   1042 #             2: target object file (without path)
   1043 # Returns   : None
   1044 # Usage     : $(eval $(call ev-compile-cpp-source,<srcfile>,<objfile>)
   1045 # Rationale : Internal template evaluated by compile-cpp-source
   1046 # -----------------------------------------------------------------------------
   1047 
   1048 define  ev-compile-cpp-source
   1049 _SRC:=$$(LOCAL_PATH)/$(1)
   1050 _OBJ:=$$(LOCAL_OBJS_DIR)/$(2)
   1051 _FLAGS := $$($$(my)CXXFLAGS) \
   1052           $$(call get-src-file-target-cflags,$(1)) \
   1053           $$(call host-c-includes, $$(LOCAL_C_INCLUDES) $$(LOCAL_PATH)) \
   1054           $$(LOCAL_CFLAGS) \
   1055           $$(LOCAL_CPPFLAGS) \
   1056           $$(LOCAL_CXXFLAGS) \
   1057           $$(GDK_APP_CFLAGS) \
   1058           $$(GDK_APP_CPPFLAGS) \
   1059           $$(GDK_APP_CXXFLAGS) \
   1060           $$(call host-c-includes,$$($(my)C_INCLUDES)) \
   1061           -c \
   1062 
   1063 _CC   := $$($$(my)CXX)
   1064 _TEXT := "Compile++ Bitcode"
   1065 
   1066 $$(eval $$(call ev-build-source-file))
   1067 endef
   1068 
   1069 # -----------------------------------------------------------------------------
   1070 # Function  : compile-cpp-source
   1071 # Arguments : 1: single C++ source file name (relative to LOCAL_PATH)
   1072 # Returns   : None
   1073 # Usage     : $(call compile-c-source,<srcfile>)
   1074 # Rationale : Setup everything required to build a single C++ source file
   1075 # -----------------------------------------------------------------------------
   1076 compile-cpp-source = $(eval $(call ev-compile-cpp-source,$1,$(1:%$(LOCAL_CPP_EXTENSION)=%.bc)))
   1077 
   1078 # -----------------------------------------------------------------------------
   1079 # Command   : cmd-install-file
   1080 # Arguments : 1: source file
   1081 #             2: destination file
   1082 # Returns   : None
   1083 # Usage     : $(call cmd-install-file,<srcfile>,<dstfile>)
   1084 # Rationale : To be used as a Make build command to copy/install a file to
   1085 #             a given location.
   1086 # -----------------------------------------------------------------------------
   1087 define cmd-install-file
   1088 @mkdir -p $(dir $2)
   1089 $(hide) cp -fp $1 $2
   1090 endef
   1091 
   1092 
   1093 #
   1094 #  Module Cannot import module with spaces in tag: '$(__import_tag)')\
   1095 #    )\
   1096 #    $(if $(call set_is_member,$(__gdk_import_list),$(__import_tag)),\
   1097 #      $(call gdk_log,Skipping duplicate import for module with tag '$(__import_tag)')\
   1098 #    ,\
   1099 #      $(call gdk_log,Looking for imported module with tag '$(__import_tag)')\
   1100 #      $(eval __imported_path := $(call import-find-module,$(__import_tag)))\
   1101 #      $(if $(__imported_path),\
   1102 #        $(call gdk_log,    Found in $(__imported_path))\
   1103 #        $(eval __gdk_import_depth := $(__gdk_import_depth)x) \
   1104 #        $(eval __gdk_import_list := $(call set_insert,$(__gdk_import_list),$(__import_tag)))\
   1105 #        $(eval include $(__imported_path)/Android-portable.mk)\
   1106 #        $(eval __gdk_import_depth := $(__gdk_import_depth:%x=%))\
   1107 #      ,\
   1108 #        $(call __gdk_info,$(call local-makefile): Cannot find module with tag '$(__import_tag)' in import path)\
   1109 #        $(call __gdk_info,Are you sure your GDK_MODULE_PATH variable is properly defined ?)\
   1110 #        $(call __gdk_info,The following directories were searched:)\
   1111 #        $(for __import_dir,$(__gdk_import_dirs),\
   1112 #          $(call __gdk_info,    $(__import_dir))\
   1113 #        )\
   1114 #        $(call __gdk_error,Aborting.)\
   1115 #      )\
   1116 #   )
   1117 
   1118 # Only used for debugging
   1119 #
   1120 import-debug = \
   1121     $(info IMPORT DIRECTORIES:)\
   1122     $(foreach __dir,$(__gdk_import_dirs),\
   1123       $(info -- $(__dir))\
   1124     )\
   1125 
   1126 #
   1127 #  Module classes
   1128 #
   1129 GDK_MODULE_CLASSES :=
   1130 
   1131 # Register a new module class
   1132 # $1: class name (e.g. STATIC_LIBRARY)
   1133 # $2: optional file prefix (e.g. 'lib')
   1134 # $3: optional file suffix (e.g. '.so')
   1135 #
   1136 module-class-register = \
   1137     $(eval GDK_MODULE_CLASSES += $1) \
   1138     $(eval GDK_MODULE_CLASS.$1.FILE_PREFIX := $2) \
   1139     $(eval GDK_MODULE_CLASS.$1.FILE_SUFFIX := $3) \
   1140     $(eval GDK_MODULE_CLASS.$1.INSTALLABLE := $(false)) \
   1141 
   1142 # Same a module-class-register, for installable modules
   1143 #
   1144 # An installable module is one that will be copied to $PROJECT/libs/<abi>/
   1145 # during the GDK build.
   1146 #
   1147 # $1: class name
   1148 # $2: optional file prefix
   1149 # $3: optional file suffix
   1150 #
   1151 module-class-register-installable = \
   1152     $(call module-class-register,$1,$2,$3) \
   1153     $(eval GDK_MODULE_CLASS.$1.INSTALLABLE := $(true))
   1154 
   1155 module-class-set-prebuilt = \
   1156     $(eval GDK_MODULE_CLASS.$1.PREBUILT := $(true))
   1157 
   1158 # Returns $(true) if $1 is a valid/registered LOCAL_MODULE_CLASS value
   1159 #
   1160 module-class-check = $(call set_is_member,$(GDK_MODULE_CLASSES),$1)
   1161 
   1162 # Returns $(true) if $1 corresponds to an installable module class
   1163 #
   1164 module-class-is-installable = $(if $(GDK_MODULE_CLASS.$1.INSTALLABLE),$(true),$(false))
   1165 
   1166 # Returns $(true) if $1 corresponds to an installable module class
   1167 #
   1168 module-class-is-prebuilt = $(if $(GDK_MODULE_CLASS.$1.PREBUILT),$(true),$(false))
   1169 
   1170 #
   1171 # Register valid module classes
   1172 #
   1173 
   1174 # static libraries:
   1175 # <foo> -> lib<foo>.a by default
   1176 #$(call module-class-register,STATIC_LIBRARY,lib,.a)
   1177 
   1178 # shared libraries:
   1179 # <foo> -> lib<foo>.so
   1180 # a shared library is installable.
   1181 #$(call module-class-register-installable,SHARED_LIBRARY,lib,.so)
   1182 
   1183 # bitcodes:
   1184 # <foo> -> lib<foo>.bc
   1185 $(call module-class-register-installable,BITCODE,lib,.bc)
   1186 
   1187 # executable
   1188 # <foo> -> <foo>
   1189 # an executable is installable.
   1190 #$(call module-class-register-installable,EXECUTABLE,,)
   1191 
   1192 # prebuilt shared library
   1193 # <foo> -> <foo>  (we assume it is already well-named)
   1194 # it is installable
   1195 #$(call module-class-register-installable,PREBUILT_SHARED_LIBRARY,,)
   1196 #$(call module-class-set-prebuilt,PREBUILT_SHARED_LIBRARY)
   1197 
   1198 # prebuilt static library
   1199 # <foo> -> <foo> (we assume it is already well-named)
   1200 #$(call module-class-register,PREBUILT_STATIC_LIBRARY,,)
   1201 #$(call module-class-set-prebuilt,PREBUILT_STATIC_LIBRARY)
   1202 
   1203 #
   1204 # C++ STL support
   1205 #
   1206 
   1207 ## The list of registered STL implementations we support
   1208 #GDK_STL_LIST :=
   1209 #
   1210 ## Used internally to register a given STL implementation, see below.
   1211 ##
   1212 ## $1: STL name as it appears in APP_STL (e.g. system)
   1213 ## $2: STL module name (e.g. cxx-stl/system)
   1214 ## $3: list of static libraries all modules will depend on
   1215 ## $4: list of shared libraries all modules will depend on
   1216 ##
   1217 #gdk-stl-register = \
   1218 #    $(eval __gdk_stl := $(strip $1)) \
   1219 #    $(eval GDK_STL_LIST += $(__gdk_stl)) \
   1220 #    $(eval GDK_STL.$(__gdk_stl).IMPORT_MODULE := $(strip $2)) \
   1221 #    $(eval GDK_STL.$(__gdk_stl).STATIC_LIBS := $(strip $3)) \
   1222 #    $(eval GDK_STL.$(__gdk_stl).SHARED_LIBS := $(strip $4))
   1223 #
   1224 ## Called to check that the value of APP_STL is a valid one.
   1225 ## $1: STL name as it apperas in APP_STL (e.g. 'system')
   1226 ##
   1227 #gdk-stl-check = \
   1228 #    $(if $(call set_is_member,$(GDK_STL_LIST),$1),,\
   1229 #        $(call __gdk_info,Invalid APP_STL value: $1)\
   1230 #        $(call __gdk_info,Please use one of the following instead: $(GDK_STL_LIST))\
   1231 #        $(call __gdk_error,Aborting))
   1232 #
   1233 ## Called before the top-level Android.mk is parsed to
   1234 ## select the STL implementation.
   1235 ## $1: STL name as it appears in APP_STL (e.g. system)
   1236 ##
   1237 #gdk-stl-select = \
   1238 #    $(call import-module,$(GDK_STL.$1.IMPORT_MODULE))
   1239 #
   1240 ## Called after all Android.mk files are parsed to add
   1241 ## proper STL dependencies to every C++ module.
   1242 ## $1: STL name as it appears in APP_STL (e.g. system)
   1243 ##
   1244 ##gdk-stl-add-dependencies = \
   1245 #    $(call modules-add-c++-dependencies,\
   1246 #        $(GDK_STL.$1.STATIC_LIBS),\
   1247 #        $(GDK_STL.$1.SHARED_LIBS))
   1248 #
   1249 ##
   1250 ##
   1251 #
   1252 ## Register the 'system' STL implementation
   1253 ##
   1254 #$(call gdk-stl-register,\
   1255 #    system,\
   1256 #    cxx-stl/system,\
   1257 #    libstdc++,\
   1258 #    )
   1259 #
   1260 ## Register the 'stlport_static' STL implementation
   1261 ##
   1262 #$(call gdk-stl-register,\
   1263 #    stlport_static,\
   1264 #    cxx-stl/stlport,\
   1265 #    stlport_static,\
   1266 #    )
   1267 #
   1268 ## Register the 'stlport_shared' STL implementation
   1269 ##
   1270 #$(call gdk-stl-register,\
   1271 #    stlport_shared,\
   1272 #    cxx-stl/stlport,\
   1273 #    ,\
   1274 #    stlport_shared\
   1275 #    )
   1276 #
   1277 ## Register the 'gnustl_static' STL implementation
   1278 ##
   1279 #$(call gdk-stl-register,\
   1280 #    gnustl_static,\
   1281 #    cxx-stl/gnu-libstdc++,\
   1282 #    gnustl_static,\
   1283 #    \
   1284 #    )
   1285 #
   1286