Home | History | Annotate | Download | only in core
      1 #
      2 # Copyright (C) 2008 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 
     17 ##
     18 ## Common build system definitions.  Mostly standard
     19 ## commands for building various types of targets, which
     20 ## are used by others to construct the final targets.
     21 ##
     22 
     23 # These are variables we use to collect overall lists
     24 # of things being processed.
     25 
     26 # Full paths to all of the documentation
     27 ALL_DOCS:=
     28 
     29 # The short names of all of the targets in the system.
     30 # For each element of ALL_MODULES, two other variables
     31 # are defined:
     32 #   $(ALL_MODULES.$(target)).BUILT
     33 #   $(ALL_MODULES.$(target)).INSTALLED
     34 # The BUILT variable contains LOCAL_BUILT_MODULE for that
     35 # target, and the INSTALLED variable contains the LOCAL_INSTALLED_MODULE.
     36 # Some targets may have multiple files listed in the BUILT and INSTALLED
     37 # sub-variables.
     38 ALL_MODULES:=
     39 
     40 # Full paths to targets that should be added to the "make droid"
     41 # set of installed targets.
     42 ALL_DEFAULT_INSTALLED_MODULES:=
     43 
     44 # The list of tags that have been defined by
     45 # LOCAL_MODULE_TAGS.  Each word in this variable maps
     46 # to a corresponding ALL_MODULE_TAGS.<tagname> variable
     47 # that contains all of the INSTALLED_MODULEs with that tag.
     48 ALL_MODULE_TAGS:=
     49 
     50 # Similar to ALL_MODULE_TAGS, but contains the short names
     51 # of all targets for a particular tag.  The top-level variable
     52 # won't have the list of tags;  ust ALL_MODULE_TAGS to get
     53 # the list of all known tags.  (This means that this variable
     54 # will always be empty; it's just here as a placeholder for
     55 # its sub-variables.)
     56 ALL_MODULE_NAME_TAGS:=
     57 
     58 # Full paths to all prebuilt files that will be copied
     59 # (used to make the dependency on acp)
     60 ALL_PREBUILT:=
     61 
     62 # Full path to all files that are made by some tool
     63 ALL_GENERATED_SOURCES:=
     64 
     65 # Full path to all asm, C, C++, lex and yacc generated C files.
     66 # These all have an order-only dependency on the copied headers
     67 ALL_C_CPP_ETC_OBJECTS:=
     68 
     69 # The list of dynamic binaries that haven't been stripped/compressed/etc.
     70 ALL_ORIGINAL_DYNAMIC_BINARIES:=
     71 
     72 # These files go into the SDK
     73 ALL_SDK_FILES:=
     74 
     75 # Files for dalvik.  This is often build without building the rest of the OS.
     76 INTERNAL_DALVIK_MODULES:=
     77 
     78 # All findbugs xml files
     79 ALL_FINDBUGS_FILES:=
     80 
     81 # GPL module license files
     82 ALL_GPL_MODULE_LICENSE_FILES:=
     83 
     84 # Target and host installed module's dependencies on shared libraries.
     85 # They are list of "<module_name>:<installed_file>:lib1,lib2...".
     86 TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES :=
     87 $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES :=
     88 HOST_DEPENDENCIES_ON_SHARED_LIBRARIES :=
     89 $(HOST_2ND_ARCH_VAR_PREFIX)HOST_DEPENDENCIES_ON_SHARED_LIBRARIES :=
     90 
     91 # Generated class file names for Android resource.
     92 # They are escaped and quoted so can be passed safely to a bash command.
     93 ANDROID_RESOURCE_GENERATED_CLASSES := 'R.class' 'R$$*.class' 'Manifest.class' 'Manifest$$*.class'
     94 
     95 ###########################################################
     96 ## Debugging; prints a variable list to stdout
     97 ###########################################################
     98 
     99 # $(1): variable name list, not variable values
    100 define print-vars
    101 $(foreach var,$(1), \
    102   $(info $(var):) \
    103   $(foreach word,$($(var)), \
    104     $(info $(space)$(space)$(word)) \
    105    ) \
    106  )
    107 endef
    108 
    109 ###########################################################
    110 ## Evaluates to true if the string contains the word true,
    111 ## and empty otherwise
    112 ## $(1): a var to test
    113 ###########################################################
    114 
    115 define true-or-empty
    116 $(filter true, $(1))
    117 endef
    118 
    119 
    120 ###########################################################
    121 ## Retrieve the directory of the current makefile
    122 ## Must be called before including any other makefile!!
    123 ###########################################################
    124 
    125 # Figure out where we are.
    126 define my-dir
    127 $(strip \
    128   $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
    129   $(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
    130     $(error my-dir must be called before including any other makefile.) \
    131    , \
    132     $(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
    133    ) \
    134  )
    135 endef
    136 
    137 ###########################################################
    138 ## Retrieve a list of all makefiles immediately below some directory
    139 ###########################################################
    140 
    141 define all-makefiles-under
    142 $(wildcard $(1)/*/Android.mk)
    143 endef
    144 
    145 ###########################################################
    146 ## Look under a directory for makefiles that don't have parent
    147 ## makefiles.
    148 ###########################################################
    149 
    150 # $(1): directory to search under
    151 # Ignores $(1)/Android.mk
    152 define first-makefiles-under
    153 $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git \
    154         --mindepth=2 $(1) Android.mk)
    155 endef
    156 
    157 ###########################################################
    158 ## Retrieve a list of all makefiles immediately below your directory
    159 ## Must be called before including any other makefile!!
    160 ###########################################################
    161 
    162 define all-subdir-makefiles
    163 $(call all-makefiles-under,$(call my-dir))
    164 endef
    165 
    166 ###########################################################
    167 ## Look in the named list of directories for makefiles,
    168 ## relative to the current directory.
    169 ## Must be called before including any other makefile!!
    170 ###########################################################
    171 
    172 # $(1): List of directories to look for under this directory
    173 define all-named-subdir-makefiles
    174 $(wildcard $(addsuffix /Android.mk, $(addprefix $(call my-dir)/,$(1))))
    175 endef
    176 
    177 ###########################################################
    178 ## Find all of the java files under the named directories.
    179 ## Meant to be used like:
    180 ##    SRC_FILES := $(call all-java-files-under,src tests)
    181 ###########################################################
    182 
    183 define all-java-files-under
    184 $(patsubst ./%,%, \
    185   $(shell cd $(LOCAL_PATH) ; \
    186           find -L $(1) -name "*.java" -and -not -name ".*") \
    187  )
    188 endef
    189 
    190 ###########################################################
    191 ## Find all of the java files from here.  Meant to be used like:
    192 ##    SRC_FILES := $(call all-subdir-java-files)
    193 ###########################################################
    194 
    195 define all-subdir-java-files
    196 $(call all-java-files-under,.)
    197 endef
    198 
    199 ###########################################################
    200 ## Find all of the c files under the named directories.
    201 ## Meant to be used like:
    202 ##    SRC_FILES := $(call all-c-files-under,src tests)
    203 ###########################################################
    204 
    205 define all-c-files-under
    206 $(patsubst ./%,%, \
    207   $(shell cd $(LOCAL_PATH) ; \
    208           find -L $(1) -name "*.c" -and -not -name ".*") \
    209  )
    210 endef
    211 
    212 ###########################################################
    213 ## Find all of the c files from here.  Meant to be used like:
    214 ##    SRC_FILES := $(call all-subdir-c-files)
    215 ###########################################################
    216 
    217 define all-subdir-c-files
    218 $(call all-c-files-under,.)
    219 endef
    220 
    221 ###########################################################
    222 ## Find all files named "I*.aidl" under the named directories,
    223 ## which must be relative to $(LOCAL_PATH).  The returned list
    224 ## is relative to $(LOCAL_PATH).
    225 ###########################################################
    226 
    227 define all-Iaidl-files-under
    228 $(patsubst ./%,%, \
    229   $(shell cd $(LOCAL_PATH) ; \
    230           find -L $(1) -name "I*.aidl" -and -not -name ".*") \
    231  )
    232 endef
    233 
    234 ###########################################################
    235 ## Find all of the "I*.aidl" files under $(LOCAL_PATH).
    236 ###########################################################
    237 
    238 define all-subdir-Iaidl-files
    239 $(call all-Iaidl-files-under,.)
    240 endef
    241 
    242 ###########################################################
    243 ## Find all of the logtags files under the named directories.
    244 ## Meant to be used like:
    245 ##    SRC_FILES := $(call all-logtags-files-under,src)
    246 ###########################################################
    247 
    248 define all-logtags-files-under
    249 $(patsubst ./%,%, \
    250   $(shell cd $(LOCAL_PATH) ; \
    251           find -L $(1) -name "*.logtags" -and -not -name ".*") \
    252   )
    253 endef
    254 
    255 ###########################################################
    256 ## Find all of the .proto files under the named directories.
    257 ## Meant to be used like:
    258 ##    SRC_FILES := $(call all-proto-files-under,src)
    259 ###########################################################
    260 
    261 define all-proto-files-under
    262 $(patsubst ./%,%, \
    263   $(shell cd $(LOCAL_PATH) ; \
    264           find -L $(1) -name "*.proto" -and -not -name ".*") \
    265   )
    266 endef
    267 
    268 ###########################################################
    269 ## Find all of the RenderScript files under the named directories.
    270 ##  Meant to be used like:
    271 ##    SRC_FILES := $(call all-renderscript-files-under,src)
    272 ###########################################################
    273 
    274 define all-renderscript-files-under
    275 $(patsubst ./%,%, \
    276   $(shell cd $(LOCAL_PATH) ; \
    277           find -L $(1) \( -name "*.rs" -or -name "*.fs" \) -and -not -name ".*") \
    278   )
    279 endef
    280 
    281 ###########################################################
    282 ## Find all of the S files under the named directories.
    283 ## Meant to be used like:
    284 ##    SRC_FILES := $(call all-c-files-under,src tests)
    285 ###########################################################
    286 
    287 define all-S-files-under
    288 $(patsubst ./%,%, \
    289   $(shell cd $(LOCAL_PATH) ; \
    290           find -L $(1) -name "*.S" -and -not -name ".*") \
    291  )
    292 endef
    293 
    294 ###########################################################
    295 ## Find all of the html files under the named directories.
    296 ## Meant to be used like:
    297 ##    SRC_FILES := $(call all-html-files-under,src tests)
    298 ###########################################################
    299 
    300 define all-html-files-under
    301 $(patsubst ./%,%, \
    302   $(shell cd $(LOCAL_PATH) ; \
    303           find -L $(1) -name "*.html" -and -not -name ".*") \
    304  )
    305 endef
    306 
    307 ###########################################################
    308 ## Find all of the html files from here.  Meant to be used like:
    309 ##    SRC_FILES := $(call all-subdir-html-files)
    310 ###########################################################
    311 
    312 define all-subdir-html-files
    313 $(call all-html-files-under,.)
    314 endef
    315 
    316 ###########################################################
    317 ## Find all of the files matching pattern
    318 ##    SRC_FILES := $(call find-subdir-files, <pattern>)
    319 ###########################################################
    320 
    321 define find-subdir-files
    322 $(patsubst ./%,%,$(shell cd $(LOCAL_PATH) ; find -L $(1)))
    323 endef
    324 
    325 ###########################################################
    326 # find the files in the subdirectory $1 of LOCAL_DIR
    327 # matching pattern $2, filtering out files $3
    328 # e.g.
    329 #     SRC_FILES += $(call find-subdir-subdir-files, \
    330 #                         css, *.cpp, DontWantThis.cpp)
    331 ###########################################################
    332 
    333 define find-subdir-subdir-files
    334 $(filter-out $(patsubst %,$(1)/%,$(3)),$(patsubst ./%,%,$(shell cd \
    335             $(LOCAL_PATH) ; find -L $(1) -maxdepth 1 -name $(2))))
    336 endef
    337 
    338 ###########################################################
    339 ## Find all of the files matching pattern
    340 ##    SRC_FILES := $(call all-subdir-java-files)
    341 ###########################################################
    342 
    343 define find-subdir-assets
    344 $(if $(1),$(patsubst ./%,%, \
    345 	$(shell if [ -d $(1) ] ; then cd $(1) ; find ./ -not -name '.*' -and -type f -and -not -type l ; fi)), \
    346 	$(warning Empty argument supplied to find-subdir-assets) \
    347 )
    348 endef
    349 
    350 ###########################################################
    351 ## Find various file types in a list of directories relative to $(LOCAL_PATH)
    352 ###########################################################
    353 
    354 define find-other-java-files
    355 	$(call find-subdir-files,$(1) -name "*.java" -and -not -name ".*")
    356 endef
    357 
    358 define find-other-html-files
    359 	$(call find-subdir-files,$(1) -name "*.html" -and -not -name ".*")
    360 endef
    361 
    362 ###########################################################
    363 # Use utility find to find given files in the given subdirs.
    364 # This function uses $(1), instead of LOCAL_PATH as the base.
    365 # $(1): the base dir, relative to the root of the source tree.
    366 # $(2): the file name pattern to be passed to find as "-name".
    367 # $(3): a list of subdirs of the base dir.
    368 # Returns: a list of paths relative to the base dir.
    369 ###########################################################
    370 
    371 define find-files-in-subdirs
    372 $(patsubst ./%,%, \
    373   $(shell cd $(1) ; \
    374           find -L $(3) -name $(2) -and -not -name ".*") \
    375  )
    376 endef
    377 
    378 ###########################################################
    379 ## Scan through each directory of $(1) looking for files
    380 ## that match $(2) using $(wildcard).  Useful for seeing if
    381 ## a given directory or one of its parents contains
    382 ## a particular file.  Returns the first match found,
    383 ## starting furthest from the root.
    384 ###########################################################
    385 
    386 define find-parent-file
    387 $(strip \
    388   $(eval _fpf := $(wildcard $(foreach f, $(2), $(strip $(1))/$(f)))) \
    389   $(if $(_fpf),$(_fpf), \
    390        $(if $(filter-out ./ .,$(1)), \
    391              $(call find-parent-file,$(patsubst %/,%,$(dir $(1))),$(2)) \
    392         ) \
    393    ) \
    394 )
    395 endef
    396 
    397 ###########################################################
    398 ## Function we can evaluate to introduce a dynamic dependency
    399 ###########################################################
    400 
    401 define add-dependency
    402 $(1): $(2)
    403 endef
    404 
    405 ###########################################################
    406 ## The intermediates directory.  Where object files go for
    407 ## a given target.  We could technically get away without
    408 ## the "_intermediates" suffix on the directory, but it's
    409 ## nice to be able to grep for that string to find out if
    410 ## anyone's abusing the system.
    411 ###########################################################
    412 
    413 # $(1): target class, like "APPS"
    414 # $(2): target name, like "NotePad"
    415 # $(3): if non-empty, this is a HOST target.
    416 # $(4): if non-empty, force the intermediates to be COMMON
    417 # $(5): if non-empty, force the intermedistes to be for the 2nd arch
    418 define intermediates-dir-for
    419 $(strip \
    420     $(eval _idfClass := $(strip $(1))) \
    421     $(if $(_idfClass),, \
    422         $(error $(LOCAL_PATH): Class not defined in call to intermediates-dir-for)) \
    423     $(eval _idfName := $(strip $(2))) \
    424     $(if $(_idfName),, \
    425         $(error $(LOCAL_PATH): Name not defined in call to intermediates-dir-for)) \
    426     $(eval _idfPrefix := $(if $(strip $(3)),HOST,TARGET)) \
    427     $(eval _idf2ndArchPrefix := $(if $(strip $(5)),$(TARGET_2ND_ARCH_VAR_PREFIX))) \
    428     $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \
    429         $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_INTERMEDIATES)) \
    430       ,$(if $(filter $(_idfClass),SHARED_LIBRARIES STATIC_LIBRARIES EXECUTABLES GYP),\
    431           $(eval _idfIntBase := $($(_idf2ndArchPrefix)$(_idfPrefix)_OUT_INTERMEDIATES)) \
    432        ,$(eval _idfIntBase := $($(_idfPrefix)_OUT_INTERMEDIATES)) \
    433        ) \
    434      ) \
    435     $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \
    436 )
    437 endef
    438 
    439 # Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE
    440 # to determine the intermediates directory.
    441 #
    442 # $(1): if non-empty, force the intermediates to be COMMON
    443 # $(2): if non-empty, force the intermediates to be for the 2nd arch
    444 define local-intermediates-dir
    445 $(strip \
    446     $(if $(strip $(LOCAL_MODULE_CLASS)),, \
    447         $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-intermediates-dir)) \
    448     $(if $(strip $(LOCAL_MODULE)),, \
    449         $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-intermediates-dir)) \
    450     $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(LOCAL_IS_HOST_MODULE),$(1),$(2)) \
    451 )
    452 endef
    453 
    454 ###########################################################
    455 ## The generated sources directory.  Placing generated
    456 ## source files directly in the intermediates directory
    457 ## causes problems for multiarch builds, where there are
    458 ## two intermediates directories for a single target. Put
    459 ## them in a separate directory, and they will be copied to
    460 ## each intermediates directory automatically.
    461 ###########################################################
    462 
    463 # $(1): target class, like "APPS"
    464 # $(2): target name, like "NotePad"
    465 # $(3): if non-empty, this is a HOST target.
    466 # $(4): if non-empty, force the generated sources to be COMMON
    467 define generated-sources-dir-for
    468 $(strip \
    469     $(eval _idfClass := $(strip $(1))) \
    470     $(if $(_idfClass),, \
    471         $(error $(LOCAL_PATH): Class not defined in call to generated-sources-dir-for)) \
    472     $(eval _idfName := $(strip $(2))) \
    473     $(if $(_idfName),, \
    474         $(error $(LOCAL_PATH): Name not defined in call to generated-sources-dir-for)) \
    475     $(eval _idfPrefix := $(if $(strip $(3)),HOST,TARGET)) \
    476     $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \
    477         $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN_COMMON)) \
    478       , \
    479         $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN)) \
    480      ) \
    481     $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \
    482 )
    483 endef
    484 
    485 # Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE
    486 # to determine the generated sources directory.
    487 #
    488 # $(1): if non-empty, force the intermediates to be COMMON
    489 define local-generated-sources-dir
    490 $(strip \
    491     $(if $(strip $(LOCAL_MODULE_CLASS)),, \
    492         $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-generated-sources-dir)) \
    493     $(if $(strip $(LOCAL_MODULE)),, \
    494         $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-generated-sources-dir)) \
    495     $(call generated-sources-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(LOCAL_IS_HOST_MODULE),$(1)) \
    496 )
    497 endef
    498 
    499 ###########################################################
    500 ## Convert "path/to/libXXX.so" to "-lXXX".
    501 ## Any "path/to/libXXX.a" elements pass through unchanged.
    502 ###########################################################
    503 
    504 define normalize-libraries
    505 $(foreach so,$(filter %.so,$(1)),-l$(patsubst lib%.so,%,$(notdir $(so))))\
    506 $(filter-out %.so,$(1))
    507 endef
    508 
    509 # TODO: change users to call the common version.
    510 define normalize-host-libraries
    511 $(call normalize-libraries,$(1))
    512 endef
    513 
    514 define normalize-target-libraries
    515 $(call normalize-libraries,$(1))
    516 endef
    517 
    518 ###########################################################
    519 ## Convert a list of short module names (e.g., "framework", "Browser")
    520 ## into the list of files that are built for those modules.
    521 ## NOTE: this won't return reliable results until after all
    522 ## sub-makefiles have been included.
    523 ## $(1): target list
    524 ###########################################################
    525 
    526 define module-built-files
    527 $(foreach module,$(1),$(ALL_MODULES.$(module).BUILT))
    528 endef
    529 
    530 ###########################################################
    531 ## Convert a list of short modules names (e.g., "framework", "Browser")
    532 ## into the list of files that are installed for those modules.
    533 ## NOTE: this won't return reliable results until after all
    534 ## sub-makefiles have been included.
    535 ## $(1): target list
    536 ###########################################################
    537 
    538 define module-installed-files
    539 $(foreach module,$(1),$(ALL_MODULES.$(module).INSTALLED))
    540 endef
    541 
    542 ###########################################################
    543 ## Convert a list of short modules names (e.g., "framework", "Browser")
    544 ## into the list of files that should be used when linking
    545 ## against that module as a public API.
    546 ## TODO: Allow this for more than JAVA_LIBRARIES modules
    547 ## NOTE: this won't return reliable results until after all
    548 ## sub-makefiles have been included.
    549 ## $(1): target list
    550 ###########################################################
    551 
    552 define module-stubs-files
    553 $(foreach module,$(1),$(ALL_MODULES.$(module).STUBS))
    554 endef
    555 
    556 ###########################################################
    557 ## Evaluates to the timestamp file for a doc module, which
    558 ## is the dependency that should be used.
    559 ## $(1): doc module
    560 ###########################################################
    561 
    562 define doc-timestamp-for
    563 $(OUT_DOCS)/$(strip $(1))-timestamp
    564 endef
    565 
    566 
    567 ###########################################################
    568 ## Convert "core ext framework" to "out/.../javalib.jar ..."
    569 ## $(1): library list
    570 ## $(2): Non-empty if IS_HOST_MODULE
    571 ###########################################################
    572 
    573 # $(1): library name
    574 # $(2): Non-empty if IS_HOST_MODULE
    575 define _java-lib-dir
    576 $(call intermediates-dir-for, \
    577 	JAVA_LIBRARIES,$(1),$(2),COMMON)
    578 endef
    579 
    580 # $(1): library name
    581 # $(2): Non-empty if IS_HOST_MODULE
    582 define _java-lib-full-classes.jar
    583 $(call _java-lib-dir,$(1),$(2))/classes$(COMMON_JAVA_PACKAGE_SUFFIX)
    584 endef
    585 
    586 # $(1): library name list
    587 # $(2): Non-empty if IS_HOST_MODULE
    588 define java-lib-files
    589 $(foreach lib,$(1),$(call _java-lib-full-classes.jar,$(lib),$(2)))
    590 endef
    591 
    592 # $(1): library name
    593 # $(2): Non-empty if IS_HOST_MODULE
    594 define _java-lib-full-dep
    595 $(call _java-lib-dir,$(1),$(2))/$(if $(2),javalib,classes)$(COMMON_JAVA_PACKAGE_SUFFIX)
    596 endef
    597 
    598 # $(1): library name list
    599 # $(2): Non-empty if IS_HOST_MODULE
    600 define java-lib-deps
    601 $(foreach lib,$(1),$(call _java-lib-full-dep,$(lib),$(2)))
    602 endef
    603 
    604 ###########################################################
    605 ## Run rot13 on a string
    606 ## $(1): the string.  Must be one line.
    607 ###########################################################
    608 define rot13
    609 $(shell echo $(1) | tr 'a-zA-Z' 'n-za-mN-ZA-M')
    610 endef
    611 
    612 
    613 ###########################################################
    614 ## Returns true if $(1) and $(2) are equal.  Returns
    615 ## the empty string if they are not equal.
    616 ###########################################################
    617 define streq
    618 $(strip $(if $(strip $(1)),\
    619   $(if $(strip $(2)),\
    620     $(if $(filter-out __,_$(subst $(strip $(1)),,$(strip $(2)))$(subst $(strip $(2)),,$(strip $(1)))_),,true), \
    621     ),\
    622   $(if $(strip $(2)),\
    623     ,\
    624     true)\
    625  ))
    626 endef
    627 
    628 ###########################################################
    629 ## Convert "a b c" into "a:b:c"
    630 ###########################################################
    631 define normalize-path-list
    632 $(subst $(space),:,$(strip $(1)))
    633 endef
    634 
    635 ###########################################################
    636 ## Read the word out of a colon-separated list of words.
    637 ## This has the same behavior as the built-in function
    638 ## $(word n,str).
    639 ##
    640 ## The individual words may not contain spaces.
    641 ##
    642 ## $(1): 1 based index
    643 ## $(2): value of the form a:b:c...
    644 ###########################################################
    645 
    646 define word-colon
    647 $(word $(1),$(subst :,$(space),$(2)))
    648 endef
    649 
    650 ###########################################################
    651 ## Convert "a=b c= d e = f" into "a=b c=d e=f"
    652 ##
    653 ## $(1): list to collapse
    654 ## $(2): if set, separator word; usually "=", ":", or ":="
    655 ##       Defaults to "=" if not set.
    656 ###########################################################
    657 
    658 define collapse-pairs
    659 $(eval _cpSEP := $(strip $(if $(2),$(2),=)))\
    660 $(subst $(space)$(_cpSEP)$(space),$(_cpSEP),$(strip \
    661     $(subst $(_cpSEP), $(_cpSEP) ,$(1))))
    662 endef
    663 
    664 ###########################################################
    665 ## Given a list of pairs, if multiple pairs have the same
    666 ## first components, keep only the first pair.
    667 ##
    668 ## $(1): list of pairs
    669 ## $(2): the separator word, such as ":", "=", etc.
    670 define uniq-pairs-by-first-component
    671 $(eval _upbfc_fc_set :=)\
    672 $(strip $(foreach w,$(1), $(eval _first := $(word 1,$(subst $(2),$(space),$(w))))\
    673     $(if $(filter $(_upbfc_fc_set),$(_first)),,$(w)\
    674         $(eval _upbfc_fc_set += $(_first)))))\
    675 $(eval _upbfc_fc_set :=)\
    676 $(eval _first:=)
    677 endef
    678 
    679 ###########################################################
    680 ## MODULE_TAG set operations
    681 ###########################################################
    682 
    683 # Given a list of tags, return the targets that specify
    684 # any of those tags.
    685 # $(1): tag list
    686 define modules-for-tag-list
    687 $(sort $(foreach tag,$(1),$(ALL_MODULE_TAGS.$(tag))))
    688 endef
    689 
    690 # Same as modules-for-tag-list, but operates on
    691 # ALL_MODULE_NAME_TAGS.
    692 # $(1): tag list
    693 define module-names-for-tag-list
    694 $(sort $(foreach tag,$(1),$(ALL_MODULE_NAME_TAGS.$(tag))))
    695 endef
    696 
    697 # Given an accept and reject list, find the matching
    698 # set of targets.  If a target has multiple tags and
    699 # any of them are rejected, the target is rejected.
    700 # Reject overrides accept.
    701 # $(1): list of tags to accept
    702 # $(2): list of tags to reject
    703 #TODO(dbort): do $(if $(strip $(1)),$(1),$(ALL_MODULE_TAGS))
    704 #TODO(jbq): as of 20100106 nobody uses the second parameter
    705 define get-tagged-modules
    706 $(filter-out \
    707 	$(call modules-for-tag-list,$(2)), \
    708 	    $(call modules-for-tag-list,$(1)))
    709 endef
    710 
    711 ###########################################################
    712 ## Append a leaf to a base path.  Properly deals with
    713 ## base paths ending in /.
    714 ##
    715 ## $(1): base path
    716 ## $(2): leaf path
    717 ###########################################################
    718 
    719 define append-path
    720 $(subst //,/,$(1)/$(2))
    721 endef
    722 
    723 
    724 ###########################################################
    725 ## Package filtering
    726 ###########################################################
    727 
    728 # Given a list of installed modules (short or long names)
    729 # return a list of the packages (yes, .apk packages, not
    730 # modules in general) that are overridden by this list and,
    731 # therefore, should not be installed.
    732 # $(1): mixed list of installed modules
    733 # TODO: This is fragile; find a reliable way to get this information.
    734 define _get-package-overrides
    735  $(eval ### Discard any words containing slashes, unless they end in .apk, \
    736         ### in which case trim off the directory component and the suffix. \
    737         ### If there are no slashes, keep the entire word.)
    738  $(eval _gpo_names := $(subst /,@@@ @@@,$(1)))
    739  $(eval _gpo_names := \
    740      $(filter %.apk,$(_gpo_names)) \
    741      $(filter-out %@@@ @@@%,$(_gpo_names)))
    742  $(eval _gpo_names := $(patsubst %.apk,%,$(_gpo_names)))
    743  $(eval _gpo_names := $(patsubst @@@%,%,$(_gpo_names)))
    744 
    745  $(eval ### Remove any remaining words that contain dots.)
    746  $(eval _gpo_names := $(subst .,@@@ @@@,$(_gpo_names)))
    747  $(eval _gpo_names := $(filter-out %@@@ @@@%,$(_gpo_names)))
    748 
    749  $(eval ### Now we have a list of any words that could possibly refer to \
    750         ### packages, although there may be words that do not.  Only \
    751         ### real packages will be present under PACKAGES.*, though.)
    752  $(foreach _gpo_name,$(_gpo_names),$(PACKAGES.$(_gpo_name).OVERRIDES))
    753 endef
    754 
    755 define get-package-overrides
    756 $(sort $(strip $(call _get-package-overrides,$(1))))
    757 endef
    758 
    759 ###########################################################
    760 ## Output the command lines, or not
    761 ###########################################################
    762 
    763 ifeq ($(strip $(SHOW_COMMANDS)),)
    764 define pretty
    765 @echo $1
    766 endef
    767 hide := @
    768 else
    769 define pretty
    770 endef
    771 hide :=
    772 endif
    773 
    774 ###########################################################
    775 ## Dump the variables that are associated with targets
    776 ###########################################################
    777 
    778 define dump-module-variables
    779 @echo all_dependencies=$^
    780 @echo PRIVATE_YACCFLAGS=$(PRIVATE_YACCFLAGS);
    781 @echo PRIVATE_CFLAGS=$(PRIVATE_CFLAGS);
    782 @echo PRIVATE_CPPFLAGS=$(PRIVATE_CPPFLAGS);
    783 @echo PRIVATE_DEBUG_CFLAGS=$(PRIVATE_DEBUG_CFLAGS);
    784 @echo PRIVATE_C_INCLUDES=$(PRIVATE_C_INCLUDES);
    785 @echo PRIVATE_LDFLAGS=$(PRIVATE_LDFLAGS);
    786 @echo PRIVATE_LDLIBS=$(PRIVATE_LDLIBS);
    787 @echo PRIVATE_ARFLAGS=$(PRIVATE_ARFLAGS);
    788 @echo PRIVATE_AAPT_FLAGS=$(PRIVATE_AAPT_FLAGS);
    789 @echo PRIVATE_DX_FLAGS=$(PRIVATE_DX_FLAGS);
    790 @echo PRIVATE_JAVACFLAGS=$(PRIVATE_JAVACFLAGS);
    791 @echo PRIVATE_JAVA_LIBRARIES=$(PRIVATE_JAVA_LIBRARIES);
    792 @echo PRIVATE_ALL_SHARED_LIBRARIES=$(PRIVATE_ALL_SHARED_LIBRARIES);
    793 @echo PRIVATE_ALL_STATIC_LIBRARIES=$(PRIVATE_ALL_STATIC_LIBRARIES);
    794 @echo PRIVATE_ALL_WHOLE_STATIC_LIBRARIES=$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES);
    795 @echo PRIVATE_ALL_OBJECTS=$(PRIVATE_ALL_OBJECTS);
    796 @echo PRIVATE_NO_CRT=$(PRIVATE_NO_CRT);
    797 endef
    798 
    799 ###########################################################
    800 ## Commands for using sed to replace given variable values
    801 ###########################################################
    802 
    803 define transform-variables
    804 @mkdir -p $(dir $@)
    805 @echo "Sed: $(if $(PRIVATE_MODULE),$(PRIVATE_MODULE),$@) <= $<"
    806 $(hide) sed $(foreach var,$(REPLACE_VARS),-e "s/{{$(var)}}/$(subst /,\/,$(PWD)/$($(var)))/g") $< >$@
    807 $(hide) if [ "$(suffix $@)" = ".sh" ]; then chmod a+rx $@; fi
    808 endef
    809 
    810 
    811 ###########################################################
    812 ## Commands for munging the dependency files GCC generates
    813 ###########################################################
    814 # $(1): the input .d file
    815 # $(2): the output .P file
    816 define transform-d-to-p-args
    817 $(hide) cp $(1) $(2); \
    818 	sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
    819 		-e '/^$$/ d' -e 's/$$/ :/' < $(1) >> $(2); \
    820 	rm -f $(1)
    821 endef
    822 
    823 define transform-d-to-p
    824 $(call transform-d-to-p-args,$(@:%.o=%.d),$(@:%.o=%.P))
    825 endef
    826 
    827 ###########################################################
    828 ## Commands for running lex
    829 ###########################################################
    830 
    831 define transform-l-to-cpp
    832 @mkdir -p $(dir $@)
    833 @echo "Lex: $(PRIVATE_MODULE) <= $<"
    834 $(hide) $(LEX) -o$@ $<
    835 endef
    836 
    837 ###########################################################
    838 ## Commands for running yacc
    839 ##
    840 ## Because the extension of c++ files can change, the
    841 ## extension must be specified in $1.
    842 ## E.g, "$(call transform-y-to-cpp,.cpp)"
    843 ###########################################################
    844 
    845 define transform-y-to-cpp
    846 @mkdir -p $(dir $@)
    847 @echo "Yacc: $(PRIVATE_MODULE) <= $<"
    848 $(YACC) $(PRIVATE_YACCFLAGS) -o $@ $<
    849 touch $(@:$1=$(YACC_HEADER_SUFFIX))
    850 echo '#ifndef '$(@F:$1=_h) > $(@:$1=.h)
    851 echo '#define '$(@F:$1=_h) >> $(@:$1=.h)
    852 cat $(@:$1=$(YACC_HEADER_SUFFIX)) >> $(@:$1=.h)
    853 echo '#endif' >> $(@:$1=.h)
    854 endef
    855 
    856 ###########################################################
    857 ## Commands to compile RenderScript to Java
    858 ###########################################################
    859 
    860 define transform-renderscripts-to-java-and-bc
    861 @echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
    862 $(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
    863 $(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/res/raw
    864 $(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/src
    865 $(hide) $(PRIVATE_RS_CC) \
    866   -o $(PRIVATE_RS_OUTPUT_DIR)/res/raw \
    867   -p $(PRIVATE_RS_OUTPUT_DIR)/src \
    868   -d $(PRIVATE_RS_OUTPUT_DIR) \
    869   -a $@ -MD \
    870   $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \
    871   $(PRIVATE_RS_FLAGS) \
    872   $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \
    873   $(PRIVATE_RS_SOURCE_FILES)
    874 $(hide) mkdir -p $(dir $@)
    875 $(hide) touch $@
    876 endef
    877 
    878 define transform-bc-to-so
    879 @echo "Renderscript compatibility: $(notdir $@) <= $(notdir $<)"
    880 $(hide) mkdir -p $(dir $@)
    881 $(hide) $(BCC_COMPAT) -O3 -o $(dir $@)/$(notdir $(<:.bc=.o)) -fPIC -shared \
    882 	-rt-path $(RS_PREBUILT_CLCORE) -mtriple $(RS_COMPAT_TRIPLE) $<
    883 $(hide) $(PRIVATE_CXX) -shared -Wl,-soname,$(notdir $@) -nostdlib \
    884 	-Wl,-rpath,\$$ORIGIN/../lib \
    885 	$(dir $@)/$(notdir $(<:.bc=.o)) \
    886 	$(RS_PREBUILT_COMPILER_RT) \
    887 	-o $@ $(TARGET_GLOBAL_LDFLAGS) -L prebuilts/gcc/ \
    888 	-L $(TARGET_OUT_INTERMEDIATE_LIBRARIES) $(RS_PREBUILT_LIBPATH) \
    889 	-lRSSupport -lm -lc
    890 endef
    891 
    892 ###########################################################
    893 ## Commands to compile RenderScript to C++
    894 ###########################################################
    895 
    896 define transform-renderscripts-to-cpp-and-bc
    897 @echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
    898 $(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
    899 $(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/
    900 $(hide) $(PRIVATE_RS_CC) \
    901   -o $(PRIVATE_RS_OUTPUT_DIR)/ \
    902   -d $(PRIVATE_RS_OUTPUT_DIR) \
    903   -a $@ -MD \
    904   -reflect-c++ \
    905   $(PRIVATE_RS_FLAGS) \
    906   $(addprefix -I , $(PRIVATE_RS_INCLUDES)) \
    907   $(PRIVATE_RS_SOURCE_FILES)
    908 $(hide) mkdir -p $(dir $@)
    909 $(hide) touch $@
    910 endef
    911 
    912 
    913 ###########################################################
    914 ## Commands for running aidl
    915 ###########################################################
    916 
    917 define transform-aidl-to-java
    918 @mkdir -p $(dir $@)
    919 @echo "Aidl: $(PRIVATE_MODULE) <= $<"
    920 $(hide) $(AIDL) -d$(patsubst %.java,%.P,$@) $(PRIVATE_AIDL_FLAGS) $< $@
    921 endef
    922 #$(AIDL) $(PRIVATE_AIDL_FLAGS) $< - | indent -nut -br -npcs -l1000 > $@
    923 
    924 
    925 ###########################################################
    926 ## Commands for running java-event-log-tags.py
    927 ###########################################################
    928 
    929 define transform-logtags-to-java
    930 @mkdir -p $(dir $@)
    931 @echo "logtags: $@ <= $<"
    932 $(hide) $(JAVATAGS) -o $@ $^
    933 endef
    934 
    935 
    936 ###########################################################
    937 ## Commands for running protoc to compile .proto into .java
    938 ###########################################################
    939 
    940 define transform-proto-to-java
    941 @mkdir -p $(dir $@)
    942 @echo "Protoc: $@ <= $(PRIVATE_PROTO_SRC_FILES)"
    943 @rm -rf $(PRIVATE_PROTO_JAVA_OUTPUT_DIR)
    944 @mkdir -p $(PRIVATE_PROTO_JAVA_OUTPUT_DIR)
    945 $(hide) for f in $(PRIVATE_PROTO_SRC_FILES); do \
    946         $(PROTOC) \
    947         $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \
    948         $(PRIVATE_PROTO_JAVA_OUTPUT_OPTION)="$(PRIVATE_PROTO_JAVA_OUTPUT_PARAMS):$(PRIVATE_PROTO_JAVA_OUTPUT_DIR)" \
    949         $(PRIVATE_PROTOC_FLAGS) \
    950         $$f || exit 33; \
    951         done
    952 $(hide) touch $@
    953 endef
    954 
    955 ######################################################################
    956 ## Commands for running protoc to compile .proto into .pb.cc and .pb.h
    957 ######################################################################
    958 define transform-proto-to-cc
    959 @mkdir -p $(dir $@)
    960 @echo "Protoc: $@ <= $<"
    961 $(hide) $(PROTOC) \
    962 	$(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \
    963 	$(PRIVATE_PROTOC_FLAGS) \
    964 	--cpp_out=$(PRIVATE_PROTO_CC_OUTPUT_DIR) $<
    965 endef
    966 
    967 
    968 ###########################################################
    969 ## Commands for running gcc to compile a C++ file
    970 ###########################################################
    971 
    972 define transform-cpp-to-o
    973 @mkdir -p $(dir $@)
    974 @echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<"
    975 $(hide) $(PRIVATE_CXX) \
    976 	$(addprefix -I , $(PRIVATE_C_INCLUDES)) \
    977 	$(shell cat $(PRIVATE_IMPORT_INCLUDES)) \
    978 	$(addprefix -isystem ,\
    979 	    $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
    980 	        $(filter-out $(PRIVATE_C_INCLUDES), \
    981 	            $(PRIVATE_TARGET_PROJECT_INCLUDES) \
    982 	            $(PRIVATE_TARGET_C_INCLUDES)))) \
    983 	-c \
    984 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
    985 	    $(PRIVATE_TARGET_GLOBAL_CFLAGS) \
    986 	    $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \
    987 	    $(PRIVATE_ARM_CFLAGS) \
    988 	 ) \
    989 	$(PRIVATE_RTTI_FLAG) \
    990 	$(PRIVATE_CFLAGS) \
    991 	$(PRIVATE_CPPFLAGS) \
    992 	$(PRIVATE_DEBUG_CFLAGS) \
    993 	-MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
    994 $(transform-d-to-p)
    995 endef
    996 
    997 
    998 ###########################################################
    999 ## Commands for running gcc to compile a C file
   1000 ###########################################################
   1001 
   1002 # $(1): extra flags
   1003 define transform-c-or-s-to-o-no-deps
   1004 @mkdir -p $(dir $@)
   1005 $(hide) $(PRIVATE_CC) \
   1006 	$(addprefix -I , $(PRIVATE_C_INCLUDES)) \
   1007 	$(shell cat $(PRIVATE_IMPORT_INCLUDES)) \
   1008 	$(addprefix -isystem ,\
   1009 	    $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1010 	        $(filter-out $(PRIVATE_C_INCLUDES), \
   1011 	            $(PRIVATE_TARGET_PROJECT_INCLUDES) \
   1012 	            $(PRIVATE_TARGET_C_INCLUDES)))) \
   1013 	-c \
   1014 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1015 	    $(PRIVATE_TARGET_GLOBAL_CFLAGS) \
   1016 	    $(PRIVATE_ARM_CFLAGS) \
   1017 	 ) \
   1018 	 $(1) \
   1019 	-MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
   1020 endef
   1021 
   1022 define transform-c-to-o-no-deps
   1023 @echo "target $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<"
   1024 $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS))
   1025 endef
   1026 
   1027 define transform-s-to-o-no-deps
   1028 @echo "target asm: $(PRIVATE_MODULE) <= $<"
   1029 $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS))
   1030 endef
   1031 
   1032 define transform-c-to-o
   1033 $(transform-c-to-o-no-deps)
   1034 $(transform-d-to-p)
   1035 endef
   1036 
   1037 define transform-s-to-o
   1038 $(transform-s-to-o-no-deps)
   1039 $(transform-d-to-p)
   1040 endef
   1041 
   1042 # YASM compilation
   1043 define transform-asm-to-o
   1044 @mkdir -p $(dir $@)
   1045 $(hide) $(YASM) \
   1046     $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
   1047     -f elf32 -m x86 \
   1048     $(PRIVATE_ASFLAGS) \
   1049     -o $@ $<
   1050 endef
   1051 
   1052 ###########################################################
   1053 ## Commands for running gcc to compile an Objective-C file
   1054 ## This should never happen for target builds but this
   1055 ## will error at build time.
   1056 ###########################################################
   1057 
   1058 define transform-m-to-o-no-deps
   1059 @echo "target ObjC: $(PRIVATE_MODULE) <= $<"
   1060 $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS))
   1061 endef
   1062 
   1063 define transform-m-to-o
   1064 $(transform-m-to-o-no-deps)
   1065 $(transform-d-to-p)
   1066 endef
   1067 
   1068 ###########################################################
   1069 ## Commands for running gcc to compile a host C++ file
   1070 ###########################################################
   1071 
   1072 define transform-host-cpp-to-o
   1073 @mkdir -p $(dir $@)
   1074 @echo "host C++: $(PRIVATE_MODULE) <= $<"
   1075 $(hide) $(PRIVATE_CXX) \
   1076 	$(addprefix -I , $(PRIVATE_C_INCLUDES)) \
   1077 	$(shell cat $(PRIVATE_IMPORT_INCLUDES)) \
   1078 	$(addprefix -isystem ,\
   1079 	    $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1080 	        $(filter-out $(PRIVATE_C_INCLUDES), \
   1081 	            $(HOST_PROJECT_INCLUDES) \
   1082 	            $(PRIVATE_HOST_C_INCLUDES)))) \
   1083 	-c \
   1084 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1085 	    $(PRIVATE_HOST_GLOBAL_CFLAGS) \
   1086 	    $(PRIVATE_HOST_GLOBAL_CPPFLAGS) \
   1087 	 ) \
   1088 	$(PRIVATE_CFLAGS) \
   1089 	$(PRIVATE_CPPFLAGS) \
   1090 	$(PRIVATE_DEBUG_CFLAGS) \
   1091 	-MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
   1092 $(transform-d-to-p)
   1093 endef
   1094 
   1095 
   1096 ###########################################################
   1097 ## Commands for running gcc to compile a host C file
   1098 ###########################################################
   1099 
   1100 # $(1): extra flags
   1101 define transform-host-c-or-s-to-o-no-deps
   1102 @mkdir -p $(dir $@)
   1103 $(hide) $(PRIVATE_CC) \
   1104 	$(addprefix -I , $(PRIVATE_C_INCLUDES)) \
   1105 	$(shell cat $(PRIVATE_IMPORT_INCLUDES)) \
   1106 	$(addprefix -isystem ,\
   1107 	    $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1108 	        $(filter-out $(PRIVATE_C_INCLUDES), \
   1109 	            $(HOST_PROJECT_INCLUDES) \
   1110 	            $(PRIVATE_HOST_C_INCLUDES)))) \
   1111 	-c \
   1112 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1113 	    $(PRIVATE_HOST_GLOBAL_CFLAGS) \
   1114 	 ) \
   1115 	$(1) \
   1116 	-MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
   1117 endef
   1118 
   1119 define transform-host-c-to-o-no-deps
   1120 @echo "host C: $(PRIVATE_MODULE) <= $<"
   1121 $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS))
   1122 endef
   1123 
   1124 define transform-host-s-to-o-no-deps
   1125 @echo "host asm: $(PRIVATE_MODULE) <= $<"
   1126 $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS))
   1127 endef
   1128 
   1129 define transform-host-c-to-o
   1130 $(transform-host-c-to-o-no-deps)
   1131 $(transform-d-to-p)
   1132 endef
   1133 
   1134 define transform-host-s-to-o
   1135 $(transform-host-s-to-o-no-deps)
   1136 $(transform-d-to-p)
   1137 endef
   1138 
   1139 ###########################################################
   1140 ## Commands for running gcc to compile a host Objective-C file
   1141 ###########################################################
   1142 
   1143 define transform-host-m-to-o-no-deps
   1144 @echo "host ObjC: $(PRIVATE_MODULE) <= $<"
   1145 $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS))
   1146 endef
   1147 
   1148 define transform-host-m-to-o
   1149 $(transform-host-m-to-o-no-deps)
   1150 $(transform-d-to-p)
   1151 endef
   1152 
   1153 ###########################################################
   1154 ## Commands for running ar
   1155 ###########################################################
   1156 
   1157 define _concat-if-arg2-not-empty
   1158 $(if $(2),$(hide) $(1) $(2))
   1159 endef
   1160 
   1161 # Split long argument list into smaller groups and call the command repeatedly
   1162 # Call the command at least once even if there are no arguments, as otherwise
   1163 # the output file won't be created.
   1164 #
   1165 # $(1): the command without arguments
   1166 # $(2): the arguments
   1167 define split-long-arguments
   1168 $(hide) $(1) $(wordlist 1,500,$(2))
   1169 $(call _concat-if-arg2-not-empty,$(1),$(wordlist 501,1000,$(2)))
   1170 $(call _concat-if-arg2-not-empty,$(1),$(wordlist 1001,1500,$(2)))
   1171 $(call _concat-if-arg2-not-empty,$(1),$(wordlist 1501,2000,$(2)))
   1172 $(call _concat-if-arg2-not-empty,$(1),$(wordlist 2001,2500,$(2)))
   1173 $(call _concat-if-arg2-not-empty,$(1),$(wordlist 2501,3000,$(2)))
   1174 $(call _concat-if-arg2-not-empty,$(1),$(wordlist 3001,99999,$(2)))
   1175 endef
   1176 
   1177 # $(1): the full path of the source static library.
   1178 define _extract-and-include-single-target-whole-static-lib
   1179 @echo "preparing StaticLib: $(PRIVATE_MODULE) [including $(1)]"
   1180 $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
   1181     rm -rf $$ldir; \
   1182     mkdir -p $$ldir; \
   1183     filelist=; \
   1184     for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) t $(1)`; do \
   1185         $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) p $(1) $$f > $$ldir/$$f; \
   1186         filelist="$$filelist $$ldir/$$f"; \
   1187     done ; \
   1188     $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \
   1189         $(PRIVATE_ARFLAGS) $@ $$filelist
   1190 
   1191 endef
   1192 
   1193 define extract-and-include-target-whole-static-libs
   1194 $(foreach lib,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), \
   1195     $(call _extract-and-include-single-target-whole-static-lib, $(lib)))
   1196 endef
   1197 
   1198 # Explicitly delete the archive first so that ar doesn't
   1199 # try to add to an existing archive.
   1200 define transform-o-to-static-lib
   1201 @mkdir -p $(dir $@)
   1202 @rm -f $@
   1203 $(extract-and-include-target-whole-static-libs)
   1204 @echo "target StaticLib: $(PRIVATE_MODULE) ($@)"
   1205 $(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) \
   1206     $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \
   1207     $(PRIVATE_ARFLAGS) $@,$(filter %.o, $^))
   1208 endef
   1209 
   1210 ###########################################################
   1211 ## Commands for running host ar
   1212 ###########################################################
   1213 
   1214 # $(1): the full path of the source static library.
   1215 define _extract-and-include-single-host-whole-static-lib
   1216 @echo "preparing StaticLib: $(PRIVATE_MODULE) [including $(1)]"
   1217 $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
   1218     rm -rf $$ldir; \
   1219     mkdir -p $$ldir; \
   1220     filelist=; \
   1221     for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) t $(1) | \grep '\.o$$'`; do \
   1222         $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) p $(1) $$f > $$ldir/$$f; \
   1223         filelist="$$filelist $$ldir/$$f"; \
   1224     done ; \
   1225     $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_ARFLAGS) \
   1226         $(PRIVATE_ARFLAGS) $@ $$filelist
   1227 
   1228 endef
   1229 
   1230 define extract-and-include-host-whole-static-libs
   1231 $(foreach lib,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), \
   1232     $(call _extract-and-include-single-host-whole-static-lib, $(lib)))
   1233 endef
   1234 
   1235 # Explicitly delete the archive first so that ar doesn't
   1236 # try to add to an existing archive.
   1237 define transform-host-o-to-static-lib
   1238 @mkdir -p $(dir $@)
   1239 @rm -f $@
   1240 $(extract-and-include-host-whole-static-libs)
   1241 @echo "host StaticLib: $(PRIVATE_MODULE) ($@)"
   1242 $(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_AR) \
   1243     $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_ARFLAGS) \
   1244     $(PRIVATE_ARFLAGS) $@,$(filter %.o, $^))
   1245 endef
   1246 
   1247 
   1248 ###########################################################
   1249 ## Commands for running gcc to link a shared library or package
   1250 ###########################################################
   1251 
   1252 # ld just seems to be so finicky with command order that we allow
   1253 # it to be overriden en-masse see combo/linux-arm.make for an example.
   1254 ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
   1255 define transform-host-o-to-shared-lib-inner
   1256 $(hide) $(PRIVATE_CXX) \
   1257 	-Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES) \
   1258 	-Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \
   1259 	-shared -Wl,-soname,$(notdir $@) \
   1260 	$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \
   1261 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1262 	   $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
   1263 	) \
   1264 	$(PRIVATE_LDFLAGS) \
   1265 	$(PRIVATE_ALL_OBJECTS) \
   1266 	-Wl,--whole-archive \
   1267 	$(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
   1268 	-Wl,--no-whole-archive \
   1269 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
   1270 	$(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
   1271 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
   1272 	$(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
   1273 	-o $@ \
   1274 	$(PRIVATE_LDLIBS)
   1275 endef
   1276 endif
   1277 
   1278 define transform-host-o-to-shared-lib
   1279 @mkdir -p $(dir $@)
   1280 @echo "host SharedLib: $(PRIVATE_MODULE) ($@)"
   1281 $(transform-host-o-to-shared-lib-inner)
   1282 endef
   1283 
   1284 define transform-host-o-to-package
   1285 @mkdir -p $(dir $@)
   1286 @echo "host Package: $(PRIVATE_MODULE) ($@)"
   1287 $(transform-host-o-to-shared-lib-inner)
   1288 endef
   1289 
   1290 
   1291 ###########################################################
   1292 ## Commands for running gcc to link a shared library or package
   1293 ###########################################################
   1294 
   1295 #echo >$@.vers "{"; \
   1296 #echo >>$@.vers " global:"; \
   1297 #$(BUILD_SYSTEM)/filter_symbols.sh $(TARGET_NM) "  " ";" $(filter %.o,$^) | sort -u >>$@.vers; \
   1298 #echo >>$@.vers " local:"; \
   1299 #echo >>$@.vers "  *;"; \
   1300 #echo >>$@.vers "};"; \
   1301 
   1302 #	-Wl,--version-script=$@.vers \
   1303 
   1304 # ld just seems to be so finicky with command order that we allow
   1305 # it to be overriden en-masse see combo/linux-arm.make for an example.
   1306 ifneq ($(TARGET_CUSTOM_LD_COMMAND),true)
   1307 define transform-o-to-shared-lib-inner
   1308 $(hide) $(PRIVATE_CXX) \
   1309 	$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
   1310 	-Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \
   1311 	-Wl,-rpath,\$$ORIGIN/../lib \
   1312 	-Wl,-shared -Wl,-soname,$(notdir $@) \
   1313 	$(PRIVATE_LDFLAGS) \
   1314 	$(PRIVATE_TARGET_GLOBAL_LD_DIRS) \
   1315 	$(PRIVATE_ALL_OBJECTS) \
   1316 	-Wl,--whole-archive \
   1317 	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
   1318 	-Wl,--no-whole-archive \
   1319 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
   1320 	$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
   1321 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
   1322 	$(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
   1323 	-o $@ \
   1324 	$(PRIVATE_LDLIBS)
   1325 endef
   1326 endif
   1327 
   1328 define transform-o-to-shared-lib
   1329 @mkdir -p $(dir $@)
   1330 @echo "target SharedLib: $(PRIVATE_MODULE) ($@)"
   1331 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-shared-lib-inner)
   1332 endef
   1333 
   1334 
   1335 ###########################################################
   1336 ## Commands for filtering a target executable or library
   1337 ###########################################################
   1338 
   1339 ifneq ($(TARGET_BUILD_VARIANT),user)
   1340   TARGET_STRIP_EXTRA = && $(PRIVATE_OBJCOPY) --add-gnu-debuglink=$< $@
   1341   TARGET_STRIP_KEEP_SYMBOLS_EXTRA = --add-gnu-debuglink=$<
   1342 endif
   1343 
   1344 define transform-to-stripped
   1345 @mkdir -p $(dir $@)
   1346 @echo "target Strip: $(PRIVATE_MODULE) ($@)"
   1347 $(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ $(TARGET_STRIP_EXTRA)
   1348 endef
   1349 
   1350 define transform-to-stripped-keep-symbols
   1351 @mkdir -p $(dir $@)
   1352 @echo "target Strip (keep symbols): $(PRIVATE_MODULE) ($@)"
   1353 $(hide) $(PRIVATE_OBJCOPY) \
   1354     `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \
   1355     $(TARGET_STRIP_KEEP_SYMBOLS_EXTRA) $< $@
   1356 endef
   1357 
   1358 
   1359 ###########################################################
   1360 ## Commands for running gcc to link an executable
   1361 ###########################################################
   1362 
   1363 ifneq ($(TARGET_CUSTOM_LD_COMMAND),true)
   1364 define transform-o-to-executable-inner
   1365 $(hide) $(PRIVATE_CXX) \
   1366 	$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
   1367 	$(PRIVATE_TARGET_GLOBAL_LD_DIRS) \
   1368 	-Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \
   1369 	-Wl,-rpath,\$$ORIGIN/../lib \
   1370 	$(PRIVATE_LDFLAGS) \
   1371 	$(PRIVATE_ALL_OBJECTS) \
   1372 	-Wl,--whole-archive \
   1373 	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
   1374 	-Wl,--no-whole-archive \
   1375 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
   1376 	$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
   1377 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
   1378 	$(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
   1379 	-o $@ \
   1380 	$(PRIVATE_LDLIBS)
   1381 endef
   1382 endif
   1383 
   1384 define transform-o-to-executable
   1385 @mkdir -p $(dir $@)
   1386 @echo "target Executable: $(PRIVATE_MODULE) ($@)"
   1387 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-executable-inner)
   1388 endef
   1389 
   1390 
   1391 ###########################################################
   1392 ## Commands for running gcc to link a statically linked
   1393 ## executable.  In practice, we only use this on arm, so
   1394 ## the other platforms don't have the
   1395 ## transform-o-to-static-executable defined
   1396 ###########################################################
   1397 
   1398 ifneq ($(TARGET_CUSTOM_LD_COMMAND),true)
   1399 define transform-o-to-static-executable-inner
   1400 endef
   1401 endif
   1402 
   1403 define transform-o-to-static-executable
   1404 @mkdir -p $(dir $@)
   1405 @echo "target StaticExecutable: $(PRIVATE_MODULE) ($@)"
   1406 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)transform-o-to-static-executable-inner)
   1407 endef
   1408 
   1409 
   1410 ###########################################################
   1411 ## Commands for running gcc to link a host executable
   1412 ###########################################################
   1413 ifdef BUILD_HOST_static
   1414 HOST_FPIE_FLAGS :=
   1415 else
   1416 HOST_FPIE_FLAGS := -pie
   1417 # Force the correct entry point to workaround a bug in binutils that manifests with -pie
   1418 ifeq ($(HOST_OS),windows)
   1419 HOST_FPIE_FLAGS += -Wl,-e_mainCRTStartup
   1420 endif
   1421 endif
   1422 
   1423 ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
   1424 define transform-host-o-to-executable-inner
   1425 $(hide) $(PRIVATE_CXX) \
   1426 	$(PRIVATE_ALL_OBJECTS) \
   1427 	-Wl,--whole-archive \
   1428 	$(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
   1429 	-Wl,--no-whole-archive \
   1430 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
   1431 	$(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
   1432 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
   1433 	$(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
   1434 	-Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES) \
   1435 	-Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)) \
   1436 	$($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \
   1437 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
   1438 		$(PRIVATE_HOST_GLOBAL_LDFLAGS) \
   1439 		$(HOST_FPIE_FLAGS) \
   1440 	) \
   1441 	$(PRIVATE_LDFLAGS) \
   1442 	-o $@ \
   1443 	$(PRIVATE_LDLIBS)
   1444 endef
   1445 endif
   1446 
   1447 define transform-host-o-to-executable
   1448 @mkdir -p $(dir $@)
   1449 @echo "host Executable: $(PRIVATE_MODULE) ($@)"
   1450 $(transform-host-o-to-executable-inner)
   1451 endef
   1452 
   1453 
   1454 ###########################################################
   1455 ## Commands for running javac to make .class files
   1456 ###########################################################
   1457 
   1458 #@echo "Source intermediates dir: $(PRIVATE_SOURCE_INTERMEDIATES_DIR)"
   1459 #@echo "Source intermediates: $$(find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java')"
   1460 
   1461 # TODO: Right now we generate the asset resources twice, first as part
   1462 # of generating the Java classes, then at the end when packaging the final
   1463 # assets.  This should be changed to do one of two things: (1) Don't generate
   1464 # any resource files the first time, only create classes during that stage;
   1465 # or (2) Don't use the -c flag with the second stage, instead taking the
   1466 # resource files from the first stage as additional input.  My original intent
   1467 # was to use approach (2), but this requires a little more work in the tool.
   1468 # Maybe we should just use approach (1).
   1469 
   1470 # This rule creates the R.java and Manifest.java files, both of which
   1471 # are PRODUCT-neutral.  Don't pass PRIVATE_PRODUCT_AAPT_CONFIG to this invocation.
   1472 define create-resource-java-files
   1473 @mkdir -p $(PRIVATE_SOURCE_INTERMEDIATES_DIR)
   1474 @mkdir -p $(dir $(PRIVATE_RESOURCE_PUBLICS_OUTPUT))
   1475 $(hide) $(AAPT) package $(PRIVATE_AAPT_FLAGS) -m \
   1476     $(eval # PRIVATE_PRODUCT_AAPT_CONFIG is intentionally missing-- see comment.) \
   1477     $(addprefix -J , $(PRIVATE_SOURCE_INTERMEDIATES_DIR)) \
   1478     $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
   1479     $(addprefix -P , $(PRIVATE_RESOURCE_PUBLICS_OUTPUT)) \
   1480     $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \
   1481     $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
   1482     $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
   1483     $(addprefix -G , $(PRIVATE_PROGUARD_OPTIONS_FILE)) \
   1484     $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
   1485     $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
   1486     $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-code , $(PLATFORM_SDK_VERSION))) \
   1487     $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-name , $(PLATFORM_VERSION)-$(BUILD_NUMBER))) \
   1488     $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
   1489     $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR))
   1490 endef
   1491 
   1492 ifeq ($(HOST_OS),windows)
   1493 xlint_unchecked :=
   1494 else
   1495 xlint_unchecked := -Xlint:unchecked
   1496 endif
   1497 
   1498 ifeq (true, $(ENABLE_INCREMENTALJAVAC))
   1499 incremental_dex := --incremental
   1500 else
   1501 incremental_dex :=
   1502 endif
   1503 
   1504 # emit-line, <word list>, <output file>
   1505 define emit-line
   1506    $(if $(1),echo -n '$(strip $(1)) ' >> $(2))
   1507 endef
   1508 
   1509 # dump-words-to-file, <word list>, <output file>
   1510 define dump-words-to-file
   1511         @rm -f $(2)
   1512         @$(call emit-line,$(wordlist 1,200,$(1)),$(2))
   1513         @$(call emit-line,$(wordlist 201,400,$(1)),$(2))
   1514         @$(call emit-line,$(wordlist 401,600,$(1)),$(2))
   1515         @$(call emit-line,$(wordlist 601,800,$(1)),$(2))
   1516         @$(call emit-line,$(wordlist 801,1000,$(1)),$(2))
   1517         @$(call emit-line,$(wordlist 1001,1200,$(1)),$(2))
   1518         @$(call emit-line,$(wordlist 1201,1400,$(1)),$(2))
   1519         @$(call emit-line,$(wordlist 1401,1600,$(1)),$(2))
   1520         @$(call emit-line,$(wordlist 1601,1800,$(1)),$(2))
   1521         @$(call emit-line,$(wordlist 1801,2000,$(1)),$(2))
   1522         @$(call emit-line,$(wordlist 2001,2200,$(1)),$(2))
   1523         @$(call emit-line,$(wordlist 2201,2400,$(1)),$(2))
   1524         @$(call emit-line,$(wordlist 2401,2600,$(1)),$(2))
   1525         @$(call emit-line,$(wordlist 2601,2800,$(1)),$(2))
   1526         @$(call emit-line,$(wordlist 2801,3000,$(1)),$(2))
   1527         @$(call emit-line,$(wordlist 3001,3200,$(1)),$(2))
   1528         @$(call emit-line,$(wordlist 3201,3400,$(1)),$(2))
   1529         @$(call emit-line,$(wordlist 3401,3600,$(1)),$(2))
   1530         @$(call emit-line,$(wordlist 3601,3800,$(1)),$(2))
   1531         @$(call emit-line,$(wordlist 3801,4000,$(1)),$(2))
   1532         @$(call emit-line,$(wordlist 4001,4200,$(1)),$(2))
   1533         @$(call emit-line,$(wordlist 4201,4400,$(1)),$(2))
   1534         @$(call emit-line,$(wordlist 4401,4600,$(1)),$(2))
   1535         @$(call emit-line,$(wordlist 4601,4800,$(1)),$(2))
   1536         @$(call emit-line,$(wordlist 4801,5000,$(1)),$(2))
   1537         @$(if $(wordlist 5001,5002,$(1)),$(error Too many words ($(words $(1)))))
   1538 endef
   1539 
   1540 # For a list of jar files, unzip them to a specified directory,
   1541 # but make sure that no META-INF files come along for the ride.
   1542 #
   1543 # $(1): files to unzip
   1544 # $(2): destination directory
   1545 define unzip-jar-files
   1546   $(hide) for f in $(1); \
   1547   do \
   1548     if [ ! -f $$f ]; then \
   1549       echo Missing file $$f; \
   1550       exit 1; \
   1551     fi; \
   1552     unzip -qo $$f -d $(2); \
   1553   done \
   1554   $(if $(PRIVATE_DONT_DELETE_JAR_META_INF),,;rm -rf $(2)/META-INF)
   1555 endef
   1556 
   1557 # Common definition to invoke javac on the host and target.
   1558 #
   1559 # Some historical notes:
   1560 # - below we write the list of java files to java-source-list to avoid argument
   1561 #   list length problems with Cygwin
   1562 # - we filter out duplicate java file names because eclipse's compiler
   1563 #   doesn't like them.
   1564 #
   1565 # $(1): javac
   1566 # $(2): bootclasspath
   1567 define compile-java
   1568 $(hide) rm -f $@
   1569 $(hide) rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR)
   1570 $(hide) mkdir -p $(dir $@)
   1571 $(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR)
   1572 $(call unzip-jar-files,$(PRIVATE_STATIC_JAVA_LIBRARIES),$(PRIVATE_CLASS_INTERMEDIATES_DIR))
   1573 $(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list)
   1574 $(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
   1575           find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list; \
   1576 fi
   1577 $(hide) tr ' ' '\n' < $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list \
   1578     | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
   1579 $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
   1580     $(1) -encoding UTF-8 \
   1581     $(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \
   1582     $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
   1583     $(2) \
   1584     $(addprefix -classpath ,$(strip \
   1585         $(call normalize-path-list,$(PRIVATE_ALL_JAVA_LIBRARIES)))) \
   1586     $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
   1587     -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
   1588     $(PRIVATE_JAVACFLAGS) \
   1589     \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \
   1590     || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \
   1591 fi
   1592 $(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/tools/java-layers.py \
   1593     $(PRIVATE_JAVA_LAYERS_FILE) \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq,)
   1594 $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list
   1595 $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
   1596 $(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
   1597     -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \
   1598     $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \
   1599     | xargs rm -rf)
   1600 $(if $(PRIVATE_JAR_PACKAGES), \
   1601     $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \
   1602         $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \
   1603             -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \
   1604         find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete)
   1605 $(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \
   1606     $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \
   1607         $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))))
   1608 $(if $(PRIVATE_RMTYPEDEFS), $(hide) $(RMTYPEDEFS) -v $(PRIVATE_CLASS_INTERMEDIATES_DIR))
   1609 $(if $(PRIVATE_JAR_MANIFEST), \
   1610     $(hide) sed -e 's/%BUILD_NUMBER%/$(BUILD_NUMBER)/' \
   1611             $(PRIVATE_JAR_MANIFEST) > $(dir $@)/manifest.mf && \
   1612         jar -cfm $@ $(dir $@)/manifest.mf \
   1613             -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ., \
   1614     $(hide) jar -cf $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) .)
   1615 endef
   1616 
   1617 define transform-java-to-classes.jar
   1618 @echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
   1619 $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH))
   1620 endef
   1621 
   1622 # Override the above definitions if we want to do incremetal javac
   1623 ifeq (true, $(ENABLE_INCREMENTALJAVAC))
   1624 define compile-java
   1625 $(hide) mkdir -p $(dir $@)
   1626 $(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR)
   1627 $(hide) touch $(PRIVATE_CLASS_INTERMEDIATES_DIR)/newstamp
   1628 $(call unzip-jar-files,$(PRIVATE_STATIC_JAVA_LIBRARIES),$(PRIVATE_CLASS_INTERMEDIATES_DIR))
   1629 $(hide) if [ -e $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp ] ; then \
   1630         newerFlag=$$(echo -n "-newer $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp") ; \
   1631     fi ; \
   1632     find $(PRIVATE_JAVA_SOURCES) $$newerFlag > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list ; \
   1633     if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
   1634         find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' $$newerFlag >> $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list; \
   1635     fi
   1636 $(hide) tr ' ' '\n' < $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list \
   1637     | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
   1638 @echo "(Incremental) build source files:"
   1639 @cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
   1640 $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
   1641     $(1) -encoding UTF-8 \
   1642     $(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \
   1643     $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
   1644     $(2) \
   1645     $(addprefix -classpath ,$(strip \
   1646         $(call normalize-path-list,$(PRIVATE_ALL_JAVA_LIBRARIES) $(PRIVATE_CLASS_INTERMEDIATES_DIR)))) \
   1647     $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
   1648     -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
   1649     $(PRIVATE_JAVACFLAGS) \
   1650     \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \
   1651     || ( exit 41 ) \
   1652 fi
   1653 $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list
   1654 $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
   1655 $(hide) rm -f $@
   1656 $(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
   1657     -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \
   1658     $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \
   1659     | xargs rm -rf)
   1660 $(if $(PRIVATE_JAR_PACKAGES), \
   1661     $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \
   1662         $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \
   1663             -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \
   1664         find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete)
   1665 $(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \
   1666     $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \
   1667         $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))))
   1668 $(if $(PRIVATE_RMTYPEDEFS), $(hide) $(RMTYPEDEFS) -v $(PRIVATE_CLASS_INTERMEDIATES_DIR))
   1669 $(if $(PRIVATE_JAR_MANIFEST), \
   1670     $(hide) sed -e 's/%BUILD_NUMBER%/$(BUILD_NUMBER)/' \
   1671             $(PRIVATE_JAR_MANIFEST) > $(dir $@)/manifest.mf && \
   1672         jar -cfm $@ $(dir $@)/manifest.mf \
   1673             -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ., \
   1674     $(hide) jar -cf $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) .)
   1675 $(hide) mv $(PRIVATE_CLASS_INTERMEDIATES_DIR)/newstamp $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp
   1676 endef
   1677 
   1678 define transform-java-to-classes.jar
   1679 @echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
   1680 $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH))
   1681 endef
   1682 endif # ENABLE_INCREMENTALJAVAC
   1683 
   1684 define transform-classes.jar-to-emma
   1685 $(hide) java -classpath $(EMMA_JAR) emma instr -outmode fullcopy -outfile \
   1686     $(PRIVATE_EMMA_COVERAGE_FILE) -ip $< -d $(PRIVATE_EMMA_INTERMEDIATES_DIR) \
   1687     $(addprefix -ix , $(PRIVATE_EMMA_COVERAGE_FILTER))
   1688 endef
   1689 
   1690 #TODO: use a smaller -Xmx value for most libraries;
   1691 #      only core.jar and framework.jar need a heap this big.
   1692 # Avoid the memory arguments on Windows, dx fails to load for some reason with them.
   1693 define transform-classes.jar-to-dex
   1694 @echo "target Dex: $(PRIVATE_MODULE)"
   1695 @mkdir -p $(dir $@)
   1696 $(hide) rm -f $(dir $@)classes*.dex
   1697 $(hide) $(DX) \
   1698     $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \
   1699     --dex --output=$(dir $@) \
   1700     $(incremental_dex) \
   1701     $(if $(NO_OPTIMIZE_DX), \
   1702         --no-optimize) \
   1703     $(if $(GENERATE_DEX_DEBUG), \
   1704 	    --debug --verbose \
   1705 	    --dump-to=$(@:.dex=.lst) \
   1706 	    --dump-width=1000) \
   1707     $(PRIVATE_DX_FLAGS) \
   1708     $<
   1709 endef
   1710 
   1711 # Create a mostly-empty .jar file that we'll add to later.
   1712 # The MacOS jar tool doesn't like creating empty jar files,
   1713 # so we need to give it something.
   1714 define create-empty-package
   1715 @mkdir -p $(dir $@)
   1716 $(hide) touch $(dir $@)dummy
   1717 $(hide) (cd $(dir $@) && jar cf $(notdir $@) dummy)
   1718 $(hide) zip -qd $@ dummy
   1719 $(hide) rm $(dir $@)dummy
   1720 endef
   1721 
   1722 #TODO: we kinda want to build different asset packages for
   1723 #      different configurations, then combine them later (or something).
   1724 #      Per-locale, etc.
   1725 #      A list of dynamic and static parameters;  build layers for
   1726 #      dynamic params that lay over the static ones.
   1727 #TODO: update the manifest to point to the package file
   1728 #Note that the version numbers are given to aapt as simple default
   1729 #values; applications can override these by explicitly stating
   1730 #them in their manifest.
   1731 define add-assets-to-package
   1732 $(hide) $(AAPT) package -u $(PRIVATE_AAPT_FLAGS) \
   1733     $(addprefix -c , $(PRIVATE_PRODUCT_AAPT_CONFIG)) \
   1734     $(addprefix --preferred-density , $(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \
   1735     $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
   1736     $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \
   1737     $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
   1738     $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
   1739     $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
   1740     $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
   1741     $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(TARGET_AAPT_CHARACTERISTICS))) \
   1742     $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-code , $(PLATFORM_SDK_VERSION))) \
   1743     $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-name , $(PLATFORM_VERSION)-$(BUILD_NUMBER))) \
   1744     $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
   1745     $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
   1746     -F $@
   1747 endef
   1748 
   1749 # We need the extra blank line, so that the command will be on a separate line.
   1750 # $(1): the ABI name
   1751 # $(2): the list of shared libraies
   1752 define _add-jni-shared-libs-to-package-per-abi
   1753 $(hide) cp $(2) $(dir $@)lib/$(1)
   1754 
   1755 endef
   1756 
   1757 define add-jni-shared-libs-to-package
   1758 $(hide) rm -rf $(dir $@)lib
   1759 $(hide) mkdir -p $(addprefix $(dir $@)lib/,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI))
   1760 $(foreach abi,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI),\
   1761   $(call _add-jni-shared-libs-to-package-per-abi,$(abi),\
   1762     $(patsubst $(abi):%,%,$(filter $(abi):%,$(PRIVATE_JNI_SHARED_LIBRARIES)))))
   1763 $(hide) (cd $(dir $@) && zip -r $(notdir $@) lib)
   1764 $(hide) rm -rf $(dir $@)lib
   1765 endef
   1766 
   1767 #TODO: update the manifest to point to the dex file
   1768 define add-dex-to-package
   1769 $(hide) zip -qj $@ $(dir $(PRIVATE_DEX_FILE))classes*.dex
   1770 endef
   1771 
   1772 # Add java resources added by the current module.
   1773 #
   1774 define add-java-resources-to-package
   1775 $(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(dir $@)jar-arg-list)
   1776 $(hide) jar uf $@ @$(dir $@)jar-arg-list
   1777 @rm -f $(dir $@)jar-arg-list
   1778 endef
   1779 
   1780 # Add java resources carried by static Java libraries.
   1781 #
   1782 define add-carried-java-resources
   1783 $(hide) if [ -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) ] ; then \
   1784     java_res_jar_flags=$$(find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -type f -a -not -name "*.class" \
   1785         | sed -e "s?^$(PRIVATE_CLASS_INTERMEDIATES_DIR)/? -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ?"); \
   1786     if [ -n "$$java_res_jar_flags" ] ; then \
   1787         echo $$java_res_jar_flags >$(dir $@)java_res_jar_flags; \
   1788         jar uf $@ $$java_res_jar_flags; \
   1789     fi; \
   1790 fi
   1791 endef
   1792 
   1793 # Sign a package using the specified key/cert.
   1794 #
   1795 define sign-package
   1796 $(hide) mv $@ $@.unsigned
   1797 $(hide) java -jar $(SIGNAPK_JAR) \
   1798     $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \
   1799     $(PRIVATE_ADDITIONAL_CERTIFICATES) $@.unsigned $@.signed
   1800 $(hide) mv $@.signed $@
   1801 endef
   1802 
   1803 # Align STORED entries of a package on 4-byte boundaries
   1804 # to make them easier to mmap.
   1805 #
   1806 define align-package
   1807 $(hide) mv $@ $@.unaligned
   1808 $(hide) $(ZIPALIGN) -f 4 $@.unaligned $@.aligned
   1809 $(hide) mv $@.aligned $@
   1810 endef
   1811 
   1812 define install-dex-debug
   1813 $(hide) if [ -f "$(PRIVATE_INTERMEDIATES_DIR)/classes.dex" ]; then \
   1814 	    mkdir -p $(TOP)/dalvik/DEBUG-FILES; \
   1815 	    $(ACP) $(PRIVATE_INTERMEDIATES_DIR)/classes.dex \
   1816 		$(TOP)/dalvik/DEBUG-FILES/$(PRIVATE_MODULE).dex; \
   1817 	fi
   1818 $(hide) if [ -f "$(PRIVATE_INTERMEDIATES_DIR)/classes.lst" ]; then \
   1819 	    mkdir -p $(TOP)/dalvik/DEBUG-FILES; \
   1820 	    $(ACP) $(PRIVATE_INTERMEDIATES_DIR)/classes.lst \
   1821 		$(TOP)/dalvik/DEBUG-FILES/$(PRIVATE_MODULE).lst; \
   1822 	fi
   1823 endef
   1824 
   1825 # TODO(joeo): If we can ever upgrade to post 3.81 make and get the
   1826 # new prebuilt rules to work, we should change this to copy the
   1827 # resources to the out directory and then copy the resources.
   1828 
   1829 # Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR
   1830 # in transform-java-to-classes for the sake of vm-tests.
   1831 define transform-host-java-to-package
   1832 @echo "host Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
   1833 $(call compile-java,$(HOST_JAVAC),$(PRIVATE_BOOTCLASSPATH))
   1834 $(if $(PRIVATE_EXTRA_JAR_ARGS), $(call add-java-resources-to-package))
   1835 endef
   1836 
   1837 ###########################################################
   1838 ## Commands for copying files
   1839 ###########################################################
   1840 
   1841 # Define a rule to copy a header.  Used via $(eval) by copy_headers.make.
   1842 # $(1): source header
   1843 # $(2): destination header
   1844 define copy-one-header
   1845 $(2): $(1)
   1846 	@echo "Header: $$@"
   1847 	$$(copy-file-to-new-target-with-cp)
   1848 endef
   1849 
   1850 # Define a rule to copy a file.  For use via $(eval).
   1851 # $(1): source file
   1852 # $(2): destination file
   1853 define copy-one-file
   1854 $(2): $(1) | $(ACP)
   1855 	@echo "Copy: $$@"
   1856 	$$(copy-file-to-target)
   1857 endef
   1858 
   1859 # Copies many files.
   1860 # $(1): The files to copy.  Each entry is a ':' separated src:dst pair
   1861 # Evaluates to the list of the dst files (ie suitable for a dependency list)
   1862 define copy-many-files
   1863 $(foreach f, $(1), $(strip \
   1864     $(eval _cmf_tuple := $(subst :, ,$(f))) \
   1865     $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \
   1866     $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \
   1867     $(eval $(call copy-one-file,$(_cmf_src),$(_cmf_dest))) \
   1868     $(_cmf_dest)))
   1869 endef
   1870 
   1871 # Copy the file only if it's a well-formed xml file. For use via $(eval).
   1872 # $(1): source file
   1873 # $(2): destination file, must end with .xml.
   1874 define copy-xml-file-checked
   1875 $(2): $(1) | $(ACP)
   1876 	@echo "Copy xml: $$@"
   1877 	$(hide) xmllint $$< >/dev/null  # Don't print the xml file to stdout.
   1878 	$$(copy-file-to-target)
   1879 endef
   1880 
   1881 # The -t option to acp and the -p option to cp is
   1882 # required for OSX.  OSX has a ridiculous restriction
   1883 # where it's an error for a .a file's modification time
   1884 # to disagree with an internal timestamp, and this
   1885 # macro is used to install .a files (among other things).
   1886 
   1887 # Copy a single file from one place to another,
   1888 # preserving permissions and overwriting any existing
   1889 # file.
   1890 # We disable the "-t" option for acp cannot handle
   1891 # high resolution timestamp correctly on file systems like ext4.
   1892 # Therefore copy-file-to-target is the same as copy-file-to-new-target.
   1893 define copy-file-to-target
   1894 @mkdir -p $(dir $@)
   1895 $(hide) $(ACP) -fp $< $@
   1896 endef
   1897 
   1898 # The same as copy-file-to-target, but use the local
   1899 # cp command instead of acp.
   1900 define copy-file-to-target-with-cp
   1901 @mkdir -p $(dir $@)
   1902 $(hide) cp -fp $< $@
   1903 endef
   1904 
   1905 # The same as copy-file-to-target, but use the zipalign tool to do so.
   1906 define copy-file-to-target-with-zipalign
   1907 @mkdir -p $(dir $@)
   1908 $(hide) $(ZIPALIGN) -f 4 $< $@
   1909 endef
   1910 
   1911 # The same as copy-file-to-target, but strip out "# comment"-style
   1912 # comments (for config files and such).
   1913 define copy-file-to-target-strip-comments
   1914 @mkdir -p $(dir $@)
   1915 $(hide) sed -e 's/#.*$$//' -e 's/[ \t]*$$//' -e '/^$$/d' < $< > $@
   1916 endef
   1917 
   1918 # The same as copy-file-to-target, but don't preserve
   1919 # the old modification time.
   1920 define copy-file-to-new-target
   1921 @mkdir -p $(dir $@)
   1922 $(hide) $(ACP) -fp $< $@
   1923 endef
   1924 
   1925 # The same as copy-file-to-new-target, but use the local
   1926 # cp command instead of acp.
   1927 define copy-file-to-new-target-with-cp
   1928 @mkdir -p $(dir $@)
   1929 $(hide) cp -f $< $@
   1930 endef
   1931 
   1932 # Copy a prebuilt file to a target location.
   1933 define transform-prebuilt-to-target
   1934 @echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)"
   1935 $(copy-file-to-target)
   1936 endef
   1937 
   1938 # Copy a prebuilt file to a target location, using zipalign on it.
   1939 define transform-prebuilt-to-target-with-zipalign
   1940 @echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK: $(PRIVATE_MODULE) ($@)"
   1941 $(copy-file-to-target-with-zipalign)
   1942 endef
   1943 
   1944 # Copy a prebuilt file to a target location, stripping "# comment" comments.
   1945 define transform-prebuilt-to-target-strip-comments
   1946 @echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)"
   1947 $(copy-file-to-target-strip-comments)
   1948 endef
   1949 
   1950 ###########################################################
   1951 ## On some platforms (MacOS), after copying a static
   1952 ## library, ranlib must be run to update an internal
   1953 ## timestamp!?!?!
   1954 ###########################################################
   1955 
   1956 ifeq ($(HOST_RUN_RANLIB_AFTER_COPYING),true)
   1957 define transform-host-ranlib-copy-hack
   1958     $(hide) ranlib $@ || true
   1959 endef
   1960 else
   1961 define transform-host-ranlib-copy-hack
   1962 @true
   1963 endef
   1964 endif
   1965 
   1966 ifeq ($(TARGET_RUN_RANLIB_AFTER_COPYING),true)
   1967 define transform-ranlib-copy-hack
   1968     $(hide) ranlib $@
   1969 endef
   1970 else
   1971 define transform-ranlib-copy-hack
   1972 @true
   1973 endef
   1974 endif
   1975 
   1976 
   1977 ###########################################################
   1978 ## Commands to call Proguard
   1979 ###########################################################
   1980 define transform-jar-to-proguard
   1981 @echo Proguard: $@
   1982 $(hide) $(PROGUARD) -injars $< -outjars $@ $(PRIVATE_PROGUARD_FLAGS) \
   1983     $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR))
   1984 endef
   1985 
   1986 ###########################################################
   1987 ## Stuff source generated from one-off tools
   1988 ###########################################################
   1989 
   1990 define transform-generated-source
   1991 @echo "target Generated: $(PRIVATE_MODULE) <= $<"
   1992 @mkdir -p $(dir $@)
   1993 $(hide) $(PRIVATE_CUSTOM_TOOL)
   1994 endef
   1995 
   1996 
   1997 ###########################################################
   1998 ## Assertions about attributes of the target
   1999 ###########################################################
   2000 
   2001 # $(1): The file to check
   2002 ifndef get-file-size
   2003 $(error HOST_OS must define get-file-size)
   2004 endif
   2005 
   2006 # Convert a partition data size (eg, as reported in /proc/mtd) to the
   2007 # size of the image used to flash that partition (which includes a
   2008 # spare area for each page).
   2009 # $(1): the partition data size
   2010 define image-size-from-data-size
   2011 $(strip $(eval _isfds_value := $$(shell echo $$$$(($(1) / $(BOARD_NAND_PAGE_SIZE) * \
   2012   ($(BOARD_NAND_PAGE_SIZE)+$(BOARD_NAND_SPARE_SIZE))))))\
   2013 $(if $(filter 0, $(_isfds_value)),$(shell echo $$(($(BOARD_NAND_PAGE_SIZE)+$(BOARD_NAND_SPARE_SIZE)))),$(_isfds_value))\
   2014 $(eval _isfds_value :=))
   2015 endef
   2016 
   2017 # $(1): The file(s) to check (often $@)
   2018 # $(2): The maximum total image size, in decimal bytes.
   2019 #    Make sure to take into account any reserved space needed for the FS.
   2020 #
   2021 # If $(2) is empty, evaluates to "true"
   2022 #
   2023 # Reserve bad blocks.  Make sure that MAX(1% of partition size, 2 blocks)
   2024 # is left over after the image has been flashed.  Round the 1% up to the
   2025 # next whole flash block size.
   2026 define assert-max-file-size
   2027 $(if $(2), \
   2028   size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); \
   2029   total=$$(( $$( echo "$$size" ) )); \
   2030   printname=$$(echo -n "$(1)" | tr " " +); \
   2031   img_blocksize=$(call image-size-from-data-size,$(BOARD_FLASH_BLOCK_SIZE)); \
   2032   twoblocks=$$((img_blocksize * 2)); \
   2033   onepct=$$((((($(2) / 100) - 1) / img_blocksize + 1) * img_blocksize)); \
   2034   reserve=$$((twoblocks > onepct ? twoblocks : onepct)); \
   2035   maxsize=$$(($(2) - reserve)); \
   2036   echo "$$printname maxsize=$$maxsize blocksize=$$img_blocksize total=$$total reserve=$$reserve"; \
   2037   if [ "$$total" -gt "$$maxsize" ]; then \
   2038     echo "error: $$printname too large ($$total > [$(2) - $$reserve])"; \
   2039     false; \
   2040   elif [ "$$total" -gt $$((maxsize - 32768)) ]; then \
   2041     echo "WARNING: $$printname approaching size limit ($$total now; limit $$maxsize)"; \
   2042   fi \
   2043  , \
   2044   true \
   2045  )
   2046 endef
   2047 
   2048 # Like assert-max-file-size, but the second argument is a partition
   2049 # size, which we'll convert to a max image size before checking it
   2050 # against the files.
   2051 #
   2052 # $(1): The file(s) to check (often $@)
   2053 # $(2): The partition size.
   2054 define assert-max-image-size
   2055 $(if $(2), \
   2056   $(call assert-max-file-size,$(1),$(call image-size-from-data-size,$(2))))
   2057 endef
   2058 
   2059 
   2060 ###########################################################
   2061 ## Define device-specific radio files
   2062 ###########################################################
   2063 INSTALLED_RADIOIMAGE_TARGET :=
   2064 
   2065 # Copy a radio image file to the output location, and add it to
   2066 # INSTALLED_RADIOIMAGE_TARGET.
   2067 # $(1): filename
   2068 define add-radio-file
   2069   $(eval $(call add-radio-file-internal,$(1),$(notdir $(1))))
   2070 endef
   2071 define add-radio-file-internal
   2072 INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2)
   2073 $$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) | $$(ACP)
   2074 	$$(transform-prebuilt-to-target)
   2075 endef
   2076 
   2077 # Version of add-radio-file that also arranges for the version of the
   2078 # file to be checked against the contents of
   2079 # $(TARGET_BOARD_INFO_FILE).
   2080 # $(1): filename
   2081 # $(2): name of version variable in board-info (eg, "version-baseband")
   2082 define add-radio-file-checked
   2083   $(eval $(call add-radio-file-checked-internal,$(1),$(notdir $(1)),$(2)))
   2084 endef
   2085 define add-radio-file-checked-internal
   2086 INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2)
   2087 BOARD_INFO_CHECK += $(3):$(LOCAL_PATH)/$(1)
   2088 $$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) | $$(ACP)
   2089 	$$(transform-prebuilt-to-target)
   2090 endef
   2091 
   2092 
   2093 ###########################################################
   2094 # Override the package defined in $(1), setting the
   2095 # variables listed below differently.
   2096 #
   2097 #  $(1): The makefile to override (relative to the source
   2098 #        tree root)
   2099 #  $(2): Old LOCAL_PACKAGE_NAME value.
   2100 #  $(3): New LOCAL_PACKAGE_NAME value.
   2101 #  $(4): New LOCAL_MANIFEST_PACKAGE_NAME value.
   2102 #  $(5): New LOCAL_CERTIFICATE value.
   2103 #  $(6): New LOCAL_INSTRUMENTATION_FOR value.
   2104 #  $(7): New LOCAL_MANIFEST_INSTRUMENTATION_FOR value.
   2105 #
   2106 # Note that LOCAL_PACKAGE_OVERRIDES is NOT cleared in
   2107 # clear_vars.mk.
   2108 ###########################################################
   2109 define inherit-package
   2110   $(eval $(call inherit-package-internal,$(1),$(2),$(3),$(4),$(5),$(6),$(7)))
   2111 endef
   2112 
   2113 define inherit-package-internal
   2114   LOCAL_PACKAGE_OVERRIDES \
   2115       := $(strip $(1))||$(strip $(2))||$(strip $(3))||$(strip $(4))||&&$(strip $(5))||&&$(strip $(6))||&&$(strip $(7)) $(LOCAL_PACKAGE_OVERRIDES)
   2116   include $(1)
   2117   LOCAL_PACKAGE_OVERRIDES \
   2118       := $(wordlist 1,$(words $(LOCAL_PACKAGE_OVERRIDES)), $(LOCAL_PACKAGE_OVERRIDES))
   2119 endef
   2120 
   2121 # To be used with inherit-package above
   2122 # Evalutes to true if the package was overridden
   2123 define set-inherited-package-variables
   2124 $(strip $(call set-inherited-package-variables-internal))
   2125 endef
   2126 
   2127 define keep-or-override
   2128 $(eval $(1) := $(if $(2),$(2),$($(1))))
   2129 endef
   2130 
   2131 define set-inherited-package-variables-internal
   2132   $(eval _o := $(subst ||, ,$(lastword $(LOCAL_PACKAGE_OVERRIDES))))
   2133   $(eval _n := $(subst ||, ,$(firstword $(LOCAL_PACKAGE_OVERRIDES))))
   2134   $(if $(filter $(word 2,$(_n)),$(LOCAL_PACKAGE_NAME)), \
   2135     $(eval LOCAL_PACKAGE_NAME := $(word 3,$(_o))) \
   2136     $(eval LOCAL_MANIFEST_PACKAGE_NAME := $(word 4,$(_o))) \
   2137     $(call keep-or-override,LOCAL_CERTIFICATE,$(patsubst &&%,%,$(word 5,$(_o)))) \
   2138     $(call keep-or-override,LOCAL_INSTRUMENTATION_FOR,$(patsubst &&%,%,$(word 6,$(_o)))) \
   2139     $(call keep-or-override,LOCAL_MANIFEST_INSTRUMENTATION_FOR,$(patsubst &&%,%,$(word 7,$(_o)))) \
   2140     $(eval LOCAL_OVERRIDES_PACKAGES := $(sort $(LOCAL_OVERRIDES_PACKAGES) $(word 2,$(_o)))) \
   2141     true \
   2142   ,)
   2143 endef
   2144 
   2145 ###########################################################
   2146 ## API Check
   2147 ###########################################################
   2148 
   2149 # eval this to define a rule that runs apicheck.
   2150 #
   2151 # Args:
   2152 #    $(1)  target
   2153 #    $(2)  stable api file
   2154 #    $(3)  api file to be tested
   2155 #    $(4)  stable removed api file
   2156 #    $(5)  removed api file to be tested
   2157 #    $(6)  arguments for apicheck
   2158 #    $(7)  command to run if apicheck failed
   2159 #    $(8)  target dependent on this api check
   2160 #    $(9)  additional dependencies
   2161 define check-api
   2162 $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp: $(2) $(3) $(4) $(APICHECK) $(9)
   2163 	@echo "Checking API:" $(1)
   2164 	$(hide) ( $(APICHECK_COMMAND) $(6) $(2) $(3) $(4) $(5) || ( $(7) ; exit 38 ) )
   2165 	$(hide) mkdir -p $$(dir $$@)
   2166 	$(hide) touch $$@
   2167 $(8): $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp
   2168 endef
   2169 
   2170 ## Whether to build from source if prebuilt alternative exists
   2171 ###########################################################
   2172 # $(1): module name
   2173 # $(2): LOCAL_PATH
   2174 # Expands to empty string if not from source.
   2175 ifeq (true,$(ANDROID_BUILD_FROM_SOURCE))
   2176 define if-build-from-source
   2177 true
   2178 endef
   2179 else
   2180 define if-build-from-source
   2181 $(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \
   2182     $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true)
   2183 endef
   2184 endif
   2185 
   2186 # Include makefile $(1) if build from source for module $(2)
   2187 # $(1): the makefile to include
   2188 # $(2): module name
   2189 # $(3): LOCAL_PATH
   2190 define include-if-build-from-source
   2191 $(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1)))
   2192 endef
   2193 
   2194 # Return the arch for the source file of a prebuilt
   2195 # Return "none" if no matching arch found, so the result can be passed to
   2196 # LOCAL_MODULE_TARGET_ARCH.
   2197 # $(1) the list of archs supported by the prebuilt
   2198 define get-prebuilt-src-arch
   2199 $(strip $(if $(filter $(TARGET_ARCH),$(1)),$(TARGET_ARCH),\
   2200   $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),none)))
   2201 endef
   2202 
   2203 ###########################################################
   2204 ## Other includes
   2205 ###########################################################
   2206 
   2207 # -----------------------------------------------------------------
   2208 # Rules and functions to help copy important files to DIST_DIR
   2209 # when requested.
   2210 include $(BUILD_SYSTEM)/distdir.mk
   2211 
   2212 # Include any vendor specific definitions.mk file
   2213 -include $(TOPDIR)vendor/*/build/core/definitions.mk
   2214 
   2215 # broken:
   2216 #	$(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file)))
   2217 
   2218 ###########################################################
   2219 ## Misc notes
   2220 ###########################################################
   2221 
   2222 #DEPDIR = .deps
   2223 #df = $(DEPDIR)/$(*F)
   2224 
   2225 #SRCS = foo.c bar.c ...
   2226 
   2227 #%.o : %.c
   2228 #	@$(MAKEDEPEND); \
   2229 #	  cp $(df).d $(df).P; \
   2230 #	  sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
   2231 #	      -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \
   2232 #	  rm -f $(df).d
   2233 #	$(COMPILE.c) -o $@ $<
   2234 
   2235 #-include $(SRCS:%.c=$(DEPDIR)/%.P)
   2236 
   2237 
   2238 #%.o : %.c
   2239 #	$(COMPILE.c) -MD -o $@ $<
   2240 #	@cp $*.d $*.P; \
   2241 #	  sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
   2242 #	      -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
   2243 #	  rm -f $*.d
   2244