github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/core/definitions.mk (about)

     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 path to all files that are made by some tool
    59  ALL_GENERATED_SOURCES:=
    60  
    61  # Full path to all asm, C, C++, lex and yacc generated C files.
    62  # These all have an order-only dependency on the copied headers
    63  ALL_C_CPP_ETC_OBJECTS:=
    64  
    65  # The list of dynamic binaries that haven't been stripped/compressed/etc.
    66  ALL_ORIGINAL_DYNAMIC_BINARIES:=
    67  
    68  # These files go into the SDK
    69  ALL_SDK_FILES:=
    70  
    71  # Files for dalvik.  This is often build without building the rest of the OS.
    72  INTERNAL_DALVIK_MODULES:=
    73  
    74  # All findbugs xml files
    75  ALL_FINDBUGS_FILES:=
    76  
    77  # GPL module license files
    78  ALL_GPL_MODULE_LICENSE_FILES:=
    79  
    80  # Target and host installed module's dependencies on shared libraries.
    81  # They are list of "<module_name>:<installed_file>:lib1,lib2...".
    82  TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES :=
    83  $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES :=
    84  HOST_DEPENDENCIES_ON_SHARED_LIBRARIES :=
    85  $(HOST_2ND_ARCH_VAR_PREFIX)HOST_DEPENDENCIES_ON_SHARED_LIBRARIES :=
    86  HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES :=
    87  $(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES :=
    88  
    89  # Generated class file names for Android resource.
    90  # They are escaped and quoted so can be passed safely to a bash command.
    91  ANDROID_RESOURCE_GENERATED_CLASSES := 'R.class' 'R$$*.class' 'Manifest.class' 'Manifest$$*.class'
    92  
    93  # Display names for various build targets
    94  TARGET_DISPLAY := target
    95  AUX_DISPLAY := aux
    96  HOST_DISPLAY := host
    97  HOST_CROSS_DISPLAY := host cross
    98  
    99  # All installed initrc files
   100  ALL_INIT_RC_INSTALLED_PAIRS :=
   101  
   102  ###########################################################
   103  ## Debugging; prints a variable list to stdout
   104  ###########################################################
   105  
   106  # $(1): variable name list, not variable values
   107  define print-vars
   108  $(foreach var,$(1), \
   109    $(info $(var):) \
   110    $(foreach word,$($(var)), \
   111      $(info $(space)$(space)$(word)) \
   112     ) \
   113   )
   114  endef
   115  
   116  ###########################################################
   117  ## Evaluates to true if the string contains the word true,
   118  ## and empty otherwise
   119  ## $(1): a var to test
   120  ###########################################################
   121  
   122  define true-or-empty
   123  $(filter true, $(1))
   124  endef
   125  
   126  ###########################################################
   127  ## Rule for touching GCNO files.
   128  ###########################################################
   129  define gcno-touch-rule
   130  $(2): $(1)
   131  	touch -c $$@
   132  endef
   133  
   134  ###########################################################
   135  
   136  ###########################################################
   137  ## Retrieve the directory of the current makefile
   138  ## Must be called before including any other makefile!!
   139  ###########################################################
   140  
   141  # Figure out where we are.
   142  define my-dir
   143  $(strip \
   144    $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
   145    $(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
   146      $(error my-dir must be called before including any other makefile.) \
   147     , \
   148      $(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
   149     ) \
   150   )
   151  endef
   152  
   153  
   154  ###########################################################
   155  ## Retrieve a list of all makefiles immediately below some directory
   156  ###########################################################
   157  
   158  define all-makefiles-under
   159  $(wildcard $(1)/*/Android.mk)
   160  endef
   161  
   162  ###########################################################
   163  ## Look under a directory for makefiles that don't have parent
   164  ## makefiles.
   165  ###########################################################
   166  
   167  # $(1): directory to search under
   168  # Ignores $(1)/Android.mk
   169  define first-makefiles-under
   170  $(shell build/make/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) \
   171          --mindepth=2 $(addprefix --dir=,$(1)) Android.mk)
   172  endef
   173  
   174  ###########################################################
   175  ## Retrieve a list of all makefiles immediately below your directory
   176  ## Must be called before including any other makefile!!
   177  ###########################################################
   178  
   179  define all-subdir-makefiles
   180  $(call all-makefiles-under,$(call my-dir))
   181  endef
   182  
   183  ###########################################################
   184  ## Look in the named list of directories for makefiles,
   185  ## relative to the current directory.
   186  ## Must be called before including any other makefile!!
   187  ###########################################################
   188  
   189  # $(1): List of directories to look for under this directory
   190  define all-named-subdir-makefiles
   191  $(wildcard $(addsuffix /Android.mk, $(addprefix $(call my-dir)/,$(1))))
   192  endef
   193  
   194  ###########################################################
   195  ## Find all of the directories under the named directories with
   196  ## the specified name.
   197  ## Meant to be used like:
   198  ##    INC_DIRS := $(call all-named-dirs-under,inc,.)
   199  ###########################################################
   200  
   201  define all-named-dirs-under
   202  $(call find-subdir-files,$(2) -type d -name "$(1)")
   203  endef
   204  
   205  ###########################################################
   206  ## Find all the directories under the current directory that
   207  ## haves name that match $(1)
   208  ###########################################################
   209  
   210  define all-subdir-named-dirs
   211  $(call all-named-dirs-under,$(1),.)
   212  endef
   213  
   214  ###########################################################
   215  ## Find all of the files under the named directories with
   216  ## the specified name.
   217  ## Meant to be used like:
   218  ##    SRC_FILES := $(call all-named-files-under,*.h,src tests)
   219  ###########################################################
   220  
   221  define all-named-files-under
   222  $(call find-files-in-subdirs,$(LOCAL_PATH),"$(1)",$(2))
   223  endef
   224  
   225  ###########################################################
   226  ## Find all of the files under the current directory with
   227  ## the specified name.
   228  ###########################################################
   229  
   230  define all-subdir-named-files
   231  $(call all-named-files-under,$(1),.)
   232  endef
   233  
   234  ###########################################################
   235  ## Find all of the java files under the named directories.
   236  ## Meant to be used like:
   237  ##    SRC_FILES := $(call all-java-files-under,src tests)
   238  ###########################################################
   239  
   240  define all-java-files-under
   241  $(call all-named-files-under,*.java,$(1))
   242  endef
   243  
   244  ###########################################################
   245  ## Find all of the java files from here.  Meant to be used like:
   246  ##    SRC_FILES := $(call all-subdir-java-files)
   247  ###########################################################
   248  
   249  define all-subdir-java-files
   250  $(call all-java-files-under,.)
   251  endef
   252  
   253  ###########################################################
   254  ## Find all of the c files under the named directories.
   255  ## Meant to be used like:
   256  ##    SRC_FILES := $(call all-c-files-under,src tests)
   257  ###########################################################
   258  
   259  define all-c-files-under
   260  $(call all-named-files-under,*.c,$(1))
   261  endef
   262  
   263  ###########################################################
   264  ## Find all of the c files from here.  Meant to be used like:
   265  ##    SRC_FILES := $(call all-subdir-c-files)
   266  ###########################################################
   267  
   268  define all-subdir-c-files
   269  $(call all-c-files-under,.)
   270  endef
   271  
   272  ###########################################################
   273  ## Find all of the cpp files under the named directories.
   274  ## LOCAL_CPP_EXTENSION is respected if set.
   275  ## Meant to be used like:
   276  ##    SRC_FILES := $(call all-cpp-files-under,src tests)
   277  ###########################################################
   278  
   279  define all-cpp-files-under
   280  $(sort $(patsubst ./%,%, \
   281    $(shell cd $(LOCAL_PATH) ; \
   282            find -L $(1) -name "*$(or $(LOCAL_CPP_EXTENSION),.cpp)" -and -not -name ".*") \
   283   ))
   284  endef
   285  
   286  ###########################################################
   287  ## Find all of the cpp files from here.  Meant to be used like:
   288  ##    SRC_FILES := $(call all-subdir-cpp-files)
   289  ###########################################################
   290  
   291  define all-subdir-cpp-files
   292  $(call all-cpp-files-under,.)
   293  endef
   294  
   295  ###########################################################
   296  ## Find all files named "I*.aidl" under the named directories,
   297  ## which must be relative to $(LOCAL_PATH).  The returned list
   298  ## is relative to $(LOCAL_PATH).
   299  ###########################################################
   300  
   301  define all-Iaidl-files-under
   302  $(call all-named-files-under,I*.aidl,$(1))
   303  endef
   304  
   305  ###########################################################
   306  ## Find all of the "I*.aidl" files under $(LOCAL_PATH).
   307  ###########################################################
   308  
   309  define all-subdir-Iaidl-files
   310  $(call all-Iaidl-files-under,.)
   311  endef
   312  
   313  ###########################################################
   314  ## Find all files named "*.vts" under the named directories,
   315  ## which must be relative to $(LOCAL_PATH).  The returned list
   316  ## is relative to $(LOCAL_PATH).
   317  ###########################################################
   318  
   319  define all-vts-files-under
   320  $(call all-named-files-under,*.vts,$(1))
   321  endef
   322  
   323  ###########################################################
   324  ## Find all of the "*.vts" files under $(LOCAL_PATH).
   325  ###########################################################
   326  
   327  define all-subdir-vts-files
   328  $(call all-vts-files-under,.)
   329  endef
   330  
   331  ###########################################################
   332  ## Find all of the logtags files under the named directories.
   333  ## Meant to be used like:
   334  ##    SRC_FILES := $(call all-logtags-files-under,src)
   335  ###########################################################
   336  
   337  define all-logtags-files-under
   338  $(call all-named-files-under,*.logtags,$(1))
   339  endef
   340  
   341  ###########################################################
   342  ## Find all of the .proto files under the named directories.
   343  ## Meant to be used like:
   344  ##    SRC_FILES := $(call all-proto-files-under,src)
   345  ###########################################################
   346  
   347  define all-proto-files-under
   348  $(call all-named-files-under,*.proto,$(1))
   349  endef
   350  
   351  ###########################################################
   352  ## Find all of the RenderScript files under the named directories.
   353  ##  Meant to be used like:
   354  ##    SRC_FILES := $(call all-renderscript-files-under,src)
   355  ###########################################################
   356  
   357  define all-renderscript-files-under
   358  $(call find-subdir-files,$(1) \( -name "*.rs" -or -name "*.fs" \) -and -not -name ".*")
   359  endef
   360  
   361  ###########################################################
   362  ## Find all of the S files under the named directories.
   363  ## Meant to be used like:
   364  ##    SRC_FILES := $(call all-c-files-under,src tests)
   365  ###########################################################
   366  
   367  define all-S-files-under
   368  $(call all-named-files-under,*.S,$(1))
   369  endef
   370  
   371  ###########################################################
   372  ## Find all of the html files under the named directories.
   373  ## Meant to be used like:
   374  ##    SRC_FILES := $(call all-html-files-under,src tests)
   375  ###########################################################
   376  
   377  define all-html-files-under
   378  $(call all-named-files-under,*.html,$(1))
   379  endef
   380  
   381  ###########################################################
   382  ## Find all of the html files from here.  Meant to be used like:
   383  ##    SRC_FILES := $(call all-subdir-html-files)
   384  ###########################################################
   385  
   386  define all-subdir-html-files
   387  $(call all-html-files-under,.)
   388  endef
   389  
   390  ###########################################################
   391  ## Find all of the files matching pattern
   392  ##    SRC_FILES := $(call find-subdir-files, <pattern>)
   393  ###########################################################
   394  
   395  define find-subdir-files
   396  $(sort $(patsubst ./%,%,$(shell cd $(LOCAL_PATH) ; find -L $(1))))
   397  endef
   398  
   399  ###########################################################
   400  # find the files in the subdirectory $1 of LOCAL_DIR
   401  # matching pattern $2, filtering out files $3
   402  # e.g.
   403  #     SRC_FILES += $(call find-subdir-subdir-files, \
   404  #                         css, *.cpp, DontWantThis.cpp)
   405  ###########################################################
   406  
   407  define find-subdir-subdir-files
   408  $(sort $(filter-out $(patsubst %,$(1)/%,$(3)),$(patsubst ./%,%,$(shell cd \
   409              $(LOCAL_PATH) ; find -L $(1) -maxdepth 1 -name $(2)))))
   410  endef
   411  
   412  ###########################################################
   413  ## Find all of the files matching pattern
   414  ##    SRC_FILES := $(call all-subdir-java-files)
   415  ###########################################################
   416  
   417  define find-subdir-assets
   418  $(sort $(if $(1),$(patsubst ./%,%, \
   419  	$(shell if [ -d $(1) ] ; then cd $(1) ; find -L ./ -not -name '.*' -and -type f ; fi)), \
   420  	$(warning Empty argument supplied to find-subdir-assets in $(LOCAL_PATH)) \
   421  ))
   422  endef
   423  
   424  ###########################################################
   425  ## Find various file types in a list of directories relative to $(LOCAL_PATH)
   426  ###########################################################
   427  
   428  define find-other-java-files
   429  $(call all-java-files-under,$(1))
   430  endef
   431  
   432  define find-other-html-files
   433  $(call all-html-files-under,$(1))
   434  endef
   435  
   436  ###########################################################
   437  # Use utility find to find given files in the given subdirs.
   438  # This function uses $(1), instead of LOCAL_PATH as the base.
   439  # $(1): the base dir, relative to the root of the source tree.
   440  # $(2): the file name pattern to be passed to find as "-name".
   441  # $(3): a list of subdirs of the base dir.
   442  # Returns: a list of paths relative to the base dir.
   443  ###########################################################
   444  
   445  define find-files-in-subdirs
   446  $(sort $(patsubst ./%,%, \
   447    $(shell cd $(1) ; \
   448            find -L $(3) -name $(2) -and -not -name ".*") \
   449   ))
   450  endef
   451  
   452  ###########################################################
   453  ## Scan through each directory of $(1) looking for files
   454  ## that match $(2) using $(wildcard).  Useful for seeing if
   455  ## a given directory or one of its parents contains
   456  ## a particular file.  Returns the first match found,
   457  ## starting furthest from the root.
   458  ###########################################################
   459  
   460  define find-parent-file
   461  $(strip \
   462    $(eval _fpf := $(sort $(wildcard $(foreach f, $(2), $(strip $(1))/$(f))))) \
   463    $(if $(_fpf),$(_fpf), \
   464         $(if $(filter-out ./ .,$(1)), \
   465               $(call find-parent-file,$(patsubst %/,%,$(dir $(1))),$(2)) \
   466          ) \
   467     ) \
   468  )
   469  endef
   470  
   471  ###########################################################
   472  ## Find test data in a form required by LOCAL_TEST_DATA
   473  ## $(1): the base dir, relative to the root of the source tree.
   474  ## $(3): the file name pattern to be passed to find as "-name"
   475  ## $(2): a list of subdirs of the base dir
   476  ###########################################################
   477  
   478  define find-test-data-in-subdirs
   479  $(foreach f,$(sort $(patsubst ./%,%, \
   480    $(shell cd $(1) ; \
   481            find -L $(3) -type f -and -name $(2) -and -not -name ".*") \
   482  )),$(1):$(f))
   483  endef
   484  
   485  ###########################################################
   486  ## Function we can evaluate to introduce a dynamic dependency
   487  ###########################################################
   488  
   489  define add-dependency
   490  $(1): $(2)
   491  endef
   492  
   493  ###########################################################
   494  ## Reverse order of a list
   495  ###########################################################
   496  
   497  define reverse-list
   498  $(if $(1),$(call reverse-list,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1))
   499  endef
   500  
   501  define def-host-aux-target
   502  $(eval _idf_val_:=$(if $(strip $(LOCAL_IS_HOST_MODULE)),HOST,$(if $(strip $(LOCAL_IS_AUX_MODULE)),AUX,))) \
   503  $(_idf_val_)
   504  endef
   505  
   506  ###########################################################
   507  ## Returns correct _idfPrefix from the list:
   508  ##   { HOST, HOST_CROSS, AUX, TARGET }
   509  ###########################################################
   510  # the following rules checked in order:
   511  # ($1 is in {AUX, HOST_CROSS} => $1;
   512  # ($1 is empty) => TARGET;
   513  # ($2 is not empty) => HOST_CROSS;
   514  # => HOST;
   515  define find-idf-prefix
   516  $(strip \
   517      $(eval _idf_pfx_:=$(strip $(filter AUX HOST_CROSS,$(1)))) \
   518      $(eval _idf_pfx_:=$(if $(strip $(1)),$(if $(_idf_pfx_),$(_idf_pfx_),$(if $(strip $(2)),HOST_CROSS,HOST)),TARGET)) \
   519      $(_idf_pfx_)
   520  )
   521  endef
   522  
   523  ###########################################################
   524  ## The intermediates directory.  Where object files go for
   525  ## a given target.  We could technically get away without
   526  ## the "_intermediates" suffix on the directory, but it's
   527  ## nice to be able to grep for that string to find out if
   528  ## anyone's abusing the system.
   529  ###########################################################
   530  
   531  # $(1): target class, like "APPS"
   532  # $(2): target name, like "NotePad"
   533  # $(3): { HOST, HOST_CROSS, AUX, <empty (TARGET)>, <other non-empty (HOST)> }
   534  # $(4): if non-empty, force the intermediates to be COMMON
   535  # $(5): if non-empty, force the intermediates to be for the 2nd arch
   536  # $(6): if non-empty, force the intermediates to be for the host cross os
   537  define intermediates-dir-for
   538  $(strip \
   539      $(eval _idfClass := $(strip $(1))) \
   540      $(if $(_idfClass),, \
   541          $(error $(LOCAL_PATH): Class not defined in call to intermediates-dir-for)) \
   542      $(eval _idfName := $(strip $(2))) \
   543      $(if $(_idfName),, \
   544          $(error $(LOCAL_PATH): Name not defined in call to intermediates-dir-for)) \
   545      $(eval _idfPrefix := $(call find-idf-prefix,$(3),$(6))) \
   546      $(eval _idf2ndArchPrefix := $(if $(strip $(5)),$(TARGET_2ND_ARCH_VAR_PREFIX))) \
   547      $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \
   548          $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_INTERMEDIATES)) \
   549        ,$(if $(filter $(_idfClass),$(PER_ARCH_MODULE_CLASSES)),\
   550            $(eval _idfIntBase := $($(_idf2ndArchPrefix)$(_idfPrefix)_OUT_INTERMEDIATES)) \
   551         ,$(eval _idfIntBase := $($(_idfPrefix)_OUT_INTERMEDIATES)) \
   552         ) \
   553       ) \
   554      $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \
   555  )
   556  endef
   557  
   558  # Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE
   559  # to determine the intermediates directory.
   560  #
   561  # $(1): if non-empty, force the intermediates to be COMMON
   562  # $(2): if non-empty, force the intermediates to be for the 2nd arch
   563  # $(3): if non-empty, force the intermediates to be for the host cross os
   564  define local-intermediates-dir
   565  $(strip \
   566      $(if $(strip $(LOCAL_MODULE_CLASS)),, \
   567          $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-intermediates-dir)) \
   568      $(if $(strip $(LOCAL_MODULE)),, \
   569          $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-intermediates-dir)) \
   570      $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(call def-host-aux-target),$(1),$(2),$(3)) \
   571  )
   572  endef
   573  
   574  ###########################################################
   575  ## The generated sources directory.  Placing generated
   576  ## source files directly in the intermediates directory
   577  ## causes problems for multiarch builds, where there are
   578  ## two intermediates directories for a single target. Put
   579  ## them in a separate directory, and they will be copied to
   580  ## each intermediates directory automatically.
   581  ###########################################################
   582  
   583  # $(1): target class, like "APPS"
   584  # $(2): target name, like "NotePad"
   585  # $(3): { HOST, HOST_CROSS, AUX, <empty (TARGET)>, <other non-empty (HOST)> }
   586  # $(4): if non-empty, force the generated sources to be COMMON
   587  define generated-sources-dir-for
   588  $(strip \
   589      $(eval _idfClass := $(strip $(1))) \
   590      $(if $(_idfClass),, \
   591          $(error $(LOCAL_PATH): Class not defined in call to generated-sources-dir-for)) \
   592      $(eval _idfName := $(strip $(2))) \
   593      $(if $(_idfName),, \
   594          $(error $(LOCAL_PATH): Name not defined in call to generated-sources-dir-for)) \
   595      $(eval _idfPrefix := $(call find-idf-prefix,$(3),)) \
   596      $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \
   597          $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_GEN)) \
   598        , \
   599          $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN)) \
   600       ) \
   601      $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \
   602  )
   603  endef
   604  
   605  # Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE
   606  # to determine the generated sources directory.
   607  #
   608  # $(1): if non-empty, force the intermediates to be COMMON
   609  define local-generated-sources-dir
   610  $(strip \
   611      $(if $(strip $(LOCAL_MODULE_CLASS)),, \
   612          $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-generated-sources-dir)) \
   613      $(if $(strip $(LOCAL_MODULE)),, \
   614          $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-generated-sources-dir)) \
   615      $(call generated-sources-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(call def-host-aux-target),$(1)) \
   616  )
   617  endef
   618  
   619  ###########################################################
   620  ## Convert a list of short module names (e.g., "framework", "Browser")
   621  ## into the list of files that are built for those modules.
   622  ## NOTE: this won't return reliable results until after all
   623  ## sub-makefiles have been included.
   624  ## $(1): target list
   625  ###########################################################
   626  
   627  define module-built-files
   628  $(foreach module,$(1),$(ALL_MODULES.$(module).BUILT))
   629  endef
   630  
   631  ###########################################################
   632  ## Convert a list of short modules names (e.g., "framework", "Browser")
   633  ## into the list of files that are installed for those modules.
   634  ## NOTE: this won't return reliable results until after all
   635  ## sub-makefiles have been included.
   636  ## $(1): target list
   637  ###########################################################
   638  
   639  define module-installed-files
   640  $(foreach module,$(1),$(ALL_MODULES.$(module).INSTALLED))
   641  endef
   642  
   643  ###########################################################
   644  ## Convert a list of short modules names (e.g., "framework", "Browser")
   645  ## into the list of files that should be used when linking
   646  ## against that module as a public API.
   647  ## TODO: Allow this for more than JAVA_LIBRARIES modules
   648  ## NOTE: this won't return reliable results until after all
   649  ## sub-makefiles have been included.
   650  ## $(1): target list
   651  ###########################################################
   652  
   653  define module-stubs-files
   654  $(foreach module,$(1),$(ALL_MODULES.$(module).STUBS))
   655  endef
   656  
   657  ###########################################################
   658  ## Evaluates to the timestamp file for a doc module, which
   659  ## is the dependency that should be used.
   660  ## $(1): doc module
   661  ###########################################################
   662  
   663  define doc-timestamp-for
   664  $(OUT_DOCS)/$(strip $(1))-timestamp
   665  endef
   666  
   667  
   668  ###########################################################
   669  ## Convert "core ext framework" to "out/.../javalib.jar ..."
   670  ## $(1): library list
   671  ## $(2): Non-empty if IS_HOST_MODULE
   672  ###########################################################
   673  
   674  # Get the jar files (you can pass to "javac -classpath") of static or shared
   675  # Java libraries that you want to link against.
   676  # $(1): library name list
   677  # $(2): Non-empty if IS_HOST_MODULE
   678  define java-lib-files
   679  $(foreach lib,$(1),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),$(2),COMMON)/classes.jar)
   680  endef
   681  
   682  # Get the header jar files (you can pass to "javac -classpath") of static or shared
   683  # Java libraries that you want to link against.
   684  # $(1): library name list
   685  # $(2): Non-empty if IS_HOST_MODULE
   686  ifneq ($(TURBINE_ENABLED),false)
   687  define java-lib-header-files
   688  $(foreach lib,$(1),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),$(2),COMMON)/classes-header.jar)
   689  endef
   690  else
   691  define java-lib-header-files
   692  $(call java-lib-files,$(1),$(2))
   693  endef
   694  endif
   695  
   696  # Get the dependency files (you can put on the right side of "|" of a build rule)
   697  # of the Java libraries.
   698  # $(1): library name list
   699  # $(2): Non-empty if IS_HOST_MODULE
   700  # Historically for target Java libraries we used a different file (javalib.jar)
   701  # as the dependency.
   702  # Now we can use classes.jar as dependency, so java-lib-deps is the same
   703  # as java-lib-files.
   704  define java-lib-deps
   705  $(call java-lib-files,$(1),$(2))
   706  endef
   707  
   708  # Get the jar files (you can pass to "javac -classpath") of static or shared
   709  # APK libraries that you want to link against.
   710  # $(1): library name list
   711  define app-lib-files
   712  $(foreach lib,$(1),$(call intermediates-dir-for,APPS,$(lib),,COMMON)/classes.jar)
   713  endef
   714  
   715  # Get the header jar files (you can pass to "javac -classpath") of static or shared
   716  # APK libraries that you want to link against.
   717  # $(1): library name list
   718  ifneq ($(TURBINE_ENABLED),false)
   719  define app-lib-header-files
   720  $(foreach lib,$(1),$(call intermediates-dir-for,APPS,$(lib),,COMMON)/classes-header.jar)
   721  endef
   722  else
   723  define app-lib-header-files
   724  $(call app-lib-files,$(1))
   725  endef
   726  endif
   727  
   728  ###########################################################
   729  ## Returns true if $(1) and $(2) are equal.  Returns
   730  ## the empty string if they are not equal.
   731  ###########################################################
   732  define streq
   733  $(strip $(if $(strip $(1)),\
   734    $(if $(strip $(2)),\
   735      $(if $(filter-out __,_$(subst $(strip $(1)),,$(strip $(2)))$(subst $(strip $(2)),,$(strip $(1)))_),,true), \
   736      ),\
   737    $(if $(strip $(2)),\
   738      ,\
   739      true)\
   740   ))
   741  endef
   742  
   743  ###########################################################
   744  ## Convert "a b c" into "a:b:c"
   745  ###########################################################
   746  define normalize-path-list
   747  $(subst $(space),:,$(strip $(1)))
   748  endef
   749  
   750  ###########################################################
   751  ## Convert "a b c" into "a,b,c"
   752  ###########################################################
   753  define normalize-comma-list
   754  $(subst $(space),$(comma),$(strip $(1)))
   755  endef
   756  
   757  ###########################################################
   758  ## Read the word out of a colon-separated list of words.
   759  ## This has the same behavior as the built-in function
   760  ## $(word n,str).
   761  ##
   762  ## The individual words may not contain spaces.
   763  ##
   764  ## $(1): 1 based index
   765  ## $(2): value of the form a:b:c...
   766  ###########################################################
   767  
   768  define word-colon
   769  $(word $(1),$(subst :,$(space),$(2)))
   770  endef
   771  
   772  ###########################################################
   773  ## Convert "a=b c= d e = f" into "a=b c=d e=f"
   774  ##
   775  ## $(1): list to collapse
   776  ## $(2): if set, separator word; usually "=", ":", or ":="
   777  ##       Defaults to "=" if not set.
   778  ###########################################################
   779  
   780  define collapse-pairs
   781  $(eval _cpSEP := $(strip $(if $(2),$(2),=)))\
   782  $(subst $(space)$(_cpSEP)$(space),$(_cpSEP),$(strip \
   783      $(subst $(_cpSEP), $(_cpSEP) ,$(1))))
   784  endef
   785  
   786  ###########################################################
   787  ## Given a list of pairs, if multiple pairs have the same
   788  ## first components, keep only the first pair.
   789  ##
   790  ## $(1): list of pairs
   791  ## $(2): the separator word, such as ":", "=", etc.
   792  define uniq-pairs-by-first-component
   793  $(eval _upbfc_fc_set :=)\
   794  $(strip $(foreach w,$(1), $(eval _first := $(word 1,$(subst $(2),$(space),$(w))))\
   795      $(if $(filter $(_upbfc_fc_set),$(_first)),,$(w)\
   796          $(eval _upbfc_fc_set += $(_first)))))\
   797  $(eval _upbfc_fc_set :=)\
   798  $(eval _first:=)
   799  endef
   800  
   801  ###########################################################
   802  ## MODULE_TAG set operations
   803  ###########################################################
   804  
   805  # Given a list of tags, return the targets that specify
   806  # any of those tags.
   807  # $(1): tag list
   808  define modules-for-tag-list
   809  $(sort $(foreach tag,$(1),$(foreach m,$(ALL_MODULE_NAME_TAGS.$(tag)),$(ALL_MODULES.$(m).INSTALLED))))
   810  endef
   811  
   812  # Same as modules-for-tag-list, but operates on
   813  # ALL_MODULE_NAME_TAGS.
   814  # $(1): tag list
   815  define module-names-for-tag-list
   816  $(sort $(foreach tag,$(1),$(ALL_MODULE_NAME_TAGS.$(tag))))
   817  endef
   818  
   819  # Given an accept and reject list, find the matching
   820  # set of targets.  If a target has multiple tags and
   821  # any of them are rejected, the target is rejected.
   822  # Reject overrides accept.
   823  # $(1): list of tags to accept
   824  # $(2): list of tags to reject
   825  #TODO(dbort): do $(if $(strip $(1)),$(1),$(ALL_MODULE_TAGS))
   826  #TODO(jbq): as of 20100106 nobody uses the second parameter
   827  define get-tagged-modules
   828  $(filter-out \
   829  	$(call modules-for-tag-list,$(2)), \
   830  	    $(call modules-for-tag-list,$(1)))
   831  endef
   832  
   833  ###########################################################
   834  ## Append a leaf to a base path.  Properly deals with
   835  ## base paths ending in /.
   836  ##
   837  ## $(1): base path
   838  ## $(2): leaf path
   839  ###########################################################
   840  
   841  define append-path
   842  $(subst //,/,$(1)/$(2))
   843  endef
   844  
   845  
   846  ###########################################################
   847  ## Color-coded warnings and errors
   848  ## Use echo-(warning|error) in a build rule
   849  ## Use pretty-(warning|error) instead of $(warning)/$(error)
   850  ###########################################################
   851  ESC_BOLD := \033[1m
   852  ESC_WARNING := \033[35m
   853  ESC_ERROR := \033[31m
   854  ESC_RESET := \033[0m
   855  
   856  # $(1): path (and optionally line) information
   857  # $(2): message to print
   858  define echo-warning
   859  echo -e "$(ESC_BOLD)$(1): $(ESC_WARNING)warning:$(ESC_RESET)$(ESC_BOLD)" $(2) "$(ESC_RESET)" >&2
   860  endef
   861  
   862  # $(1): path (and optionally line) information
   863  # $(2): message to print
   864  define echo-error
   865  echo -e "$(ESC_BOLD)$(1): $(ESC_ERROR)error:$(ESC_RESET)$(ESC_BOLD)" $(2) "$(ESC_RESET)" >&2
   866  endef
   867  
   868  # $(1): message to print
   869  define pretty-warning
   870  $(shell $(call echo-warning,$(LOCAL_MODULE_MAKEFILE),$(LOCAL_MODULE): $(1)))
   871  endef
   872  
   873  # $(1): message to print
   874  define pretty-error
   875  $(shell $(call echo-error,$(LOCAL_MODULE_MAKEFILE),$(LOCAL_MODULE): $(1)))
   876  $(error done)
   877  endef
   878  
   879  ###########################################################
   880  ## Package filtering
   881  ###########################################################
   882  
   883  # Given a list of installed modules (short or long names)
   884  # return a list of the packages (yes, .apk packages, not
   885  # modules in general) that are overridden by this list and,
   886  # therefore, should not be installed.
   887  # $(1): mixed list of installed modules
   888  # TODO: This is fragile; find a reliable way to get this information.
   889  define _get-package-overrides
   890   $(eval ### Discard any words containing slashes, unless they end in .apk, \
   891          ### in which case trim off the directory component and the suffix. \
   892          ### If there are no slashes, keep the entire word.)
   893   $(eval _gpo_names := $(subst /,@@@ @@@,$(1)))
   894   $(eval _gpo_names := \
   895       $(filter %.apk,$(_gpo_names)) \
   896       $(filter-out %@@@ @@@%,$(_gpo_names)))
   897   $(eval _gpo_names := $(patsubst %.apk,%,$(_gpo_names)))
   898   $(eval _gpo_names := $(patsubst @@@%,%,$(_gpo_names)))
   899  
   900   $(eval ### Remove any remaining words that contain dots.)
   901   $(eval _gpo_names := $(subst .,@@@ @@@,$(_gpo_names)))
   902   $(eval _gpo_names := $(filter-out %@@@ @@@%,$(_gpo_names)))
   903  
   904   $(eval ### Now we have a list of any words that could possibly refer to \
   905          ### packages, although there may be words that do not.  Only \
   906          ### real packages will be present under PACKAGES.*, though.)
   907   $(foreach _gpo_name,$(_gpo_names),$(PACKAGES.$(_gpo_name).OVERRIDES))
   908  endef
   909  
   910  define get-package-overrides
   911  $(sort $(strip $(call _get-package-overrides,$(1))))
   912  endef
   913  
   914  ###########################################################
   915  ## Output the command lines, or not
   916  ###########################################################
   917  
   918  ifeq ($(strip $(SHOW_COMMANDS)),)
   919  define pretty
   920  @echo $1
   921  endef
   922  else
   923  define pretty
   924  endef
   925  endif
   926  
   927  ###########################################################
   928  ## Commands for including the dependency files the compiler generates
   929  ###########################################################
   930  # $(1): the .P file
   931  # $(2): the main build target
   932  define include-depfile
   933  $(eval $(2) : .KATI_DEPFILE := $1)
   934  endef
   935  
   936  # $(1): object files
   937  define include-depfiles-for-objs
   938  $(foreach obj, $(1), $(call include-depfile, $(obj:%.o=%.d), $(obj)))
   939  endef
   940  
   941  ###########################################################
   942  ## Track source files compiled to objects
   943  ###########################################################
   944  # $(1): list of sources
   945  # $(2): list of matching objects
   946  define track-src-file-obj
   947  $(eval $(call _track-src-file-obj,$(1)))
   948  endef
   949  define _track-src-file-obj
   950  i := w
   951  $(foreach s,$(1),
   952  my_tracked_src_files += $(s)
   953  my_src_file_obj_$(s) := $$(word $$(words $$(i)),$$(2))
   954  i += w)
   955  endef
   956  
   957  # $(1): list of sources
   958  # $(2): list of matching generated sources
   959  define track-src-file-gen
   960  $(eval $(call _track-src-file-gen,$(2)))
   961  endef
   962  define _track-src-file-gen
   963  i := w
   964  $(foreach s,$(1),
   965  my_tracked_gen_files += $(s)
   966  my_src_file_gen_$(s) := $$(word $$(words $$(i)),$$(1))
   967  i += w)
   968  endef
   969  
   970  # $(1): list of generated sources
   971  # $(2): list of matching objects
   972  define track-gen-file-obj
   973  $(call track-src-file-obj,$(foreach f,$(1),\
   974    $(or $(my_src_file_gen_$(f)),$(f))),$(2))
   975  endef
   976  
   977  ###########################################################
   978  ## Commands for running lex
   979  ###########################################################
   980  
   981  define transform-l-to-c-or-cpp
   982  @echo "Lex: $(PRIVATE_MODULE) <= $<"
   983  @mkdir -p $(dir $@)
   984  $(hide) $(LEX) -o$@ $<
   985  endef
   986  
   987  ###########################################################
   988  ## Commands for running yacc
   989  ##
   990  ###########################################################
   991  
   992  define transform-y-to-c-or-cpp
   993  @echo "Yacc: $(PRIVATE_MODULE) <= $<"
   994  @mkdir -p $(dir $@)
   995  $(YACC) $(PRIVATE_YACCFLAGS) \
   996    --defines=$(basename $@).h \
   997    -o $@ $<
   998  endef
   999  
  1000  ###########################################################
  1001  ## Commands to compile RenderScript to Java
  1002  ###########################################################
  1003  
  1004  ## Merge multiple .d files generated by llvm-rs-cc. This is necessary
  1005  ## because ninja can handle only a single depfile per build target.
  1006  ## .d files generated by llvm-rs-cc define .stamp, .bc, and optionally
  1007  ## .java as build targets. However, there's no way to let ninja know
  1008  ## dependencies to .bc files and .java files, so we give up build
  1009  ## targets for them. As we write the .stamp file as the target by
  1010  ## ourselves, the awk script removes the first lines before the colon
  1011  ## and append a backslash to the last line to concatenate contents of
  1012  ## multiple files.
  1013  # $(1): .d files to be merged
  1014  # $(2): merged .d file
  1015  define _merge-renderscript-d
  1016  $(hide) echo '$@: $(backslash)' > $2
  1017  $(foreach d,$1, \
  1018    $(hide) awk 'start { sub(/( \\)?$$/, " \\"); print } /:/ { start=1 }' < $d >> $2$(newline))
  1019  $(hide) echo >> $2
  1020  endef
  1021  
  1022  # b/37755219
  1023  RS_CC_ASAN_OPTIONS := ASAN_OPTIONS=detect_leaks=0:detect_container_overflow=0
  1024  
  1025  define transform-renderscripts-to-java-and-bc
  1026  @echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
  1027  $(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
  1028  $(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/res/raw
  1029  $(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/src
  1030  $(hide) $(RS_CC_ASAN_OPTIONS) $(PRIVATE_RS_CC) \
  1031    -o $(PRIVATE_RS_OUTPUT_DIR)/res/raw \
  1032    -p $(PRIVATE_RS_OUTPUT_DIR)/src \
  1033    -d $(PRIVATE_RS_OUTPUT_DIR) \
  1034    -a $@ -MD \
  1035    $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \
  1036    $(PRIVATE_RS_FLAGS) \
  1037    $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \
  1038    $(PRIVATE_RS_SOURCE_FILES)
  1039  $(SOONG_ZIP) -o $@ -C $(PRIVATE_RS_OUTPUT_DIR)/src -D $(PRIVATE_RS_OUTPUT_DIR)/src
  1040  $(SOONG_ZIP) -o $(PRIVATE_RS_OUTPUT_RES_ZIP) -C $(PRIVATE_RS_OUTPUT_DIR)/res -D $(PRIVATE_RS_OUTPUT_DIR)/res
  1041  $(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d)
  1042  endef
  1043  
  1044  define transform-bc-to-so
  1045  @echo "Renderscript compatibility: $(notdir $@) <= $(notdir $<)"
  1046  $(hide) mkdir -p $(dir $@)
  1047  $(hide) $(BCC_COMPAT) -O3 -o $(dir $@)/$(notdir $(<:.bc=.o)) -fPIC -shared \
  1048  	-rt-path $(RS_PREBUILT_CLCORE) -mtriple $(RS_COMPAT_TRIPLE) $<
  1049  $(hide) $(PRIVATE_CXX) -shared -Wl,-soname,$(notdir $@) -nostdlib \
  1050  	-Wl,-rpath,\$$ORIGIN/../lib \
  1051  	$(dir $@)/$(notdir $(<:.bc=.o)) \
  1052  	$(RS_PREBUILT_COMPILER_RT) \
  1053  	-o $@ $(TARGET_GLOBAL_LDFLAGS) -Wl,--hash-style=sysv \
  1054  	-L $(SOONG_OUT_DIR)/ndk/platforms/android-$(PRIVATE_SDK_VERSION)/arch-$(TARGET_ARCH)/usr/lib64 \
  1055  	-L $(SOONG_OUT_DIR)/ndk/platforms/android-$(PRIVATE_SDK_VERSION)/arch-$(TARGET_ARCH)/usr/lib \
  1056  	$(call intermediates-dir-for,SHARED_LIBRARIES,libRSSupport)/libRSSupport.so \
  1057  	-lm -lc
  1058  endef
  1059  
  1060  ###########################################################
  1061  ## Commands to compile RenderScript to C++
  1062  ###########################################################
  1063  
  1064  define transform-renderscripts-to-cpp-and-bc
  1065  @echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
  1066  $(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
  1067  $(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/
  1068  $(hide) $(RS_CC_ASAN_OPTIONS) $(PRIVATE_RS_CC) \
  1069    -o $(PRIVATE_RS_OUTPUT_DIR)/ \
  1070    -d $(PRIVATE_RS_OUTPUT_DIR) \
  1071    -a $@ -MD \
  1072    -reflect-c++ \
  1073    $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \
  1074    $(PRIVATE_RS_FLAGS) \
  1075    $(addprefix -I , $(PRIVATE_RS_INCLUDES)) \
  1076    $(PRIVATE_RS_SOURCE_FILES)
  1077  $(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d)
  1078  $(hide) mkdir -p $(dir $@)
  1079  $(hide) touch $@
  1080  endef
  1081  
  1082  
  1083  ###########################################################
  1084  ## Commands for running aidl
  1085  ###########################################################
  1086  
  1087  define transform-aidl-to-java
  1088  @mkdir -p $(dir $@)
  1089  @echo "Aidl: $(PRIVATE_MODULE) <= $<"
  1090  $(hide) $(AIDL) -d$(patsubst %.java,%.P,$@) $(PRIVATE_AIDL_FLAGS) $< $@
  1091  endef
  1092  #$(AIDL) $(PRIVATE_AIDL_FLAGS) $< - | indent -nut -br -npcs -l1000 > $@
  1093  
  1094  define transform-aidl-to-cpp
  1095  @mkdir -p $(dir $@)
  1096  @mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR)
  1097  @echo "Generating C++ from AIDL: $(PRIVATE_MODULE) <= $<"
  1098  $(hide) $(AIDL_CPP) -d$(basename $@).aidl.d -ninja $(PRIVATE_AIDL_FLAGS) \
  1099      $< $(PRIVATE_HEADER_OUTPUT_DIR) $@
  1100  endef
  1101  
  1102  ## Given a .aidl file path, generate the rule to compile it a .java file
  1103  # $(1): a .aidl source file
  1104  # $(2): a directory to place the generated .java files in
  1105  # $(3): name of a variable to add the path to the generated source file to
  1106  #
  1107  # You must call this with $(eval).
  1108  define define-aidl-java-rule
  1109  define-aidl-java-rule-src := $(patsubst %.aidl,%.java,$(subst ../,dotdot/,$(addprefix $(2)/,$(1))))
  1110  $$(define-aidl-java-rule-src) : $(LOCAL_PATH)/$(1) $(AIDL)
  1111  	$$(transform-aidl-to-java)
  1112  $(3) += $$(define-aidl-java-rule-src)
  1113  endef
  1114  
  1115  ## Given a .aidl file path generate the rule to compile it a .cpp file.
  1116  # $(1): a .aidl source file
  1117  # $(2): a directory to place the generated .cpp files in
  1118  # $(3): name of a variable to add the path to the generated source file to
  1119  #
  1120  # You must call this with $(eval).
  1121  define define-aidl-cpp-rule
  1122  define-aidl-cpp-rule-src := $(patsubst %.aidl,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1))))
  1123  $$(define-aidl-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(AIDL_CPP)
  1124  	$$(transform-aidl-to-cpp)
  1125  $(3) += $$(define-aidl-cpp-rule-src)
  1126  endef
  1127  
  1128  ###########################################################
  1129  ## Commands for running vts
  1130  ###########################################################
  1131  
  1132  define transform-vts-to-cpp
  1133  @mkdir -p $(dir $@)
  1134  @mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR)
  1135  @echo "Generating C++ from VTS: $(PRIVATE_MODULE) <= $<"
  1136  $(hide) $(VTSC) -d$(basename $@).vts.P $(PRIVATE_VTS_FLAGS) \
  1137      $< $(PRIVATE_HEADER_OUTPUT_DIR) $@
  1138  endef
  1139  
  1140  ## Given a .vts file path generate the rule to compile it a .cpp file.
  1141  # $(1): a .vts source file
  1142  # $(2): a directory to place the generated .cpp files in
  1143  # $(3): name of a variable to add the path to the generated source file to
  1144  #
  1145  # You must call this with $(eval).
  1146  define define-vts-cpp-rule
  1147  define-vts-cpp-rule-src := $(patsubst %.vts,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1))))
  1148  $$(define-vts-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(VTSC)
  1149  	$$(transform-vts-to-cpp)
  1150  $(3) += $$(define-vts-cpp-rule-src)
  1151  endef
  1152  
  1153  ###########################################################
  1154  ## Commands for running java-event-log-tags.py
  1155  ###########################################################
  1156  
  1157  define transform-logtags-to-java
  1158  @mkdir -p $(dir $@)
  1159  @echo "logtags: $@ <= $<"
  1160  $(hide) $(JAVATAGS) -o $@ $< $(PRIVATE_MERGED_TAG)
  1161  endef
  1162  
  1163  
  1164  ###########################################################
  1165  ## Commands for running protoc to compile .proto into .java
  1166  ###########################################################
  1167  # PATH contains HOST_OUT_EXECUTABLES to allow protoc-gen-* plugins
  1168  
  1169  define transform-proto-to-java
  1170  @mkdir -p $(dir $@)
  1171  @echo "Protoc: $@ <= $(PRIVATE_PROTO_SRC_FILES)"
  1172  @rm -rf $(PRIVATE_PROTO_JAVA_OUTPUT_DIR)
  1173  @mkdir -p $(PRIVATE_PROTO_JAVA_OUTPUT_DIR)
  1174  $(hide) for f in $(PRIVATE_PROTO_SRC_FILES); do \
  1175          PATH=$$PATH:$(HOST_OUT_EXECUTABLES) \
  1176          $(PROTOC) \
  1177          $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \
  1178          $(PRIVATE_PROTO_JAVA_OUTPUT_OPTION)="$(PRIVATE_PROTO_JAVA_OUTPUT_PARAMS):$(PRIVATE_PROTO_JAVA_OUTPUT_DIR)" \
  1179          $(PRIVATE_PROTOC_FLAGS) \
  1180          $$f || exit 33; \
  1181          done
  1182  $(hide) touch $@
  1183  endef
  1184  
  1185  ######################################################################
  1186  ## Commands for running protoc to compile .proto into .pb.cc (or.pb.c) and .pb.h
  1187  ######################################################################
  1188  # PATH contains HOST_OUT_EXECUTABLES to allow protoc-gen-* plugins
  1189  
  1190  define transform-proto-to-cc
  1191  @echo "Protoc: $@ <= $<"
  1192  @mkdir -p $(dir $@)
  1193  $(hide) \
  1194  	PATH=$$PATH:$(HOST_OUT_EXECUTABLES) \
  1195  	$(PROTOC) \
  1196  	$(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \
  1197  	$(PRIVATE_PROTOC_FLAGS) \
  1198  	$<
  1199  @# aprotoc outputs only .cc. Rename it to .cpp if necessary.
  1200  $(if $(PRIVATE_RENAME_CPP_EXT),\
  1201    $(hide) mv $(basename $@).cc $@)
  1202  endef
  1203  
  1204  ###########################################################
  1205  ## Helper to set include paths form transform-*-to-o
  1206  ###########################################################
  1207  define c-includes
  1208  $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
  1209  $$(cat $(PRIVATE_IMPORT_INCLUDES))\
  1210  $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\
  1211      $(addprefix -I ,\
  1212          $(filter-out $(PRIVATE_C_INCLUDES), \
  1213              $(PRIVATE_GLOBAL_C_INCLUDES))) \
  1214      $(addprefix -isystem ,\
  1215          $(filter-out $(PRIVATE_C_INCLUDES), \
  1216              $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES))))
  1217  endef
  1218  
  1219  ###########################################################
  1220  ## Commands for running gcc to compile a C++ file
  1221  ###########################################################
  1222  
  1223  define transform-cpp-to-o-compiler-args
  1224  	$(c-includes) \
  1225  	-c \
  1226  	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
  1227  	    $(PRIVATE_TARGET_GLOBAL_CFLAGS) \
  1228  	    $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \
  1229  	    $(PRIVATE_ARM_CFLAGS) \
  1230  	 ) \
  1231  	$(PRIVATE_RTTI_FLAG) \
  1232  	$(PRIVATE_CFLAGS) \
  1233  	$(PRIVATE_CPPFLAGS) \
  1234  	$(PRIVATE_DEBUG_CFLAGS) \
  1235  	$(PRIVATE_CFLAGS_NO_OVERRIDE) \
  1236  	$(PRIVATE_CPPFLAGS_NO_OVERRIDE)
  1237  endef
  1238  
  1239  define clang-tidy-cpp
  1240  $(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
  1241    -checks=$(PRIVATE_TIDY_CHECKS) \
  1242    $< -- $(transform-cpp-to-o-compiler-args)
  1243  endef
  1244  
  1245  ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
  1246  define transform-cpp-to-o
  1247  $(if $(PRIVATE_TIDY_CHECKS),
  1248    @echo "$($(PRIVATE_PREFIX)DISPLAY) tidy $(PRIVATE_ARM_MODE) C++: $<"
  1249    $(clang-tidy-cpp))
  1250  endef
  1251  else
  1252  define transform-cpp-to-o
  1253  @echo "$($(PRIVATE_PREFIX)DISPLAY) $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<"
  1254  @mkdir -p $(dir $@)
  1255  $(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-cpp))
  1256  $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \
  1257    $(transform-cpp-to-o-compiler-args) \
  1258    -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
  1259  endef
  1260  endif
  1261  
  1262  
  1263  ###########################################################
  1264  ## Commands for running gcc to compile a C file
  1265  ###########################################################
  1266  
  1267  # $(1): extra flags
  1268  define transform-c-or-s-to-o-compiler-args
  1269  	$(c-includes) \
  1270  	-c \
  1271  	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
  1272  	    $(PRIVATE_TARGET_GLOBAL_CFLAGS) \
  1273  	    $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \
  1274  	    $(PRIVATE_ARM_CFLAGS) \
  1275  	 ) \
  1276  	 $(1)
  1277  endef
  1278  
  1279  define transform-c-to-o-compiler-args
  1280  $(call transform-c-or-s-to-o-compiler-args, \
  1281    $(PRIVATE_CFLAGS) \
  1282    $(PRIVATE_CONLYFLAGS) \
  1283    $(PRIVATE_DEBUG_CFLAGS) \
  1284    $(PRIVATE_CFLAGS_NO_OVERRIDE))
  1285  endef
  1286  
  1287  define clang-tidy-c
  1288  $(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
  1289    -checks=$(PRIVATE_TIDY_CHECKS) \
  1290    $< -- $(transform-c-to-o-compiler-args)
  1291  endef
  1292  
  1293  ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
  1294  define transform-c-to-o
  1295  $(if $(PRIVATE_TIDY_CHECKS),
  1296    @echo "$($(PRIVATE_PREFIX)DISPLAY) tidy $(PRIVATE_ARM_MODE) C: $<"
  1297    $(clang-tidy-c))
  1298  endef
  1299  else
  1300  define transform-c-to-o
  1301  @echo "$($(PRIVATE_PREFIX)DISPLAY) $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<"
  1302  @mkdir -p $(dir $@)
  1303  $(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-c))
  1304  $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \
  1305    $(transform-c-to-o-compiler-args) \
  1306    -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
  1307  endef
  1308  endif
  1309  
  1310  define transform-s-to-o
  1311  @echo "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<"
  1312  @mkdir -p $(dir $@)
  1313  $(RELATIVE_PWD) $(PRIVATE_CC) \
  1314    $(call transform-c-or-s-to-o-compiler-args, $(PRIVATE_ASFLAGS)) \
  1315    -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
  1316  endef
  1317  
  1318  # YASM compilation
  1319  define transform-asm-to-o
  1320  @mkdir -p $(dir $@)
  1321  $(hide) $(YASM) \
  1322      $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
  1323      $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_YASM_FLAGS) \
  1324      $(PRIVATE_ASFLAGS) \
  1325      -o $@ $<
  1326  endef
  1327  
  1328  ###########################################################
  1329  ## Commands for running gcc to compile an Objective-C file
  1330  ## This should never happen for target builds but this
  1331  ## will error at build time.
  1332  ###########################################################
  1333  
  1334  define transform-m-to-o
  1335  @echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<"
  1336  $(call transform-c-or-s-to-o, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS))
  1337  endef
  1338  
  1339  ###########################################################
  1340  ## Commands for running gcc to compile a host C++ file
  1341  ###########################################################
  1342  
  1343  define transform-host-cpp-to-o-compiler-args
  1344  	$(c-includes) \
  1345  	-c \
  1346  	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
  1347  	    $(PRIVATE_HOST_GLOBAL_CFLAGS) \
  1348  	    $(PRIVATE_HOST_GLOBAL_CPPFLAGS) \
  1349  	 ) \
  1350  	$(PRIVATE_CFLAGS) \
  1351  	$(PRIVATE_CPPFLAGS) \
  1352  	$(PRIVATE_DEBUG_CFLAGS) \
  1353  	$(PRIVATE_CFLAGS_NO_OVERRIDE) \
  1354  	$(PRIVATE_CPPFLAGS_NO_OVERRIDE)
  1355  endef
  1356  
  1357  define clang-tidy-host-cpp
  1358  $(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
  1359    -checks=$(PRIVATE_TIDY_CHECKS) \
  1360    $< -- $(transform-host-cpp-to-o-compiler-args)
  1361  endef
  1362  
  1363  ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
  1364  define transform-host-cpp-to-o
  1365  $(if $(PRIVATE_TIDY_CHECKS),
  1366    @echo "tidy $($(PRIVATE_PREFIX)DISPLAY) C++: $<"
  1367    $(clang-tidy-host-cpp))
  1368  endef
  1369  else
  1370  define transform-host-cpp-to-o
  1371  @echo "$($(PRIVATE_PREFIX)DISPLAY) C++: $(PRIVATE_MODULE) <= $<"
  1372  @mkdir -p $(dir $@)
  1373  $(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-host-cpp))
  1374  $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \
  1375    $(transform-host-cpp-to-o-compiler-args) \
  1376    -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
  1377  endef
  1378  endif
  1379  
  1380  
  1381  ###########################################################
  1382  ## Commands for running gcc to compile a host C file
  1383  ###########################################################
  1384  
  1385  define transform-host-c-or-s-to-o-common-args
  1386  	$(c-includes) \
  1387  	-c \
  1388  	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
  1389  	    $(PRIVATE_HOST_GLOBAL_CFLAGS) \
  1390  	    $(PRIVATE_HOST_GLOBAL_CONLYFLAGS) \
  1391  	 )
  1392  endef
  1393  
  1394  # $(1): extra flags
  1395  define transform-host-c-or-s-to-o
  1396  @mkdir -p $(dir $@)
  1397  $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \
  1398    $(transform-host-c-or-s-to-o-common-args) \
  1399    $(1) \
  1400    -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
  1401  endef
  1402  
  1403  define transform-host-c-to-o-compiler-args
  1404    $(transform-host-c-or-s-to-o-common-args) \
  1405    $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) \
  1406    $(PRIVATE_DEBUG_CFLAGS) $(PRIVATE_CFLAGS_NO_OVERRIDE)
  1407  endef
  1408  
  1409  define clang-tidy-host-c
  1410  $(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
  1411    -checks=$(PRIVATE_TIDY_CHECKS) \
  1412    $< -- $(transform-host-c-to-o-compiler-args)
  1413  endef
  1414  
  1415  ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
  1416  define transform-host-c-to-o
  1417  $(if $(PRIVATE_TIDY_CHECKS),
  1418    @echo "tidy $($(PRIVATE_PREFIX)DISPLAY) C: $<"
  1419    $(clang-tidy-host-c))
  1420  endef
  1421  else
  1422  define transform-host-c-to-o
  1423  @echo "$($(PRIVATE_PREFIX)DISPLAY) C: $(PRIVATE_MODULE) <= $<"
  1424  @mkdir -p $(dir $@)
  1425  $(if $(PRIVATE_TIDY_CHECKS), $(clang-tidy-host-c))
  1426  $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \
  1427    $(transform-host-c-to-o-compiler-args) \
  1428    -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
  1429  endef
  1430  endif
  1431  
  1432  define transform-host-s-to-o
  1433  @echo "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<"
  1434  $(call transform-host-c-or-s-to-o, $(PRIVATE_ASFLAGS))
  1435  endef
  1436  
  1437  ###########################################################
  1438  ## Commands for running gcc to compile a host Objective-C file
  1439  ###########################################################
  1440  
  1441  define transform-host-m-to-o
  1442  @echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<"
  1443  $(call transform-host-c-or-s-to-o, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS) $(PRIVATE_CFLAGS_NO_OVERRIDE))
  1444  endef
  1445  
  1446  ###########################################################
  1447  ## Commands for running gcc to compile a host Objective-C++ file
  1448  ###########################################################
  1449  
  1450  define transform-host-mm-to-o
  1451  $(transform-host-cpp-to-o)
  1452  endef
  1453  
  1454  
  1455  ###########################################################
  1456  ## Rules to compile a single C/C++ source with ../ in the path
  1457  ###########################################################
  1458  # Replace "../" in object paths with $(DOTDOT_REPLACEMENT).
  1459  DOTDOT_REPLACEMENT := dotdot/
  1460  
  1461  ## Rule to compile a C++ source file with ../ in the path.
  1462  ## Must be called with $(eval).
  1463  # $(1): the C++ source file in LOCAL_SRC_FILES.
  1464  # $(2): the additional dependencies.
  1465  # $(3): the variable name to collect the output object file.
  1466  define compile-dotdot-cpp-file
  1467  o := $(intermediates)/$(patsubst %$(LOCAL_CPP_EXTENSION),%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
  1468  $$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
  1469  	$$(transform-$$(PRIVATE_HOST)cpp-to-o)
  1470  $$(call include-depfiles-for-objs, $$(o))
  1471  $(3) += $$(o)
  1472  endef
  1473  
  1474  ## Rule to compile a C source file with ../ in the path.
  1475  ## Must be called with $(eval).
  1476  # $(1): the C source file in LOCAL_SRC_FILES.
  1477  # $(2): the additional dependencies.
  1478  # $(3): the variable name to collect the output object file.
  1479  define compile-dotdot-c-file
  1480  o := $(intermediates)/$(patsubst %.c,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
  1481  $$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
  1482  	$$(transform-$$(PRIVATE_HOST)c-to-o)
  1483  $$(call include-depfiles-for-objs, $$(o))
  1484  $(3) += $$(o)
  1485  endef
  1486  
  1487  ## Rule to compile a .S source file with ../ in the path.
  1488  ## Must be called with $(eval).
  1489  # $(1): the .S source file in LOCAL_SRC_FILES.
  1490  # $(2): the additional dependencies.
  1491  # $(3): the variable name to collect the output object file.
  1492  define compile-dotdot-s-file
  1493  o := $(intermediates)/$(patsubst %.S,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
  1494  $$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
  1495  	$$(transform-$$(PRIVATE_HOST)s-to-o)
  1496  $$(call include-depfiles-for-objs, $$(o))
  1497  $(3) += $$(o)
  1498  endef
  1499  
  1500  ## Rule to compile a .s source file with ../ in the path.
  1501  ## Must be called with $(eval).
  1502  # $(1): the .s source file in LOCAL_SRC_FILES.
  1503  # $(2): the additional dependencies.
  1504  # $(3): the variable name to collect the output object file.
  1505  define compile-dotdot-s-file-no-deps
  1506  o := $(intermediates)/$(patsubst %.s,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
  1507  $$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
  1508  	$$(transform-$$(PRIVATE_HOST)s-to-o)
  1509  $(3) += $$(o)
  1510  endef
  1511  
  1512  ###########################################################
  1513  ## Commands for running ar
  1514  ###########################################################
  1515  
  1516  define _concat-if-arg2-not-empty
  1517  $(if $(2),$(hide) $(1) $(2))
  1518  endef
  1519  
  1520  # Split long argument list into smaller groups and call the command repeatedly
  1521  # Call the command at least once even if there are no arguments, as otherwise
  1522  # the output file won't be created.
  1523  #
  1524  # $(1): the command without arguments
  1525  # $(2): the arguments
  1526  define split-long-arguments
  1527  $(hide) $(1) $(wordlist 1,500,$(2))
  1528  $(call _concat-if-arg2-not-empty,$(1),$(wordlist 501,1000,$(2)))
  1529  $(call _concat-if-arg2-not-empty,$(1),$(wordlist 1001,1500,$(2)))
  1530  $(call _concat-if-arg2-not-empty,$(1),$(wordlist 1501,2000,$(2)))
  1531  $(call _concat-if-arg2-not-empty,$(1),$(wordlist 2001,2500,$(2)))
  1532  $(call _concat-if-arg2-not-empty,$(1),$(wordlist 2501,3000,$(2)))
  1533  $(call _concat-if-arg2-not-empty,$(1),$(wordlist 3001,99999,$(2)))
  1534  endef
  1535  
  1536  # $(1): the full path of the source static library.
  1537  # $(2): the full path of the destination static library.
  1538  define _extract-and-include-single-target-whole-static-lib
  1539  $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
  1540      rm -rf $$ldir; \
  1541      mkdir -p $$ldir; \
  1542      cp $(1) $$ldir; \
  1543      lib_to_include=$$ldir/$(notdir $(1)); \
  1544      filelist=; \
  1545      subdir=0; \
  1546      for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) t $(1)`; do \
  1547          if [ -e $$ldir/$$f ]; then \
  1548              mkdir $$ldir/$$subdir; \
  1549              ext=$$subdir/; \
  1550              subdir=$$((subdir+1)); \
  1551              $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) m $$lib_to_include $$f; \
  1552          else \
  1553              ext=; \
  1554          fi; \
  1555          $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \
  1556          filelist="$$filelist $$ldir/$$ext$$f"; \
  1557      done ; \
  1558      $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \
  1559          $(PRIVATE_ARFLAGS) $(2) $$filelist
  1560  
  1561  endef
  1562  
  1563  # $(1): the full path of the source static library.
  1564  # $(2): the full path of the destination static library.
  1565  define extract-and-include-whole-static-libs-first
  1566  $(if $(strip $(1)),
  1567  $(hide) cp $(1) $(2))
  1568  endef
  1569  
  1570  # $(1): the full path of the destination static library.
  1571  define extract-and-include-target-whole-static-libs
  1572  $(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)),$(1))
  1573  $(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \
  1574      $(call _extract-and-include-single-target-whole-static-lib, $(lib), $(1)))
  1575  endef
  1576  
  1577  # Explicitly delete the archive first so that ar doesn't
  1578  # try to add to an existing archive.
  1579  define transform-o-to-static-lib
  1580  @echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)"
  1581  @mkdir -p $(dir $@)
  1582  @rm -f $@ $@.tmp
  1583  $(call extract-and-include-target-whole-static-libs,$@.tmp)
  1584  $(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) \
  1585      $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \
  1586      $(PRIVATE_ARFLAGS) \
  1587      $@.tmp,$(PRIVATE_ALL_OBJECTS))
  1588  $(hide) mv -f $@.tmp $@
  1589  endef
  1590  
  1591  # $(1): the full path of the source static library.
  1592  # $(2): the full path of the destination static library.
  1593  define _extract-and-include-single-aux-whole-static-lib
  1594  $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
  1595      rm -rf $$ldir; \
  1596      mkdir -p $$ldir; \
  1597      cp $(1) $$ldir; \
  1598      lib_to_include=$$ldir/$(notdir $(1)); \
  1599      filelist=; \
  1600      subdir=0; \
  1601      for f in `$(PRIVATE_AR) t $(1)`; do \
  1602          if [ -e $$ldir/$$f ]; then \
  1603              mkdir $$ldir/$$subdir; \
  1604              ext=$$subdir/; \
  1605              subdir=$$((subdir+1)); \
  1606              $(PRIVATE_AR) m $$lib_to_include $$f; \
  1607          else \
  1608              ext=; \
  1609          fi; \
  1610          $(PRIVATE_AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \
  1611          filelist="$$filelist $$ldir/$$ext$$f"; \
  1612      done ; \
  1613      $(PRIVATE_AR) $(AUX_GLOBAL_ARFLAGS) $(2) $$filelist
  1614  
  1615  endef
  1616  
  1617  define extract-and-include-aux-whole-static-libs
  1618  $(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)),$(1))
  1619  $(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \
  1620      $(call _extract-and-include-single-aux-whole-static-lib, $(lib), $(1)))
  1621  endef
  1622  
  1623  # Explicitly delete the archive first so that ar doesn't
  1624  # try to add to an existing archive.
  1625  define transform-o-to-aux-static-lib
  1626  @echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)"
  1627  @mkdir -p $(dir $@)
  1628  @rm -f $@ $@.tmp
  1629  $(call extract-and-include-aux-whole-static-libs,$@.tmp)
  1630  $(call split-long-arguments,$(PRIVATE_AR) \
  1631      $(AUX_GLOBAL_ARFLAGS) $@.tmp,$(PRIVATE_ALL_OBJECTS))
  1632  $(hide) mv -f $@.tmp $@
  1633  endef
  1634  
  1635  define transform-o-to-aux-executable-inner
  1636  $(hide) $(PRIVATE_CXX) -pie \
  1637  	-Bdynamic \
  1638  	-Wl,--gc-sections \
  1639  	$(PRIVATE_ALL_OBJECTS) \
  1640  	-Wl,--whole-archive \
  1641  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1642  	-Wl,--no-whole-archive \
  1643  	$(PRIVATE_ALL_STATIC_LIBRARIES) \
  1644  	$(PRIVATE_LDFLAGS) \
  1645  	-o $@
  1646  endef
  1647  
  1648  define transform-o-to-aux-executable
  1649  @echo "$(AUX_DISPLAY) Executable: $(PRIVATE_MODULE) ($@)"
  1650  @mkdir -p $(dir $@)
  1651  $(transform-o-to-aux-executable-inner)
  1652  endef
  1653  
  1654  define transform-o-to-aux-static-executable-inner
  1655  $(hide) $(PRIVATE_CXX) \
  1656  	-Bstatic \
  1657  	-Wl,--gc-sections \
  1658  	$(PRIVATE_ALL_OBJECTS) \
  1659  	-Wl,--whole-archive \
  1660  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1661  	-Wl,--no-whole-archive \
  1662  	$(PRIVATE_ALL_STATIC_LIBRARIES) \
  1663  	$(PRIVATE_LDFLAGS) \
  1664  	-Wl,-Map=$(@).map \
  1665  	-o $@
  1666  endef
  1667  
  1668  define transform-o-to-aux-static-executable
  1669  @echo "$(AUX_DISPLAY) StaticExecutable: $(PRIVATE_MODULE) ($@)"
  1670  @mkdir -p $(dir $@)
  1671  $(transform-o-to-aux-static-executable-inner)
  1672  endef
  1673  
  1674  ###########################################################
  1675  ## Commands for running host ar
  1676  ###########################################################
  1677  
  1678  # $(1): the full path of the source static library.
  1679  # $(2): the full path of the destination static library.
  1680  define _extract-and-include-single-host-whole-static-lib
  1681  $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
  1682      rm -rf $$ldir; \
  1683      mkdir -p $$ldir; \
  1684      cp $(1) $$ldir; \
  1685      lib_to_include=$$ldir/$(notdir $(1)); \
  1686      filelist=; \
  1687      subdir=0; \
  1688      for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) t $(1) | \grep '\.o$$'`; do \
  1689          if [ -e $$ldir/$$f ]; then \
  1690             mkdir $$ldir/$$subdir; \
  1691             ext=$$subdir/; \
  1692             subdir=$$((subdir+1)); \
  1693             $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) m $$lib_to_include $$f; \
  1694          else \
  1695             ext=; \
  1696          fi; \
  1697          $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \
  1698          filelist="$$filelist $$ldir/$$ext$$f"; \
  1699      done ; \
  1700      $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) \
  1701          $(2) $$filelist
  1702  
  1703  endef
  1704  
  1705  define extract-and-include-host-whole-static-libs
  1706  $(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)),$(1))
  1707  $(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \
  1708      $(call _extract-and-include-single-host-whole-static-lib, $(lib),$(1)))
  1709  endef
  1710  
  1711  ifeq ($(HOST_OS),darwin)
  1712  # On Darwin the host ar fails if there is nothing to add to .a at all.
  1713  # We work around by adding a dummy.o and then deleting it.
  1714  define create-dummy.o-if-no-objs
  1715  $(if $(PRIVATE_ALL_OBJECTS),,$(hide) touch $(dir $(1))dummy.o)
  1716  endef
  1717  
  1718  define get-dummy.o-if-no-objs
  1719  $(if $(PRIVATE_ALL_OBJECTS),,$(dir $(1))dummy.o)
  1720  endef
  1721  
  1722  define delete-dummy.o-if-no-objs
  1723  $(if $(PRIVATE_ALL_OBJECTS),,$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) d $(1) $(dir $(1))dummy.o \
  1724    && rm -f $(dir $(1))dummy.o)
  1725  endef
  1726  else
  1727  create-dummy.o-if-no-objs =
  1728  get-dummy.o-if-no-objs =
  1729  delete-dummy.o-if-no-objs =
  1730  endif  # HOST_OS is darwin
  1731  
  1732  # Explicitly delete the archive first so that ar doesn't
  1733  # try to add to an existing archive.
  1734  define transform-host-o-to-static-lib
  1735  @echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)"
  1736  @mkdir -p $(dir $@)
  1737  @rm -f $@ $@.tmp
  1738  $(call extract-and-include-host-whole-static-libs,$@.tmp)
  1739  $(call create-dummy.o-if-no-objs,$@.tmp)
  1740  $(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) \
  1741      $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) $@.tmp,\
  1742      $(PRIVATE_ALL_OBJECTS) $(call get-dummy.o-if-no-objs,$@.tmp))
  1743  $(call delete-dummy.o-if-no-objs,$@.tmp)
  1744  $(hide) mv -f $@.tmp $@
  1745  endef
  1746  
  1747  
  1748  ###########################################################
  1749  ## Commands for running gcc to link a shared library or package
  1750  ###########################################################
  1751  
  1752  # ld just seems to be so finicky with command order that we allow
  1753  # it to be overriden en-masse see combo/linux-arm.make for an example.
  1754  ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
  1755  define transform-host-o-to-shared-lib-inner
  1756  $(hide) $(PRIVATE_CXX) \
  1757  	-Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \
  1758  	-Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \
  1759  	-Wl,-rpath,\$$ORIGIN/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \
  1760  	-shared -Wl,-soname,$(notdir $@) \
  1761  	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
  1762  	   $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
  1763  	) \
  1764  	$(PRIVATE_LDFLAGS) \
  1765  	$(PRIVATE_ALL_OBJECTS) \
  1766  	-Wl,--whole-archive \
  1767  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1768  	-Wl,--no-whole-archive \
  1769  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
  1770  	$(PRIVATE_ALL_STATIC_LIBRARIES) \
  1771  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
  1772  	$(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \
  1773  	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \
  1774  	$(PRIVATE_ALL_SHARED_LIBRARIES) \
  1775  	-o $@ \
  1776  	$(PRIVATE_LDLIBS)
  1777  endef
  1778  endif
  1779  
  1780  define transform-host-o-to-shared-lib
  1781  @echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)"
  1782  @mkdir -p $(dir $@)
  1783  $(transform-host-o-to-shared-lib-inner)
  1784  endef
  1785  
  1786  define transform-host-o-to-package
  1787  @echo "$($(PRIVATE_PREFIX)DISPLAY) Package: $(PRIVATE_MODULE) ($@)"
  1788  @mkdir -p $(dir $@)
  1789  $(transform-host-o-to-shared-lib-inner)
  1790  endef
  1791  
  1792  
  1793  ###########################################################
  1794  ## Commands for running gcc to link a shared library or package
  1795  ###########################################################
  1796  
  1797  define transform-o-to-shared-lib-inner
  1798  $(hide) $(PRIVATE_CXX) \
  1799  	-nostdlib -Wl,-soname,$(notdir $@) \
  1800  	-Wl,--gc-sections \
  1801  	$(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl$(comma)-shared) \
  1802  	$(PRIVATE_TARGET_CRTBEGIN_SO_O) \
  1803  	$(PRIVATE_ALL_OBJECTS) \
  1804  	-Wl,--whole-archive \
  1805  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1806  	-Wl,--no-whole-archive \
  1807  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
  1808  	$(PRIVATE_ALL_STATIC_LIBRARIES) \
  1809  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
  1810  	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
  1811  	$(PRIVATE_TARGET_LIBATOMIC) \
  1812  	$(PRIVATE_TARGET_LIBGCC) \
  1813  	$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
  1814  	$(PRIVATE_LDFLAGS) \
  1815  	$(PRIVATE_ALL_SHARED_LIBRARIES) \
  1816  	-o $@ \
  1817  	$(PRIVATE_TARGET_CRTEND_SO_O) \
  1818  	$(PRIVATE_LDLIBS)
  1819  endef
  1820  
  1821  define transform-o-to-shared-lib
  1822  @echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)"
  1823  @mkdir -p $(dir $@)
  1824  $(transform-o-to-shared-lib-inner)
  1825  endef
  1826  
  1827  ###########################################################
  1828  ## Commands for filtering a target executable or library
  1829  ###########################################################
  1830  
  1831  ifneq ($(TARGET_BUILD_VARIANT),user)
  1832    TARGET_STRIP_EXTRA = && $(PRIVATE_OBJCOPY) --add-gnu-debuglink=$< $@
  1833    TARGET_STRIP_KEEP_SYMBOLS_EXTRA = --add-gnu-debuglink=$<
  1834  endif
  1835  
  1836  define transform-to-stripped
  1837  @echo "$($(PRIVATE_PREFIX)DISPLAY) Strip: $(PRIVATE_MODULE) ($@)"
  1838  @mkdir -p $(dir $@)
  1839  $(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ \
  1840    $(if $(PRIVATE_NO_DEBUGLINK),,$(TARGET_STRIP_EXTRA))
  1841  endef
  1842  
  1843  define transform-to-stripped-keep-mini-debug-info
  1844  @echo "$($(PRIVATE_PREFIX)DISPLAY) Strip (mini debug info): $(PRIVATE_MODULE) ($@)"
  1845  @mkdir -p $(dir $@)
  1846  $(hide) rm -f $@ $@.dynsyms $@.funcsyms $@.keep_symbols $@.debug $@.mini_debuginfo.xz
  1847  if $(PRIVATE_STRIP) --strip-all -R .comment $< -o $@; then \
  1848    $(PRIVATE_OBJCOPY) --only-keep-debug $< $@.debug && \
  1849    $(PRIVATE_NM) -D $< --format=posix --defined-only | awk '{ print $$1 }' | sort >$@.dynsyms && \
  1850    $(PRIVATE_NM) $< --format=posix --defined-only | awk '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort >$@.funcsyms && \
  1851    comm -13 $@.dynsyms $@.funcsyms >$@.keep_symbols && \
  1852    echo >>$@.keep_symbols && \
  1853    $(PRIVATE_OBJCOPY) --rename-section .debug_frame=saved_debug_frame $@.debug $@.mini_debuginfo && \
  1854    $(PRIVATE_OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$@.keep_symbols $@.mini_debuginfo && \
  1855    $(PRIVATE_OBJCOPY) --rename-section saved_debug_frame=.debug_frame $@.mini_debuginfo && \
  1856    rm -f $@.mini_debuginfo.xz && \
  1857    xz $@.mini_debuginfo && \
  1858    $(PRIVATE_OBJCOPY) --add-section .gnu_debugdata=$@.mini_debuginfo.xz $@; \
  1859  else \
  1860    cp -f $< $@; \
  1861  fi
  1862  endef
  1863  
  1864  define transform-to-stripped-keep-symbols
  1865  @echo "$($(PRIVATE_PREFIX)DISPLAY) Strip (keep symbols): $(PRIVATE_MODULE) ($@)"
  1866  @mkdir -p $(dir $@)
  1867  $(hide) $(PRIVATE_OBJCOPY) \
  1868      `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \
  1869      $(TARGET_STRIP_KEEP_SYMBOLS_EXTRA) $< $@
  1870  endef
  1871  
  1872  ###########################################################
  1873  ## Commands for packing a target executable or library
  1874  ###########################################################
  1875  
  1876  define pack-elf-relocations
  1877  @echo "$($(PRIVATE_PREFIX)DISPLAY) Pack Relocations: $(PRIVATE_MODULE) ($@)"
  1878  $(copy-file-to-target)
  1879  $(hide) $(RELOCATION_PACKER) $@
  1880  endef
  1881  
  1882  ###########################################################
  1883  ## Commands for running gcc to link an executable
  1884  ###########################################################
  1885  
  1886  define transform-o-to-executable-inner
  1887  $(hide) $(PRIVATE_CXX) -pie \
  1888  	-nostdlib -Bdynamic \
  1889  	-Wl,-dynamic-linker,$(PRIVATE_LINKER) \
  1890  	-Wl,--gc-sections \
  1891  	-Wl,-z,nocopyreloc \
  1892  	-Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \
  1893  	$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O) \
  1894  	$(PRIVATE_ALL_OBJECTS) \
  1895  	-Wl,--whole-archive \
  1896  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1897  	-Wl,--no-whole-archive \
  1898  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
  1899  	$(PRIVATE_ALL_STATIC_LIBRARIES) \
  1900  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
  1901  	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
  1902  	$(PRIVATE_TARGET_LIBATOMIC) \
  1903  	$(PRIVATE_TARGET_LIBGCC) \
  1904  	$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
  1905  	$(PRIVATE_LDFLAGS) \
  1906  	$(PRIVATE_ALL_SHARED_LIBRARIES) \
  1907  	-o $@ \
  1908  	$(PRIVATE_TARGET_CRTEND_O) \
  1909  	$(PRIVATE_LDLIBS)
  1910  endef
  1911  
  1912  define transform-o-to-executable
  1913  @echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)"
  1914  @mkdir -p $(dir $@)
  1915  $(transform-o-to-executable-inner)
  1916  endef
  1917  
  1918  
  1919  ###########################################################
  1920  ## Commands for linking a static executable. In practice,
  1921  ## we only use this on arm, so the other platforms don't
  1922  ## have transform-o-to-static-executable defined.
  1923  ## Clang driver needs -static to create static executable.
  1924  ## However, bionic/linker uses -shared to overwrite.
  1925  ## Linker for x86 targets does not allow coexistance of -static and -shared,
  1926  ## so we add -static only if -shared is not used.
  1927  ###########################################################
  1928  
  1929  define transform-o-to-static-executable-inner
  1930  $(hide) $(PRIVATE_CXX) \
  1931  	-nostdlib -Bstatic \
  1932  	$(if $(filter $(PRIVATE_LDFLAGS),-shared),,-static) \
  1933  	-Wl,--gc-sections \
  1934  	-o $@ \
  1935  	$(PRIVATE_TARGET_CRTBEGIN_STATIC_O) \
  1936  	$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
  1937  	$(PRIVATE_LDFLAGS) \
  1938  	$(PRIVATE_ALL_OBJECTS) \
  1939  	-Wl,--whole-archive \
  1940  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1941  	-Wl,--no-whole-archive \
  1942  	$(filter-out %libcompiler_rt.a,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \
  1943  	-Wl,--start-group \
  1944  	$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
  1945  	$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
  1946  	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
  1947  	$(PRIVATE_TARGET_LIBATOMIC) \
  1948  	$(filter %libcompiler_rt.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
  1949  	$(PRIVATE_TARGET_LIBGCC) \
  1950  	-Wl,--end-group \
  1951  	$(PRIVATE_TARGET_CRTEND_O)
  1952  endef
  1953  
  1954  define transform-o-to-static-executable
  1955  @echo "$($(PRIVATE_PREFIX)DISPLAY) StaticExecutable: $(PRIVATE_MODULE) ($@)"
  1956  @mkdir -p $(dir $@)
  1957  $(transform-o-to-static-executable-inner)
  1958  endef
  1959  
  1960  
  1961  ###########################################################
  1962  ## Commands for running gcc to link a host executable
  1963  ###########################################################
  1964  ifdef BUILD_HOST_static
  1965  HOST_FPIE_FLAGS :=
  1966  else
  1967  HOST_FPIE_FLAGS := -pie
  1968  # Force the correct entry point to workaround a bug in binutils that manifests with -pie
  1969  ifeq ($(HOST_CROSS_OS),windows)
  1970  HOST_CROSS_FPIE_FLAGS += -Wl,-e_mainCRTStartup
  1971  endif
  1972  endif
  1973  
  1974  ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
  1975  define transform-host-o-to-executable-inner
  1976  $(hide) $(PRIVATE_CXX) \
  1977  	$(PRIVATE_ALL_OBJECTS) \
  1978  	-Wl,--whole-archive \
  1979  	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
  1980  	-Wl,--no-whole-archive \
  1981  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
  1982  	$(PRIVATE_ALL_STATIC_LIBRARIES) \
  1983  	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
  1984  	$(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \
  1985  	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \
  1986  	$(PRIVATE_ALL_SHARED_LIBRARIES) \
  1987  	-Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \
  1988  	$(foreach path,$(PRIVATE_RPATHS), \
  1989  	  -Wl,-rpath,\$$ORIGIN/$(path)) \
  1990  	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
  1991  		$(PRIVATE_HOST_GLOBAL_LDFLAGS) \
  1992  	) \
  1993  	$(PRIVATE_LDFLAGS) \
  1994  	-o $@ \
  1995  	$(PRIVATE_LDLIBS)
  1996  endef
  1997  endif
  1998  
  1999  define transform-host-o-to-executable
  2000  @echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)"
  2001  @mkdir -p $(dir $@)
  2002  $(transform-host-o-to-executable-inner)
  2003  endef
  2004  
  2005  
  2006  ###########################################################
  2007  ## Commands for running javac to make .class files
  2008  ###########################################################
  2009  
  2010  # b/37750224
  2011  AAPT_ASAN_OPTIONS := ASAN_OPTIONS=detect_leaks=0
  2012  
  2013  # TODO: Right now we generate the asset resources twice, first as part
  2014  # of generating the Java classes, then at the end when packaging the final
  2015  # assets.  This should be changed to do one of two things: (1) Don't generate
  2016  # any resource files the first time, only create classes during that stage;
  2017  # or (2) Don't use the -c flag with the second stage, instead taking the
  2018  # resource files from the first stage as additional input.  My original intent
  2019  # was to use approach (2), but this requires a little more work in the tool.
  2020  # Maybe we should just use approach (1).
  2021  
  2022  # This rule creates the R.java and Manifest.java files, both of which
  2023  # are PRODUCT-neutral.  Don't pass PRIVATE_PRODUCT_AAPT_CONFIG to this invocation.
  2024  define create-resource-java-files
  2025  @mkdir -p $(dir $(PRIVATE_RESOURCE_PUBLICS_OUTPUT))
  2026  rm -rf $(PRIVATE_JAVA_GEN_DIR)
  2027  mkdir -p $(PRIVATE_JAVA_GEN_DIR)
  2028  $(hide) $(AAPT_ASAN_OPTIONS) $(AAPT) package $(PRIVATE_AAPT_FLAGS) -m \
  2029      $(eval # PRIVATE_PRODUCT_AAPT_CONFIG is intentionally missing-- see comment.) \
  2030      $(addprefix -J , $(PRIVATE_JAVA_GEN_DIR)) \
  2031      $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
  2032      $(addprefix -P , $(PRIVATE_RESOURCE_PUBLICS_OUTPUT)) \
  2033      $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \
  2034      $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
  2035      $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
  2036      $(addprefix -G , $(PRIVATE_PROGUARD_OPTIONS_FILE)) \
  2037      $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  2038      $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  2039      $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
  2040      $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
  2041      $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
  2042      $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
  2043      --skip-symbols-without-default-localization
  2044  $(SOONG_ZIP) -o $(PRIVATE_SRCJAR) -C $(PRIVATE_JAVA_GEN_DIR) -D $(PRIVATE_JAVA_GEN_DIR)
  2045  # So that we re-run aapt when the list of input files change
  2046  $(hide) echo $(PRIVATE_RESOURCE_LIST) >/dev/null
  2047  endef
  2048  
  2049  # Search for generated R.java/Manifest.java in $1, copy the found R.java as $2.
  2050  # Also copy them to a central 'R' directory to make it easier to add the files to an IDE.
  2051  define find-generated-R.java
  2052  $(hide) for GENERATED_MANIFEST_FILE in `find $(1) \
  2053    -name Manifest.java 2> /dev/null`; do \
  2054      dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_MANIFEST_FILE`; \
  2055      mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
  2056      $(ACP) -fp $$GENERATED_MANIFEST_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
  2057    done;
  2058  $(hide) for GENERATED_R_FILE in `find $(1) \
  2059    -name R.java 2> /dev/null`; do \
  2060      dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_R_FILE`; \
  2061      mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
  2062      $(ACP) -fp $$GENERATED_R_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir \
  2063        || exit 31; \
  2064      $(ACP) -fp $$GENERATED_R_FILE $(2) || exit 32; \
  2065    done;
  2066  @# Ensure that the target file is always created, i.e. also in case we did not
  2067  @# enter the GENERATED_R_FILE-loop above. This avoids unnecessary rebuilding.
  2068  $(hide) touch $(2)
  2069  endef
  2070  
  2071  ###########################################################
  2072  # AAPT2 compilation and link
  2073  ###########################################################
  2074  define aapt2-compile-one-resource-file
  2075  @mkdir -p $(dir $@)
  2076  $(hide) $(AAPT2) compile -o $(dir $@) $(PRIVATE_AAPT2_CFLAGS) --legacy $<
  2077  endef
  2078  
  2079  define aapt2-compile-resource-dirs
  2080  @mkdir -p $(dir $@)
  2081  $(hide) $(AAPT2) compile -o $@ $(addprefix --dir ,$(PRIVATE_SOURCE_RES_DIRS)) \
  2082    $(PRIVATE_AAPT2_CFLAGS) --legacy
  2083  endef
  2084  
  2085  # TODO(b/74574557): use aapt2 compile --zip if it gets implemented
  2086  define aapt2-compile-resource-zips
  2087  @mkdir -p $(dir $@)
  2088  $(ZIPSYNC) -d $@.contents -l $@.list $(PRIVATE_SOURCE_RES_ZIPS)
  2089  $(hide) $(AAPT2) compile -o $@ --dir $@.contents $(PRIVATE_AAPT2_CFLAGS) --legacy
  2090  endef
  2091  
  2092  # Set up rule to compile one resource file with aapt2.
  2093  # Must be called with $(eval).
  2094  # $(1): the source file
  2095  # $(2): the output file
  2096  define aapt2-compile-one-resource-file-rule
  2097  $(2) : $(1) $(AAPT2)
  2098  	@echo "AAPT2 compile $$@ <- $$<"
  2099  	$$(call aapt2-compile-one-resource-file)
  2100  endef
  2101  
  2102  # Convert input resource file path to output file path.
  2103  # values-[config]/<file>.xml -> values-[config]_<file>.arsc.flat;
  2104  # For other resource file, just replace the last "/" with "_" and
  2105  # add .flat extension.
  2106  #
  2107  # $(1): the input resource file path
  2108  # $(2): the base dir of the output file path
  2109  # Returns: the compiled output file path
  2110  define aapt2-compiled-resource-out-file
  2111  $(eval _p_w := $(strip $(subst /,$(space),$(dir $(1)))))$(2)/$(subst $(space),/,$(_p_w))_$(if $(filter values%,$(lastword $(_p_w))),$(patsubst %.xml,%.arsc,$(notdir $(1))),$(notdir $(1))).flat
  2112  endef
  2113  
  2114  define aapt2-link
  2115  @mkdir -p $(dir $@)
  2116  rm -rf $(PRIVATE_JAVA_GEN_DIR)
  2117  mkdir -p $(PRIVATE_JAVA_GEN_DIR)
  2118  $(call dump-words-to-file,$(PRIVATE_RES_FLAT),$(dir $@)aapt2-flat-list)
  2119  $(call dump-words-to-file,$(PRIVATE_OVERLAY_FLAT),$(dir $@)aapt2-flat-overlay-list)
  2120  $(hide) $(AAPT2) link -o $@ \
  2121    $(PRIVATE_AAPT_FLAGS) \
  2122    $(if $(PRIVATE_STATIC_LIBRARY_EXTRA_PACKAGES),$$(cat $(PRIVATE_STATIC_LIBRARY_EXTRA_PACKAGES))) \
  2123    $(addprefix --manifest ,$(PRIVATE_ANDROID_MANIFEST)) \
  2124    $(addprefix -I ,$(PRIVATE_AAPT_INCLUDES)) \
  2125    $(addprefix -I ,$(PRIVATE_SHARED_ANDROID_LIBRARIES)) \
  2126    $(addprefix -A ,$(PRIVATE_ASSET_DIR)) \
  2127    $(addprefix --java ,$(PRIVATE_JAVA_GEN_DIR)) \
  2128    $(addprefix --proguard ,$(PRIVATE_PROGUARD_OPTIONS_FILE)) \
  2129    $(addprefix --min-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  2130    $(addprefix --target-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  2131    $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product ,$(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \
  2132    $(addprefix -c ,$(PRIVATE_PRODUCT_AAPT_CONFIG)) \
  2133    $(addprefix --preferred-density ,$(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \
  2134    $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
  2135    $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
  2136    $(addprefix --rename-manifest-package ,$(PRIVATE_MANIFEST_PACKAGE_NAME)) \
  2137    $(addprefix --rename-instrumentation-target-package ,$(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
  2138    -R \@$(dir $@)aapt2-flat-overlay-list \
  2139    \@$(dir $@)aapt2-flat-list
  2140  $(SOONG_ZIP) -o $(PRIVATE_SRCJAR) -C $(PRIVATE_JAVA_GEN_DIR) -D $(PRIVATE_JAVA_GEN_DIR)
  2141  $(EXTRACT_JAR_PACKAGES) -i $(PRIVATE_SRCJAR) -o $(PRIVATE_AAPT_EXTRA_PACKAGES) --prefix '--extra-packages '
  2142  endef
  2143  
  2144  ###########################################################
  2145  xlint_unchecked := -Xlint:unchecked
  2146  
  2147  # emit-line, <word list>, <output file>
  2148  define emit-line
  2149     $(if $(1),echo -n '$(strip $(1)) ' >> $(2))
  2150  endef
  2151  
  2152  # dump-words-to-file, <word list>, <output file>
  2153  define dump-words-to-file
  2154          @rm -f $(2)
  2155          @touch $(2)
  2156          @$(call emit-line,$(wordlist 1,500,$(1)),$(2))
  2157          @$(call emit-line,$(wordlist 501,1000,$(1)),$(2))
  2158          @$(call emit-line,$(wordlist 1001,1500,$(1)),$(2))
  2159          @$(call emit-line,$(wordlist 1501,2000,$(1)),$(2))
  2160          @$(call emit-line,$(wordlist 2001,2500,$(1)),$(2))
  2161          @$(call emit-line,$(wordlist 2501,3000,$(1)),$(2))
  2162          @$(call emit-line,$(wordlist 3001,3500,$(1)),$(2))
  2163          @$(call emit-line,$(wordlist 3501,4000,$(1)),$(2))
  2164          @$(call emit-line,$(wordlist 4001,4500,$(1)),$(2))
  2165          @$(call emit-line,$(wordlist 4501,5000,$(1)),$(2))
  2166          @$(call emit-line,$(wordlist 5001,5500,$(1)),$(2))
  2167          @$(call emit-line,$(wordlist 5501,6000,$(1)),$(2))
  2168          @$(call emit-line,$(wordlist 6001,6500,$(1)),$(2))
  2169          @$(call emit-line,$(wordlist 6501,7000,$(1)),$(2))
  2170          @$(call emit-line,$(wordlist 7001,7500,$(1)),$(2))
  2171          @$(call emit-line,$(wordlist 7501,8000,$(1)),$(2))
  2172          @$(call emit-line,$(wordlist 8001,8500,$(1)),$(2))
  2173          @$(call emit-line,$(wordlist 8501,9000,$(1)),$(2))
  2174          @$(call emit-line,$(wordlist 9001,9500,$(1)),$(2))
  2175          @$(call emit-line,$(wordlist 9501,10000,$(1)),$(2))
  2176          @$(call emit-line,$(wordlist 10001,10500,$(1)),$(2))
  2177          @$(call emit-line,$(wordlist 10501,11000,$(1)),$(2))
  2178          @$(call emit-line,$(wordlist 11001,11500,$(1)),$(2))
  2179          @$(call emit-line,$(wordlist 11501,12000,$(1)),$(2))
  2180          @$(call emit-line,$(wordlist 12001,12500,$(1)),$(2))
  2181          @$(call emit-line,$(wordlist 12501,13000,$(1)),$(2))
  2182          @$(call emit-line,$(wordlist 13001,13500,$(1)),$(2))
  2183          @$(if $(wordlist 13501,13502,$(1)),$(error Too many words ($(words $(1)))))
  2184  endef
  2185  
  2186  # For a list of jar files, unzip them to a specified directory,
  2187  # but make sure that no META-INF files come along for the ride,
  2188  # unless PRIVATE_DONT_DELETE_JAR_META_INF is set.
  2189  #
  2190  # $(1): files to unzip
  2191  # $(2): destination directory
  2192  define unzip-jar-files
  2193    $(hide) for f in $(1); \
  2194    do \
  2195      if [ ! -f $$f ]; then \
  2196        echo Missing file $$f; \
  2197        exit 1; \
  2198      fi; \
  2199      unzip -qo $$f -d $(2); \
  2200      rm -f $(2)/module-info.class; \
  2201    done
  2202    $(if $(PRIVATE_DONT_DELETE_JAR_META_INF),,$(hide) rm -rf $(2)/META-INF)
  2203  endef
  2204  
  2205  # Return jar arguments to compress files in a given directory
  2206  # $(1): directory
  2207  #
  2208  # Returns an @-file argument that contains the output of a subshell
  2209  # that looks like -C $(1) path/to/file1 -C $(1) path/to/file2
  2210  # Also adds "-C out/empty ." which avoids errors in jar when
  2211  # there are no files in the directory.
  2212  define jar-args-sorted-files-in-directory
  2213      @<(find $(1) -type f | sort | $(JAR_ARGS) $(1); echo "-C $(EMPTY_DIRECTORY) .")
  2214  endef
  2215  
  2216  # append additional Java sources(resources/Proto sources, and etc) to $(1).
  2217  define fetch-additional-java-source
  2218  $(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
  2219      find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' -and -not -name '.*' >> $(1); \
  2220  fi
  2221  $(if $(PRIVATE_HAS_PROTO_SOURCES), \
  2222      $(hide) find $(PRIVATE_PROTO_SOURCE_INTERMEDIATES_DIR) -name '*.java' -and -not -name '.*' >> $(1))
  2223  endef
  2224  
  2225  # Some historical notes:
  2226  # - below we write the list of java files to java-source-list to avoid argument
  2227  #   list length problems with Cygwin
  2228  # - we filter out duplicate java file names because eclipse's compiler
  2229  #   doesn't like them.
  2230  define write-java-source-list
  2231  @echo "$($(PRIVATE_PREFIX)DISPLAY) Java source list: $(PRIVATE_MODULE)"
  2232  $(hide) rm -f $@
  2233  $(call dump-words-to-file,$(sort $(PRIVATE_JAVA_SOURCES)),$@.tmp)
  2234  $(call fetch-additional-java-source,$@.tmp)
  2235  $(hide) tr ' ' '\n' < $@.tmp | $(NORMALIZE_PATH) | sort -u > $@
  2236  endef
  2237  
  2238  # Common definition to invoke javac on the host and target.
  2239  #
  2240  # $(1): javac
  2241  # $(2): classpath_libs
  2242  define compile-java
  2243  $(hide) rm -f $@
  2244  $(hide) rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(PRIVATE_ANNO_INTERMEDIATES_DIR)
  2245  $(hide) mkdir -p $(dir $@)
  2246  $(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(PRIVATE_ANNO_INTERMEDIATES_DIR)
  2247  $(if $(PRIVATE_SRCJARS),\
  2248      $(ZIPSYNC) -d $(PRIVATE_SRCJAR_INTERMEDIATES_DIR) -l $(PRIVATE_SRCJAR_LIST_FILE) -f "*.java" $(PRIVATE_SRCJARS))
  2249  $(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) $(if $(PRIVATE_SRCJARS),-o -s $(PRIVATE_SRCJAR_LIST_FILE) )] ; then \
  2250      $(SOONG_JAVAC_WRAPPER) $(JAVAC_WRAPPER) $(1) -encoding UTF-8 \
  2251      $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
  2252      $(if $(PRIVATE_USE_SYSTEM_MODULES), \
  2253        $(addprefix --system=,$(PRIVATE_SYSTEM_MODULES_DIR)), \
  2254        $(addprefix -bootclasspath ,$(strip \
  2255            $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH)) \
  2256            $(PRIVATE_EMPTY_BOOTCLASSPATH)))) \
  2257      $(if $(PRIVATE_USE_SYSTEM_MODULES), \
  2258        $(if $(PRIVATE_PATCH_MODULE), \
  2259          --patch-module=$(PRIVATE_PATCH_MODULE)=$(call normalize-path-list,. $(2)))) \
  2260      $(addprefix -classpath ,$(call normalize-path-list,$(strip \
  2261        $(if $(PRIVATE_USE_SYSTEM_MODULES), \
  2262          $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \
  2263        $(2)))) \
  2264      $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
  2265      -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) -s $(PRIVATE_ANNO_INTERMEDIATES_DIR) \
  2266      $(PRIVATE_JAVACFLAGS) \
  2267      \@$(PRIVATE_JAVA_SOURCE_LIST) \
  2268      $(if $(PRIVATE_SRCJARS),\@$(PRIVATE_SRCJAR_LIST_FILE)) \
  2269      || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \
  2270  fi
  2271  $(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/make/tools/java-layers.py \
  2272      $(PRIVATE_JAVA_LAYERS_FILE) @$(PRIVATE_JAVA_SOURCE_LIST),)
  2273  $(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
  2274      -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \
  2275      $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \
  2276      | xargs rm -rf)
  2277  $(if $(PRIVATE_JAR_PACKAGES), \
  2278      $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \
  2279          $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \
  2280              -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \
  2281          find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete)
  2282  $(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \
  2283      $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \
  2284          $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))))
  2285  $(hide) $(JAR) -cf $@ $(call jar-args-sorted-files-in-directory,$(PRIVATE_CLASS_INTERMEDIATES_DIR))
  2286  $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@))
  2287  endef
  2288  
  2289  define transform-java-to-header.jar
  2290  @echo "$($(PRIVATE_PREFIX)DISPLAY) Turbine: $(PRIVATE_MODULE)"
  2291  @mkdir -p $(dir $@)
  2292  @rm -rf $(dir $@)/classes-turbine
  2293  @mkdir $(dir $@)/classes-turbine
  2294  $(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) -o -n "$(PRIVATE_SRCJARS)" ] ; then \
  2295      $(JAVA) -jar $(TURBINE) \
  2296      --output $@.premerged --temp_dir $(dir $@)/classes-turbine \
  2297      --sources \@$(PRIVATE_JAVA_SOURCE_LIST) --source_jars $(PRIVATE_SRCJARS) \
  2298      --javacopts $(PRIVATE_JAVACFLAGS) $(COMMON_JDK_FLAGS) \
  2299      $(addprefix --bootclasspath ,$(strip \
  2300           $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH)) \
  2301           $(PRIVATE_EMPTY_BOOTCLASSPATH))) \
  2302      $(addprefix --classpath ,$(strip \
  2303          $(call normalize-path-list,$(PRIVATE_ALL_JAVA_HEADER_LIBRARIES)))) \
  2304      || ( rm -rf $(dir $@)/classes-turbine ; exit 41 ) && \
  2305      $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $@.premerged $(call reverse-list,$(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES)) ; \
  2306  else \
  2307      $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $(call reverse-list,$(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES)) ; \
  2308  fi
  2309  $(hide) $(ZIPTIME) $@.tmp
  2310  $(hide) $(call commit-change-for-toc,$@)
  2311  endef
  2312  
  2313  # Moves $1.tmp to $1 if necessary. This is designed to be used with
  2314  # .KATI_RESTAT. For kati, this function doesn't update the timestamp
  2315  # of $1 when $1.tmp is identical to $1 so that ninja won't rebuild
  2316  # targets which depend on $1.
  2317  define commit-change-for-toc
  2318  $(hide) if cmp -s $1.tmp $1 ; then \
  2319   rm $1.tmp ; \
  2320  else \
  2321   mv $1.tmp $1 ; \
  2322  fi
  2323  endef
  2324  
  2325  ifeq (,$(TARGET_BUILD_APPS))
  2326  
  2327  ## Rule to create a table of contents from a .dex file.
  2328  ## Must be called with $(eval).
  2329  # $(1): The directory which contains classes*.dex files
  2330  define _transform-dex-to-toc
  2331  $1/classes.dex.toc: PRIVATE_INPUT_DEX_FILES := $1/classes*.dex
  2332  $1/classes.dex.toc: $1/classes.dex $(DEXDUMP)
  2333  	@echo Generating TOC: $$@
  2334  	$(hide) ANDROID_LOG_TAGS="*:e" $(DEXDUMP) -l xml $$(PRIVATE_INPUT_DEX_FILES) > $$@.tmp
  2335  	$$(call commit-change-for-toc,$$@)
  2336  endef
  2337  
  2338  ## Define a rule which generates .dex.toc and mark it as .KATI_RESTAT.
  2339  # $(1): The directory which contains classes*.dex files
  2340  define define-dex-to-toc-rule
  2341  $(eval $(call _transform-dex-to-toc,$1))\
  2342  $(eval .KATI_RESTAT: $1/classes.dex.toc)
  2343  endef
  2344  
  2345  else
  2346  
  2347  # Turn off .toc optimization for apps build as we cannot build dexdump.
  2348  define define-dex-to-toc-rule
  2349  endef
  2350  
  2351  endif  # TARGET_BUILD_APPS
  2352  
  2353  
  2354  # Takes an sdk version that might be PLATFORM_VERSION_CODENAME (for example P),
  2355  # returns a number greater than the highest existing sdk version if it is, or
  2356  # the input if it is not.
  2357  define codename-or-sdk-to-sdk
  2358  $(if $(filter $(1),$(PLATFORM_VERSION_CODENAME)),10000,$(1))
  2359  endef
  2360  
  2361  # --add-opens is required because desugar reflects via java.lang.invoke.MethodHandles.Lookup
  2362  define desugar-classes-jar
  2363  @echo Desugar: $@
  2364  @mkdir -p $(dir $@)
  2365  $(hide) rm -f $@ $@.tmp
  2366  @rm -rf $(dir $@)/desugar_dumped_classes
  2367  @mkdir $(dir $@)/desugar_dumped_classes
  2368  $(hide) $(JAVA) \
  2369      $(if $(USE_OPENJDK9),--add-opens java.base/java.lang.invoke=ALL-UNNAMED,) \
  2370      -Djdk.internal.lambda.dumpProxyClasses=$(abspath $(dir $@))/desugar_dumped_classes \
  2371      -jar $(DESUGAR) \
  2372      $(addprefix --bootclasspath_entry ,$(PRIVATE_BOOTCLASSPATH)) \
  2373      $(addprefix --classpath_entry ,$(PRIVATE_SHARED_JAVA_HEADER_LIBRARIES)) \
  2374      --min_sdk_version $(call codename-or-sdk-to-sdk,$(PRIVATE_MIN_SDK_VERSION)) \
  2375      --allow_empty_bootclasspath \
  2376      $(if $(filter --core-library,$(PRIVATE_DX_FLAGS)),--core_library) \
  2377      -i $< -o $@.tmp
  2378      mv $@.tmp $@
  2379  endef
  2380  
  2381  
  2382  define transform-classes.jar-to-dex
  2383  @echo "target Dex: $(PRIVATE_MODULE)"
  2384  @mkdir -p $(dir $@)
  2385  $(hide) rm -f $(dir $@)classes*.dex
  2386  $(hide) $(DX_COMMAND) \
  2387      --dex --output=$(dir $@) \
  2388      --min-sdk-version=$(PRIVATE_MIN_SDK_VERSION) \
  2389      $(if $(NO_OPTIMIZE_DX), \
  2390          --no-optimize) \
  2391      $(if $(GENERATE_DEX_DEBUG), \
  2392  	    --debug --verbose \
  2393  	    --dump-to=$(@:.dex=.lst) \
  2394  	    --dump-width=1000) \
  2395      $(PRIVATE_DX_FLAGS) \
  2396      $<
  2397  endef
  2398  
  2399  
  2400  define transform-classes-d8.jar-to-dex
  2401  @echo "target Dex: $(PRIVATE_MODULE)"
  2402  @mkdir -p $(dir $@)
  2403  $(hide) rm -f $(dir $@)classes*.dex $(dir $@)d8_input.jar
  2404  $(hide) $(ZIP2ZIP) -j -i $< -o $(dir $@)d8_input.jar "**/*.class"
  2405  $(hide) $(DX_COMMAND) \
  2406      --output $(dir $@) \
  2407      --min-api $(PRIVATE_MIN_SDK_VERSION) \
  2408      $(subst --main-dex-list=, --main-dex-list , \
  2409          $(filter-out --core-library --multi-dex --minimal-main-dex,$(PRIVATE_DX_FLAGS))) \
  2410      $(dir $@)d8_input.jar
  2411  $(hide) rm -f $(dir $@)d8_input.jar
  2412  endef
  2413  
  2414  # Create a mostly-empty .jar file that we'll add to later.
  2415  # The MacOS jar tool doesn't like creating empty jar files,
  2416  # so we need to give it something.
  2417  # $(1) package to create
  2418  define create-empty-package-at
  2419  @mkdir -p $(dir $(1))
  2420  $(hide) touch $(dir $(1))zipdummy
  2421  $(hide) $(JAR) cf $(1) -C $(dir $(1)) zipdummy
  2422  $(hide) zip -qd $(1) zipdummy
  2423  $(hide) rm $(dir $(1))zipdummy
  2424  endef
  2425  
  2426  # Create a mostly-empty .jar file that we'll add to later.
  2427  # The MacOS jar tool doesn't like creating empty jar files,
  2428  # so we need to give it something.
  2429  define create-empty-package
  2430  $(call create-empty-package-at,$@)
  2431  endef
  2432  
  2433  # Copy an arhchive file and delete any class files and empty folders inside.
  2434  # $(1): the source archive file.
  2435  # $(2): the destination archive file.
  2436  define initialize-package-file
  2437  @mkdir -p $(dir $(2))
  2438  $(hide) cp -f $(1) $(2)
  2439  $(hide) zip -qd $(2) "*.class" \
  2440      $(if $(strip $(PRIVATE_DONT_DELETE_JAR_DIRS)),,"*/") \
  2441      || true # Ignore the error when nothing to delete.
  2442  endef
  2443  
  2444  #TODO: we kinda want to build different asset packages for
  2445  #      different configurations, then combine them later (or something).
  2446  #      Per-locale, etc.
  2447  #      A list of dynamic and static parameters;  build layers for
  2448  #      dynamic params that lay over the static ones.
  2449  #TODO: update the manifest to point to the package file
  2450  #Note that the version numbers are given to aapt as simple default
  2451  #values; applications can override these by explicitly stating
  2452  #them in their manifest.
  2453  define add-assets-to-package
  2454  $(hide) $(AAPT_ASAN_OPTIONS) $(AAPT) package -u $(PRIVATE_AAPT_FLAGS) \
  2455      $(addprefix -c , $(PRIVATE_PRODUCT_AAPT_CONFIG)) \
  2456      $(addprefix --preferred-density , $(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \
  2457      $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
  2458      $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \
  2459      $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
  2460      $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
  2461      $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  2462      $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  2463      $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \
  2464      $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
  2465      $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
  2466      $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
  2467      $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
  2468      --skip-symbols-without-default-localization \
  2469      -F $@
  2470  # So that we re-run aapt when the list of input files change
  2471  $(hide) echo $(PRIVATE_RESOURCE_LIST) >/dev/null
  2472  endef
  2473  
  2474  # We need the extra blank line, so that the command will be on a separate line.
  2475  # $(1): the ABI name
  2476  # $(2): the list of shared libraies
  2477  define _add-jni-shared-libs-to-package-per-abi
  2478  $(hide) cp $(2) $(dir $@)lib/$(1)
  2479  
  2480  endef
  2481  
  2482  # For apps_only build, don't uncompress/page-align the jni libraries,
  2483  # because the apk may be run on older platforms that don't support loading jni directly from apk.
  2484  ifdef TARGET_BUILD_APPS
  2485  JNI_COMPRESS_FLAGS :=
  2486  ZIPALIGN_PAGE_ALIGN_FLAGS :=
  2487  else
  2488  JNI_COMPRESS_FLAGS := -0
  2489  ZIPALIGN_PAGE_ALIGN_FLAGS := -p
  2490  endif
  2491  
  2492  define add-jni-shared-libs-to-package
  2493  $(hide) rm -rf $(dir $@)lib
  2494  $(hide) mkdir -p $(addprefix $(dir $@)lib/,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI))
  2495  $(foreach abi,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI),\
  2496    $(call _add-jni-shared-libs-to-package-per-abi,$(abi),\
  2497      $(patsubst $(abi):%,%,$(filter $(abi):%,$(PRIVATE_JNI_SHARED_LIBRARIES)))))
  2498  $(hide) (cd $(dir $@) && zip -qrX $(JNI_COMPRESS_FLAGS) $(notdir $@) lib)
  2499  $(hide) rm -rf $(dir $@)lib
  2500  endef
  2501  
  2502  #TODO: update the manifest to point to the dex file
  2503  define add-dex-to-package
  2504  $(call add-dex-to-package-arg,$@)
  2505  endef
  2506  
  2507  # $(1): the package file.
  2508  define add-dex-to-package-arg
  2509  $(hide) find $(dir $(PRIVATE_DEX_FILE)) -maxdepth 1 -name "classes*.dex" | sort | xargs zip -qjX $(1)
  2510  endef
  2511  
  2512  # Add java resources added by the current module.
  2513  # $(1) destination package
  2514  #
  2515  define add-java-resources-to
  2516  $(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(1).jar-arg-list)
  2517  $(hide) $(JAR) uf $(1) @$(1).jar-arg-list
  2518  @rm -f $(1).jar-arg-list
  2519  endef
  2520  
  2521  # Add resources (non .class files) from a jar to a package
  2522  # $(1): the package file
  2523  # $(2): the jar file
  2524  # $(3): temporary directory
  2525  define add-jar-resources-to-package
  2526    rm -rf $(3)
  2527    mkdir -p $(3)
  2528    unzip -qo $(2) -d $(3) $$(zipinfo -1 $(2) | grep -v -E "\.class$$")
  2529    $(JAR) uf $(1) $(call jar-args-sorted-files-in-directory,$(3))
  2530  endef
  2531  
  2532  # Sign a package using the specified key/cert.
  2533  #
  2534  define sign-package
  2535  $(call sign-package-arg,$@)
  2536  endef
  2537  
  2538  # $(1): the package file we are signing.
  2539  define sign-package-arg
  2540  $(hide) mv $(1) $(1).unsigned
  2541  $(hide) $(JAVA) -Djava.library.path=$(SIGNAPK_JNI_LIBRARY_PATH) -jar $(SIGNAPK_JAR) \
  2542      $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \
  2543      $(PRIVATE_ADDITIONAL_CERTIFICATES) $(1).unsigned $(1).signed
  2544  $(hide) mv $(1).signed $(1)
  2545  endef
  2546  
  2547  # Align STORED entries of a package on 4-byte boundaries to make them easier to mmap.
  2548  #
  2549  define align-package
  2550  $(hide) if ! $(ZIPALIGN) -c $(ZIPALIGN_PAGE_ALIGN_FLAGS) 4 $@ >/dev/null ; then \
  2551    mv $@ $@.unaligned; \
  2552    $(ZIPALIGN) \
  2553      -f \
  2554      $(ZIPALIGN_PAGE_ALIGN_FLAGS) \
  2555      4 \
  2556      $@.unaligned $@.aligned; \
  2557    mv $@.aligned $@; \
  2558    fi
  2559  endef
  2560  
  2561  # Compress a package using the standard gzip algorithm.
  2562  define compress-package
  2563  $(hide) \
  2564    mv $@ $@.uncompressed; \
  2565    $(MINIGZIP) -c $@.uncompressed > $@.compressed; \
  2566    rm -f $@.uncompressed; \
  2567    mv $@.compressed $@;
  2568  endef
  2569  
  2570  # Remove dynamic timestamps from packages
  2571  #
  2572  define remove-timestamps-from-package
  2573  $(hide) $(ZIPTIME) $@
  2574  endef
  2575  
  2576  # Uncompress dex files embedded in an apk.
  2577  #
  2578  define uncompress-dexs
  2579  $(hide) if (zipinfo $@ '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
  2580    tmpdir=$@.tmpdir; \
  2581    rm -rf $$tmpdir && mkdir $$tmpdir; \
  2582    unzip -q $@ '*.dex' -d $$tmpdir && \
  2583    zip -qd $@ '*.dex' && \
  2584    ( cd $$tmpdir && find . -type f | sort | zip -qD -X -0 ../$(notdir $@) -@ ) && \
  2585    rm -rf $$tmpdir; \
  2586    fi
  2587  endef
  2588  
  2589  # Uncompress shared libraries embedded in an apk.
  2590  #
  2591  define uncompress-shared-libs
  2592  $(hide) if (zipinfo $@ $(PRIVATE_EMBEDDED_JNI_LIBS) 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
  2593    rm -rf $(dir $@)uncompressedlibs && mkdir $(dir $@)uncompressedlibs; \
  2594    unzip -q $@ $(PRIVATE_EMBEDDED_JNI_LIBS) -d $(dir $@)uncompressedlibs && \
  2595    zip -qd $@ 'lib/*.so' && \
  2596    ( cd $(dir $@)uncompressedlibs && find lib -type f | sort | zip -qD -X -0 ../$(notdir $@) -@ ) && \
  2597    rm -rf $(dir $@)uncompressedlibs; \
  2598    fi
  2599  endef
  2600  
  2601  # TODO(joeo): If we can ever upgrade to post 3.81 make and get the
  2602  # new prebuilt rules to work, we should change this to copy the
  2603  # resources to the out directory and then copy the resources.
  2604  
  2605  # Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR
  2606  # in transform-java-to-classes for the sake of vm-tests.
  2607  define transform-host-java-to-package
  2608  @echo "Host Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
  2609  $(call compile-java,$(HOST_JAVAC),$(PRIVATE_ALL_JAVA_LIBRARIES))
  2610  endef
  2611  
  2612  # Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR
  2613  # in transform-java-to-classes for the sake of vm-tests.
  2614  define transform-host-java-to-dalvik-package
  2615  @echo "Dalvik Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
  2616  $(call compile-java,$(HOST_JAVAC),$(PRIVATE_ALL_JAVA_HEADER_LIBRARIES))
  2617  endef
  2618  
  2619  ###########################################################
  2620  ## Commands for copying files
  2621  ###########################################################
  2622  
  2623  # Define a rule to copy a header.  Used via $(eval) by copy_headers.make.
  2624  # $(1): source header
  2625  # $(2): destination header
  2626  define copy-one-header
  2627  $(2): $(1)
  2628  	@echo "Header: $$@"
  2629  	$$(copy-file-to-new-target-with-cp)
  2630  endef
  2631  
  2632  # Define a rule to copy a file.  For use via $(eval).
  2633  # $(1): source file
  2634  # $(2): destination file
  2635  define copy-one-file
  2636  $(2): $(1)
  2637  	@echo "Copy: $$@"
  2638  	$$(copy-file-to-target)
  2639  endef
  2640  
  2641  define copy-and-uncompress-dexs
  2642  $(2): $(1) $(ZIPALIGN)
  2643  	@echo "Uncompress dexs in: $$@"
  2644  	$$(copy-file-to-target)
  2645  	$$(uncompress-dexs)
  2646  	$$(align-package)
  2647  endef
  2648  
  2649  # Copies many files.
  2650  # $(1): The files to copy.  Each entry is a ':' separated src:dst pair
  2651  # Evaluates to the list of the dst files (ie suitable for a dependency list)
  2652  define copy-many-files
  2653  $(foreach f, $(1), $(strip \
  2654      $(eval _cmf_tuple := $(subst :, ,$(f))) \
  2655      $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \
  2656      $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \
  2657      $(eval $(call copy-one-file,$(_cmf_src),$(_cmf_dest))) \
  2658      $(_cmf_dest)))
  2659  endef
  2660  
  2661  # Copy the file only if it's a well-formed xml file. For use via $(eval).
  2662  # $(1): source file
  2663  # $(2): destination file, must end with .xml.
  2664  define copy-xml-file-checked
  2665  $(2): $(1) $(XMLLINT)
  2666  	@echo "Copy xml: $$@"
  2667  	$(hide) $(XMLLINT) $$< >/dev/null  # Don't print the xml file to stdout.
  2668  	$$(copy-file-to-target)
  2669  endef
  2670  
  2671  # The -t option to acp and the -p option to cp is
  2672  # required for OSX.  OSX has a ridiculous restriction
  2673  # where it's an error for a .a file's modification time
  2674  # to disagree with an internal timestamp, and this
  2675  # macro is used to install .a files (among other things).
  2676  
  2677  # Copy a single file from one place to another,
  2678  # preserving permissions and overwriting any existing
  2679  # file.
  2680  # When we used acp, it could not handle high resolution timestamps
  2681  # on file systems like ext4. Because of that, '-t' option was disabled
  2682  # and copy-file-to-target was identical to copy-file-to-new-target.
  2683  # Keep the behavior until we audit and ensure that switching this back
  2684  # won't break anything.
  2685  define copy-file-to-target
  2686  @mkdir -p $(dir $@)
  2687  $(hide) rm -f $@
  2688  $(hide) cp "$<" "$@"
  2689  endef
  2690  
  2691  # The same as copy-file-to-target, but use the local
  2692  # cp command instead of acp.
  2693  define copy-file-to-target-with-cp
  2694  @mkdir -p $(dir $@)
  2695  $(hide) rm -f $@
  2696  $(hide) cp -p "$<" "$@"
  2697  endef
  2698  
  2699  # The same as copy-file-to-target, but strip out "# comment"-style
  2700  # comments (for config files and such).
  2701  define copy-file-to-target-strip-comments
  2702  @mkdir -p $(dir $@)
  2703  $(hide) rm -f $@
  2704  $(hide) sed -e 's/#.*$$//' -e 's/[ \t]*$$//' -e '/^$$/d' < $< > $@
  2705  endef
  2706  
  2707  # The same as copy-file-to-target, but don't preserve
  2708  # the old modification time.
  2709  define copy-file-to-new-target
  2710  @mkdir -p $(dir $@)
  2711  $(hide) rm -f $@
  2712  $(hide) cp $< $@
  2713  endef
  2714  
  2715  # The same as copy-file-to-new-target, but use the local
  2716  # cp command instead of acp.
  2717  define copy-file-to-new-target-with-cp
  2718  @mkdir -p $(dir $@)
  2719  $(hide) rm -f $@
  2720  $(hide) cp $< $@
  2721  endef
  2722  
  2723  # Copy a prebuilt file to a target location.
  2724  define transform-prebuilt-to-target
  2725  @echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)"
  2726  $(copy-file-to-target)
  2727  endef
  2728  
  2729  # Copy a prebuilt file to a target location, stripping "# comment" comments.
  2730  define transform-prebuilt-to-target-strip-comments
  2731  @echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)"
  2732  $(copy-file-to-target-strip-comments)
  2733  endef
  2734  
  2735  # Copy a list of files/directories to target location, with sub dir structure preserved.
  2736  # For example $(HOST_OUT_EXECUTABLES)/aapt -> $(staging)/bin/aapt .
  2737  # $(1): the source list of files/directories.
  2738  # $(2): the path prefix to strip. In the above example it would be $(HOST_OUT).
  2739  # $(3): the target location.
  2740  define copy-files-with-structure
  2741  $(foreach t,$(1),\
  2742    $(eval s := $(patsubst $(2)%,%,$(t)))\
  2743    $(hide) mkdir -p $(dir $(3)/$(s)); cp -Rf $(t) $(3)/$(s)$(newline))
  2744  endef
  2745  
  2746  # Define a rule to create a symlink to a file.
  2747  # $(1): full path to source
  2748  # $(2): source (may be relative)
  2749  # $(3): full path to destination
  2750  define symlink-file
  2751  $(eval $(_symlink-file))
  2752  endef
  2753  
  2754  # Order-only dependency because make/ninja will follow the link when checking
  2755  # the timestamp, so the file must exist
  2756  define _symlink-file
  2757  $(3): | $(1)
  2758  	@echo "Symlink: $$@ -> $(2)"
  2759  	@mkdir -p $(dir $$@)
  2760  	@rm -rf $$@
  2761  	$(hide) ln -sf $(2) $$@
  2762  endef
  2763  
  2764  # Copy an apk to a target location while removing classes*.dex
  2765  # $(1): source file
  2766  # $(2): destination file
  2767  # $(3): LOCAL_DEX_PREOPT, if nostripping then leave classes*.dex
  2768  define dexpreopt-copy-jar
  2769  $(2): $(1)
  2770  	@echo "Copy: $$@"
  2771  	$$(copy-file-to-target)
  2772  	$(if $(filter nostripping,$(3)),,$$(call dexpreopt-remove-classes.dex,$$@))
  2773  endef
  2774  
  2775  # $(1): the .jar or .apk to remove classes.dex. Note that if all dex files
  2776  # are uncompressed in the archive, then dexopt will not do a copy of the dex
  2777  # files and we should not strip.
  2778  define dexpreopt-remove-classes.dex
  2779  $(hide) if (zipinfo $1 '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
  2780  zip --quiet --delete $(1) classes.dex; \
  2781  dex_index=2; \
  2782  while zip --quiet --delete $(1) classes$${dex_index}.dex > /dev/null; do \
  2783    let dex_index=dex_index+1; \
  2784  done \
  2785  fi
  2786  endef
  2787  
  2788  define hiddenapi-copy-dex-files
  2789  $(2): $(1) $(HIDDENAPI) $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \
  2790        $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)
  2791  	@rm -rf $(dir $(2))
  2792  	@mkdir -p $(dir $(2))
  2793  	find $(dir $(1)) -maxdepth 1 -name "classes*.dex" | sort | \
  2794  		xargs -I{} cp -f {} $(dir $(2))
  2795  	find $(dir $(2)) -name "classes*.dex" | sort | sed 's/^/--dex=/' | \
  2796  		xargs $(HIDDENAPI) --light-greylist=$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \
  2797  		                   --dark-greylist=$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) \
  2798  		                   --blacklist=$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)
  2799  endef
  2800  
  2801  define hiddenapi-copy-soong-jar
  2802  $(2): PRIVATE_FOLDER := $(dir $(2))dex-hiddenapi
  2803  $(2): $(1) $(HIDDENAPI) $(SOONG_ZIP) $(MERGE_ZIPS) $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \
  2804        $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)
  2805  	@echo "Hidden API: $$@"
  2806  	$$(copy-file-to-target)
  2807  	@rm -rf $${PRIVATE_FOLDER}
  2808  	@mkdir -p $${PRIVATE_FOLDER}
  2809  	unzip -q $(2) 'classes*.dex' -d $${PRIVATE_FOLDER}
  2810  	find $${PRIVATE_FOLDER} -name "classes*.dex" | sort | sed 's/^/--dex=/' | \
  2811  		xargs $(HIDDENAPI) --light-greylist=$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \
  2812  		                   --dark-greylist=$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) \
  2813  		                   --blacklist=$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)
  2814  	$(SOONG_ZIP) -o $${PRIVATE_FOLDER}/classes.dex.jar -C $${PRIVATE_FOLDER} -D $${PRIVATE_FOLDER}
  2815  	$(MERGE_ZIPS) -D -zipToNotStrip $${PRIVATE_FOLDER}/classes.dex.jar -stripFile "classes*.dex" \
  2816  		$(2) $${PRIVATE_FOLDER}/classes.dex.jar $(1)
  2817  endef
  2818  
  2819  ###########################################################
  2820  ## Commands to call Proguard
  2821  ###########################################################
  2822  ifdef TARGET_OPENJDK9
  2823  define transform-jar-to-proguard
  2824  @echo Skipping Proguard: $< $@
  2825  $(hide) cp '$<' $@
  2826  endef
  2827  else
  2828  define transform-jar-to-proguard
  2829  @echo Proguard: $@
  2830  $(hide) $(PROGUARD) -injars $< -outjars $@ $(PRIVATE_PROGUARD_FLAGS) \
  2831      $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR))
  2832  endef
  2833  endif
  2834  
  2835  
  2836  ###########################################################
  2837  ## Commands to call R8
  2838  ###########################################################
  2839  define transform-jar-to-dex-r8
  2840  @echo R8: $@
  2841  $(hide) $(R8_COMPAT_PROGUARD) -injars '$<' \
  2842      --min-api $(PRIVATE_MIN_SDK_VERSION) \
  2843      --force-proguard-compatibility --output $(subst classes.dex,,$@) \
  2844      $(PRIVATE_PROGUARD_FLAGS) \
  2845      $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR)) \
  2846      $(PRIVATE_DX_FLAGS)
  2847  endef
  2848  
  2849  ###########################################################
  2850  ## Stuff source generated from one-off tools
  2851  ###########################################################
  2852  
  2853  define transform-generated-source
  2854  @echo "$($(PRIVATE_PREFIX)DISPLAY) Generated: $(PRIVATE_MODULE) <= $<"
  2855  @mkdir -p $(dir $@)
  2856  $(hide) $(PRIVATE_CUSTOM_TOOL)
  2857  endef
  2858  
  2859  
  2860  ###########################################################
  2861  ## Assertions about attributes of the target
  2862  ###########################################################
  2863  
  2864  # $(1): The file to check
  2865  ifndef get-file-size
  2866  $(error HOST_OS must define get-file-size)
  2867  endif
  2868  
  2869  # $(1): The file(s) to check (often $@)
  2870  # $(2): The partition size.
  2871  define assert-max-image-size
  2872  $(if $(2), \
  2873    size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); \
  2874    total=$$(( $$( echo "$$size" ) )); \
  2875    printname=$$(echo -n "$(1)" | tr " " +); \
  2876    maxsize=$$(($(2))); \
  2877    if [ "$$total" -gt "$$maxsize" ]; then \
  2878      echo "error: $$printname too large ($$total > $$maxsize)"; \
  2879      false; \
  2880    elif [ "$$total" -gt $$((maxsize - 32768)) ]; then \
  2881      echo "WARNING: $$printname approaching size limit ($$total now; limit $$maxsize)"; \
  2882    fi \
  2883   , \
  2884    true \
  2885   )
  2886  endef
  2887  
  2888  
  2889  ###########################################################
  2890  ## Define device-specific radio files
  2891  ###########################################################
  2892  INSTALLED_RADIOIMAGE_TARGET :=
  2893  
  2894  # Copy a radio image file to the output location, and add it to
  2895  # INSTALLED_RADIOIMAGE_TARGET.
  2896  # $(1): filename
  2897  define add-radio-file
  2898    $(eval $(call add-radio-file-internal,$(1),$(notdir $(1))))
  2899  endef
  2900  define add-radio-file-internal
  2901  INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2)
  2902  $$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1)
  2903  	$$(transform-prebuilt-to-target)
  2904  endef
  2905  
  2906  # Version of add-radio-file that also arranges for the version of the
  2907  # file to be checked against the contents of
  2908  # $(TARGET_BOARD_INFO_FILE).
  2909  # $(1): filename
  2910  # $(2): name of version variable in board-info (eg, "version-baseband")
  2911  define add-radio-file-checked
  2912    $(eval $(call add-radio-file-checked-internal,$(1),$(notdir $(1)),$(2)))
  2913  endef
  2914  define add-radio-file-checked-internal
  2915  INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2)
  2916  BOARD_INFO_CHECK += $(3):$(LOCAL_PATH)/$(1)
  2917  $$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1)
  2918  	$$(transform-prebuilt-to-target)
  2919  endef
  2920  
  2921  
  2922  ###########################################################
  2923  # Override the package defined in $(1), setting the
  2924  # variables listed below differently.
  2925  #
  2926  #  $(1): The makefile to override (relative to the source
  2927  #        tree root)
  2928  #  $(2): Old LOCAL_PACKAGE_NAME value.
  2929  #  $(3): New LOCAL_PACKAGE_NAME value.
  2930  #  $(4): New LOCAL_MANIFEST_PACKAGE_NAME value.
  2931  #  $(5): New LOCAL_CERTIFICATE value.
  2932  #  $(6): New LOCAL_INSTRUMENTATION_FOR value.
  2933  #  $(7): New LOCAL_MANIFEST_INSTRUMENTATION_FOR value.
  2934  #
  2935  # Note that LOCAL_PACKAGE_OVERRIDES is NOT cleared in
  2936  # clear_vars.mk.
  2937  ###########################################################
  2938  define inherit-package
  2939    $(eval $(call inherit-package-internal,$(1),$(2),$(3),$(4),$(5),$(6),$(7)))
  2940  endef
  2941  
  2942  define inherit-package-internal
  2943    LOCAL_PACKAGE_OVERRIDES \
  2944        := $(strip $(1))||$(strip $(2))||$(strip $(3))||$(strip $(4))||&&$(strip $(5))||&&$(strip $(6))||&&$(strip $(7)) $(LOCAL_PACKAGE_OVERRIDES)
  2945    include $(1)
  2946    LOCAL_PACKAGE_OVERRIDES \
  2947        := $(wordlist 1,$(words $(LOCAL_PACKAGE_OVERRIDES)), $(LOCAL_PACKAGE_OVERRIDES))
  2948  endef
  2949  
  2950  # To be used with inherit-package above
  2951  # Evalutes to true if the package was overridden
  2952  define set-inherited-package-variables
  2953  $(strip $(call set-inherited-package-variables-internal))
  2954  endef
  2955  
  2956  define keep-or-override
  2957  $(eval $(1) := $(if $(2),$(2),$($(1))))
  2958  endef
  2959  
  2960  define set-inherited-package-variables-internal
  2961    $(eval _o := $(subst ||, ,$(lastword $(LOCAL_PACKAGE_OVERRIDES))))
  2962    $(eval _n := $(subst ||, ,$(firstword $(LOCAL_PACKAGE_OVERRIDES))))
  2963    $(if $(filter $(word 2,$(_n)),$(LOCAL_PACKAGE_NAME)), \
  2964      $(eval LOCAL_PACKAGE_NAME := $(word 3,$(_o))) \
  2965      $(eval LOCAL_MANIFEST_PACKAGE_NAME := $(word 4,$(_o))) \
  2966      $(call keep-or-override,LOCAL_CERTIFICATE,$(patsubst &&%,%,$(word 5,$(_o)))) \
  2967      $(call keep-or-override,LOCAL_INSTRUMENTATION_FOR,$(patsubst &&%,%,$(word 6,$(_o)))) \
  2968      $(call keep-or-override,LOCAL_MANIFEST_INSTRUMENTATION_FOR,$(patsubst &&%,%,$(word 7,$(_o)))) \
  2969      $(eval LOCAL_OVERRIDES_PACKAGES := $(sort $(LOCAL_OVERRIDES_PACKAGES) $(word 2,$(_o)))) \
  2970      true \
  2971    ,)
  2972  endef
  2973  
  2974  ###########################################################
  2975  ## API Check
  2976  ###########################################################
  2977  
  2978  # eval this to define a rule that runs apicheck.
  2979  #
  2980  # Args:
  2981  #    $(1)  target
  2982  #    $(2)  stable api file
  2983  #    $(3)  api file to be tested
  2984  #    $(4)  stable removed api file
  2985  #    $(5)  removed api file to be tested
  2986  #    $(6)  arguments for apicheck
  2987  #    $(7)  command to run if apicheck failed
  2988  #    $(8)  target dependent on this api check
  2989  #    $(9)  additional dependencies
  2990  define check-api
  2991  $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp: $(2) $(3) $(4) $(APICHECK) $(9)
  2992  	@echo "Checking API:" $(1)
  2993  	$(hide) ( $(APICHECK_COMMAND) $(6) $(2) $(3) $(4) $(5) || ( $(7) ; exit 38 ) )
  2994  	$(hide) mkdir -p $$(dir $$@)
  2995  	$(hide) touch $$@
  2996  $(8): $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp
  2997  endef
  2998  
  2999  ## Whether to build from source if prebuilt alternative exists
  3000  ###########################################################
  3001  # $(1): module name
  3002  # $(2): LOCAL_PATH
  3003  # Expands to empty string if not from source.
  3004  ifeq (true,$(ANDROID_BUILD_FROM_SOURCE))
  3005  define if-build-from-source
  3006  true
  3007  endef
  3008  else
  3009  define if-build-from-source
  3010  $(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \
  3011      $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true)
  3012  endef
  3013  endif
  3014  
  3015  # Include makefile $(1) if build from source for module $(2)
  3016  # $(1): the makefile to include
  3017  # $(2): module name
  3018  # $(3): LOCAL_PATH
  3019  define include-if-build-from-source
  3020  $(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1)))
  3021  endef
  3022  
  3023  # Return the arch for the source file of a prebuilt
  3024  # Return "none" if no matching arch found and return empty
  3025  # if the input is empty, so the result can be passed to
  3026  # LOCAL_MODULE_TARGET_ARCH.
  3027  # $(1) the list of archs supported by the prebuilt
  3028  define get-prebuilt-src-arch
  3029  $(strip $(if $(filter $(TARGET_ARCH),$(1)),$(TARGET_ARCH),\
  3030    $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),$(if $(1),none))))
  3031  endef
  3032  
  3033  # ###############################################################
  3034  # Set up statistics gathering
  3035  # ###############################################################
  3036  STATS.MODULE_TYPE := \
  3037    HOST_STATIC_LIBRARY \
  3038    HOST_SHARED_LIBRARY \
  3039    STATIC_LIBRARY \
  3040    SHARED_LIBRARY \
  3041    EXECUTABLE \
  3042    HOST_EXECUTABLE \
  3043    PACKAGE \
  3044    PHONY_PACKAGE \
  3045    HOST_PREBUILT \
  3046    PREBUILT \
  3047    MULTI_PREBUILT \
  3048    JAVA_LIBRARY \
  3049    STATIC_JAVA_LIBRARY \
  3050    HOST_JAVA_LIBRARY \
  3051    DROIDDOC \
  3052    COPY_HEADERS \
  3053    NATIVE_TEST \
  3054    NATIVE_BENCHMARK \
  3055    HOST_NATIVE_TEST \
  3056    FUZZ_TEST \
  3057    HOST_FUZZ_TEST \
  3058    STATIC_TEST_LIBRARY \
  3059    HOST_STATIC_TEST_LIBRARY \
  3060    NOTICE_FILE \
  3061    HOST_DALVIK_JAVA_LIBRARY \
  3062    HOST_DALVIK_STATIC_JAVA_LIBRARY \
  3063    base_rules \
  3064    HEADER_LIBRARY \
  3065    HOST_TEST_CONFIG \
  3066    TARGET_TEST_CONFIG
  3067  
  3068  $(foreach s,$(STATS.MODULE_TYPE),$(eval STATS.MODULE_TYPE.$(s) :=))
  3069  define record-module-type
  3070  $(strip $(if $(LOCAL_RECORDED_MODULE_TYPE),,
  3071    $(if $(filter-out $(SOONG_ANDROID_MK),$(LOCAL_MODULE_MAKEFILE)),
  3072      $(if $(filter $(1),$(STATS.MODULE_TYPE)),
  3073        $(eval LOCAL_RECORDED_MODULE_TYPE := true)
  3074          $(eval STATS.MODULE_TYPE.$(1) += 1),
  3075        $(error Invalid module type: $(1))))))
  3076  endef
  3077  
  3078  ###########################################################
  3079  ## Compatibility suite tools
  3080  ###########################################################
  3081  
  3082  # Return a list of output directories for a given suite and the current LOCAL_MODULE.
  3083  # Can be passed a subdirectory to use for the common testcase directory.
  3084  define compatibility_suite_dirs
  3085    $(strip \
  3086      $(COMPATIBILITY_TESTCASES_OUT_$(1)) \
  3087      $($(my_prefix)OUT_TESTCASES)/$(LOCAL_MODULE)$(2))
  3088  endef
  3089  
  3090  # For each suite:
  3091  # 1. Copy the files to the many suite output directories.
  3092  # 2. Add all the files to each suite's dependent files list.
  3093  # 3. Do the dependency addition to my_all_targets
  3094  # Requires for each suite: my_compat_dist_$(suite) to be defined.
  3095  define create-suite-dependencies
  3096  $(foreach suite, $(LOCAL_COMPATIBILITY_SUITE), \
  3097    $(eval COMPATIBILITY.$(suite).FILES := \
  3098      $$(COMPATIBILITY.$(suite).FILES) $$(foreach f,$$(my_compat_dist_$(suite)),$$(call word-colon,2,$$(f))))) \
  3099  $(eval $(my_all_targets) : $(call copy-many-files, \
  3100    $(sort $(foreach suite,$(LOCAL_COMPATIBILITY_SUITE),$(my_compat_dist_$(suite))))))
  3101  endef
  3102  
  3103  ###########################################################
  3104  ## Path Cleaning
  3105  ###########################################################
  3106  
  3107  # Remove "dir .." combinations (but keep ".. ..")
  3108  #
  3109  # $(1): The expanded path, where / is converted to ' ' to work with $(word)
  3110  define _clean-path-strip-dotdot
  3111  $(strip \
  3112    $(if $(word 2,$(1)),
  3113      $(if $(call streq,$(word 2,$(1)),..),
  3114        $(if $(call streq,$(word 1,$(1)),..),
  3115          $(word 1,$(1)) $(call _clean-path-strip-dotdot,$(wordlist 2,$(words $(1)),$(1)))
  3116        ,
  3117          $(call _clean-path-strip-dotdot,$(wordlist 3,$(words $(1)),$(1)))
  3118        )
  3119      ,
  3120        $(word 1,$(1)) $(call _clean-path-strip-dotdot,$(wordlist 2,$(words $(1)),$(1)))
  3121      )
  3122    ,
  3123      $(1)
  3124    )
  3125  )
  3126  endef
  3127  
  3128  # Remove any leading .. from the path (in case of /..)
  3129  #
  3130  # Should only be called if the original path started with /
  3131  # $(1): The expanded path, where / is converted to ' ' to work with $(word)
  3132  define _clean-path-strip-root-dotdots
  3133  $(strip $(if $(call streq,$(firstword $(1)),..),
  3134    $(call _clean-path-strip-root-dotdots,$(wordlist 2,$(words $(1)),$(1))),
  3135    $(1)))
  3136  endef
  3137  
  3138  # Call _clean-path-strip-dotdot until the path stops changing
  3139  # $(1): Non-empty if this path started with a /
  3140  # $(2): The expanded path, where / is converted to ' ' to work with $(word)
  3141  define _clean-path-expanded
  3142  $(strip \
  3143    $(eval _ep := $(call _clean-path-strip-dotdot,$(2)))
  3144    $(if $(1),$(eval _ep := $(call _clean-path-strip-root-dotdots,$(_ep))))
  3145    $(if $(call streq,$(2),$(_ep)),
  3146      $(_ep),
  3147      $(call _clean-path-expanded,$(1),$(_ep))))
  3148  endef
  3149  
  3150  # Clean the file path -- remove //, dir/.., extra .
  3151  #
  3152  # This should be the same semantics as golang's filepath.Clean
  3153  #
  3154  # $(1): The file path to clean
  3155  define clean-path
  3156  $(strip \
  3157    $(if $(call streq,$(words $(1)),1),
  3158      $(eval _rooted := $(filter /%,$(1)))
  3159      $(eval _expanded_path := $(filter-out .,$(subst /,$(space),$(1))))
  3160      $(eval _path := $(if $(_rooted),/)$(subst $(space),/,$(call _clean-path-expanded,$(_rooted),$(_expanded_path))))
  3161      $(if $(_path),
  3162        $(_path),
  3163        .
  3164       )
  3165    ,
  3166      $(if $(call streq,$(words $(1)),0),
  3167        .,
  3168        $(error Call clean-path with only one path (without spaces))
  3169      )
  3170    )
  3171  )
  3172  endef
  3173  
  3174  ifeq ($(TEST_MAKE_clean_path),true)
  3175    define my_test
  3176      $(if $(call streq,$(call clean-path,$(1)),$(2)),,
  3177        $(eval my_failed := true)
  3178        $(warning clean-path test '$(1)': expected '$(2)', got '$(call clean-path,$(1))'))
  3179    endef
  3180    my_failed :=
  3181  
  3182    # Already clean
  3183    $(call my_test,abc,abc)
  3184    $(call my_test,abc/def,abc/def)
  3185    $(call my_test,a/b/c,a/b/c)
  3186    $(call my_test,.,.)
  3187    $(call my_test,..,..)
  3188    $(call my_test,../..,../..)
  3189    $(call my_test,../../abc,../../abc)
  3190    $(call my_test,/abc,/abc)
  3191    $(call my_test,/,/)
  3192  
  3193    # Empty is current dir
  3194    $(call my_test,,.)
  3195  
  3196    # Remove trailing slash
  3197    $(call my_test,abc/,abc)
  3198    $(call my_test,abc/def/,abc/def)
  3199    $(call my_test,a/b/c/,a/b/c)
  3200    $(call my_test,./,.)
  3201    $(call my_test,../,..)
  3202    $(call my_test,../../,../..)
  3203    $(call my_test,/abc/,/abc)
  3204  
  3205    # Remove doubled slash
  3206    $(call my_test,abc//def//ghi,abc/def/ghi)
  3207    $(call my_test,//abc,/abc)
  3208    $(call my_test,///abc,/abc)
  3209    $(call my_test,//abc//,/abc)
  3210    $(call my_test,abc//,abc)
  3211  
  3212    # Remove . elements
  3213    $(call my_test,abc/./def,abc/def)
  3214    $(call my_test,/./abc/def,/abc/def)
  3215    $(call my_test,abc/.,abc)
  3216  
  3217    # Remove .. elements
  3218    $(call my_test,abc/def/ghi/../jkl,abc/def/jkl)
  3219    $(call my_test,abc/def/../ghi/../jkl,abc/jkl)
  3220    $(call my_test,abc/def/..,abc)
  3221    $(call my_test,abc/def/../..,.)
  3222    $(call my_test,/abc/def/../..,/)
  3223    $(call my_test,abc/def/../../..,..)
  3224    $(call my_test,/abc/def/../../..,/)
  3225    $(call my_test,abc/def/../../../ghi/jkl/../../../mno,../../mno)
  3226    $(call my_test,/../abc,/abc)
  3227  
  3228    # Combinations
  3229    $(call my_test,abc/./../def,def)
  3230    $(call my_test,abc//./../def,def)
  3231    $(call my_test,abc/../../././../def,../../def)
  3232  
  3233    ifdef my_failed
  3234      $(error failed clean-path test)
  3235    endif
  3236  endif
  3237  
  3238  ###########################################################
  3239  ## Given a filepath, returns nonempty if the path cannot be
  3240  ## validated to be contained in the current directory
  3241  ## This is, this function checks for '/' and '..'
  3242  ##
  3243  ## $(1): path to validate
  3244  define try-validate-path-is-subdir
  3245  $(strip 
  3246      $(if $(filter /%,$(1)),
  3247          $(1) starts with a slash
  3248      )
  3249      $(if $(filter ../%,$(call clean-path,$(1))),
  3250          $(1) escapes its parent using '..'
  3251      )
  3252      $(if $(strip $(1)),
  3253      ,
  3254          '$(1)' is empty
  3255      )
  3256  )
  3257  endef
  3258  
  3259  define validate-path-is-subdir
  3260  $(if $(call try-validate-path-is-subdir,$(1)),
  3261    $(call pretty-error, Illegal path: $(call try-validate-path-is-subdir,$(1)))
  3262  )
  3263  endef
  3264  
  3265  ###########################################################
  3266  ## Given a space-delimited list of filepaths, returns
  3267  ## nonempty if any cannot be validated to be contained in
  3268  ## the current directory
  3269  ##
  3270  ## $(1): path list to validate
  3271  define try-validate-paths-are-subdirs
  3272  $(strip \
  3273    $(foreach my_path,$(1),\
  3274      $(call try-validate-path-is-subdir,$(my_path))\
  3275    )
  3276  )
  3277  endef
  3278  
  3279  define validate-paths-are-subdirs
  3280  $(if $(call try-validate-paths-are-subdirs,$(1)),
  3281      $(call pretty-error,Illegal paths:\'$(call try-validate-paths-are-subdirs,$(1))\')
  3282  )
  3283  endef
  3284  
  3285  ###########################################################
  3286  ## Tests of try-validate-path-is-subdir
  3287  ##     and  try-validate-paths-are-subdirs
  3288  define test-validate-paths-are-subdirs
  3289  $(eval my_error := $(call try-validate-path-is-subdir,/tmp)) \
  3290  $(if $(call streq,$(my_error),/tmp starts with a slash),
  3291  ,
  3292    $(error incorrect error message for path /tmp. Got '$(my_error)')
  3293  ) \
  3294  $(eval my_error := $(call try-validate-path-is-subdir,../sibling)) \
  3295  $(if $(call streq,$(my_error),../sibling escapes its parent using '..'),
  3296  ,
  3297    $(error incorrect error message for path ../sibling. Got '$(my_error)')
  3298  ) \
  3299  $(eval my_error := $(call try-validate-path-is-subdir,child/../../sibling)) \
  3300  $(if $(call streq,$(my_error),child/../../sibling escapes its parent using '..'),
  3301  ,
  3302    $(error incorrect error message for path child/../../sibling. Got '$(my_error)')
  3303  ) \
  3304  $(eval my_error := $(call try-validate-path-is-subdir,)) \
  3305  $(if $(call streq,$(my_error),'' is empty),
  3306  ,
  3307    $(error incorrect error message for empty path ''. Got '$(my_error)')
  3308  ) \
  3309  $(eval my_error := $(call try-validate-path-is-subdir,subdir/subsubdir)) \
  3310  $(if $(call streq,$(my_error),),
  3311  ,
  3312    $(error rejected valid path 'subdir/subsubdir'. Got '$(my_error)')
  3313  )
  3314  
  3315  $(eval my_error := $(call try-validate-paths-are-subdirs,a/b /c/d e/f))
  3316  $(if $(call streq,$(my_error),/c/d starts with a slash),
  3317  ,
  3318    $(error incorrect error message for path list 'a/b /c/d e/f'. Got '$(my_error)')
  3319  )
  3320  $(eval my_error := $(call try-validate-paths-are-subdirs,a/b c/d))
  3321  $(if $(call streq,$(my_error),),
  3322  ,
  3323    $(error rejected valid path list 'a/b c/d'. Got '$(my_error)')
  3324  )
  3325  endef
  3326  # run test
  3327  $(strip $(call test-validate-paths-are-subdirs))
  3328  
  3329  ###########################################################
  3330  ## Validate jacoco class filters and convert them to
  3331  ## file arguments
  3332  ## Jacoco class filters are comma-separated lists of class
  3333  ## files (android.app.Application), and may have '*' as the
  3334  ## last character to match all classes in a package
  3335  ## including subpackages.
  3336  define jacoco-class-filter-to-file-args
  3337  $(strip $(call jacoco-validate-file-args,\
  3338    $(subst $(comma),$(space),\
  3339      $(subst .,/,\
  3340        $(strip $(1))))))
  3341  endef
  3342  
  3343  define jacoco-validate-file-args
  3344  $(strip $(1)\
  3345    $(call validate-paths-are-subdirs,$(1))
  3346    $(foreach arg,$(1),\
  3347      $(if $(findstring ?,$(arg)),$(call pretty-error,\
  3348        '?' filters are not supported in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\
  3349      $(if $(findstring *,$(patsubst %*,%,$(arg))),$(call pretty-error,\
  3350        '*' is only supported at the end of a filter in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\
  3351    ))
  3352  endef
  3353  
  3354  ###########################################################
  3355  ## Other includes
  3356  ###########################################################
  3357  
  3358  # -----------------------------------------------------------------
  3359  # Rules and functions to help copy important files to DIST_DIR
  3360  # when requested.
  3361  include $(BUILD_SYSTEM)/distdir.mk
  3362  
  3363  # Include any vendor specific definitions.mk file
  3364  -include $(TOPDIR)vendor/*/build/core/definitions.mk
  3365  -include $(TOPDIR)device/*/build/core/definitions.mk
  3366  -include $(TOPDIR)product/*/build/core/definitions.mk
  3367  
  3368  # broken:
  3369  #	$(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file)))
  3370  
  3371  ###########################################################
  3372  ## Misc notes
  3373  ###########################################################
  3374  
  3375  #DEPDIR = .deps
  3376  #df = $(DEPDIR)/$(*F)
  3377  
  3378  #SRCS = foo.c bar.c ...
  3379  
  3380  #%.o : %.c
  3381  #	@$(MAKEDEPEND); \
  3382  #	  cp $(df).d $(df).P; \
  3383  #	  sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
  3384  #	      -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \
  3385  #	  rm -f $(df).d
  3386  #	$(COMPILE.c) -o $@ $<
  3387  
  3388  #-include $(SRCS:%.c=$(DEPDIR)/%.P)
  3389  
  3390  
  3391  #%.o : %.c
  3392  #	$(COMPILE.c) -MD -o $@ $<
  3393  #	@cp $*.d $*.P; \
  3394  #	  sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
  3395  #	      -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
  3396  #	  rm -f $*.d
  3397  
  3398  
  3399  ###########################################################
  3400  # Append the information to generate a RRO package for the
  3401  # source module.
  3402  #
  3403  #  $(1): Source module name.
  3404  #  $(2): Whether $(3) is a manifest package name or not.
  3405  #  $(3): Manifest package name if $(2) is true.
  3406  #        Otherwise, android manifest file path of the
  3407  #        source module.
  3408  #  $(4): Whether LOCAL_EXPORT_PACKAGE_RESOURCES is set or
  3409  #        not for the source module.
  3410  #  $(5): Resource overlay list.
  3411  ###########################################################
  3412  define append_enforce_rro_sources
  3413    $(eval ENFORCE_RRO_SOURCES += \
  3414        $(strip $(1))||$(strip $(2))||$(strip $(3))||$(strip $(4))||$(call normalize-path-list, $(strip $(5))))
  3415  endef
  3416  
  3417  ###########################################################
  3418  # Generate all RRO packages for source modules stored in
  3419  # ENFORCE_RRO_SOURCES
  3420  ###########################################################
  3421  define generate_all_enforce_rro_packages
  3422  $(foreach source,$(ENFORCE_RRO_SOURCES), \
  3423    $(eval _o := $(subst ||,$(space),$(source))) \
  3424    $(eval enforce_rro_source_module := $(word 1,$(_o))) \
  3425    $(eval enforce_rro_source_is_manifest_package_name := $(word 2,$(_o))) \
  3426    $(eval enforce_rro_source_manifest_package_info := $(word 3,$(_o))) \
  3427    $(eval enforce_rro_use_res_lib := $(word 4,$(_o))) \
  3428    $(eval enforce_rro_source_overlays := $(subst :, ,$(word 5,$(_o)))) \
  3429    $(eval enforce_rro_module := $(enforce_rro_source_module)__auto_generated_rro) \
  3430    $(eval include $(BUILD_SYSTEM)/generate_enforce_rro.mk) \
  3431    $(eval ALL_MODULES.$(enforce_rro_source_module).REQUIRED += $(enforce_rro_module)) \
  3432  )
  3433  endef
  3434  
  3435  ###########################################################
  3436  ## Find system_$(VER) in LOCAL_SDK_VERSION
  3437  ##
  3438  ## $(1): LOCAL_SDK_VERSION
  3439  ###########################################################
  3440  define has-system-sdk-version
  3441  $(filter system_%,$(1))
  3442  endef
  3443  
  3444  ###########################################################
  3445  ## Get numerical version in LOCAL_SDK_VERSION
  3446  ##
  3447  ## $(1): LOCAL_SDK_VERSION
  3448  ###########################################################
  3449  define get-numeric-sdk-version
  3450  $(filter-out current,\
  3451    $(if $(call has-system-sdk-version,$(1)),$(patsubst system_%,%,$(1)),$(1)))
  3452  endef
  3453  
  3454  # Convert to lower case without requiring a shell, which isn't cacheable.
  3455  to-lower=$(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
  3456  
  3457  # Convert to upper case without requiring a shell, which isn't cacheable.
  3458  to-upper=$(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
  3459  
  3460  # Sanity-check to-lower and to-upper
  3461  lower := abcdefghijklmnopqrstuvwxyz-_
  3462  upper := ABCDEFGHIJKLMNOPQRSTUVWXYZ-_
  3463  
  3464  ifneq ($(lower),$(call to-lower,$(upper)))
  3465    $(error to-lower sanity check failure)
  3466  endif
  3467  
  3468  ifneq ($(upper),$(call to-upper,$(lower)))
  3469    $(error to-upper sanity check failure)
  3470  endif
  3471  
  3472  lower :=
  3473  upper :=