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 27ALL_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. 38ALL_MODULES:= 39 40ALL_MAKE_MODULE_INFO_JSON_MODULES:= 41 42# The relative paths of the non-module targets in the system. 43ALL_NON_MODULES:= 44NON_MODULES_WITHOUT_LICENSE_METADATA:= 45 46# List of copied targets that need license metadata copied. 47ALL_COPIED_TARGETS:= 48 49# Full paths to targets that should be added to the "make droid" 50# set of installed targets. 51ALL_DEFAULT_INSTALLED_MODULES:= 52 53# Full path to all asm, C, C++, lex and yacc generated C files. 54# These all have an order-only dependency on the copied headers 55ALL_C_CPP_ETC_OBJECTS:= 56 57# These files go into the SDK 58ALL_SDK_FILES:= 59 60# Files for dalvik. This is often build without building the rest of the OS. 61INTERNAL_DALVIK_MODULES:= 62 63# All findbugs xml files 64ALL_FINDBUGS_FILES:= 65 66# Packages with certificate violation 67CERTIFICATE_VIOLATION_MODULES := 68 69# Target and host installed module's dependencies on shared libraries. 70# They are list of "<module_name>:<installed_file>:lib1,lib2...". 71TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES := 72$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES := 73HOST_DEPENDENCIES_ON_SHARED_LIBRARIES := 74$(HOST_2ND_ARCH_VAR_PREFIX)HOST_DEPENDENCIES_ON_SHARED_LIBRARIES := 75HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES := 76$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES := 77 78# Generated class file names for Android resource. 79# They are escaped and quoted so can be passed safely to a bash command. 80ANDROID_RESOURCE_GENERATED_CLASSES := 'R.class' 'R$$*.class' 'Manifest.class' 'Manifest$$*.class' 81 82# Display names for various build targets 83TARGET_DISPLAY := target 84HOST_DISPLAY := host 85HOST_CROSS_DISPLAY := host cross 86 87# All installed initrc files 88ALL_INIT_RC_INSTALLED_PAIRS := 89 90# All installed vintf manifest fragments for a partition at 91ALL_VINTF_MANIFEST_FRAGMENTS_LIST:= 92 93# All tests that should be skipped in presubmit check. 94ALL_DISABLED_PRESUBMIT_TESTS := 95 96# All compatibility suites mentioned in LOCAL_COMPATIBILITY_SUITE 97ALL_COMPATIBILITY_SUITES := 98 99# All compatibility suite files to dist. 100ALL_COMPATIBILITY_DIST_FILES := 101 102# All LINK_TYPE entries 103ALL_LINK_TYPES := 104 105# All exported/imported include entries 106EXPORTS_LIST := 107 108# All modules already converted to Soong 109SOONG_ALREADY_CONV := 110 111########################################################### 112## Debugging; prints a variable list to stdout 113########################################################### 114 115# $(1): variable name list, not variable values 116define print-vars 117$(foreach var,$(1), \ 118 $(info $(var):) \ 119 $(foreach word,$($(var)), \ 120 $(info $(space)$(space)$(word)) \ 121 ) \ 122 ) 123endef 124 125########################################################### 126## Evaluates to true if the string contains the word true, 127## and empty otherwise 128## $(1): a var to test 129########################################################### 130 131define true-or-empty 132$(filter true, $(1)) 133endef 134 135define boolean-not 136$(if $(filter true,$(1)),,true) 137endef 138 139########################################################### 140## Rule for touching GCNO files. 141########################################################### 142define gcno-touch-rule 143$(2): $(1) 144 touch -c $$@ 145endef 146 147########################################################### 148 149########################################################### 150## Retrieve the directory of the current makefile 151## Must be called before including any other makefile!! 152########################################################### 153 154# Figure out where we are. 155define my-dir 156$(strip \ 157 $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \ 158 $(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \ 159 $(error my-dir must be called before including any other makefile.) \ 160 , \ 161 $(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \ 162 ) \ 163 ) 164endef 165 166 167########################################################### 168## Retrieve a list of all makefiles immediately below some directory 169########################################################### 170 171define all-makefiles-under 172$(wildcard $(1)/*/Android.mk) 173endef 174 175########################################################### 176## Look under a directory for makefiles that don't have parent 177## makefiles. 178########################################################### 179 180# $(1): directory to search under 181# Ignores $(1)/Android.mk 182define first-makefiles-under 183$(shell build/make/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) \ 184 --mindepth=2 $(addprefix --dir=,$(1)) Android.mk) 185endef 186 187########################################################### 188## Retrieve a list of all makefiles immediately below your directory 189## Must be called before including any other makefile!! 190########################################################### 191 192define all-subdir-makefiles 193$(call all-makefiles-under,$(call my-dir)) 194endef 195 196########################################################### 197## Look in the named list of directories for makefiles, 198## relative to the current directory. 199## Must be called before including any other makefile!! 200########################################################### 201 202# $(1): List of directories to look for under this directory 203define all-named-subdir-makefiles 204$(wildcard $(addsuffix /Android.mk, $(addprefix $(call my-dir)/,$(1)))) 205endef 206 207########################################################### 208## Find all of the directories under the named directories with 209## the specified name. 210## Meant to be used like: 211## INC_DIRS := $(call all-named-dirs-under,inc,.) 212########################################################### 213 214define all-named-dirs-under 215$(call find-subdir-files,$(2) -type d -name "$(1)") 216endef 217 218########################################################### 219## Find all the directories under the current directory that 220## haves name that match $(1) 221########################################################### 222 223define all-subdir-named-dirs 224$(call all-named-dirs-under,$(1),.) 225endef 226 227########################################################### 228## Find all of the files under the named directories with 229## the specified name. 230## Meant to be used like: 231## SRC_FILES := $(call all-named-files-under,*.h,src tests) 232########################################################### 233 234define all-named-files-under 235$(call find-files-in-subdirs,$(LOCAL_PATH),"$(1)",$(2)) 236endef 237 238########################################################### 239## Find all of the files under the current directory with 240## the specified name. 241########################################################### 242 243define all-subdir-named-files 244$(call all-named-files-under,$(1),.) 245endef 246 247########################################################### 248## Find all of the java files under the named directories. 249## Meant to be used like: 250## SRC_FILES := $(call all-java-files-under,src tests) 251########################################################### 252 253define all-java-files-under 254$(call all-named-files-under,*.java,$(1)) 255endef 256 257########################################################### 258## Find all of the java files from here. Meant to be used like: 259## SRC_FILES := $(call all-subdir-java-files) 260########################################################### 261 262define all-subdir-java-files 263$(call all-java-files-under,.) 264endef 265 266########################################################### 267## Find all of the c files under the named directories. 268## Meant to be used like: 269## SRC_FILES := $(call all-c-files-under,src tests) 270########################################################### 271 272define all-c-files-under 273$(call all-named-files-under,*.c,$(1)) 274endef 275 276########################################################### 277## Find all of the c files from here. Meant to be used like: 278## SRC_FILES := $(call all-subdir-c-files) 279########################################################### 280 281define all-subdir-c-files 282$(call all-c-files-under,.) 283endef 284 285########################################################### 286## Find all of the cpp files under the named directories. 287## LOCAL_CPP_EXTENSION is respected if set. 288## Meant to be used like: 289## SRC_FILES := $(call all-cpp-files-under,src tests) 290########################################################### 291 292define all-cpp-files-under 293$(sort $(patsubst ./%,%, \ 294 $(shell cd $(LOCAL_PATH) ; \ 295 find -L $(1) -name "*$(or $(LOCAL_CPP_EXTENSION),.cpp)" -and -not -name ".*") \ 296 )) 297endef 298 299########################################################### 300## Find all of the cpp files from here. Meant to be used like: 301## SRC_FILES := $(call all-subdir-cpp-files) 302########################################################### 303 304define all-subdir-cpp-files 305$(call all-cpp-files-under,.) 306endef 307 308########################################################### 309## Find all files named "I*.aidl" under the named directories, 310## which must be relative to $(LOCAL_PATH). The returned list 311## is relative to $(LOCAL_PATH). 312########################################################### 313 314define all-Iaidl-files-under 315$(call all-named-files-under,I*.aidl,$(1)) 316endef 317 318########################################################### 319## Find all of the "I*.aidl" files under $(LOCAL_PATH). 320########################################################### 321 322define all-subdir-Iaidl-files 323$(call all-Iaidl-files-under,.) 324endef 325 326########################################################### 327## Find all files named "*.vts" under the named directories, 328## which must be relative to $(LOCAL_PATH). The returned list 329## is relative to $(LOCAL_PATH). 330########################################################### 331 332define all-vts-files-under 333$(call all-named-files-under,*.vts,$(1)) 334endef 335 336########################################################### 337## Find all of the "*.vts" files under $(LOCAL_PATH). 338########################################################### 339 340define all-subdir-vts-files 341$(call all-vts-files-under,.) 342endef 343 344########################################################### 345## Find all of the logtags files under the named directories. 346## Meant to be used like: 347## SRC_FILES := $(call all-logtags-files-under,src) 348########################################################### 349 350define all-logtags-files-under 351$(call all-named-files-under,*.logtags,$(1)) 352endef 353 354########################################################### 355## Find all of the .proto files under the named directories. 356## Meant to be used like: 357## SRC_FILES := $(call all-proto-files-under,src) 358########################################################### 359 360define all-proto-files-under 361$(call all-named-files-under,*.proto,$(1)) 362endef 363 364########################################################### 365## Find all of the RenderScript files under the named directories. 366## Meant to be used like: 367## SRC_FILES := $(call all-renderscript-files-under,src) 368########################################################### 369 370define all-renderscript-files-under 371$(call find-subdir-files,$(1) \( -name "*.rscript" -or -name "*.fs" \) -and -not -name ".*") 372endef 373 374########################################################### 375## Find all of the S files under the named directories. 376## Meant to be used like: 377## SRC_FILES := $(call all-c-files-under,src tests) 378########################################################### 379 380define all-S-files-under 381$(call all-named-files-under,*.S,$(1)) 382endef 383 384########################################################### 385## Find all of the html files under the named directories. 386## Meant to be used like: 387## SRC_FILES := $(call all-html-files-under,src tests) 388########################################################### 389 390define all-html-files-under 391$(call all-named-files-under,*.html,$(1)) 392endef 393 394########################################################### 395## Find all of the html files from here. Meant to be used like: 396## SRC_FILES := $(call all-subdir-html-files) 397########################################################### 398 399define all-subdir-html-files 400$(call all-html-files-under,.) 401endef 402 403########################################################### 404## Find all of the files matching pattern 405## SRC_FILES := $(call find-subdir-files, <pattern>) 406########################################################### 407 408define find-subdir-files 409$(sort $(patsubst ./%,%,$(shell cd $(LOCAL_PATH) ; find -L $(1)))) 410endef 411 412########################################################### 413# find the files in the subdirectory $1 of LOCAL_DIR 414# matching pattern $2, filtering out files $3 415# e.g. 416# SRC_FILES += $(call find-subdir-subdir-files, \ 417# css, *.cpp, DontWantThis.cpp) 418########################################################### 419 420define find-subdir-subdir-files 421$(sort $(filter-out $(patsubst %,$(1)/%,$(3)),$(patsubst ./%,%,$(shell cd \ 422 $(LOCAL_PATH) ; find -L $(1) -maxdepth 1 -name $(2))))) 423endef 424 425########################################################### 426## Find all of the files matching pattern 427## SRC_FILES := $(call all-subdir-java-files) 428########################################################### 429 430define find-subdir-assets 431$(sort $(if $(1),$(patsubst ./%,%, \ 432 $(shell if [ -d $(1) ] ; then cd $(1) ; find -L ./ -not -name '.*' -and -type f ; fi)), \ 433 $(warning Empty argument supplied to find-subdir-assets in $(LOCAL_PATH)) \ 434)) 435endef 436 437########################################################### 438## Find various file types in a list of directories relative to $(LOCAL_PATH) 439########################################################### 440 441define find-other-java-files 442$(call all-java-files-under,$(1)) 443endef 444 445define find-other-html-files 446$(call all-html-files-under,$(1)) 447endef 448 449########################################################### 450# Use utility find to find given files in the given subdirs. 451# This function uses $(1), instead of LOCAL_PATH as the base. 452# $(1): the base dir, relative to the root of the source tree. 453# $(2): the file name pattern to be passed to find as "-name". 454# $(3): a list of subdirs of the base dir. 455# Returns: a list of paths relative to the base dir. 456########################################################### 457 458define find-files-in-subdirs 459$(sort $(patsubst ./%,%, \ 460 $(shell cd $(1) ; \ 461 find -L $(3) -name $(2) -and -not -name ".*") \ 462 )) 463endef 464 465########################################################### 466## Scan through each directory of $(1) looking for files 467## that match $(2) using $(wildcard). Useful for seeing if 468## a given directory or one of its parents contains 469## a particular file. Returns the first match found, 470## starting furthest from the root. 471########################################################### 472 473define find-parent-file 474$(strip \ 475 $(eval _fpf := $(sort $(wildcard $(foreach f, $(2), $(strip $(1))/$(f))))) \ 476 $(if $(_fpf),$(_fpf), \ 477 $(if $(filter-out ./ .,$(1)), \ 478 $(call find-parent-file,$(patsubst %/,%,$(dir $(1))),$(2)) \ 479 ) \ 480 ) \ 481) 482endef 483 484########################################################### 485## Find test data in a form required by LOCAL_TEST_DATA 486## $(1): the base dir, relative to the root of the source tree. 487## $(2): the file name pattern to be passed to find as "-name" 488## $(3): a list of subdirs of the base dir 489########################################################### 490 491define find-test-data-in-subdirs 492$(foreach f,$(sort $(patsubst ./%,%, \ 493 $(shell cd $(1) ; \ 494 find -L $(3) -type f -and -name $(2) -and -not -name ".*") \ 495)),$(1):$(f)) 496endef 497 498########################################################### 499## Function we can evaluate to introduce a dynamic dependency 500########################################################### 501 502define add-dependency 503$(1): $(2) 504endef 505 506########################################################### 507## Reverse order of a list 508########################################################### 509 510define reverse-list 511$(if $(1),$(call reverse-list,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1)) 512endef 513 514########################################################### 515## Sometimes a notice dependency will reference an unadorned 516## module name that only appears in ALL_MODULES adorned with 517## an ARCH suffix or a `host_cross_` prefix. 518## 519## After all of the modules are processed in base_rules.mk, 520## replace all such dependencies with every matching adorned 521## module name. 522########################################################### 523 524define fix-notice-deps 525$(strip \ 526 $(eval _all_module_refs := \ 527 $(sort \ 528 $(foreach m,$(sort $(ALL_MODULES)), \ 529 $(call word-colon,1,$(ALL_MODULES.$(m).NOTICE_DEPS)) \ 530 ) \ 531 ) \ 532 ) \ 533 $(foreach m, $(_all_module_refs), \ 534 $(eval _lookup.$(m) := \ 535 $(sort \ 536 $(if $(strip $(ALL_MODULES.$(m).PATH)), \ 537 $(m), \ 538 $(filter $(m)_32 $(m)_64 host_cross_$(m) host_cross_$(m)_32 host_cross_$(m)_64, $(ALL_MODULES)) \ 539 ) \ 540 ) \ 541 ) \ 542 ) \ 543 $(foreach m, $(ALL_MODULES), \ 544 $(eval ALL_MODULES.$(m).NOTICE_DEPS := \ 545 $(sort \ 546 $(foreach d,$(sort $(ALL_MODULES.$(m).NOTICE_DEPS)), \ 547 $(foreach n,$(_lookup.$(call word-colon,1,$(d))),$(n):$(call wordlist-colon,2,9999,$(d))) \ 548 ) \ 549 ) \ 550 ) \ 551 ) \ 552) 553endef 554 555########################################################### 556## Target directory for license metadata files. 557########################################################### 558define license-metadata-dir 559$(call generated-sources-dir-for,META,lic,$(filter-out $(PRODUCT_OUT)%,$(1))) 560endef 561 562TARGETS_MISSING_LICENSE_METADATA:= 563 564########################################################### 565# License metadata targets corresponding to targets in $(1) 566########################################################### 567define corresponding-license-metadata 568$(strip $(filter-out 0p,$(foreach target, $(sort $(1)), \ 569 $(if $(strip $(ALL_MODULES.$(target).META_LIC)), \ 570 $(ALL_MODULES.$(target).META_LIC), \ 571 $(if $(strip $(ALL_TARGETS.$(target).META_LIC)), \ 572 $(ALL_TARGETS.$(target).META_LIC), \ 573 $(eval TARGETS_MISSING_LICENSE_METADATA += $(target)) \ 574 ) \ 575 ) \ 576))) 577endef 578 579########################################################### 580## Record a target $(1) copied from another target(s) $(2) that will need 581## license metadata. 582########################################################### 583define declare-copy-target-license-metadata 584$(strip $(if $(filter $(OUT_DIR)%,$(2)),\ 585 $(eval _tgt:=$(strip $(1)))\ 586 $(eval ALL_COPIED_TARGETS.$(_tgt).SOURCES := $(sort $(ALL_COPIED_TARGETS.$(_tgt).SOURCES) $(filter $(OUT_DIR)%,$(2))))\ 587 $(eval ALL_COPIED_TARGETS += $(_tgt)))) 588endef 589 590########################################################### 591## License metadata build rule for my_register_name $(1) 592########################################################### 593define license-metadata-rule 594$(foreach meta_lic, $(ALL_MODULES.$(1).DELAYED_META_LIC),$(call _license-metadata-rule,$(1),$(meta_lic))) 595endef 596 597$(KATI_obsolete_var notice-rule, This function has been removed) 598 599define _license-metadata-rule 600$(strip $(eval _srcs := $(strip $(foreach d,$(ALL_MODULES.$(1).NOTICE_DEPS),$(if $(strip $(ALL_MODULES.$(call word-colon,1,$(d)).INSTALLED)), $(ALL_MODULES.$(call word-colon,1,$(d)).INSTALLED),$(if $(strip $(ALL_MODULES.$(call word-colon,1,$(d)).BUILT)), $(ALL_MODULES.$(call word-colon,1,$(d)).BUILT), $(call word-colon,1,$d))))))) 601$(strip $(eval _deps := $(sort $(filter-out $(2)%,\ 602 $(foreach d,$(ALL_MODULES.$(1).NOTICE_DEPS),\ 603 $(addsuffix :$(call wordlist-colon,2,9999,$(d)), \ 604 $(foreach dt,$(ALL_MODULES.$(d).BUILT) $(ALL_MODULES.$(d).INSTALLED),\ 605 $(ALL_TARGETS.$(dt).META_LIC)))))))) 606$(strip $(eval _notices := $(sort $(ALL_MODULES.$(1).NOTICES)))) 607$(strip $(eval _tgts := $(sort $(ALL_MODULES.$(1).BUILT)))) 608$(strip $(eval _inst := $(sort $(ALL_MODULES.$(1).INSTALLED)))) 609$(strip $(eval _path := $(sort $(ALL_MODULES.$(1).PATH)))) 610$(strip $(eval _map := $(strip $(foreach _m,$(sort $(ALL_MODULES.$(1).LICENSE_INSTALL_MAP)), \ 611 $(eval _s := $(call word-colon,1,$(_m))) \ 612 $(eval _d := $(call word-colon,2,$(_m))) \ 613 $(eval _ns := $(if $(strip $(ALL_MODULES.$(_s).INSTALLED)),$(ALL_MODULES.$(_s).INSTALLED),$(if $(strip $(ALL_MODULES.$(_s).BUILT)),$(ALL_MODULES.$(_s).BUILT),$(_s)))) \ 614 $(foreach ns,$(_ns),$(ns):$(_d) ) \ 615)))) 616 617$(2): PRIVATE_KINDS := $(sort $(ALL_MODULES.$(1).LICENSE_KINDS)) 618$(2): PRIVATE_CONDITIONS := $(sort $(ALL_MODULES.$(1).LICENSE_CONDITIONS)) 619$(2): PRIVATE_NOTICES := $(_notices) 620$(2): PRIVATE_NOTICE_DEPS := $(_deps) 621$(2): PRIVATE_SOURCES := $(_srcs) 622$(2): PRIVATE_TARGETS := $(_tgts) 623$(2): PRIVATE_INSTALLED := $(_inst) 624$(2): PRIVATE_PATH := $(_path) 625$(2): PRIVATE_IS_CONTAINER := $(ALL_MODULES.$(1).IS_CONTAINER) 626$(2): PRIVATE_PACKAGE_NAME := $(strip $(ALL_MODULES.$(1).LICENSE_PACKAGE_NAME)) 627$(2): PRIVATE_INSTALL_MAP := $(_map) 628$(2): PRIVATE_MODULE_NAME := $(1) 629$(2): PRIVATE_MODULE_TYPE := $(ALL_MODULES.$(1).MODULE_TYPE) 630$(2): PRIVATE_MODULE_CLASS := $(ALL_MODULES.$(1).MODULE_CLASS) 631$(2): PRIVATE_INSTALL_MAP := $(_map) 632$(2): PRIVATE_ARGUMENT_FILE := $(call intermediates-dir-for,PACKAGING,notice)/$(2)/arguments 633$(2): $(BUILD_LICENSE_METADATA) 634$(2) : $(foreach d,$(_deps),$(call word-colon,1,$(d))) $(foreach n,$(_notices),$(call word-colon,1,$(n)) ) 635 rm -f $$@ 636 mkdir -p $$(dir $$@) 637 mkdir -p $$(dir $$(PRIVATE_ARGUMENT_FILE)) 638 $$(call dump-words-to-file,\ 639 $$(addprefix -mn ,$$(PRIVATE_MODULE_NAME))\ 640 $$(addprefix -mt ,$$(PRIVATE_MODULE_TYPE))\ 641 $$(addprefix -mc ,$$(PRIVATE_MODULE_CLASS))\ 642 $$(addprefix -k ,$$(PRIVATE_KINDS))\ 643 $$(addprefix -c ,$$(PRIVATE_CONDITIONS))\ 644 $$(addprefix -n ,$$(PRIVATE_NOTICES))\ 645 $$(addprefix -d ,$$(PRIVATE_NOTICE_DEPS))\ 646 $$(addprefix -s ,$$(PRIVATE_SOURCES))\ 647 $$(addprefix -m ,$$(PRIVATE_INSTALL_MAP))\ 648 $$(addprefix -t ,$$(PRIVATE_TARGETS))\ 649 $$(addprefix -i ,$$(PRIVATE_INSTALLED))\ 650 $$(addprefix -r ,$$(PRIVATE_PATH)),\ 651 $$(PRIVATE_ARGUMENT_FILE)) 652 OUT_DIR=$(OUT_DIR) $(BUILD_LICENSE_METADATA) \ 653 $$(if $$(PRIVATE_IS_CONTAINER),-is_container) \ 654 -p '$$(PRIVATE_PACKAGE_NAME)' \ 655 @$$(PRIVATE_ARGUMENT_FILE) \ 656 -o $$@ 657endef 658 659 660########################################################### 661## License metadata build rule for non-module target $(1) 662########################################################### 663define non-module-license-metadata-rule 664$(strip $(eval _dir := $(call license-metadata-dir,$(1)))) 665$(strip $(eval _tgt := $(strip $(1)))) 666$(strip $(eval _meta := $(call append-path,$(_dir),$(patsubst $(OUT_DIR)%,out%,$(_tgt).meta_lic)))) 667$(strip $(eval _deps := $(sort $(filter-out 0p: :,$(foreach d,$(strip $(ALL_NON_MODULES.$(_tgt).DEPENDENCIES)),$(ALL_TARGETS.$(call word-colon,1,$(d)).META_LIC):$(call wordlist-colon,2,9999,$(d))))))) 668$(strip $(eval _notices := $(sort $(ALL_NON_MODULES.$(_tgt).NOTICES)))) 669$(strip $(eval _path := $(sort $(ALL_NON_MODULES.$(_tgt).PATH)))) 670$(strip $(eval _install_map := $(ALL_NON_MODULES.$(_tgt).ROOT_MAPPINGS))) 671 672$(_meta): PRIVATE_KINDS := $(sort $(ALL_NON_MODULES.$(_tgt).LICENSE_KINDS)) 673$(_meta): PRIVATE_CONDITIONS := $(sort $(ALL_NON_MODULES.$(_tgt).LICENSE_CONDITIONS)) 674$(_meta): PRIVATE_NOTICES := $(_notices) 675$(_meta): PRIVATE_NOTICE_DEPS := $(_deps) 676$(_meta): PRIVATE_SOURCES := $(ALL_NON_MODULES.$(_tgt).DEPENDENCIES) 677$(_meta): PRIVATE_TARGETS := $(_tgt) 678$(_meta): PRIVATE_PATH := $(_path) 679$(_meta): PRIVATE_IS_CONTAINER := $(ALL_NON_MODULES.$(_tgt).IS_CONTAINER) 680$(_meta): PRIVATE_PACKAGE_NAME := $(strip $(ALL_NON_MODULES.$(_tgt).LICENSE_PACKAGE_NAME)) 681$(_meta): PRIVATE_INSTALL_MAP := $(strip $(_install_map)) 682$(_meta): PRIVATE_ARGUMENT_FILE := $(call intermediates-dir-for,PACKAGING,notice)/$(_meta)/arguments 683$(_meta): $(BUILD_LICENSE_METADATA) 684$(_meta) : $(foreach d,$(_deps),$(call word-colon,1,$(d))) $(foreach n,$(_notices),$(call word-colon,1,$(n)) ) 685 rm -f $$@ 686 mkdir -p $$(dir $$@) 687 mkdir -p $$(dir $$(PRIVATE_ARGUMENT_FILE)) 688 $$(call dump-words-to-file,\ 689 $$(addprefix -k ,$$(PRIVATE_KINDS))\ 690 $$(addprefix -c ,$$(PRIVATE_CONDITIONS))\ 691 $$(addprefix -n ,$$(PRIVATE_NOTICES))\ 692 $$(addprefix -d ,$$(PRIVATE_NOTICE_DEPS))\ 693 $$(addprefix -s ,$$(PRIVATE_SOURCES))\ 694 $$(addprefix -m ,$$(PRIVATE_INSTALL_MAP))\ 695 $$(addprefix -t ,$$(PRIVATE_TARGETS))\ 696 $$(addprefix -r ,$$(PRIVATE_PATH)),\ 697 $$(PRIVATE_ARGUMENT_FILE)) 698 OUT_DIR=$(OUT_DIR) $(BUILD_LICENSE_METADATA) \ 699 -mt raw -mc unknown \ 700 $$(if $$(PRIVATE_IS_CONTAINER),-is_container) \ 701 $$(addprefix -r ,$$(PRIVATE_PATH)) \ 702 @$$(PRIVATE_ARGUMENT_FILE) \ 703 -o $$@ 704 705endef 706 707########################################################### 708## Record missing dependencies for non-module target $(1) 709########################################################### 710define record-missing-non-module-dependencies 711$(strip $(eval _tgt := $(strip $(1)))) 712$(strip $(foreach d,$(strip $(ALL_NON_MODULES.$(_tgt).DEPENDENCIES)), \ 713 $(if $(strip $(ALL_TARGETS.$(d).META_LIC)), \ 714 , \ 715 $(eval NON_MODULES_WITHOUT_LICENSE_METADATA += $(d))) \ 716)) 717endef 718 719########################################################### 720## License metadata build rule for copied target $(1) 721########################################################### 722define copied-target-license-metadata-rule 723$(if $(strip $(ALL_TARGETS.$(1).META_LIC)),,$(call _copied-target-license-metadata-rule,$(1))) 724endef 725 726define _copied-target-license-metadata-rule 727$(strip $(eval _dir := $(call license-metadata-dir,$(1)))) 728$(strip $(eval _meta := $(call append-path,$(_dir),$(patsubst $(OUT_DIR)%,out%,$(1).meta_lic)))) 729$(strip $(eval ALL_TARGETS.$(1).META_LIC:=$(_meta))) 730$(strip $(eval _dep:=)) 731$(strip $(foreach s,$(ALL_COPIED_TARGETS.$(1).SOURCES),\ 732 $(eval _dmeta:=$(ALL_TARGETS.$(s).META_LIC))\ 733 $(if $(filter-out 0p,$(_dep)),\ 734 $(if $(filter-out $(_dep),$(_dmeta)),$(error cannot copy target from multiple modules: $(1) from $(_dep) and $(_dmeta))),\ 735 $(eval _dep:=$(_dmeta))))) 736$(if $(filter 0p,$(_dep)),$(eval ALL_TARGETS.$(1).META_LIC:=0p)) 737$(strip $(if $(strip $(_dep)),,$(error cannot copy target from unknown module: $(1) from $(ALL_COPIED_TARGETS.$(1).SOURCES)))) 738 739ifneq (0p,$(ALL_TARGETS.$(1).META_LIC)) 740$(_meta): PRIVATE_DEST_TARGET := $(1) 741$(_meta): PRIVATE_SOURCE_TARGETS := $(ALL_COPIED_TARGETS.$(1).SOURCES) 742$(_meta): PRIVATE_SOURCE_METADATA := $(_dep) 743$(_meta): PRIVATE_ARGUMENT_FILE := $(call intermediates-dir-for,PACKAGING,copynotice)/$(_meta)/arguments 744$(_meta) : $(_dep) $(COPY_LICENSE_METADATA) 745 rm -f $$@ 746 mkdir -p $$(dir $$@) 747 mkdir -p $$(dir $$(PRIVATE_ARGUMENT_FILE)) 748 $$(call dump-words-to-file,\ 749 $$(addprefix -i ,$$(PRIVATE_DEST_TARGET))\ 750 $$(addprefix -s ,$$(PRIVATE_SOURCE_TARGETS))\ 751 $$(addprefix -d ,$$(PRIVATE_SOURCE_METADATA)),\ 752 $$(PRIVATE_ARGUMENT_FILE)) 753 OUT_DIR=$(OUT_DIR) $(COPY_LICENSE_METADATA) \ 754 @$$(PRIVATE_ARGUMENT_FILE) \ 755 -o $$@ 756 757endif 758 759$(eval _dep:=) 760$(eval _dmeta:=) 761$(eval _meta:=) 762$(eval _dir:=) 763endef 764 765########################################################### 766## Declare the license metadata for non-module target $(1). 767## 768## $(2) -- license kinds e.g. SPDX-license-identifier-Apache-2.0 769## $(3) -- license conditions e.g. notice by_exception_only 770## $(4) -- license text filenames (notices) 771## $(5) -- package name 772## $(6) -- project path 773########################################################### 774define declare-license-metadata 775$(strip \ 776 $(eval _tgt := $(subst //,/,$(strip $(1)))) \ 777 $(eval ALL_NON_MODULES += $(_tgt)) \ 778 $(eval ALL_TARGETS.$(_tgt).META_LIC := $(call license-metadata-dir,$(1))/$(patsubst $(OUT_DIR)%,out%,$(_tgt)).meta_lic) \ 779 $(eval ALL_NON_MODULES.$(_tgt).LICENSE_KINDS := $(strip $(2))) \ 780 $(eval ALL_NON_MODULES.$(_tgt).LICENSE_CONDITIONS := $(strip $(3))) \ 781 $(eval ALL_NON_MODULES.$(_tgt).NOTICES := $(strip $(4))) \ 782 $(eval ALL_NON_MODULES.$(_tgt).LICENSE_PACKAGE_NAME := $(strip $(5))) \ 783 $(eval ALL_NON_MODULES.$(_tgt).PATH := $(strip $(6))) \ 784) 785endef 786 787########################################################### 788## Declare that non-module targets copied from project $(1) and 789## optionally ending in $(2) have the following license 790## metadata: 791## 792## $(3) -- license kinds e.g. SPDX-license-identifier-Apache-2.0 793## $(4) -- license conditions e.g. notice by_exception_only 794## $(5) -- license text filenames (notices) 795## $(6) -- package name 796########################################################### 797define declare-copy-files-license-metadata 798$(strip \ 799 $(foreach _pair,$(filter $(1)%$(2),$(PRODUCT_COPY_FILES)),$(eval $(call declare-license-metadata,$(PRODUCT_OUT)/$(call word-colon,2,$(_pair)),$(3),$(4),$(5),$(6),$(1)))) \ 800) 801endef 802 803########################################################### 804## Declare the license metadata for non-module container-type target $(1). 805## 806## Container-type targets are targets like .zip files that 807## merely aggregate other files. 808## 809## $(2) -- license kinds e.g. SPDX-license-identifier-Apache-2.0 810## $(3) -- license conditions e.g. notice by_exception_only 811## $(4) -- license text filenames (notices) 812## $(5) -- package name 813## $(6) -- project path 814########################################################### 815define declare-container-license-metadata 816$(strip \ 817 $(eval _tgt := $(subst //,/,$(strip $(1)))) \ 818 $(eval ALL_NON_MODULES += $(_tgt)) \ 819 $(eval ALL_TARGETS.$(_tgt).META_LIC := $(call license-metadata-dir,$(1))/$(patsubst $(OUT_DIR)%,out%,$(_tgt)).meta_lic) \ 820 $(eval ALL_NON_MODULES.$(_tgt).LICENSE_KINDS := $(strip $(2))) \ 821 $(eval ALL_NON_MODULES.$(_tgt).LICENSE_CONDITIONS := $(strip $(3))) \ 822 $(eval ALL_NON_MODULES.$(_tgt).NOTICES := $(strip $(4))) \ 823 $(eval ALL_NON_MODULES.$(_tgt).LICENSE_PACKAGE_NAME := $(strip $(5))) \ 824 $(eval ALL_NON_MODULES.$(_tgt).PATH := $(strip $(6))) \ 825 $(eval ALL_NON_MODULES.$(_tgt).IS_CONTAINER := true) \ 826) 827endef 828 829########################################################### 830## Declare that non-module target $(1) is a non-copyrightable file. 831## 832## e.g. an information-only file merely listing other files. 833########################################################### 834define declare-0p-target 835$(strip \ 836 $(eval _tgt := $(subst //,/,$(strip $(1)))) \ 837 $(eval ALL_0P_TARGETS += $(_tgt)) \ 838) 839endef 840 841########################################################### 842## Declare that non-module targets copied from project $(1) and 843## optionally ending in $(2) are non-copyrightable files. 844## 845## e.g. an information-only file merely listing other files. 846########################################################### 847define declare-0p-copy-files 848$(strip \ 849 $(foreach _pair,$(filter $(1)%$(2),$(PRODUCT_COPY_FILES)),$(eval $(call declare-0p-target,$(PRODUCT_OUT)/$(call word-colon,2,$(_pair))))) \ 850) 851endef 852 853########################################################### 854## Declare non-module target $(1) to have a first-party license 855## (Android Apache 2.0) 856## 857## $(2) -- project path 858########################################################### 859define declare-1p-target 860$(call declare-license-metadata,$(1),SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,Android,$(2)) 861endef 862 863########################################################### 864## Declare that non-module targets copied from project $(1) and 865## optionally ending in $(2) are first-party licensed 866## (Android Apache 2.0) 867########################################################### 868define declare-1p-copy-files 869$(foreach _pair,$(filter $(1)%$(2),$(PRODUCT_COPY_FILES)),$(call declare-1p-target,$(PRODUCT_OUT)/$(call word-colon,2,$(_pair)),$(1))) 870endef 871 872########################################################### 873## Declare non-module container-type target $(1) to have a 874## first-party license (Android Apache 2.0). 875## 876## Container-type targets are targets like .zip files that 877## merely aggregate other files. 878## 879## $92) -- project path 880########################################################### 881define declare-1p-container 882$(call declare-container-license-metadata,$(1),SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,Android,$(2)) 883endef 884 885########################################################### 886## Declare license dependencies $(2) with optional colon-separated 887## annotations for non-module target $(1) 888########################################################### 889define declare-license-deps 890$(strip \ 891 $(eval _tgt := $(subst //,/,$(strip $(1)))) \ 892 $(eval ALL_NON_MODULES += $(_tgt)) \ 893 $(eval ALL_TARGETS.$(_tgt).META_LIC := $(call license-metadata-dir,$(1))/$(patsubst $(OUT_DIR)%,out%,$(_tgt)).meta_lic) \ 894 $(eval ALL_NON_MODULES.$(_tgt).DEPENDENCIES := $(strip $(ALL_NON_MODULES.$(_tgt).DEPENDENCIES) $(2))) \ 895) 896endef 897 898########################################################### 899## Declare license dependencies $(2) with optional colon-separated 900## annotations for non-module container-type target $(1) 901## 902## Container-type targets are targets like .zip files that 903## merely aggregate other files. 904## 905## $(3) -- root mappings space-separated source:target 906########################################################### 907define declare-container-license-deps 908$(strip \ 909 $(eval _tgt := $(subst //,/,$(strip $(1)))) \ 910 $(eval ALL_NON_MODULES += $(_tgt)) \ 911 $(eval ALL_TARGETS.$(_tgt).META_LIC := $(call license-metadata-dir,$(1))/$(patsubst $(OUT_DIR)%,out%,$(_tgt)).meta_lic) \ 912 $(eval ALL_NON_MODULES.$(_tgt).DEPENDENCIES := $(strip $(ALL_NON_MODULES.$(_tgt).DEPENDENCIES) $(2))) \ 913 $(eval ALL_NON_MODULES.$(_tgt).IS_CONTAINER := true) \ 914 $(eval ALL_NON_MODULES.$(_tgt).ROOT_MAPPINGS := $(strip $(ALL_NON_MODULES.$(_tgt).ROOT_MAPPINGS) $(3))) \ 915) 916endef 917 918########################################################### 919## Declares the rule to report targets with no license metadata. 920########################################################### 921define report-missing-licenses-rule 922.PHONY: reportmissinglicenses 923reportmissinglicenses: PRIVATE_NON_MODULES:=$(sort $(NON_MODULES_WITHOUT_LICENSE_METADATA) $(TARGETS_MISSING_LICENSE_METADATA)) 924reportmissinglicenses: PRIVATE_COPIED_FILES:=$(sort $(filter $(NON_MODULES_WITHOUT_LICENSE_METADATA) $(TARGETS_MISSING_LICENSE_METADATA),\ 925 $(foreach _pair,$(PRODUCT_COPY_FILES), $(PRODUCT_OUT)/$(call word-colon,2,$(_pair))))) 926reportmissinglicenses: 927 @echo Reporting $$(words $$(PRIVATE_NON_MODULES)) targets without license metadata 928 $$(foreach t,$$(PRIVATE_NON_MODULES),if ! [ -h $$(t) ]; then echo No license metadata for $$(t) >&2; fi;) 929 $$(foreach t,$$(PRIVATE_COPIED_FILES),if ! [ -h $$(t) ]; then echo No license metadata for copied file $$(t) >&2; fi;) 930 echo $$(words $$(PRIVATE_NON_MODULES)) targets missing license metadata >&2 931 932endef 933 934 935########################################################### 936# Returns the unique list of built license metadata files. 937########################################################### 938define all-license-metadata 939$(sort \ 940 $(foreach t,$(ALL_NON_MODULES),$(if $(filter 0p,$(ALL_TARGETS.$(t).META_LIC)),, $(ALL_TARGETS.$(t).META_LIC))) \ 941 $(foreach m,$(ALL_MODULES), $(ALL_MODULES.$(m).META_LIC)) \ 942) 943endef 944 945########################################################### 946# Declares the rule to report all library names used in any notice files. 947########################################################### 948define report-all-notice-library-names-rule 949$(strip $(eval _all := $(call all-license-metadata))) 950 951.PHONY: reportallnoticelibrarynames 952reportallnoticelibrarynames: PRIVATE_LIST_FILE := $(call license-metadata-dir,COMMON)/filelist 953reportallnoticelibrarynames: | $(COMPLIANCENOTICE_SHIPPEDLIBS) 954reportallnoticelibrarynames: $(_all) 955 @echo Reporting notice library names for at least $$(words $(_all)) license metadata files 956 $(hide) rm -f $$(PRIVATE_LIST_FILE) 957 $(hide) mkdir -p $$(dir $$(PRIVATE_LIST_FILE)) 958 $(hide) find out -name '*meta_lic' -type f -printf '"%p"\n' >$$(PRIVATE_LIST_FILE) 959 OUT_DIR=$(OUT_DIR) $(COMPLIANCENOTICE_SHIPPEDLIBS) @$$(PRIVATE_LIST_FILE) 960endef 961 962########################################################### 963# Declares the rule to build all license metadata. 964########################################################### 965define build-all-license-metadata-rule 966$(strip $(eval _all := $(call all-license-metadata))) 967 968.PHONY: alllicensemetadata 969alllicensemetadata: $(_all) 970 @echo Building all $(words $(_all)) license metadata files 971endef 972 973 974########################################################### 975## Declares a license metadata build rule for ALL_MODULES 976########################################################### 977define build-license-metadata 978$(strip \ 979 $(foreach t,$(sort $(ALL_0P_TARGETS)), \ 980 $(eval ALL_TARGETS.$(t).META_LIC := 0p) \ 981 ) \ 982 $(foreach t,$(sort $(ALL_COPIED_TARGETS)),$(eval $(call copied-target-license-metadata-rule,$(t)))) \ 983 $(foreach t,$(sort $(ALL_NON_MODULES)),$(eval $(call non-module-license-metadata-rule,$(t)))) \ 984 $(foreach m,$(sort $(ALL_MODULES)),$(eval $(call license-metadata-rule,$(m)))) \ 985 $(eval $(call build-all-license-metadata-rule))) 986endef 987 988########################################################### 989## Returns correct _idfPrefix from the list: 990## { HOST, HOST_CROSS, TARGET } 991########################################################### 992# the following rules checked in order: 993# ($1 is in {HOST_CROSS} => $1; 994# ($1 is empty) => TARGET; 995# ($2 is not empty) => HOST_CROSS; 996# => HOST; 997define find-idf-prefix 998$(strip \ 999 $(eval _idf_pfx_:=$(strip $(filter HOST_CROSS,$(1)))) \ 1000 $(eval _idf_pfx_:=$(if $(strip $(1)),$(if $(_idf_pfx_),$(_idf_pfx_),$(if $(strip $(2)),HOST_CROSS,HOST)),TARGET)) \ 1001 $(_idf_pfx_) 1002) 1003endef 1004 1005########################################################### 1006## The intermediates directory. Where object files go for 1007## a given target. We could technically get away without 1008## the "_intermediates" suffix on the directory, but it's 1009## nice to be able to grep for that string to find out if 1010## anyone's abusing the system. 1011########################################################### 1012 1013# $(1): target class, like "APPS" 1014# $(2): target name, like "NotePad" 1015# $(3): { HOST, HOST_CROSS, <empty (TARGET)>, <other non-empty (HOST)> } 1016# $(4): if non-empty, force the intermediates to be COMMON 1017# $(5): if non-empty, force the intermediates to be for the 2nd arch 1018# $(6): if non-empty, force the intermediates to be for the host cross os 1019define intermediates-dir-for 1020$(strip \ 1021 $(eval _idfClass := $(strip $(1))) \ 1022 $(if $(_idfClass),, \ 1023 $(error $(LOCAL_PATH): Class not defined in call to intermediates-dir-for)) \ 1024 $(eval _idfName := $(strip $(2))) \ 1025 $(if $(_idfName),, \ 1026 $(error $(LOCAL_PATH): Name not defined in call to intermediates-dir-for)) \ 1027 $(eval _idfPrefix := $(call find-idf-prefix,$(3),$(6))) \ 1028 $(eval _idf2ndArchPrefix := $(if $(strip $(5)),$(TARGET_2ND_ARCH_VAR_PREFIX))) \ 1029 $(if $(filter $(_idfPrefix)_$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \ 1030 $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_INTERMEDIATES)) \ 1031 ,$(if $(filter $(_idfClass),$(PER_ARCH_MODULE_CLASSES)),\ 1032 $(eval _idfIntBase := $($(_idf2ndArchPrefix)$(_idfPrefix)_OUT_INTERMEDIATES)) \ 1033 ,$(eval _idfIntBase := $($(_idfPrefix)_OUT_INTERMEDIATES)) \ 1034 ) \ 1035 ) \ 1036 $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \ 1037) 1038endef 1039 1040# Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE 1041# to determine the intermediates directory. 1042# 1043# $(1): if non-empty, force the intermediates to be COMMON 1044# $(2): if non-empty, force the intermediates to be for the 2nd arch 1045# $(3): if non-empty, force the intermediates to be for the host cross os 1046define local-intermediates-dir 1047$(strip \ 1048 $(if $(strip $(LOCAL_MODULE_CLASS)),, \ 1049 $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-intermediates-dir)) \ 1050 $(if $(strip $(LOCAL_MODULE)),, \ 1051 $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-intermediates-dir)) \ 1052 $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(if $(strip $(LOCAL_IS_HOST_MODULE)),HOST),$(1),$(2),$(3)) \ 1053) 1054endef 1055 1056# Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE 1057# to determine the intermediates directory. 1058# 1059# $(1): if non-empty, force the intermediates to be COMMON 1060# $(2): if non-empty, force the intermediates to be for the 2nd arch 1061# $(3): if non-empty, force the intermediates to be for the host cross os 1062define local-meta-intermediates-dir 1063$(strip \ 1064 $(if $(strip $(LOCAL_MODULE_CLASS)),, \ 1065 $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-meta-intermediates-dir)) \ 1066 $(if $(strip $(LOCAL_MODULE)),, \ 1067 $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-meta-intermediates-dir)) \ 1068 $(call intermediates-dir-for,META$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(if $(strip $(LOCAL_IS_HOST_MODULE)),HOST),$(1),$(2),$(3)) \ 1069) 1070endef 1071 1072########################################################### 1073## The generated sources directory. Placing generated 1074## source files directly in the intermediates directory 1075## causes problems for multiarch builds, where there are 1076## two intermediates directories for a single target. Put 1077## them in a separate directory, and they will be copied to 1078## each intermediates directory automatically. 1079########################################################### 1080 1081# $(1): target class, like "APPS" 1082# $(2): target name, like "NotePad" 1083# $(3): { HOST, HOST_CROSS, <empty (TARGET)>, <other non-empty (HOST)> } 1084# $(4): if non-empty, force the generated sources to be COMMON 1085define generated-sources-dir-for 1086$(strip \ 1087 $(eval _idfClass := $(strip $(1))) \ 1088 $(if $(_idfClass),, \ 1089 $(error $(LOCAL_PATH): Class not defined in call to generated-sources-dir-for)) \ 1090 $(eval _idfName := $(strip $(2))) \ 1091 $(if $(_idfName),, \ 1092 $(error $(LOCAL_PATH): Name not defined in call to generated-sources-dir-for)) \ 1093 $(eval _idfPrefix := $(call find-idf-prefix,$(3),)) \ 1094 $(if $(filter $(_idfPrefix)_$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \ 1095 $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_GEN)) \ 1096 , \ 1097 $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN)) \ 1098 ) \ 1099 $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \ 1100) 1101endef 1102 1103# Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE 1104# to determine the generated sources directory. 1105# 1106# $(1): if non-empty, force the intermediates to be COMMON 1107define local-generated-sources-dir 1108$(strip \ 1109 $(if $(strip $(LOCAL_MODULE_CLASS)),, \ 1110 $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-generated-sources-dir)) \ 1111 $(if $(strip $(LOCAL_MODULE)),, \ 1112 $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-generated-sources-dir)) \ 1113 $(call generated-sources-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(if $(strip $(LOCAL_IS_HOST_MODULE)),HOST),$(1)) \ 1114) 1115endef 1116 1117########################################################### 1118## The packaging directory for a module. Similar to intermedates, but 1119## in a location that will be wiped by an m installclean. 1120########################################################### 1121 1122# $(1): subdir in PACKAGING 1123# $(2): target class, like "APPS" 1124# $(3): target name, like "NotePad" 1125# $(4): { HOST, HOST_CROSS, <empty (TARGET)>, <other non-empty (HOST)> } 1126define packaging-dir-for 1127$(strip \ 1128 $(eval _pdfClass := $(strip $(2))) \ 1129 $(if $(_pdfClass),, \ 1130 $(error $(LOCAL_PATH): Class not defined in call to generated-sources-dir-for)) \ 1131 $(eval _pdfName := $(strip $(3))) \ 1132 $(if $(_pdfName),, \ 1133 $(error $(LOCAL_PATH): Name not defined in call to generated-sources-dir-for)) \ 1134 $(call intermediates-dir-for,PACKAGING,$(1),$(4))/$(_pdfClass)/$(_pdfName)_intermediates \ 1135) 1136endef 1137 1138# Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE 1139# to determine the packaging directory. 1140# 1141# $(1): subdir in PACKAGING 1142define local-packaging-dir 1143$(strip \ 1144 $(if $(strip $(LOCAL_MODULE_CLASS)),, \ 1145 $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-generated-sources-dir)) \ 1146 $(if $(strip $(LOCAL_MODULE)),, \ 1147 $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-generated-sources-dir)) \ 1148 $(call packaging-dir-for,$(1),$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(if $(strip $(LOCAL_IS_HOST_MODULE)),HOST)) \ 1149) 1150endef 1151 1152 1153########################################################### 1154## Convert a list of short module names (e.g., "framework", "Browser") 1155## into the list of files that are built for those modules. 1156## NOTE: this won't return reliable results until after all 1157## sub-makefiles have been included. 1158## $(1): target list 1159########################################################### 1160 1161define module-built-files 1162$(foreach module,$(1),$(ALL_MODULES.$(module).BUILT)) 1163endef 1164 1165########################################################### 1166## Convert a list of short modules names (e.g., "framework", "Browser") 1167## into the list of files that are installed for those modules. 1168## NOTE: this won't return reliable results until after all 1169## sub-makefiles have been included. 1170## $(1): target list 1171########################################################### 1172 1173define module-installed-files 1174$(foreach module,$(1),$(ALL_MODULES.$(module).INSTALLED)) 1175endef 1176 1177########################################################### 1178## Convert a list of short modules names (e.g., "framework", "Browser") 1179## into the list of files that are built *for the target* for those modules. 1180## NOTE: this won't return reliable results until after all 1181## sub-makefiles have been included. 1182## $(1): target list 1183########################################################### 1184 1185define module-target-built-files 1186$(foreach module,$(1),$(ALL_MODULES.$(module).TARGET_BUILT)) 1187endef 1188 1189########################################################### 1190## Convert a list of short modules names (e.g., "framework", "Browser") 1191## into the list of files that should be used when linking 1192## against that module as a public API. 1193## TODO: Allow this for more than JAVA_LIBRARIES modules 1194## NOTE: this won't return reliable results until after all 1195## sub-makefiles have been included. 1196## $(1): target list 1197########################################################### 1198 1199define module-stubs-files 1200$(foreach module,$(1),$(if $(filter $(module),$(JAVA_SDK_LIBRARIES)),\ 1201$(call java-lib-files,$(module).stubs),$(ALL_MODULES.$(module).STUBS))) 1202endef 1203 1204########################################################### 1205## Evaluates to the timestamp file for a doc module, which 1206## is the dependency that should be used. 1207## $(1): doc module 1208########################################################### 1209 1210define doc-timestamp-for 1211$(OUT_DOCS)/$(strip $(1))-timestamp 1212endef 1213 1214 1215########################################################### 1216## Convert "core ext framework" to "out/.../javalib.jar ..." 1217## $(1): library list 1218## $(2): Non-empty if IS_HOST_MODULE 1219########################################################### 1220 1221# Get the jar files (you can pass to "javac -classpath") of static or shared 1222# Java libraries that you want to link against. 1223# $(1): library name list 1224# $(2): Non-empty if IS_HOST_MODULE 1225define java-lib-files 1226$(foreach lib,$(1),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),$(2),COMMON)/classes.jar) 1227endef 1228 1229# Get the header jar files (you can pass to "javac -classpath") of static or shared 1230# Java libraries that you want to link against. 1231# $(1): library name list 1232# $(2): Non-empty if IS_HOST_MODULE 1233ifneq ($(TURBINE_ENABLED),false) 1234define java-lib-header-files 1235$(foreach lib,$(1),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),$(2),COMMON)/classes-header.jar) 1236endef 1237else 1238define java-lib-header-files 1239$(call java-lib-files,$(1),$(2)) 1240endef 1241endif 1242 1243# Get the dependency files (you can put on the right side of "|" of a build rule) 1244# of the Java libraries. 1245# $(1): library name list 1246# $(2): Non-empty if IS_HOST_MODULE 1247# Historically for target Java libraries we used a different file (javalib.jar) 1248# as the dependency. 1249# Now we can use classes.jar as dependency, so java-lib-deps is the same 1250# as java-lib-files. 1251define java-lib-deps 1252$(call java-lib-files,$(1),$(2)) 1253endef 1254 1255# Get the jar files (you can pass to "javac -classpath") of static or shared 1256# APK libraries that you want to link against. 1257# $(1): library name list 1258define app-lib-files 1259$(foreach lib,$(1),$(call intermediates-dir-for,APPS,$(lib),,COMMON)/classes.jar) 1260endef 1261 1262# Get the header jar files (you can pass to "javac -classpath") of static or shared 1263# APK libraries that you want to link against. 1264# $(1): library name list 1265ifneq ($(TURBINE_ENABLED),false) 1266define app-lib-header-files 1267$(foreach lib,$(1),$(call intermediates-dir-for,APPS,$(lib),,COMMON)/classes-header.jar) 1268endef 1269else 1270define app-lib-header-files 1271$(call app-lib-files,$(1)) 1272endef 1273endif 1274 1275# Get the exported-sdk-libs files which collectively give you the list of exported java sdk 1276# lib names that are (transitively) exported from the given set of java libs 1277# $(1): library name list 1278define exported-sdk-libs-files 1279$(foreach lib,$(1),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/exported-sdk-libs) 1280endef 1281 1282########################################################### 1283## Append a leaf to a base path. Properly deals with 1284## base paths ending in /. 1285## 1286## $(1): base path 1287## $(2): leaf path 1288########################################################### 1289 1290define append-path 1291$(subst //,/,$(1)/$(2)) 1292endef 1293 1294 1295########################################################### 1296## Color-coded warnings and errors 1297## Use echo-(warning|error) in a build rule 1298## Use pretty-(warning|error) instead of $(warning)/$(error) 1299########################################################### 1300ESC_BOLD := \033[1m 1301ESC_WARNING := \033[35m 1302ESC_ERROR := \033[31m 1303ESC_RESET := \033[0m 1304 1305# $(1): path (and optionally line) information 1306# $(2): message to print 1307define echo-warning 1308echo -e "$(ESC_BOLD)$(1): $(ESC_WARNING)warning:$(ESC_RESET)$(ESC_BOLD)" '$(subst ','\'',$(2))' "$(ESC_RESET)" >&2 1309endef 1310 1311# $(1): path (and optionally line) information 1312# $(2): message to print 1313define echo-error 1314echo -e "$(ESC_BOLD)$(1): $(ESC_ERROR)error:$(ESC_RESET)$(ESC_BOLD)" '$(subst ','\'',$(2))' "$(ESC_RESET)" >&2 1315endef 1316 1317########################################################### 1318## Legacy showcommands compatibility 1319########################################################### 1320 1321define pretty 1322@echo $1 1323endef 1324 1325########################################################### 1326## Commands for including the dependency files the compiler generates 1327########################################################### 1328# $(1): the .P file 1329# $(2): the main build target 1330define include-depfile 1331$(eval $(2) : .KATI_DEPFILE := $1) 1332endef 1333 1334# $(1): object files 1335define include-depfiles-for-objs 1336$(foreach obj, $(1), $(call include-depfile, $(obj:%.o=%.d), $(obj))) 1337endef 1338 1339########################################################### 1340## Track source files compiled to objects 1341########################################################### 1342# $(1): list of sources 1343# $(2): list of matching objects 1344define track-src-file-obj 1345$(eval $(call _track-src-file-obj,$(1))) 1346endef 1347define _track-src-file-obj 1348i := w 1349$(foreach s,$(1), 1350my_tracked_src_files += $(s) 1351my_src_file_obj_$(s) := $$(word $$(words $$(i)),$$(2)) 1352i += w) 1353endef 1354 1355# $(1): list of sources 1356# $(2): list of matching generated sources 1357define track-src-file-gen 1358$(eval $(call _track-src-file-gen,$(2))) 1359endef 1360define _track-src-file-gen 1361i := w 1362$(foreach s,$(1), 1363my_tracked_gen_files += $(s) 1364my_src_file_gen_$(s) := $$(word $$(words $$(i)),$$(1)) 1365i += w) 1366endef 1367 1368# $(1): list of generated sources 1369# $(2): list of matching objects 1370define track-gen-file-obj 1371$(call track-src-file-obj,$(foreach f,$(1),\ 1372 $(or $(my_src_file_gen_$(f)),$(f))),$(2)) 1373endef 1374 1375########################################################### 1376## Commands for running lex 1377########################################################### 1378 1379define transform-l-to-c-or-cpp 1380@echo "Lex: $(PRIVATE_MODULE) <= $<" 1381@mkdir -p $(dir $@) 1382M4=$(M4) $(LEX) -o$@ $< 1383endef 1384 1385########################################################### 1386## Commands for running yacc 1387## 1388########################################################### 1389 1390define transform-y-to-c-or-cpp 1391@echo "Yacc: $(PRIVATE_MODULE) <= $<" 1392@mkdir -p $(dir $@) 1393M4=$(M4) $(YACC) $(PRIVATE_YACCFLAGS) \ 1394 --defines=$(basename $@).h \ 1395 -o $@ $< 1396endef 1397 1398########################################################### 1399## Commands to compile RenderScript to Java 1400########################################################### 1401 1402## Merge multiple .d files generated by llvm-rs-cc. This is necessary 1403## because ninja can handle only a single depfile per build target. 1404## .d files generated by llvm-rs-cc define .stamp, .bc, and optionally 1405## .java as build targets. However, there's no way to let ninja know 1406## dependencies to .bc files and .java files, so we give up build 1407## targets for them. As we write the .stamp file as the target by 1408## ourselves, the awk script removes the first lines before the colon 1409## and append a backslash to the last line to concatenate contents of 1410## multiple files. 1411# $(1): .d files to be merged 1412# $(2): merged .d file 1413define _merge-renderscript-d 1414$(hide) echo '$@: $(backslash)' > $2 1415$(foreach d,$1, \ 1416 $(hide) awk 'start { sub(/( \\)?$$/, " \\"); print } /:/ { start=1 }' < $d >> $2$(newline)) 1417$(hide) echo >> $2 1418endef 1419 1420# b/37755219 1421RS_CC_ASAN_OPTIONS := ASAN_OPTIONS=detect_leaks=0:detect_container_overflow=0 1422 1423define transform-renderscripts-to-java-and-bc 1424@echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)" 1425$(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR) 1426$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/res/raw 1427$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/src 1428$(hide) $(RS_CC_ASAN_OPTIONS) $(PRIVATE_RS_CC) \ 1429 -o $(PRIVATE_RS_OUTPUT_DIR)/res/raw \ 1430 -p $(PRIVATE_RS_OUTPUT_DIR)/src \ 1431 -d $(PRIVATE_RS_OUTPUT_DIR) \ 1432 -a $@ -MD \ 1433 $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \ 1434 $(PRIVATE_RS_FLAGS) \ 1435 $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \ 1436 $(PRIVATE_RS_SOURCE_FILES) 1437$(SOONG_ZIP) -o $@ -C $(PRIVATE_RS_OUTPUT_DIR)/src -D $(PRIVATE_RS_OUTPUT_DIR)/src 1438$(SOONG_ZIP) -o $(PRIVATE_RS_OUTPUT_RES_ZIP) -C $(PRIVATE_RS_OUTPUT_DIR)/res -D $(PRIVATE_RS_OUTPUT_DIR)/res 1439$(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d) 1440endef 1441 1442define transform-bc-to-so 1443@echo "Renderscript compatibility: $(notdir $@) <= $(notdir $<)" 1444$(hide) mkdir -p $(dir $@) 1445$(hide) $(BCC_COMPAT) -O3 -o $(dir $@)/$(notdir $(<:.bc=.o)) -fPIC -shared \ 1446 -rt-path $(RS_PREBUILT_CLCORE) -mtriple $(RS_COMPAT_TRIPLE) $< 1447$(hide) $(PRIVATE_CXX_LINK) -fuse-ld=lld -target $(CLANG_TARGET_TRIPLE) -shared -Wl,-soname,$(notdir $@) -nostdlib \ 1448 -Wl,-rpath,\$$ORIGIN/../lib \ 1449 $(dir $@)/$(notdir $(<:.bc=.o)) \ 1450 $(RS_PREBUILT_COMPILER_RT) \ 1451 -o $@ $(CLANG_TARGET_GLOBAL_LLDFLAGS) -Wl,--hash-style=sysv \ 1452 -L $(SOONG_OUT_DIR)/ndk/platforms/android-$(PRIVATE_SDK_VERSION)/arch-$(TARGET_ARCH)/usr/lib64 \ 1453 -L $(SOONG_OUT_DIR)/ndk/platforms/android-$(PRIVATE_SDK_VERSION)/arch-$(TARGET_ARCH)/usr/lib \ 1454 $(call intermediates-dir-for,SHARED_LIBRARIES,libRSSupport)/libRSSupport.so \ 1455 -lm -lc 1456endef 1457 1458########################################################### 1459## Commands to compile RenderScript to C++ 1460########################################################### 1461 1462define transform-renderscripts-to-cpp-and-bc 1463@echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)" 1464$(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR) 1465$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/ 1466$(hide) $(RS_CC_ASAN_OPTIONS) $(PRIVATE_RS_CC) \ 1467 -o $(PRIVATE_RS_OUTPUT_DIR)/ \ 1468 -d $(PRIVATE_RS_OUTPUT_DIR) \ 1469 -a $@ -MD \ 1470 -reflect-c++ \ 1471 $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \ 1472 $(PRIVATE_RS_FLAGS) \ 1473 $(addprefix -I , $(PRIVATE_RS_INCLUDES)) \ 1474 $(PRIVATE_RS_SOURCE_FILES) 1475$(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d) 1476$(hide) mkdir -p $(dir $@) 1477$(hide) touch $@ 1478endef 1479 1480 1481########################################################### 1482## Commands for running aidl 1483########################################################### 1484 1485define transform-aidl-to-java 1486@mkdir -p $(dir $@) 1487@echo "Aidl: $(PRIVATE_MODULE) <= $<" 1488$(hide) $(AIDL) -d$(patsubst %.java,%.P,$@) $(PRIVATE_AIDL_FLAGS) $< $@ 1489endef 1490#$(AIDL) $(PRIVATE_AIDL_FLAGS) $< - | indent -nut -br -npcs -l1000 > $@ 1491 1492define transform-aidl-to-cpp 1493@mkdir -p $(dir $@) 1494@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR) 1495@echo "Generating C++ from AIDL: $(PRIVATE_MODULE) <= $<" 1496$(hide) $(AIDL_CPP) -d$(basename $@).aidl.d --ninja $(PRIVATE_AIDL_FLAGS) \ 1497 $< $(PRIVATE_HEADER_OUTPUT_DIR) $@ 1498endef 1499 1500## Given a .aidl file path, generate the rule to compile it a .java file 1501# $(1): a .aidl source file 1502# $(2): a directory to place the generated .java files in 1503# $(3): name of a variable to add the path to the generated source file to 1504# 1505# You must call this with $(eval). 1506define define-aidl-java-rule 1507define_aidl_java_rule_src := $(patsubst %.aidl,%.java,$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) 1508$$(define_aidl_java_rule_src) : $(call clean-path,$(LOCAL_PATH)/$(1)) $(AIDL) 1509 $$(transform-aidl-to-java) 1510$(3) += $$(define_aidl_java_rule_src) 1511endef 1512 1513## Given a .aidl file path generate the rule to compile it a .cpp file. 1514# $(1): a .aidl source file 1515# $(2): a directory to place the generated .cpp files in 1516# $(3): name of a variable to add the path to the generated source file to 1517# 1518# You must call this with $(eval). 1519define define-aidl-cpp-rule 1520define_aidl_cpp_rule_src := $(patsubst %.aidl,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) 1521$$(define_aidl_cpp_rule_src) : $(call clean-path,$(LOCAL_PATH)/$(1)) $(AIDL_CPP) 1522 $$(transform-aidl-to-cpp) 1523$(3) += $$(define_aidl_cpp_rule_src) 1524endef 1525 1526########################################################### 1527## Commands for running vts 1528########################################################### 1529 1530define transform-vts-to-cpp 1531@mkdir -p $(dir $@) 1532@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR) 1533@echo "Generating C++ from VTS: $(PRIVATE_MODULE) <= $<" 1534$(hide) $(VTSC) -TODO_b/120496070 $(PRIVATE_VTS_FLAGS) \ 1535 $< $(PRIVATE_HEADER_OUTPUT_DIR) $@ 1536endef 1537 1538## Given a .vts file path generate the rule to compile it a .cpp file. 1539# $(1): a .vts source file 1540# $(2): a directory to place the generated .cpp files in 1541# $(3): name of a variable to add the path to the generated source file to 1542# 1543# You must call this with $(eval). 1544define define-vts-cpp-rule 1545define_vts_cpp_rule_src := $(patsubst %.vts,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1)))) 1546$$(define_vts_cpp_rule_src) : $(LOCAL_PATH)/$(1) $(VTSC) 1547 $$(transform-vts-to-cpp) 1548$(3) += $$(define_vts_cpp_rule_src) 1549endef 1550 1551########################################################### 1552## Commands for running java-event-log-tags.py 1553########################################################### 1554 1555define transform-logtags-to-java 1556@mkdir -p $(dir $@) 1557@echo "logtags: $@ <= $<" 1558$(hide) $(JAVATAGS) -o $@ $< $(PRIVATE_MERGED_TAG) 1559endef 1560 1561 1562########################################################### 1563## Commands for running protoc to compile .proto into .java 1564########################################################### 1565 1566define transform-proto-to-java 1567@mkdir -p $(dir $@) 1568@echo "Protoc: $@ <= $(PRIVATE_PROTO_SRC_FILES)" 1569@rm -rf $(PRIVATE_PROTO_JAVA_OUTPUT_DIR) 1570@mkdir -p $(PRIVATE_PROTO_JAVA_OUTPUT_DIR) 1571$(hide) for f in $(PRIVATE_PROTO_SRC_FILES); do \ 1572 $(PROTOC) \ 1573 $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ 1574 $(PRIVATE_PROTO_JAVA_OUTPUT_OPTION)="$(PRIVATE_PROTO_JAVA_OUTPUT_PARAMS):$(PRIVATE_PROTO_JAVA_OUTPUT_DIR)" \ 1575 $(PRIVATE_PROTOC_FLAGS) \ 1576 $$f || exit 33; \ 1577 done 1578$(SOONG_ZIP) -o $@ -C $(PRIVATE_PROTO_JAVA_OUTPUT_DIR) -D $(PRIVATE_PROTO_JAVA_OUTPUT_DIR) 1579endef 1580 1581###################################################################### 1582## Commands for running protoc to compile .proto into .pb.cc (or.pb.c) and .pb.h 1583###################################################################### 1584 1585define transform-proto-to-cc 1586@echo "Protoc: $@ <= $<" 1587@mkdir -p $(dir $@) 1588$(hide) \ 1589 $(PROTOC) \ 1590 $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ 1591 $(PRIVATE_PROTOC_FLAGS) \ 1592 $< 1593@# aprotoc outputs only .cc. Rename it to .cpp if necessary. 1594$(if $(PRIVATE_RENAME_CPP_EXT),\ 1595 $(hide) mv $(basename $@).cc $@) 1596endef 1597 1598########################################################### 1599## Helper to set include paths form transform-*-to-o 1600########################################################### 1601define c-includes 1602$(addprefix -I , $(PRIVATE_C_INCLUDES)) \ 1603$(foreach i,$(PRIVATE_IMPORTED_INCLUDES),$(EXPORTS.$(i)))\ 1604$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),,\ 1605 $(addprefix -I ,\ 1606 $(filter-out $(PRIVATE_C_INCLUDES), \ 1607 $(PRIVATE_GLOBAL_C_INCLUDES))) \ 1608 $(addprefix -isystem ,\ 1609 $(filter-out $(PRIVATE_C_INCLUDES), \ 1610 $(PRIVATE_GLOBAL_C_SYSTEM_INCLUDES)))) 1611endef 1612 1613########################################################### 1614## Commands for running gcc to compile a C++ file 1615########################################################### 1616 1617define transform-cpp-to-o-compiler-args 1618$(c-includes) \ 1619-c \ 1620$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 1621 $(PRIVATE_TARGET_GLOBAL_CFLAGS) \ 1622 $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \ 1623 $(PRIVATE_ARM_CFLAGS) \ 1624 ) \ 1625$(PRIVATE_RTTI_FLAG) \ 1626$(PRIVATE_CFLAGS) \ 1627$(PRIVATE_CPPFLAGS) \ 1628$(PRIVATE_DEBUG_CFLAGS) \ 1629$(PRIVATE_CFLAGS_NO_OVERRIDE) \ 1630$(PRIVATE_CPPFLAGS_NO_OVERRIDE) 1631endef 1632 1633# PATH_TO_CLANG_TIDY is defined in build/soong 1634define call-clang-tidy 1635$(PATH_TO_CLANG_TIDY) \ 1636 $(PRIVATE_TIDY_FLAGS) \ 1637 -checks=$(PRIVATE_TIDY_CHECKS) 1638endef 1639 1640define clang-tidy-cpp 1641$(hide) $(call-clang-tidy) $< -- $(transform-cpp-to-o-compiler-args) 1642endef 1643 1644ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY))) 1645define transform-cpp-to-o 1646$(if $(PRIVATE_TIDY_CHECKS), 1647 @echo "$($(PRIVATE_PREFIX)DISPLAY) tidy $(PRIVATE_ARM_MODE) C++: $<" 1648 $(clang-tidy-cpp)) 1649endef 1650else 1651define transform-cpp-to-o 1652@echo "$($(PRIVATE_PREFIX)DISPLAY) $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<" 1653@mkdir -p $(dir $@) 1654$(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-cpp)) 1655$(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ 1656 $(transform-cpp-to-o-compiler-args) \ 1657 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< 1658endef 1659endif 1660 1661 1662########################################################### 1663## Commands for running gcc to compile a C file 1664########################################################### 1665 1666# $(1): extra flags 1667define transform-c-or-s-to-o-compiler-args 1668$(c-includes) \ 1669-c \ 1670$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 1671 $(PRIVATE_TARGET_GLOBAL_CFLAGS) \ 1672 $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \ 1673 $(PRIVATE_ARM_CFLAGS) \ 1674 ) \ 1675 $(1) 1676endef 1677 1678define transform-c-to-o-compiler-args 1679$(call transform-c-or-s-to-o-compiler-args, \ 1680 $(PRIVATE_CFLAGS) \ 1681 $(PRIVATE_CONLYFLAGS) \ 1682 $(PRIVATE_DEBUG_CFLAGS) \ 1683 $(PRIVATE_CFLAGS_NO_OVERRIDE)) 1684endef 1685 1686define clang-tidy-c 1687$(hide) $(call-clang-tidy) $< -- $(transform-c-to-o-compiler-args) 1688endef 1689 1690ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY))) 1691define transform-c-to-o 1692$(if $(PRIVATE_TIDY_CHECKS), 1693 @echo "$($(PRIVATE_PREFIX)DISPLAY) tidy $(PRIVATE_ARM_MODE) C: $<" 1694 $(clang-tidy-c)) 1695endef 1696else 1697define transform-c-to-o 1698@echo "$($(PRIVATE_PREFIX)DISPLAY) $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<" 1699@mkdir -p $(dir $@) 1700$(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-c)) 1701$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ 1702 $(transform-c-to-o-compiler-args) \ 1703 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< 1704endef 1705endif 1706 1707define transform-s-to-o 1708@echo "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<" 1709@mkdir -p $(dir $@) 1710$(RELATIVE_PWD) $(PRIVATE_CC) \ 1711 $(call transform-c-or-s-to-o-compiler-args, $(PRIVATE_ASFLAGS)) \ 1712 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< 1713endef 1714 1715# YASM compilation 1716define transform-asm-to-o 1717@mkdir -p $(dir $@) 1718$(hide) $(YASM) \ 1719 $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ 1720 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_YASM_FLAGS) \ 1721 $(PRIVATE_ASFLAGS) \ 1722 -o $@ $< 1723endef 1724 1725########################################################### 1726## Commands for running gcc to compile an Objective-C file 1727## This should never happen for target builds but this 1728## will error at build time. 1729########################################################### 1730 1731define transform-m-to-o 1732@echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<" 1733$(call transform-c-or-s-to-o, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) 1734endef 1735 1736########################################################### 1737## Commands for running gcc to compile a host C++ file 1738########################################################### 1739 1740define transform-host-cpp-to-o-compiler-args 1741$(c-includes) \ 1742-c \ 1743$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 1744 $(PRIVATE_HOST_GLOBAL_CFLAGS) \ 1745 $(PRIVATE_HOST_GLOBAL_CPPFLAGS) \ 1746 ) \ 1747$(PRIVATE_CFLAGS) \ 1748$(PRIVATE_CPPFLAGS) \ 1749$(PRIVATE_DEBUG_CFLAGS) \ 1750$(PRIVATE_CFLAGS_NO_OVERRIDE) \ 1751$(PRIVATE_CPPFLAGS_NO_OVERRIDE) 1752endef 1753 1754define clang-tidy-host-cpp 1755$(hide) $(call-clang-tidy) $< -- $(transform-host-cpp-to-o-compiler-args) 1756endef 1757 1758ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY))) 1759define transform-host-cpp-to-o 1760$(if $(PRIVATE_TIDY_CHECKS), 1761 @echo "tidy $($(PRIVATE_PREFIX)DISPLAY) C++: $<" 1762 $(clang-tidy-host-cpp)) 1763endef 1764else 1765define transform-host-cpp-to-o 1766@echo "$($(PRIVATE_PREFIX)DISPLAY) C++: $(PRIVATE_MODULE) <= $<" 1767@mkdir -p $(dir $@) 1768$(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-host-cpp)) 1769$(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ 1770 $(transform-host-cpp-to-o-compiler-args) \ 1771 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< 1772endef 1773endif 1774 1775 1776########################################################### 1777## Commands for running gcc to compile a host C file 1778########################################################### 1779 1780define transform-host-c-or-s-to-o-common-args 1781$(c-includes) \ 1782-c \ 1783$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 1784 $(PRIVATE_HOST_GLOBAL_CFLAGS) \ 1785 $(PRIVATE_HOST_GLOBAL_CONLYFLAGS) \ 1786 ) 1787endef 1788 1789# $(1): extra flags 1790define transform-host-c-or-s-to-o 1791@mkdir -p $(dir $@) 1792$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ 1793 $(transform-host-c-or-s-to-o-common-args) \ 1794 $(1) \ 1795 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< 1796endef 1797 1798define transform-host-c-to-o-compiler-args 1799 $(transform-host-c-or-s-to-o-common-args) \ 1800 $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) \ 1801 $(PRIVATE_DEBUG_CFLAGS) $(PRIVATE_CFLAGS_NO_OVERRIDE) 1802endef 1803 1804define clang-tidy-host-c 1805$(hide) $(call-clang-tidy) $< -- $(transform-host-c-to-o-compiler-args) 1806endef 1807 1808ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY))) 1809define transform-host-c-to-o 1810$(if $(PRIVATE_TIDY_CHECKS), 1811 @echo "tidy $($(PRIVATE_PREFIX)DISPLAY) C: $<" 1812 $(clang-tidy-host-c)) 1813endef 1814else 1815define transform-host-c-to-o 1816@echo "$($(PRIVATE_PREFIX)DISPLAY) C: $(PRIVATE_MODULE) <= $<" 1817@mkdir -p $(dir $@) 1818$(if $(PRIVATE_TIDY_CHECKS), $(clang-tidy-host-c)) 1819$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ 1820 $(transform-host-c-to-o-compiler-args) \ 1821 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< 1822endef 1823endif 1824 1825define transform-host-s-to-o 1826@echo "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<" 1827$(call transform-host-c-or-s-to-o, $(PRIVATE_ASFLAGS)) 1828endef 1829 1830########################################################### 1831## Commands for running gcc to compile a host Objective-C file 1832########################################################### 1833 1834define transform-host-m-to-o 1835@echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<" 1836$(call transform-host-c-or-s-to-o, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS) $(PRIVATE_CFLAGS_NO_OVERRIDE)) 1837endef 1838 1839########################################################### 1840## Commands for running gcc to compile a host Objective-C++ file 1841########################################################### 1842 1843define transform-host-mm-to-o 1844$(transform-host-cpp-to-o) 1845endef 1846 1847 1848########################################################### 1849## Rules to compile a single C/C++ source with ../ in the path 1850########################################################### 1851# Replace "../" in object paths with $(DOTDOT_REPLACEMENT). 1852DOTDOT_REPLACEMENT := dotdot/ 1853 1854## Rule to compile a C++ source file with ../ in the path. 1855## Must be called with $(eval). 1856# $(1): the C++ source file in LOCAL_SRC_FILES. 1857# $(2): the additional dependencies. 1858# $(3): the variable name to collect the output object file. 1859# $(4): the ninja pool to use for the rule 1860define compile-dotdot-cpp-file 1861o := $(intermediates)/$(patsubst %$(LOCAL_CPP_EXTENSION),%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) 1862$$(o) : .KATI_NINJA_POOL := $(4) 1863$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) $(CLANG_CXX) 1864 $$(transform-$$(PRIVATE_HOST)cpp-to-o) 1865$$(call include-depfiles-for-objs, $$(o)) 1866$(3) += $$(o) 1867endef 1868 1869## Rule to compile a C source file with ../ in the path. 1870## Must be called with $(eval). 1871# $(1): the C source file in LOCAL_SRC_FILES. 1872# $(2): the additional dependencies. 1873# $(3): the variable name to collect the output object file. 1874# $(4): the ninja pool to use for the rule 1875define compile-dotdot-c-file 1876o := $(intermediates)/$(patsubst %.c,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) 1877$$(o) : .KATI_NINJA_POOL := $(4) 1878$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) $(CLANG) 1879 $$(transform-$$(PRIVATE_HOST)c-to-o) 1880$$(call include-depfiles-for-objs, $$(o)) 1881$(3) += $$(o) 1882endef 1883 1884## Rule to compile a .S source file with ../ in the path. 1885## Must be called with $(eval). 1886# $(1): the .S source file in LOCAL_SRC_FILES. 1887# $(2): the additional dependencies. 1888# $(3): the variable name to collect the output object file. 1889# $(4): the ninja pool to use for the rule 1890define compile-dotdot-s-file 1891o := $(intermediates)/$(patsubst %.S,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) 1892$$(o) : .KATI_NINJA_POOL := $(4) 1893$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) $(CLANG) 1894 $$(transform-$$(PRIVATE_HOST)s-to-o) 1895$$(call include-depfiles-for-objs, $$(o)) 1896$(3) += $$(o) 1897endef 1898 1899## Rule to compile a .s source file with ../ in the path. 1900## Must be called with $(eval). 1901# $(1): the .s source file in LOCAL_SRC_FILES. 1902# $(2): the additional dependencies. 1903# $(3): the variable name to collect the output object file. 1904# $(4): the ninja pool to use for the rule 1905define compile-dotdot-s-file-no-deps 1906o := $(intermediates)/$(patsubst %.s,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1))) 1907$$(o) : .KATI_NINJA_POOL := $(4) 1908$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2) $(CLANG) 1909 $$(transform-$$(PRIVATE_HOST)s-to-o) 1910$(3) += $$(o) 1911endef 1912 1913########################################################### 1914## Commands for running ar 1915########################################################### 1916 1917define _concat-if-arg2-not-empty 1918$(if $(2),$(hide) $(1) $(2)) 1919endef 1920 1921# Split long argument list into smaller groups and call the command repeatedly 1922# Call the command at least once even if there are no arguments, as otherwise 1923# the output file won't be created. 1924# 1925# $(1): the command without arguments 1926# $(2): the arguments 1927define split-long-arguments 1928$(hide) $(1) $(wordlist 1,500,$(2)) 1929$(call _concat-if-arg2-not-empty,$(1),$(wordlist 501,1000,$(2))) 1930$(call _concat-if-arg2-not-empty,$(1),$(wordlist 1001,1500,$(2))) 1931$(call _concat-if-arg2-not-empty,$(1),$(wordlist 1501,2000,$(2))) 1932$(call _concat-if-arg2-not-empty,$(1),$(wordlist 2001,2500,$(2))) 1933$(call _concat-if-arg2-not-empty,$(1),$(wordlist 2501,3000,$(2))) 1934$(call _concat-if-arg2-not-empty,$(1),$(wordlist 3001,99999,$(2))) 1935endef 1936 1937# $(1): the full path of the source static library. 1938# $(2): the full path of the destination static library. 1939define _extract-and-include-single-target-whole-static-lib 1940$(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ 1941 rm -rf $$ldir; \ 1942 mkdir -p $$ldir; \ 1943 cp $(1) $$ldir; \ 1944 lib_to_include=$$ldir/$(notdir $(1)); \ 1945 filelist=; \ 1946 subdir=0; \ 1947 for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) t $(1)`; do \ 1948 if [ -e $$ldir/$$f ]; then \ 1949 mkdir $$ldir/$$subdir; \ 1950 ext=$$subdir/; \ 1951 subdir=$$((subdir+1)); \ 1952 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) m $$lib_to_include $$f; \ 1953 else \ 1954 ext=; \ 1955 fi; \ 1956 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \ 1957 filelist="$$filelist $$ldir/$$ext$$f"; \ 1958 done ; \ 1959 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \ 1960 $(PRIVATE_ARFLAGS) $(2) $$filelist 1961 1962endef 1963 1964# $(1): the full path of the source static library. 1965# $(2): the full path of the destination static library. 1966define extract-and-include-whole-static-libs-first 1967$(if $(strip $(1)), 1968$(hide) cp $(1) $(2)) 1969endef 1970 1971# $(1): the full path of the destination static library. 1972define extract-and-include-target-whole-static-libs 1973$(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)),$(1)) 1974$(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \ 1975 $(call _extract-and-include-single-target-whole-static-lib, $(lib), $(1))) 1976endef 1977 1978# Explicitly delete the archive first so that ar doesn't 1979# try to add to an existing archive. 1980define transform-o-to-static-lib 1981@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)" 1982@mkdir -p $(dir $@) 1983@rm -f $@ $@.tmp 1984$(call extract-and-include-target-whole-static-libs,$@.tmp) 1985$(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) \ 1986 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \ 1987 $(PRIVATE_ARFLAGS) \ 1988 $@.tmp,$(PRIVATE_ALL_OBJECTS)) 1989$(hide) mv -f $@.tmp $@ 1990endef 1991 1992########################################################### 1993## Commands for running host ar 1994########################################################### 1995 1996# $(1): the full path of the source static library. 1997# $(2): the full path of the destination static library. 1998define _extract-and-include-single-host-whole-static-lib 1999$(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ 2000 rm -rf $$ldir; \ 2001 mkdir -p $$ldir; \ 2002 cp $(1) $$ldir; \ 2003 lib_to_include=$$ldir/$(notdir $(1)); \ 2004 filelist=; \ 2005 subdir=0; \ 2006 for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) t $(1) | \grep '\.o$$'`; do \ 2007 if [ -e $$ldir/$$f ]; then \ 2008 mkdir $$ldir/$$subdir; \ 2009 ext=$$subdir/; \ 2010 subdir=$$((subdir+1)); \ 2011 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) m $$lib_to_include $$f; \ 2012 else \ 2013 ext=; \ 2014 fi; \ 2015 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \ 2016 filelist="$$filelist $$ldir/$$ext$$f"; \ 2017 done ; \ 2018 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) \ 2019 $(2) $$filelist 2020 2021endef 2022 2023define extract-and-include-host-whole-static-libs 2024$(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)),$(1)) 2025$(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \ 2026 $(call _extract-and-include-single-host-whole-static-lib, $(lib),$(1))) 2027endef 2028 2029ifeq ($(HOST_OS),darwin) 2030# On Darwin the host ar fails if there is nothing to add to .a at all. 2031# We work around by adding a dummy.o and then deleting it. 2032define create-dummy.o-if-no-objs 2033$(if $(PRIVATE_ALL_OBJECTS),,$(hide) touch $(dir $(1))dummy.o) 2034endef 2035 2036define get-dummy.o-if-no-objs 2037$(if $(PRIVATE_ALL_OBJECTS),,$(dir $(1))dummy.o) 2038endef 2039 2040define delete-dummy.o-if-no-objs 2041$(if $(PRIVATE_ALL_OBJECTS),,$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) d $(1) $(dir $(1))dummy.o \ 2042 && rm -f $(dir $(1))dummy.o) 2043endef 2044else 2045create-dummy.o-if-no-objs = 2046get-dummy.o-if-no-objs = 2047delete-dummy.o-if-no-objs = 2048endif # HOST_OS is darwin 2049 2050# Explicitly delete the archive first so that ar doesn't 2051# try to add to an existing archive. 2052define transform-host-o-to-static-lib 2053@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)" 2054@mkdir -p $(dir $@) 2055@rm -f $@ $@.tmp 2056$(call extract-and-include-host-whole-static-libs,$@.tmp) 2057$(call create-dummy.o-if-no-objs,$@.tmp) 2058$(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) \ 2059 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) $@.tmp,\ 2060 $(PRIVATE_ALL_OBJECTS) $(call get-dummy.o-if-no-objs,$@.tmp)) 2061$(call delete-dummy.o-if-no-objs,$@.tmp) 2062$(hide) mv -f $@.tmp $@ 2063endef 2064 2065 2066########################################################### 2067## Commands for running gcc to link a shared library or package 2068########################################################### 2069 2070# ld just seems to be so finicky with command order that we allow 2071# it to be overriden en-masse see combo/linux-arm.make for an example. 2072ifneq ($(HOST_CUSTOM_LD_COMMAND),true) 2073define transform-host-o-to-shared-lib-inner 2074$(hide) $(PRIVATE_CXX_LINK) \ 2075 -Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \ 2076 -Wl,-rpath,\$$ORIGIN/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \ 2077 -shared -Wl,-soname,$(notdir $@) \ 2078 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 2079 $(PRIVATE_HOST_GLOBAL_LDFLAGS) \ 2080 ) \ 2081 $(PRIVATE_LDFLAGS) \ 2082 $(PRIVATE_CRTBEGIN) \ 2083 $(PRIVATE_ALL_OBJECTS) \ 2084 -Wl,--whole-archive \ 2085 $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \ 2086 -Wl,--no-whole-archive \ 2087 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ 2088 $(PRIVATE_ALL_STATIC_LIBRARIES) \ 2089 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ 2090 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \ 2091 $(PRIVATE_LIBCRT_BUILTINS) \ 2092 $(PRIVATE_ALL_SHARED_LIBRARIES) \ 2093 -o $@ \ 2094 $(PRIVATE_CRTEND) \ 2095 $(PRIVATE_LDLIBS) 2096endef 2097endif 2098 2099define transform-host-o-to-shared-lib 2100@echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)" 2101@mkdir -p $(dir $@) 2102$(transform-host-o-to-shared-lib-inner) 2103endef 2104 2105define transform-host-o-to-package 2106@echo "$($(PRIVATE_PREFIX)DISPLAY) Package: $(PRIVATE_MODULE) ($@)" 2107@mkdir -p $(dir $@) 2108$(transform-host-o-to-shared-lib-inner) 2109endef 2110 2111 2112########################################################### 2113## Commands for running gcc to link a shared library or package 2114########################################################### 2115 2116define transform-o-to-shared-lib-inner 2117$(hide) $(PRIVATE_CXX_LINK) \ 2118 -nostdlib -Wl,-soname,$(notdir $@) \ 2119 -Wl,--gc-sections \ 2120 -shared \ 2121 $(PRIVATE_TARGET_CRTBEGIN_SO_O) \ 2122 $(PRIVATE_ALL_OBJECTS) \ 2123 -Wl,--whole-archive \ 2124 $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \ 2125 -Wl,--no-whole-archive \ 2126 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ 2127 $(PRIVATE_ALL_STATIC_LIBRARIES) \ 2128 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ 2129 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \ 2130 $(PRIVATE_TARGET_LIBCRT_BUILTINS) \ 2131 $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ 2132 $(PRIVATE_LDFLAGS) \ 2133 $(PRIVATE_ALL_SHARED_LIBRARIES) \ 2134 -o $@ \ 2135 $(PRIVATE_TARGET_CRTEND_SO_O) \ 2136 $(PRIVATE_LDLIBS) 2137endef 2138 2139define transform-o-to-shared-lib 2140@echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)" 2141@mkdir -p $(dir $@) 2142$(transform-o-to-shared-lib-inner) 2143endef 2144 2145########################################################### 2146## Commands for running gcc to link an executable 2147########################################################### 2148 2149define transform-o-to-executable-inner 2150$(hide) $(PRIVATE_CXX_LINK) -pie \ 2151 -nostdlib -Bdynamic \ 2152 -Wl,-dynamic-linker,$(PRIVATE_LINKER) \ 2153 -Wl,--gc-sections \ 2154 -Wl,-z,nocopyreloc \ 2155 $(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O) \ 2156 $(PRIVATE_ALL_OBJECTS) \ 2157 -Wl,--whole-archive \ 2158 $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \ 2159 -Wl,--no-whole-archive \ 2160 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ 2161 $(PRIVATE_ALL_STATIC_LIBRARIES) \ 2162 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ 2163 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \ 2164 $(PRIVATE_TARGET_LIBCRT_BUILTINS) \ 2165 $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ 2166 $(PRIVATE_LDFLAGS) \ 2167 $(PRIVATE_ALL_SHARED_LIBRARIES) \ 2168 -o $@ \ 2169 $(PRIVATE_TARGET_CRTEND_O) \ 2170 $(PRIVATE_LDLIBS) 2171endef 2172 2173define transform-o-to-executable 2174@echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)" 2175@mkdir -p $(dir $@) 2176$(transform-o-to-executable-inner) 2177endef 2178 2179 2180########################################################### 2181## Commands for linking a static executable. In practice, 2182## we only use this on arm, so the other platforms don't 2183## have transform-o-to-static-executable defined. 2184## Clang driver needs -static to create static executable. 2185## However, bionic/linker uses -shared to overwrite. 2186## Linker for x86 targets does not allow coexistance of -static and -shared, 2187## so we add -static only if -shared is not used. 2188########################################################### 2189 2190define transform-o-to-static-executable-inner 2191$(hide) $(PRIVATE_CXX_LINK) \ 2192 -nostdlib -Bstatic \ 2193 $(if $(filter $(PRIVATE_LDFLAGS),-shared),,-static) \ 2194 -Wl,--gc-sections \ 2195 -o $@ \ 2196 $(PRIVATE_TARGET_CRTBEGIN_STATIC_O) \ 2197 $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \ 2198 $(PRIVATE_LDFLAGS) \ 2199 $(PRIVATE_ALL_OBJECTS) \ 2200 -Wl,--whole-archive \ 2201 $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \ 2202 -Wl,--no-whole-archive \ 2203 $(filter-out %libcompiler_rt.hwasan.a %libc_nomalloc.hwasan.a %libc.hwasan.a %libcompiler_rt.a %libc_nomalloc.a %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ 2204 -Wl,--start-group \ 2205 $(filter %libc.a %libc.hwasan.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ 2206 $(filter %libc_nomalloc.a %libc_nomalloc.hwasan.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ 2207 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \ 2208 $(filter %libcompiler_rt.a %libcompiler_rt.hwasan.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ 2209 $(PRIVATE_TARGET_LIBCRT_BUILTINS) \ 2210 -Wl,--end-group \ 2211 $(PRIVATE_TARGET_CRTEND_O) 2212endef 2213 2214define transform-o-to-static-executable 2215@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticExecutable: $(PRIVATE_MODULE) ($@)" 2216@mkdir -p $(dir $@) 2217$(transform-o-to-static-executable-inner) 2218endef 2219 2220 2221########################################################### 2222## Commands for running gcc to link a host executable 2223########################################################### 2224 2225ifneq ($(HOST_CUSTOM_LD_COMMAND),true) 2226define transform-host-o-to-executable-inner 2227$(hide) $(PRIVATE_CXX_LINK) \ 2228 $(PRIVATE_CRTBEGIN) \ 2229 $(PRIVATE_ALL_OBJECTS) \ 2230 -Wl,--whole-archive \ 2231 $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \ 2232 -Wl,--no-whole-archive \ 2233 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ 2234 $(PRIVATE_ALL_STATIC_LIBRARIES) \ 2235 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ 2236 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \ 2237 $(PRIVATE_LIBCRT_BUILTINS) \ 2238 $(PRIVATE_ALL_SHARED_LIBRARIES) \ 2239 $(foreach path,$(PRIVATE_RPATHS), \ 2240 -Wl,-rpath,\$$ORIGIN/$(path)) \ 2241 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 2242 $(PRIVATE_HOST_GLOBAL_LDFLAGS) \ 2243 ) \ 2244 $(PRIVATE_LDFLAGS) \ 2245 -o $@ \ 2246 $(PRIVATE_CRTEND) \ 2247 $(PRIVATE_LDLIBS) 2248endef 2249endif 2250 2251define transform-host-o-to-executable 2252@echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)" 2253@mkdir -p $(dir $@) 2254$(transform-host-o-to-executable-inner) 2255endef 2256 2257########################################################### 2258## Commands for packaging native coverage files 2259########################################################### 2260define package-coverage-files 2261 @rm -f $@ $@.lst $@.premerged 2262 @touch $@.lst 2263 $(foreach obj,$(strip $(PRIVATE_ALL_OBJECTS)), $(hide) echo $(obj) >> $@.lst$(newline)) 2264 $(hide) $(SOONG_ZIP) -o $@.premerged -C $(OUT_DIR) -l $@.lst 2265 $(hide) $(MERGE_ZIPS) -ignore-duplicates $@ $@.premerged $(strip $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) 2266endef 2267 2268########################################################### 2269## Commands for running javac to make .class files 2270########################################################### 2271 2272# b/37750224 2273AAPT_ASAN_OPTIONS := ASAN_OPTIONS=detect_leaks=0 2274 2275# Search for generated R.java in $1, copy the found R.java as $2. 2276define find-generated-R.java 2277$(hide) for GENERATED_R_FILE in `find $(1) \ 2278 -name R.java 2> /dev/null`; do \ 2279 cp $$GENERATED_R_FILE $(2) || exit 32; \ 2280 done; 2281@# Ensure that the target file is always created, i.e. also in case we did not 2282@# enter the GENERATED_R_FILE-loop above. This avoids unnecessary rebuilding. 2283$(hide) touch $(2) 2284endef 2285 2286########################################################### 2287# AAPT2 compilation and link 2288########################################################### 2289define aapt2-compile-one-resource-file 2290@mkdir -p $(dir $@) 2291$(hide) $(AAPT2) compile -o $(dir $@) $(PRIVATE_AAPT2_CFLAGS) $< 2292endef 2293 2294define aapt2-compile-resource-dirs 2295@mkdir -p $(dir $@) 2296$(hide) $(AAPT2) compile -o $@ $(addprefix --dir ,$(PRIVATE_SOURCE_RES_DIRS)) \ 2297 $(PRIVATE_AAPT2_CFLAGS) 2298endef 2299 2300# TODO(b/74574557): use aapt2 compile --zip if it gets implemented 2301define aapt2-compile-resource-zips 2302@mkdir -p $(dir $@) 2303$(ZIPSYNC) -d $@.contents -l $@.list $(PRIVATE_SOURCE_RES_ZIPS) 2304$(hide) $(AAPT2) compile -o $@ --dir $@.contents $(PRIVATE_AAPT2_CFLAGS) 2305endef 2306 2307# Set up rule to compile one resource file with aapt2. 2308# Must be called with $(eval). 2309# $(1): the source file 2310# $(2): the output file 2311define aapt2-compile-one-resource-file-rule 2312$(2) : $(1) $(AAPT2) 2313 @echo "AAPT2 compile $$@ <- $$<" 2314 $$(call aapt2-compile-one-resource-file) 2315endef 2316 2317# Convert input resource file path to output file path. 2318# values-[config]/<file>.xml -> values-[config]_<file>.arsc.flat; 2319# For other resource file, just replace the last "/" with "_" and 2320# add .flat extension. 2321# 2322# $(1): the input resource file path 2323# $(2): the base dir of the output file path 2324# Returns: the compiled output file path 2325define aapt2-compiled-resource-out-file 2326$(strip \ 2327 $(eval _p_w := $(strip $(subst /,$(space),$(dir $(call clean-path,$(1)))))) 2328 $(2)/$(subst $(space),/,$(_p_w))_$(if $(filter values%,$(lastword $(_p_w))),$(patsubst %.xml,%.arsc,$(notdir $(1))),$(notdir $(1))).flat) 2329endef 2330 2331define aapt2-link 2332@mkdir -p $(dir $@) 2333rm -rf $(PRIVATE_JAVA_GEN_DIR) 2334mkdir -p $(PRIVATE_JAVA_GEN_DIR) 2335$(call dump-words-to-file,$(PRIVATE_RES_FLAT),$(dir $@)aapt2-flat-list) 2336$(call dump-words-to-file,$(PRIVATE_OVERLAY_FLAT),$(dir $@)aapt2-flat-overlay-list) 2337cat $(PRIVATE_STATIC_LIBRARY_TRANSITIVE_RES_PACKAGES_LISTS) | sort -u | tr '\n' ' ' > $(dir $@)aapt2-transitive-overlay-list 2338$(hide) $(AAPT2) link -o $@ \ 2339 $(PRIVATE_AAPT_FLAGS) \ 2340 $(if $(PRIVATE_STATIC_LIBRARY_EXTRA_PACKAGES),$$(cat $(PRIVATE_STATIC_LIBRARY_EXTRA_PACKAGES))) \ 2341 $(addprefix --manifest ,$(PRIVATE_ANDROID_MANIFEST)) \ 2342 $(addprefix -I ,$(PRIVATE_AAPT_INCLUDES)) \ 2343 $(addprefix -I ,$(PRIVATE_SHARED_ANDROID_LIBRARIES)) \ 2344 $(addprefix -A ,$(foreach d,$(PRIVATE_ASSET_DIR),$(call clean-path,$(d)))) \ 2345 $(addprefix --java ,$(PRIVATE_JAVA_GEN_DIR)) \ 2346 $(addprefix --proguard ,$(PRIVATE_PROGUARD_OPTIONS_FILE)) \ 2347 $(addprefix --min-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ 2348 $(addprefix --target-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ 2349 $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product ,$(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \ 2350 $(addprefix -c ,$(PRIVATE_PRODUCT_AAPT_CONFIG)) \ 2351 $(addprefix --preferred-density ,$(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \ 2352 $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \ 2353 $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \ 2354 $(addprefix --rename-manifest-package ,$(PRIVATE_MANIFEST_PACKAGE_NAME)) \ 2355 $(addprefix --rename-instrumentation-target-package ,$(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \ 2356 -R \@$(dir $@)aapt2-flat-overlay-list \ 2357 -R \@$(dir $@)aapt2-transitive-overlay-list \ 2358 \@$(dir $@)aapt2-flat-list 2359$(SOONG_ZIP) -o $(PRIVATE_SRCJAR) -C $(PRIVATE_JAVA_GEN_DIR) -D $(PRIVATE_JAVA_GEN_DIR) 2360$(EXTRACT_JAR_PACKAGES) -i $(PRIVATE_SRCJAR) -o $(PRIVATE_AAPT_EXTRA_PACKAGES) --prefix '--extra-packages ' 2361endef 2362 2363define _create-default-manifest-file 2364$(1): 2365 rm -f $1 2366 (echo '<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="missing.manifest">' && \ 2367 echo ' <uses-sdk android:minSdkVersion="$(2)" />' && \ 2368 echo '</manifest>' ) > $1 2369endef 2370 2371define create-default-manifest-file 2372 $(eval $(call _create-default-manifest-file,$(1),$(2))) 2373endef 2374 2375 2376########################################################### 2377xlint_unchecked := -Xlint:unchecked 2378 2379# emit-line, <word list>, <output file> 2380define emit-line 2381 $(if $(1),echo -n '$(strip $(1)) ' >> $(2)) 2382endef 2383 2384# dump-words-to-file, <word list>, <output file> 2385define dump-words-to-file 2386 @rm -f $(2) 2387 @touch $(2) 2388 @$(call emit-line,$(wordlist 1,500,$(1)),$(2)) 2389 @$(call emit-line,$(wordlist 501,1000,$(1)),$(2)) 2390 @$(call emit-line,$(wordlist 1001,1500,$(1)),$(2)) 2391 @$(call emit-line,$(wordlist 1501,2000,$(1)),$(2)) 2392 @$(call emit-line,$(wordlist 2001,2500,$(1)),$(2)) 2393 @$(call emit-line,$(wordlist 2501,3000,$(1)),$(2)) 2394 @$(call emit-line,$(wordlist 3001,3500,$(1)),$(2)) 2395 @$(call emit-line,$(wordlist 3501,4000,$(1)),$(2)) 2396 @$(call emit-line,$(wordlist 4001,4500,$(1)),$(2)) 2397 @$(call emit-line,$(wordlist 4501,5000,$(1)),$(2)) 2398 @$(call emit-line,$(wordlist 5001,5500,$(1)),$(2)) 2399 @$(call emit-line,$(wordlist 5501,6000,$(1)),$(2)) 2400 @$(call emit-line,$(wordlist 6001,6500,$(1)),$(2)) 2401 @$(call emit-line,$(wordlist 6501,7000,$(1)),$(2)) 2402 @$(call emit-line,$(wordlist 7001,7500,$(1)),$(2)) 2403 @$(call emit-line,$(wordlist 7501,8000,$(1)),$(2)) 2404 @$(call emit-line,$(wordlist 8001,8500,$(1)),$(2)) 2405 @$(call emit-line,$(wordlist 8501,9000,$(1)),$(2)) 2406 @$(call emit-line,$(wordlist 9001,9500,$(1)),$(2)) 2407 @$(call emit-line,$(wordlist 9501,10000,$(1)),$(2)) 2408 @$(call emit-line,$(wordlist 10001,10500,$(1)),$(2)) 2409 @$(call emit-line,$(wordlist 10501,11000,$(1)),$(2)) 2410 @$(call emit-line,$(wordlist 11001,11500,$(1)),$(2)) 2411 @$(call emit-line,$(wordlist 11501,12000,$(1)),$(2)) 2412 @$(call emit-line,$(wordlist 12001,12500,$(1)),$(2)) 2413 @$(call emit-line,$(wordlist 12501,13000,$(1)),$(2)) 2414 @$(call emit-line,$(wordlist 13001,13500,$(1)),$(2)) 2415 @$(call emit-line,$(wordlist 13501,14000,$(1)),$(2)) 2416 @$(call emit-line,$(wordlist 14001,14500,$(1)),$(2)) 2417 @$(call emit-line,$(wordlist 14501,15000,$(1)),$(2)) 2418 @$(call emit-line,$(wordlist 15001,15500,$(1)),$(2)) 2419 @$(call emit-line,$(wordlist 15501,16000,$(1)),$(2)) 2420 @$(call emit-line,$(wordlist 16001,16500,$(1)),$(2)) 2421 @$(call emit-line,$(wordlist 16501,17000,$(1)),$(2)) 2422 @$(call emit-line,$(wordlist 17001,17500,$(1)),$(2)) 2423 @$(call emit-line,$(wordlist 17501,18000,$(1)),$(2)) 2424 @$(call emit-line,$(wordlist 18001,18500,$(1)),$(2)) 2425 @$(call emit-line,$(wordlist 18501,19000,$(1)),$(2)) 2426 @$(call emit-line,$(wordlist 19001,19500,$(1)),$(2)) 2427 @$(call emit-line,$(wordlist 19501,20000,$(1)),$(2)) 2428 @$(call emit-line,$(wordlist 20001,20500,$(1)),$(2)) 2429 @$(call emit-line,$(wordlist 20501,21000,$(1)),$(2)) 2430 @$(call emit-line,$(wordlist 21001,21500,$(1)),$(2)) 2431 @$(call emit-line,$(wordlist 21501,22000,$(1)),$(2)) 2432 @$(call emit-line,$(wordlist 22001,22500,$(1)),$(2)) 2433 @$(call emit-line,$(wordlist 22501,23000,$(1)),$(2)) 2434 @$(call emit-line,$(wordlist 23001,23500,$(1)),$(2)) 2435 @$(call emit-line,$(wordlist 23501,24000,$(1)),$(2)) 2436 @$(call emit-line,$(wordlist 24001,24500,$(1)),$(2)) 2437 @$(call emit-line,$(wordlist 24501,25000,$(1)),$(2)) 2438 @$(call emit-line,$(wordlist 25001,25500,$(1)),$(2)) 2439 @$(call emit-line,$(wordlist 25501,26000,$(1)),$(2)) 2440 @$(call emit-line,$(wordlist 26001,26500,$(1)),$(2)) 2441 @$(call emit-line,$(wordlist 26501,27000,$(1)),$(2)) 2442 @$(call emit-line,$(wordlist 27001,27500,$(1)),$(2)) 2443 @$(call emit-line,$(wordlist 27501,28000,$(1)),$(2)) 2444 @$(call emit-line,$(wordlist 28001,28500,$(1)),$(2)) 2445 @$(call emit-line,$(wordlist 28501,29000,$(1)),$(2)) 2446 @$(call emit-line,$(wordlist 29001,29500,$(1)),$(2)) 2447 @$(call emit-line,$(wordlist 29501,30000,$(1)),$(2)) 2448 @$(call emit-line,$(wordlist 30001,30500,$(1)),$(2)) 2449 @$(call emit-line,$(wordlist 30501,31000,$(1)),$(2)) 2450 @$(call emit-line,$(wordlist 31001,31500,$(1)),$(2)) 2451 @$(call emit-line,$(wordlist 31501,32000,$(1)),$(2)) 2452 @$(call emit-line,$(wordlist 32001,32500,$(1)),$(2)) 2453 @$(call emit-line,$(wordlist 32501,33000,$(1)),$(2)) 2454 @$(call emit-line,$(wordlist 33001,33500,$(1)),$(2)) 2455 @$(call emit-line,$(wordlist 33501,34000,$(1)),$(2)) 2456 @$(call emit-line,$(wordlist 34001,34500,$(1)),$(2)) 2457 @$(call emit-line,$(wordlist 34501,35000,$(1)),$(2)) 2458 @$(call emit-line,$(wordlist 35001,35500,$(1)),$(2)) 2459 @$(call emit-line,$(wordlist 35501,36000,$(1)),$(2)) 2460 @$(call emit-line,$(wordlist 36001,36500,$(1)),$(2)) 2461 @$(call emit-line,$(wordlist 36501,37000,$(1)),$(2)) 2462 @$(call emit-line,$(wordlist 37001,37500,$(1)),$(2)) 2463 @$(call emit-line,$(wordlist 37501,38000,$(1)),$(2)) 2464 @$(call emit-line,$(wordlist 38001,38500,$(1)),$(2)) 2465 @$(call emit-line,$(wordlist 38501,39000,$(1)),$(2)) 2466 @$(call emit-line,$(wordlist 39001,39500,$(1)),$(2)) 2467 @$(call emit-line,$(wordlist 39501,40000,$(1)),$(2)) 2468 @$(call emit-line,$(wordlist 40001,40500,$(1)),$(2)) 2469 @$(call emit-line,$(wordlist 40501,41000,$(1)),$(2)) 2470 @$(call emit-line,$(wordlist 41001,41500,$(1)),$(2)) 2471 @$(call emit-line,$(wordlist 41501,42000,$(1)),$(2)) 2472 @$(call emit-line,$(wordlist 42001,42500,$(1)),$(2)) 2473 @$(call emit-line,$(wordlist 42501,43000,$(1)),$(2)) 2474 @$(call emit-line,$(wordlist 43001,43500,$(1)),$(2)) 2475 @$(call emit-line,$(wordlist 43501,44000,$(1)),$(2)) 2476 @$(call emit-line,$(wordlist 44001,44500,$(1)),$(2)) 2477 @$(call emit-line,$(wordlist 44501,45000,$(1)),$(2)) 2478 @$(call emit-line,$(wordlist 45001,45500,$(1)),$(2)) 2479 @$(call emit-line,$(wordlist 45501,46000,$(1)),$(2)) 2480 @$(call emit-line,$(wordlist 46001,46500,$(1)),$(2)) 2481 @$(call emit-line,$(wordlist 46501,47000,$(1)),$(2)) 2482 @$(call emit-line,$(wordlist 47001,47500,$(1)),$(2)) 2483 @$(call emit-line,$(wordlist 47501,48000,$(1)),$(2)) 2484 @$(call emit-line,$(wordlist 48001,48500,$(1)),$(2)) 2485 @$(call emit-line,$(wordlist 48501,49000,$(1)),$(2)) 2486 @$(call emit-line,$(wordlist 49001,49500,$(1)),$(2)) 2487 @$(call emit-line,$(wordlist 49501,50000,$(1)),$(2)) 2488 @$(call emit-line,$(wordlist 50001,50500,$(1)),$(2)) 2489 @$(call emit-line,$(wordlist 50501,51000,$(1)),$(2)) 2490 @$(call emit-line,$(wordlist 51001,51500,$(1)),$(2)) 2491 @$(call emit-line,$(wordlist 51501,52000,$(1)),$(2)) 2492 @$(call emit-line,$(wordlist 52001,52500,$(1)),$(2)) 2493 @$(call emit-line,$(wordlist 52501,53000,$(1)),$(2)) 2494 @$(call emit-line,$(wordlist 53001,53500,$(1)),$(2)) 2495 @$(call emit-line,$(wordlist 53501,54000,$(1)),$(2)) 2496 @$(call emit-line,$(wordlist 54001,54500,$(1)),$(2)) 2497 @$(call emit-line,$(wordlist 54501,55000,$(1)),$(2)) 2498 @$(call emit-line,$(wordlist 55001,55500,$(1)),$(2)) 2499 @$(call emit-line,$(wordlist 55501,56000,$(1)),$(2)) 2500 @$(call emit-line,$(wordlist 56001,56500,$(1)),$(2)) 2501 @$(call emit-line,$(wordlist 56501,57000,$(1)),$(2)) 2502 @$(call emit-line,$(wordlist 57001,57500,$(1)),$(2)) 2503 @$(call emit-line,$(wordlist 57501,58000,$(1)),$(2)) 2504 @$(call emit-line,$(wordlist 58001,58500,$(1)),$(2)) 2505 @$(call emit-line,$(wordlist 58501,59000,$(1)),$(2)) 2506 @$(call emit-line,$(wordlist 59001,59500,$(1)),$(2)) 2507 @$(call emit-line,$(wordlist 59501,60000,$(1)),$(2)) 2508 @$(call emit-line,$(wordlist 60001,60500,$(1)),$(2)) 2509 @$(call emit-line,$(wordlist 60501,61000,$(1)),$(2)) 2510 @$(call emit-line,$(wordlist 61001,61500,$(1)),$(2)) 2511 @$(call emit-line,$(wordlist 61501,62000,$(1)),$(2)) 2512 @$(call emit-line,$(wordlist 62001,62500,$(1)),$(2)) 2513 @$(call emit-line,$(wordlist 62501,63000,$(1)),$(2)) 2514 @$(call emit-line,$(wordlist 63001,63500,$(1)),$(2)) 2515 @$(call emit-line,$(wordlist 63501,64000,$(1)),$(2)) 2516 @$(call emit-line,$(wordlist 64001,64500,$(1)),$(2)) 2517 @$(call emit-line,$(wordlist 64501,65000,$(1)),$(2)) 2518 @$(call emit-line,$(wordlist 65001,65500,$(1)),$(2)) 2519 @$(call emit-line,$(wordlist 65501,66000,$(1)),$(2)) 2520 @$(call emit-line,$(wordlist 66001,66500,$(1)),$(2)) 2521 @$(call emit-line,$(wordlist 66501,67000,$(1)),$(2)) 2522 @$(call emit-line,$(wordlist 67001,67500,$(1)),$(2)) 2523 @$(call emit-line,$(wordlist 67501,68000,$(1)),$(2)) 2524 @$(call emit-line,$(wordlist 68001,68500,$(1)),$(2)) 2525 @$(call emit-line,$(wordlist 68501,69000,$(1)),$(2)) 2526 @$(call emit-line,$(wordlist 69001,69500,$(1)),$(2)) 2527 @$(call emit-line,$(wordlist 69501,70000,$(1)),$(2)) 2528 @$(call emit-line,$(wordlist 70001,70500,$(1)),$(2)) 2529 @$(call emit-line,$(wordlist 70501,71000,$(1)),$(2)) 2530 @$(call emit-line,$(wordlist 71001,71500,$(1)),$(2)) 2531 @$(call emit-line,$(wordlist 71501,72000,$(1)),$(2)) 2532 @$(call emit-line,$(wordlist 72001,72500,$(1)),$(2)) 2533 @$(call emit-line,$(wordlist 72501,73000,$(1)),$(2)) 2534 @$(call emit-line,$(wordlist 73001,73500,$(1)),$(2)) 2535 @$(call emit-line,$(wordlist 73501,74000,$(1)),$(2)) 2536 @$(call emit-line,$(wordlist 74001,74500,$(1)),$(2)) 2537 @$(call emit-line,$(wordlist 74501,75000,$(1)),$(2)) 2538 @$(call emit-line,$(wordlist 75001,75500,$(1)),$(2)) 2539 @$(call emit-line,$(wordlist 75501,76000,$(1)),$(2)) 2540 @$(call emit-line,$(wordlist 76001,76500,$(1)),$(2)) 2541 @$(call emit-line,$(wordlist 76501,77000,$(1)),$(2)) 2542 @$(call emit-line,$(wordlist 77001,77500,$(1)),$(2)) 2543 @$(call emit-line,$(wordlist 77501,78000,$(1)),$(2)) 2544 @$(call emit-line,$(wordlist 78001,78500,$(1)),$(2)) 2545 @$(call emit-line,$(wordlist 78501,79000,$(1)),$(2)) 2546 @$(call emit-line,$(wordlist 79001,79500,$(1)),$(2)) 2547 @$(call emit-line,$(wordlist 79501,80000,$(1)),$(2)) 2548 @$(call emit-line,$(wordlist 80001,80500,$(1)),$(2)) 2549 @$(call emit-line,$(wordlist 80501,81000,$(1)),$(2)) 2550 @$(call emit-line,$(wordlist 81001,81500,$(1)),$(2)) 2551 @$(call emit-line,$(wordlist 81501,82000,$(1)),$(2)) 2552 @$(call emit-line,$(wordlist 82001,82500,$(1)),$(2)) 2553 @$(call emit-line,$(wordlist 82501,83000,$(1)),$(2)) 2554 @$(call emit-line,$(wordlist 83001,83500,$(1)),$(2)) 2555 @$(call emit-line,$(wordlist 83501,84000,$(1)),$(2)) 2556 @$(call emit-line,$(wordlist 84001,84500,$(1)),$(2)) 2557 @$(call emit-line,$(wordlist 84501,85000,$(1)),$(2)) 2558 @$(call emit-line,$(wordlist 85001,85500,$(1)),$(2)) 2559 @$(call emit-line,$(wordlist 85501,86000,$(1)),$(2)) 2560 @$(call emit-line,$(wordlist 86001,86500,$(1)),$(2)) 2561 @$(call emit-line,$(wordlist 86501,87000,$(1)),$(2)) 2562 @$(call emit-line,$(wordlist 87001,87500,$(1)),$(2)) 2563 @$(call emit-line,$(wordlist 87501,88000,$(1)),$(2)) 2564 @$(call emit-line,$(wordlist 88001,88500,$(1)),$(2)) 2565 @$(call emit-line,$(wordlist 88501,89000,$(1)),$(2)) 2566 @$(call emit-line,$(wordlist 89001,89500,$(1)),$(2)) 2567 @$(call emit-line,$(wordlist 89501,90000,$(1)),$(2)) 2568 @$(call emit-line,$(wordlist 90001,90500,$(1)),$(2)) 2569 @$(call emit-line,$(wordlist 90501,91000,$(1)),$(2)) 2570 @$(call emit-line,$(wordlist 91001,91500,$(1)),$(2)) 2571 @$(call emit-line,$(wordlist 91501,92000,$(1)),$(2)) 2572 @$(call emit-line,$(wordlist 92001,92500,$(1)),$(2)) 2573 @$(call emit-line,$(wordlist 92501,93000,$(1)),$(2)) 2574 @$(call emit-line,$(wordlist 93001,93500,$(1)),$(2)) 2575 @$(call emit-line,$(wordlist 93501,94000,$(1)),$(2)) 2576 @$(call emit-line,$(wordlist 94001,94500,$(1)),$(2)) 2577 @$(call emit-line,$(wordlist 94501,95000,$(1)),$(2)) 2578 @$(call emit-line,$(wordlist 95001,95500,$(1)),$(2)) 2579 @$(call emit-line,$(wordlist 95501,96000,$(1)),$(2)) 2580 @$(call emit-line,$(wordlist 96001,96500,$(1)),$(2)) 2581 @$(call emit-line,$(wordlist 96501,97000,$(1)),$(2)) 2582 @$(call emit-line,$(wordlist 97001,97500,$(1)),$(2)) 2583 @$(call emit-line,$(wordlist 97501,98000,$(1)),$(2)) 2584 @$(call emit-line,$(wordlist 98001,98500,$(1)),$(2)) 2585 @$(call emit-line,$(wordlist 98501,99000,$(1)),$(2)) 2586 @$(call emit-line,$(wordlist 99001,99500,$(1)),$(2)) 2587 @$(if $(wordlist 99501,99502,$(1)),$(error dump-words-to-file: Too many words ($(words $(1))))) 2588endef 2589# Return jar arguments to compress files in a given directory 2590# $(1): directory 2591# 2592# Returns an @-file argument that contains the output of a subshell 2593# that looks like -C $(1) path/to/file1 -C $(1) path/to/file2 2594# Also adds "-C out/empty ." which avoids errors in jar when 2595# there are no files in the directory. 2596define jar-args-sorted-files-in-directory 2597 @<(find $(1) -type f | sort | $(JAR_ARGS) $(1); echo "-C $(EMPTY_DIRECTORY) .") 2598endef 2599 2600# append additional Java sources(resources/Proto sources, and etc) to $(1). 2601define fetch-additional-java-source 2602$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ 2603 find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' -and -not -name '.*' >> $(1); \ 2604fi 2605endef 2606 2607# Some historical notes: 2608# - below we write the list of java files to java-source-list to avoid argument 2609# list length problems with Cygwin 2610# - we filter out duplicate java file names because eclipse's compiler 2611# doesn't like them. 2612define write-java-source-list 2613@echo "$($(PRIVATE_PREFIX)DISPLAY) Java source list: $(PRIVATE_MODULE)" 2614$(hide) rm -f $@ 2615$(call dump-words-to-file,$(sort $(PRIVATE_JAVA_SOURCES)),$@.tmp) 2616$(call fetch-additional-java-source,$@.tmp) 2617$(hide) tr ' ' '\n' < $@.tmp | $(NORMALIZE_PATH) | sort -u > $@ 2618endef 2619 2620# Common definition to invoke javac on the host and target. 2621# 2622# $(1): javac 2623# $(2): classpath_libs 2624define compile-java 2625$(hide) rm -f $@ 2626$(hide) rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(PRIVATE_ANNO_INTERMEDIATES_DIR) 2627$(hide) mkdir -p $(dir $@) 2628$(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(PRIVATE_ANNO_INTERMEDIATES_DIR) 2629$(if $(PRIVATE_SRCJARS),\ 2630 $(ZIPSYNC) -d $(PRIVATE_SRCJAR_INTERMEDIATES_DIR) -l $(PRIVATE_SRCJAR_LIST_FILE) -f "*.java" $(PRIVATE_SRCJARS)) 2631$(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) $(if $(PRIVATE_SRCJARS),-o -s $(PRIVATE_SRCJAR_LIST_FILE) )] ; then \ 2632 $(SOONG_JAVAC_WRAPPER) $(JAVAC_WRAPPER) $(1) -encoding UTF-8 \ 2633 $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ 2634 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2635 $(addprefix --system=,$(PRIVATE_SYSTEM_MODULES_DIR)), \ 2636 $(addprefix -bootclasspath ,$(strip \ 2637 $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH)) \ 2638 $(PRIVATE_EMPTY_BOOTCLASSPATH)))) \ 2639 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2640 $(if $(PRIVATE_PATCH_MODULE), \ 2641 --patch-module=$(PRIVATE_PATCH_MODULE)=$(call normalize-path-list,. $(2)))) \ 2642 $(addprefix -classpath ,$(call normalize-path-list,$(strip \ 2643 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2644 $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \ 2645 $(2)))) \ 2646 $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ 2647 -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) -s $(PRIVATE_ANNO_INTERMEDIATES_DIR) \ 2648 $(PRIVATE_JAVACFLAGS) \ 2649 \@$(PRIVATE_JAVA_SOURCE_LIST) \ 2650 $(if $(PRIVATE_SRCJARS),\@$(PRIVATE_SRCJAR_LIST_FILE)) \ 2651 || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \ 2652fi 2653$(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ 2654 -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \ 2655 $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \ 2656 | xargs rm -rf) 2657$(if $(PRIVATE_JAR_PACKAGES), \ 2658 $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \ 2659 $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \ 2660 -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \ 2661 find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete) 2662$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \ 2663 $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \ 2664 $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg)))) 2665$(hide) $(SOONG_ZIP) -jar -o $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) -D $(PRIVATE_CLASS_INTERMEDIATES_DIR) 2666$(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) 2667endef 2668 2669define transform-java-to-header.jar 2670@echo "$($(PRIVATE_PREFIX)DISPLAY) Turbine: $(PRIVATE_MODULE)" 2671@mkdir -p $(dir $@) 2672@rm -rf $(dir $@)/classes-turbine 2673@mkdir $(dir $@)/classes-turbine 2674$(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) -o -n "$(PRIVATE_SRCJARS)" ] ; then \ 2675 $(JAVA) -jar $(TURBINE) \ 2676 --output $@.premerged --temp_dir $(dir $@)/classes-turbine \ 2677 --sources \@$(PRIVATE_JAVA_SOURCE_LIST) --source_jars $(PRIVATE_SRCJARS) \ 2678 --javacopts $(PRIVATE_JAVACFLAGS) $(COMMON_JDK_FLAGS) -- \ 2679 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2680 --system $(PRIVATE_SYSTEM_MODULES_DIR), \ 2681 --bootclasspath $(strip $(PRIVATE_BOOTCLASSPATH))) \ 2682 --classpath $(strip $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2683 $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \ 2684 $(PRIVATE_ALL_JAVA_HEADER_LIBRARIES)) \ 2685 || ( rm -rf $(dir $@)/classes-turbine ; exit 41 ) && \ 2686 $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $@.premerged $(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES) ; \ 2687else \ 2688 $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES) ; \ 2689fi 2690$(hide) $(ZIPTIME) $@.tmp 2691$(hide) $(call commit-change-for-toc,$@) 2692endef 2693 2694# Runs jarjar on an input file. Jarjar doesn't exit with a nonzero return code 2695# when there is a syntax error in a rules file and doesn't write the output 2696# file, so removes the output file before running jarjar and check if it exists 2697# after running jarjar. 2698define transform-jarjar 2699echo $($(PRIVATE_PREFIX)DISPLAY) JarJar: $@ 2700rm -f $@ 2701$(JAVA) -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ 2702[ -e $@ ] || (echo "Missing output file"; exit 1) 2703endef 2704 2705# Moves $1.tmp to $1 if necessary. This is designed to be used with 2706# .KATI_RESTAT. For kati, this function doesn't update the timestamp 2707# of $1 when $1.tmp is identical to $1 so that ninja won't rebuild 2708# targets which depend on $1. 2709define commit-change-for-toc 2710$(hide) if cmp -s $1.tmp $1 ; then \ 2711 rm $1.tmp ; \ 2712else \ 2713 mv $1.tmp $1 ; \ 2714fi 2715endef 2716 2717ifeq (,$(TARGET_BUILD_APPS)) 2718 2719## Rule to create a table of contents from a .dex file. 2720## Must be called with $(eval). 2721# $(1): The directory which contains classes*.dex files 2722define _transform-dex-to-toc 2723$1/classes.dex.toc: PRIVATE_INPUT_DEX_FILES := $1/classes*.dex 2724$1/classes.dex.toc: $1/classes.dex $(DEXDUMP) 2725 @echo Generating TOC: $$@ 2726 $(hide) ANDROID_LOG_TAGS="*:e" $(DEXDUMP) -l xml $$(PRIVATE_INPUT_DEX_FILES) > $$@.tmp 2727 $$(call commit-change-for-toc,$$@) 2728endef 2729 2730## Define a rule which generates .dex.toc and mark it as .KATI_RESTAT. 2731# $(1): The directory which contains classes*.dex files 2732define define-dex-to-toc-rule 2733$(eval $(call _transform-dex-to-toc,$1))\ 2734$(eval .KATI_RESTAT: $1/classes.dex.toc) 2735endef 2736 2737else 2738 2739# Turn off .toc optimization for apps build as we cannot build dexdump. 2740define define-dex-to-toc-rule 2741endef 2742 2743endif # TARGET_BUILD_APPS 2744 2745 2746# Takes an sdk version that might be PLATFORM_VERSION_CODENAME (for example P), 2747# returns a number greater than the highest existing sdk version if it is, or 2748# the input if it is not. 2749define codename-or-sdk-to-sdk 2750$(if $(filter $(1),$(PLATFORM_VERSION_CODENAME)),10000,$(1)) 2751endef 2752 2753# Uses LOCAL_SDK_VERSION and PLATFORM_SDK_VERSION to determine a compileSdkVersion 2754# in the form of a number or a codename (28 or P) 2755define module-sdk-version 2756$(strip \ 2757 $(if $(filter-out current system_current test_current core_current,$(LOCAL_SDK_VERSION)), \ 2758 $(call get-numeric-sdk-version,$(LOCAL_SDK_VERSION)), \ 2759 $(PLATFORM_SDK_VERSION))) 2760endef 2761 2762# Uses LOCAL_SDK_VERSION and DEFAULT_APP_TARGET_SDK to determine 2763# a targetSdkVersion in the form of a number or a codename (28 or P). 2764define module-target-sdk-version 2765$(strip \ 2766 $(if $(filter-out current system_current test_current core_current,$(LOCAL_SDK_VERSION)), \ 2767 $(call get-numeric-sdk-version,$(LOCAL_SDK_VERSION)), \ 2768 $(DEFAULT_APP_TARGET_SDK))) 2769endef 2770 2771# Uses LOCAL_MIN_SDK_VERSION, LOCAL_SDK_VERSION and DEFAULT_APP_TARGET_SDK to determine 2772# a minSdkVersion in the form of a number or a codename (28 or P). 2773define module-min-sdk-version 2774$(if $(LOCAL_MIN_SDK_VERSION),$(LOCAL_MIN_SDK_VERSION),$(call module-target-sdk-version)) 2775endef 2776 2777# Checks if module is in vendor or product 2778define module-in-vendor-or-product 2779$(if $(filter true,$(LOCAL_IN_VENDOR) $(LOCAL_IN_PRODUCT)),true) 2780endef 2781 2782define transform-classes.jar-to-dex 2783@echo "target Dex: $(PRIVATE_MODULE)" 2784@mkdir -p $(dir $@)tmp 2785$(hide) rm -f $(dir $@)classes*.dex $(dir $@)d8_input.jar 2786$(hide) $(ZIP2ZIP) -j -i $< -o $(dir $@)d8_input.jar "**/*.class" 2787$(hide) $(D8_WRAPPER) $(D8_COMMAND) \ 2788 --output $(dir $@)tmp \ 2789 $(addprefix --lib ,$(PRIVATE_D8_LIBS)) \ 2790 --min-api $(PRIVATE_MIN_SDK_VERSION) \ 2791 $(subst --main-dex-list=, --main-dex-list , \ 2792 $(filter-out --core-library --multi-dex --minimal-main-dex,$(PRIVATE_DX_FLAGS))) \ 2793 $(dir $@)d8_input.jar 2794$(hide) mv $(dir $@)tmp/* $(dir $@) 2795$(hide) rm -f $(dir $@)d8_input.jar 2796$(hide) rm -rf $(dir $@)tmp 2797endef 2798 2799# We need the extra blank line, so that the command will be on a separate line. 2800# $(1): the package 2801# $(2): the ABI name 2802# $(3): the list of shared libraies 2803define _add-jni-shared-libs-to-package-per-abi 2804$(hide) cp $(3) $(dir $(1))lib/$(2) 2805 2806endef 2807 2808# $(1): the package file 2809# $(2): if true, uncompress jni libs 2810define create-jni-shared-libs-package 2811rm -rf $(dir $(1))lib 2812mkdir -p $(addprefix $(dir $(1))lib/,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI)) 2813$(foreach abi,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI),\ 2814 $(call _add-jni-shared-libs-to-package-per-abi,$(1),$(abi),\ 2815 $(patsubst $(abi):%,%,$(filter $(abi):%,$(PRIVATE_JNI_SHARED_LIBRARIES))))) 2816$(SOONG_ZIP) $(if $(2),-L 0) -o $(1) -C $(dir $(1)) -D $(dir $(1))lib 2817rm -rf $(dir $(1))lib 2818endef 2819 2820# $(1): the jar file. 2821# $(2): the classes.dex file. 2822define create-dex-jar 2823find $(dir $(2)) -maxdepth 1 -name "classes*.dex" | sort > $(1).lst 2824$(SOONG_ZIP) -o $(1) -C $(dir $(2)) -l $(1).lst 2825endef 2826 2827# Add java resources added by the current module to an existing package. 2828# $(1) destination package. 2829define add-java-resources-to 2830 $(call _java-resources,$(1),u) 2831endef 2832 2833# Add java resources added by the current module to a new jar. 2834# $(1) destination jar. 2835define create-java-resources-jar 2836 $(call _java-resources,$(1),c) 2837endef 2838 2839define _java-resources 2840$(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(1).jar-arg-list) 2841$(hide) $(JAR) $(2)f $(1) @$(1).jar-arg-list 2842@rm -f $(1).jar-arg-list 2843endef 2844 2845# Add resources (non .class files) from a jar to a package 2846# $(1): the package file 2847# $(2): the jar file 2848# $(3): temporary directory 2849define add-jar-resources-to-package 2850 rm -rf $(3) 2851 mkdir -p $(3) 2852 zipinfo -1 $(2) > /dev/null 2853 unzip -qo $(2) -d $(3) $$(zipinfo -1 $(2) | grep -v -E "\.class$$") 2854 $(JAR) uf $(1) $(call jar-args-sorted-files-in-directory,$(3)) 2855endef 2856 2857# $(1): the output resources jar. 2858# $(2): the input jar 2859define extract-resources-jar 2860 $(ZIP2ZIP) -i $(2) -o $(1) -x '**/*.class' -x '**/*/' 2861endef 2862 2863# Sign a package using the specified key/cert. 2864# 2865define sign-package 2866$(call sign-package-arg,$@) 2867endef 2868 2869# $(1): the package file we are signing. 2870define sign-package-arg 2871$(hide) mv $(1) $(1).unsigned 2872$(hide) $(JAVA) -Djava.library.path=$$(dirname $(SIGNAPK_JNI_LIBRARY_PATH)) -jar $(SIGNAPK_JAR) \ 2873 $(if $(strip $(PRIVATE_CERTIFICATE_LINEAGE)), --lineage $(PRIVATE_CERTIFICATE_LINEAGE)) \ 2874 $(if $(strip $(PRIVATE_ROTATION_MIN_SDK_VERSION)), --rotation-min-sdk-version $(PRIVATE_ROTATION_MIN_SDK_VERSION)) \ 2875 $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \ 2876 $(PRIVATE_ADDITIONAL_CERTIFICATES) $(1).unsigned $(1).signed 2877$(hide) mv $(1).signed $(1) 2878endef 2879 2880# Align STORED entries of a package on 4-byte boundaries to make them easier to mmap. 2881# 2882define align-package 2883$(hide) if ! $(ZIPALIGN) -c -p 4 $@ >/dev/null ; then \ 2884 mv $@ $@.unaligned; \ 2885 $(ZIPALIGN) \ 2886 -f \ 2887 -p \ 2888 4 \ 2889 $@.unaligned $@.aligned; \ 2890 mv $@.aligned $@; \ 2891 fi 2892endef 2893 2894# Verifies ZIP alignment of a package. 2895# 2896define check-package-alignment 2897$(hide) if ! $(ZIPALIGN) -c -p 4 $@ >/dev/null ; then \ 2898 $(call echo-error,$@,Improper package alignment); \ 2899 exit 1; \ 2900 fi 2901endef 2902 2903# Compress a package using the standard gzip algorithm. 2904define compress-package 2905$(hide) \ 2906 mv $@ $@.uncompressed; \ 2907 $(GZIP) -9 -c $@.uncompressed > $@.compressed; \ 2908 rm -f $@.uncompressed; \ 2909 mv $@.compressed $@; 2910endef 2911 2912ifeq ($(HOST_OS),linux) 2913# Runs appcompat and store logs in $(PRODUCT_OUT)/appcompat 2914define extract-package 2915$(AAPT2) dump resources $@ | awk -F ' |=' '/^Package/{print $$3; exit}' >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && 2916endef 2917define appcompat-header 2918$(hide) \ 2919 mkdir -p $(PRODUCT_OUT)/appcompat && \ 2920 rm -f $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 2921 echo -n "Package name: " >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 2922 $(extract-package) \ 2923 echo "Module name in Android tree: $(PRIVATE_MODULE)" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 2924 echo "Local path in Android tree: $(PRIVATE_PATH)" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 2925 echo "Install path: $(patsubst $(PRODUCT_OUT)/%,%,$(PRIVATE_INSTALLED_MODULE))" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 2926 echo >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log 2927endef 2928ART_VERIDEX_APPCOMPAT:=$(HOST_OUT)/bin/appcompat 2929define run-appcompat 2930$(hide) \ 2931 echo "appcompat output:" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 2932 ANDROID_LOG_TAGS="*:e" $(ART_VERIDEX_APPCOMPAT) --dex-file=$@ 2>&1 >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log 2933endef 2934appcompat-files = \ 2935 $(AAPT2) \ 2936 $(ART_VERIDEX_APPCOMPAT) \ 2937else 2938appcompat-header = 2939run-appcompat = 2940appcompat-files = 2941endif # HOST_OS == linux 2942.KATI_READONLY: appcompat-header run-appcompat appcompat-files 2943 2944# Remove dynamic timestamps from packages 2945# 2946define remove-timestamps-from-package 2947$(hide) $(ZIPTIME) $@ 2948endef 2949 2950# Uncompress dex files embedded in an apk. 2951# 2952define uncompress-dexs 2953 if (zipinfo $@ '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 2954 $(ZIP2ZIP) -i $@ -o $@.tmp -0 "classes*.dex" && \ 2955 mv -f $@.tmp $@ ; \ 2956 fi 2957endef 2958 2959# Uncompress shared JNI libraries embedded in an apk. 2960# 2961define uncompress-prebuilt-embedded-jni-libs 2962 if (zipinfo $@ 'lib/*.so' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 2963 $(ZIP2ZIP) -i $@ -o $@.tmp -0 'lib/**/*.so' && mv -f $@.tmp $@ ; \ 2964 fi 2965endef 2966 2967# Verifies shared JNI libraries and dex files in an apk are uncompressed. 2968# 2969define check-jni-dex-compression 2970 if (zipinfo $@ 'lib/*.so' '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 2971 $(call echo-error,$@,Contains compressed JNI libraries and/or dex files); \ 2972 exit 1; \ 2973 fi 2974endef 2975 2976# Remove unwanted shared JNI libraries embedded in an apk. 2977# 2978define remove-unwanted-prebuilt-embedded-jni-libs 2979 $(if $(PRIVATE_EMBEDDED_JNI_LIBS), \ 2980 $(ZIP2ZIP) -i $@ -o $@.tmp \ 2981 -x 'lib/**/*.so' $(addprefix -X ,$(PRIVATE_EMBEDDED_JNI_LIBS)) && \ 2982 mv -f $@.tmp $@) 2983endef 2984 2985# TODO(joeo): If we can ever upgrade to post 3.81 make and get the 2986# new prebuilt rules to work, we should change this to copy the 2987# resources to the out directory and then copy the resources. 2988 2989# Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR 2990# in transform-java-to-classes for the sake of vm-tests. 2991define transform-host-java-to-package 2992@echo "Host Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" 2993$(call compile-java,$(HOST_JAVAC),$(PRIVATE_ALL_JAVA_LIBRARIES)) 2994endef 2995 2996# Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR 2997# in transform-java-to-classes for the sake of vm-tests. 2998define transform-host-java-to-dalvik-package 2999@echo "Dalvik Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" 3000$(call compile-java,$(HOST_JAVAC),$(PRIVATE_ALL_JAVA_HEADER_LIBRARIES)) 3001endef 3002 3003########################################################### 3004## Commands for copying files 3005########################################################### 3006 3007# Define a rule to copy a header. Used via $(eval) by copy_headers.make. 3008# $(1): source header 3009# $(2): destination header 3010define copy-one-header 3011$(2): $(1) 3012 @echo "Header: $$@" 3013 $$(copy-file-to-new-target-with-cp) 3014endef 3015 3016# Define a rule to copy a file. For use via $(eval). 3017# $(1): source file 3018# $(2): destination file 3019define copy-one-file 3020$(2): $(1) 3021 @echo "Copy: $$@" 3022 $$(copy-file-to-target) 3023endef 3024 3025# Define a rule to copy a license metadata file. For use via $(eval). 3026# $(1): source license metadata file 3027# $(2): destination license metadata file 3028# $(3): built targets 3029# $(4): installed targets 3030define copy-one-license-metadata-file 3031$(2): PRIVATE_BUILT=$(3) 3032$(2): PRIVATE_INSTALLED=$(4) 3033$(2): $(1) 3034 @echo "Copy: $$@" 3035 $$(call copy-license-metadata-file-to-target,$$(PRIVATE_BUILT),$$(PRIVATE_INSTALLED)) 3036endef 3037 3038define copy-and-uncompress-dexs 3039$(2): $(1) $(ZIPALIGN) $(ZIP2ZIP) 3040 @echo "Uncompress dexs in: $$@" 3041 $$(copy-file-to-target) 3042 $$(uncompress-dexs) 3043 $$(align-package) 3044endef 3045 3046# Create copy pair for compatibility suite 3047# Filter out $(LOCAL_INSTALLED_MODULE) to prevent overriding target 3048# $(1): source path 3049# $(2): destination path 3050# The format of copy pair is src:dst 3051define compat-copy-pair 3052$(if $(filter-out $(2), $(LOCAL_INSTALLED_MODULE)), $(1):$(2)) 3053endef 3054 3055# Create copy pair for $(1) $(2) 3056# If $(2) is substring of $(3) do nothing. 3057# $(1): source path 3058# $(2): destination path 3059# $(3): filter-out target 3060# The format of copy pair is src:dst 3061define filter-copy-pair 3062$(if $(findstring $(2), $(3)),,$(1):$(2)) 3063endef 3064 3065# Copies many files. 3066# $(1): The files to copy. Each entry is a ':' separated src:dst pair 3067# $(2): An optional directory to prepend to the destination 3068# Evaluates to the list of the dst files (ie suitable for a dependency list) 3069define copy-many-files 3070$(foreach f, $(1), $(strip \ 3071 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3072 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3073 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3074 $(if $(strip $(2)), \ 3075 $(eval _cmf_dest := $(patsubst %/,%,$(strip $(2)))/$(patsubst /%,%,$(_cmf_dest)))) \ 3076 $(if $(filter-out $(_cmf_src), $(_cmf_dest)), \ 3077 $(eval $(call copy-one-file,$(_cmf_src),$(_cmf_dest)))) \ 3078 $(_cmf_dest))) 3079endef 3080 3081# Copy the file only if it's a well-formed init script file. For use via $(eval). 3082# $(1): source file 3083# $(2): destination file 3084define copy-init-script-file-checked 3085ifdef TARGET_BUILD_UNBUNDLED 3086# TODO (b/185624993): Remove the check on TARGET_BUILD_UNBUNDLED when host_init_verifier can run 3087# without requiring the HIDL interface map. 3088$(2): $(1) 3089else ifneq ($(HOST_OS),darwin) 3090# Host init verifier doesn't exist on darwin. 3091$(2): \ 3092 $(1) \ 3093 $(HOST_INIT_VERIFIER) \ 3094 $(call intermediates-dir-for,ETC,passwd_system)/passwd_system \ 3095 $(call intermediates-dir-for,ETC,passwd_system_ext)/passwd_system_ext \ 3096 $(call intermediates-dir-for,ETC,passwd_vendor)/passwd_vendor \ 3097 $(call intermediates-dir-for,ETC,passwd_odm)/passwd_odm \ 3098 $(call intermediates-dir-for,ETC,passwd_product)/passwd_product \ 3099 $(call intermediates-dir-for,ETC,plat_property_contexts)/plat_property_contexts \ 3100 $(call intermediates-dir-for,ETC,system_ext_property_contexts)/system_ext_property_contexts \ 3101 $(call intermediates-dir-for,ETC,product_property_contexts)/product_property_contexts \ 3102 $(call intermediates-dir-for,ETC,vendor_property_contexts)/vendor_property_contexts \ 3103 $(call intermediates-dir-for,ETC,odm_property_contexts)/odm_property_contexts 3104 $(hide) $(HOST_INIT_VERIFIER) \ 3105 -p $(call intermediates-dir-for,ETC,passwd_system)/passwd_system \ 3106 -p $(call intermediates-dir-for,ETC,passwd_system_ext)/passwd_system_ext \ 3107 -p $(call intermediates-dir-for,ETC,passwd_vendor)/passwd_vendor \ 3108 -p $(call intermediates-dir-for,ETC,passwd_odm)/passwd_odm \ 3109 -p $(call intermediates-dir-for,ETC,passwd_product)/passwd_product \ 3110 --property-contexts=$(call intermediates-dir-for,ETC,plat_property_contexts)/plat_property_contexts \ 3111 --property-contexts=$(call intermediates-dir-for,ETC,system_ext_property_contexts)/system_ext_property_contexts \ 3112 --property-contexts=$(call intermediates-dir-for,ETC,product_property_contexts)/product_property_contexts \ 3113 --property-contexts=$(call intermediates-dir-for,ETC,vendor_property_contexts)/vendor_property_contexts \ 3114 --property-contexts=$(call intermediates-dir-for,ETC,odm_property_contexts)/odm_property_contexts \ 3115 $$< 3116else 3117$(2): $(1) 3118endif 3119 @echo "Copy init script: $$@" 3120 $$(copy-file-to-target) 3121endef 3122 3123# Copies many init script files and check they are well-formed. 3124# $(1): The init script files to copy. Each entry is a ':' separated src:dst pair. 3125define copy-many-init-script-files-checked 3126$(foreach f, $(1), $(strip \ 3127 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3128 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3129 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3130 $(eval $(call copy-init-script-file-checked,$(_cmf_src),$(_cmf_dest))))) 3131endef 3132 3133# Copy the file only if it's a well-formed xml file. For use via $(eval). 3134# $(1): source file 3135# $(2): destination file, must end with .xml. 3136define copy-xml-file-checked 3137$(2): $(1) $(XMLLINT) 3138 @echo "Copy xml: $$@" 3139 $(hide) $(XMLLINT) $$< >/dev/null # Don't print the xml file to stdout. 3140 $$(copy-file-to-target) 3141endef 3142 3143# Copies many xml files and check they are well-formed. 3144# $(1): The xml files to copy. Each entry is a ':' separated src:dst pair. 3145# Evaluates to the list of the dst files. (ie suitable for a dependency list.) 3146define copy-many-xml-files-checked 3147$(foreach f, $(1), $(strip \ 3148 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3149 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3150 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3151 $(eval $(call copy-xml-file-checked,$(_cmf_src),$(_cmf_dest))) \ 3152 $(_cmf_dest))) 3153endef 3154 3155# Copy the file only if it is a well-formed manifest file. For use viea $(eval) 3156# $(1): source file 3157# $(2): destination file 3158define copy-vintf-manifest-checked 3159$(2): $(1) $(HOST_OUT_EXECUTABLES)/assemble_vintf 3160 @echo "Copy xml: $$@" 3161 $(hide) mkdir -p "$$(dir $$@)" 3162 $(hide) VINTF_IGNORE_TARGET_FCM_VERSION=true\ 3163 $(HOST_OUT_EXECUTABLES)/assemble_vintf -i $$< -o $$@ 3164endef 3165 3166# Copies many vintf manifest files checked. 3167# $(1): The files to copy. Each entry is a ':' separated src:dst pair 3168define copy-many-vintf-manifest-files-checked 3169$(foreach f, $(1), $(strip \ 3170 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3171 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3172 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3173 $(eval $(call copy-vintf-manifest-checked,$(_cmf_src),$(_cmf_dest))))) 3174endef 3175 3176# Copy the file only if it's not an ELF file. For use via $(eval). 3177# $(1): source file 3178# $(2): destination file 3179# $(3): message to print on error 3180define copy-non-elf-file-checked 3181$(eval check_non_elf_file_timestamp := \ 3182 $(call intermediates-dir-for,FAKE,check-non-elf-file-timestamps)/$(2).timestamp) 3183$(check_non_elf_file_timestamp): $(1) $(LLVM_READOBJ) 3184 @echo "Check non-ELF: $$<" 3185 $(hide) mkdir -p "$$(dir $$@)" 3186 $(hide) rm -f "$$@" 3187 $(hide) \ 3188 if $(LLVM_READOBJ) -h "$$<" >/dev/null 2>&1; then \ 3189 $(call echo-error,$(2),$(3)); \ 3190 $(call echo-error,$(2),found ELF file: $$<); \ 3191 false; \ 3192 fi 3193 $(hide) touch "$$@" 3194 3195$(2): $(1) $(check_non_elf_file_timestamp) 3196 @echo "Copy non-ELF: $$@" 3197 $$(copy-file-to-target) 3198 3199check-elf-prebuilt-product-copy-files: $(check_non_elf_file_timestamp) 3200endef 3201 3202# The -t option to acp and the -p option to cp is 3203# required for OSX. OSX has a ridiculous restriction 3204# where it's an error for a .a file's modification time 3205# to disagree with an internal timestamp, and this 3206# macro is used to install .a files (among other things). 3207 3208# Copy a single file from one place to another, 3209# preserving permissions and overwriting any existing 3210# file. 3211# When we used acp, it could not handle high resolution timestamps 3212# on file systems like ext4. Because of that, '-t' option was disabled 3213# and copy-file-to-target was identical to copy-file-to-new-target. 3214# Keep the behavior until we audit and ensure that switching this back 3215# won't break anything. 3216define copy-file-to-target 3217@mkdir -p $(dir $@) 3218$(hide) rm -f $@ 3219$(hide) cp "$<" "$@" 3220endef 3221 3222# Same as copy-file-to-target, but assume file is a licenes metadata file, 3223# and append built from $(1) and installed from $(2). 3224define copy-license-metadata-file-to-target 3225@mkdir -p $(dir $@) 3226$(hide) rm -f $@ 3227$(hide) cp "$<" "$@" $(strip \ 3228 $(foreach b,$(1), && (grep -F 'built: "'"$(b)"'"' "$@" >/dev/null || echo 'built: "'"$(b)"'"' >>"$@")) \ 3229 $(foreach i,$(2), && (grep -F 'installed: "'"$(i)"'"' "$@" >/dev/null || echo 'installed: "'"$(i)"'"' >>"$@")) \ 3230) 3231endef 3232 3233# The same as copy-file-to-target, but use the local 3234# cp command instead of acp. 3235define copy-file-to-target-with-cp 3236@mkdir -p $(dir $@) 3237$(hide) rm -f $@ 3238$(hide) cp -p "$<" "$@" 3239endef 3240 3241# The same as copy-file-to-target, but don't preserve 3242# the old modification time. 3243define copy-file-to-new-target 3244@mkdir -p $(dir $@) 3245$(hide) rm -f $@ 3246$(hide) cp $< $@ 3247endef 3248 3249# The same as copy-file-to-new-target, but use the local 3250# cp command instead of acp. 3251define copy-file-to-new-target-with-cp 3252@mkdir -p $(dir $@) 3253$(hide) rm -f $@ 3254$(hide) cp $< $@ 3255endef 3256 3257# The same as copy-file-to-new-target, but preserve symlinks. Symlinks are 3258# converted to absolute to not break. 3259define copy-file-or-link-to-new-target 3260@mkdir -p $(dir $@) 3261$(hide) rm -f $@ 3262$(hide) if [ -h $< ]; then \ 3263 ln -s $$(realpath $<) $@; \ 3264else \ 3265 cp $< $@; \ 3266fi 3267endef 3268 3269# Copy a prebuilt file to a target location. 3270define transform-prebuilt-to-target 3271@echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)" 3272$(copy-file-to-target) 3273endef 3274 3275# Copy a prebuilt file to a target location, but preserve symlinks rather than 3276# dereference them. 3277define copy-or-link-prebuilt-to-target 3278@echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)" 3279$(copy-file-or-link-to-new-target) 3280endef 3281 3282# Copy a list of files/directories to target location, with sub dir structure preserved. 3283# For example $(HOST_OUT_EXECUTABLES)/aapt -> $(staging)/bin/aapt . 3284# $(1): the source list of files/directories. 3285# $(2): the path prefix to strip. In the above example it would be $(HOST_OUT). 3286# $(3): the target location. 3287define copy-files-with-structure 3288$(foreach t,$(1),\ 3289 $(eval s := $(patsubst $(2)%,%,$(t)))\ 3290 $(hide) mkdir -p $(dir $(3)/$(s)); cp -Rf $(t) $(3)/$(s)$(newline)) 3291endef 3292 3293# Define a rule to create a symlink to a file. 3294# $(1): any dependencies 3295# $(2): source (may be relative) 3296# $(3): full path to destination 3297define symlink-file 3298$(eval $(_symlink-file)) 3299$(eval $(call declare-license-metadata,$(3),,,,,,)) 3300$(eval $(call declare-license-deps,$(3),$(1))) 3301endef 3302 3303define _symlink-file 3304$(3): $(1) 3305 @echo "Symlink: $$@ -> $(2)" 3306 @mkdir -p $$(dir $$@) 3307 @rm -rf $$@ 3308 $(hide) ln -sf $(2) $$@ 3309endef 3310 3311# Copy an apk to a target location while removing classes*.dex 3312# $(1): source file 3313# $(2): destination file 3314# $(3): LOCAL_STRIP_DEX, if non-empty then strip classes*.dex 3315define dexpreopt-copy-jar 3316$(2): $(1) 3317 @echo "Copy: $$@" 3318 $$(copy-file-to-target) 3319 $(if $(3),$$(call dexpreopt-remove-classes.dex,$$@)) 3320endef 3321 3322# $(1): the .jar or .apk to remove classes.dex. Note that if all dex files 3323# are uncompressed in the archive, then dexopt will not do a copy of the dex 3324# files and we should not strip. 3325define dexpreopt-remove-classes.dex 3326$(hide) if (zipinfo $1 '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 3327zip --quiet --delete $(1) classes.dex; \ 3328dex_index=2; \ 3329while zip --quiet --delete $(1) classes$${dex_index}.dex > /dev/null; do \ 3330 let dex_index=dex_index+1; \ 3331done \ 3332fi 3333endef 3334 3335# Copy an unstripped binary to the symbols directory while also extracting 3336# a hash mapping to the mapping directory. 3337# $(1): unstripped intermediates file 3338# $(2): path in symbols directory 3339define copy-unstripped-elf-file-with-mapping 3340$(call _copy-symbols-file-with-mapping,$(1),$(2),\ 3341 elf,$(patsubst $(TARGET_OUT_UNSTRIPPED)/%,$(call intermediates-dir-for,PACKAGING,elf_symbol_mapping)/%,$(2).textproto)) 3342endef 3343 3344# Copy an R8 dictionary to the packaging directory while also extracting 3345# a hash mapping to the mapping directory. 3346# $(1): unstripped intermediates file 3347# $(2): path in packaging directory 3348# $(3): path in mappings packaging directory 3349define copy-r8-dictionary-file-with-mapping 3350$(call _copy-symbols-file-with-mapping,$(1),$(2),r8,$(3)) 3351endef 3352 3353# Copy an unstripped binary or R8 dictionary to the symbols directory 3354# while also extracting a hash mapping to the mapping directory. 3355# $(1): unstripped intermediates file 3356# $(2): path in symbols directory 3357# $(3): file type (elf or r8) 3358# $(4): path in the mappings directory 3359# 3360# Regarding the restats at the end: I think you should only need to use KATI_RESTAT on $(2), but 3361# there appears to be a bug in kati where it was not adding restat=true in the ninja file unless we 3362# also added 4 to KATI_RESTAT. 3363define _copy-symbols-file-with-mapping 3364$(2): .KATI_IMPLICIT_OUTPUTS := $(4) 3365$(2): $(SYMBOLS_MAP) 3366$(2): $(1) 3367 @echo "Copy symbols with mapping: $$@" 3368 $$(copy-file-to-target) 3369 $(SYMBOLS_MAP) -$(strip $(3)) $(2) -write_if_changed $(4) 3370.KATI_RESTAT: $(2) 3371.KATI_RESTAT: $(4) 3372endef 3373 3374 3375########################################################### 3376## Commands to call R8 3377########################################################### 3378 3379# Use --debug flag for eng builds by default 3380ifeq (eng,$(TARGET_BUILD_VARIANT)) 3381R8_DEBUG_MODE := --debug 3382else 3383R8_DEBUG_MODE := 3384endif 3385 3386define transform-jar-to-dex-r8 3387@echo R8: $@ 3388$(hide) rm -f $(PRIVATE_PROGUARD_DICTIONARY) 3389$(hide) $(R8_WRAPPER) $(R8_COMMAND) \ 3390 -injars '$<' \ 3391 --min-api $(PRIVATE_MIN_SDK_VERSION) \ 3392 --no-data-resources \ 3393 --force-proguard-compatibility --output $(subst classes.dex,,$@) \ 3394 $(R8_DEBUG_MODE) \ 3395 $(PRIVATE_PROGUARD_FLAGS) \ 3396 $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR)) \ 3397 $(PRIVATE_DX_FLAGS) \ 3398 -ignorewarnings 3399$(hide) touch $(PRIVATE_PROGUARD_DICTIONARY) 3400endef 3401 3402########################################################### 3403## Stuff source generated from one-off tools 3404########################################################### 3405 3406define transform-generated-source 3407@echo "$($(PRIVATE_PREFIX)DISPLAY) Generated: $(PRIVATE_MODULE) <= $<" 3408@mkdir -p $(dir $@) 3409$(hide) $(PRIVATE_CUSTOM_TOOL) 3410endef 3411 3412 3413########################################################### 3414## Assertions about attributes of the target 3415########################################################### 3416 3417# $(1): The file to check 3418define get-file-size 3419stat -c "%s" "$(1)" | tr -d '\n' 3420endef 3421 3422# $(1): The file(s) to check (often $@) 3423# $(2): The partition size. 3424define assert-max-image-size 3425$(if $(2), \ 3426 size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); \ 3427 total=$$(( $$( echo "$$size" ) )); \ 3428 printname=$$(echo -n "$(1)" | tr " " +); \ 3429 maxsize=$$(($(2))); \ 3430 if [ "$$total" -gt "$$maxsize" ]; then \ 3431 echo "error: $$printname too large ($$total > $$maxsize)"; \ 3432 false; \ 3433 elif [ "$$total" -gt $$((maxsize - 32768)) ]; then \ 3434 echo "WARNING: $$printname approaching size limit ($$total now; limit $$maxsize)"; \ 3435 fi \ 3436 , \ 3437 true \ 3438 ) 3439endef 3440 3441 3442########################################################### 3443## Define device-specific radio files 3444########################################################### 3445INSTALLED_RADIOIMAGE_TARGET := 3446 3447# Copy a radio image file to the output location, and add it to 3448# INSTALLED_RADIOIMAGE_TARGET. 3449# $(1): filename 3450define add-radio-file 3451 $(eval $(call add-radio-file-internal,$(1),$(notdir $(1)))) 3452endef 3453define add-radio-file-internal 3454INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2) 3455$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) 3456 $$(transform-prebuilt-to-target) 3457endef 3458 3459# Version of add-radio-file that also arranges for the version of the 3460# file to be checked against the contents of 3461# $(TARGET_BOARD_INFO_FILE). 3462# $(1): filename 3463# $(2): name of version variable in board-info (eg, "version-baseband") 3464define add-radio-file-checked 3465 $(eval $(call add-radio-file-checked-internal,$(1),$(notdir $(1)),$(2))) 3466endef 3467define add-radio-file-checked-internal 3468INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2) 3469BOARD_INFO_CHECK += $(3):$(LOCAL_PATH)/$(1) 3470$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) 3471 $$(transform-prebuilt-to-target) 3472endef 3473 3474## Whether to build from source if prebuilt alternative exists 3475########################################################### 3476# $(1): module name 3477# $(2): LOCAL_PATH 3478# Expands to empty string if not from source. 3479ifeq (true,$(ANDROID_BUILD_FROM_SOURCE)) 3480define if-build-from-source 3481true 3482endef 3483else 3484define if-build-from-source 3485$(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \ 3486 $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true) 3487endef 3488endif 3489 3490# Include makefile $(1) if build from source for module $(2) 3491# $(1): the makefile to include 3492# $(2): module name 3493# $(3): LOCAL_PATH 3494define include-if-build-from-source 3495$(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1))) 3496endef 3497 3498# Return the arch for the source file of a prebuilt 3499# Return "none" if no matching arch found and return empty 3500# if the input is empty, so the result can be passed to 3501# LOCAL_MODULE_TARGET_ARCH. 3502# $(1) the list of archs supported by the prebuilt 3503define get-prebuilt-src-arch 3504$(strip $(if $(filter $(TARGET_ARCH),$(1)),$(TARGET_ARCH),\ 3505 $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),$(if $(1),none)))) 3506endef 3507 3508# ############################################################### 3509# Set up statistics gathering 3510# ############################################################### 3511STATS.MODULE_TYPE := \ 3512 HOST_STATIC_LIBRARY \ 3513 HOST_SHARED_LIBRARY \ 3514 STATIC_LIBRARY \ 3515 SHARED_LIBRARY \ 3516 EXECUTABLE \ 3517 HOST_EXECUTABLE \ 3518 PACKAGE \ 3519 PHONY_PACKAGE \ 3520 HOST_PREBUILT \ 3521 PREBUILT \ 3522 MULTI_PREBUILT \ 3523 JAVA_LIBRARY \ 3524 STATIC_JAVA_LIBRARY \ 3525 HOST_JAVA_LIBRARY \ 3526 DROIDDOC \ 3527 COPY_HEADERS \ 3528 NATIVE_TEST \ 3529 NATIVE_BENCHMARK \ 3530 HOST_NATIVE_TEST \ 3531 FUZZ_TEST \ 3532 HOST_FUZZ_TEST \ 3533 STATIC_TEST_LIBRARY \ 3534 HOST_STATIC_TEST_LIBRARY \ 3535 NOTICE_FILE \ 3536 base_rules \ 3537 HEADER_LIBRARY \ 3538 HOST_TEST_CONFIG \ 3539 TARGET_TEST_CONFIG 3540 3541$(foreach s,$(STATS.MODULE_TYPE),$(eval STATS.MODULE_TYPE.$(s) :=)) 3542define record-module-type 3543$(strip $(if $(LOCAL_RECORDED_MODULE_TYPE),, 3544 $(if $(filter-out $(SOONG_ANDROID_MK),$(LOCAL_MODULE_MAKEFILE)), 3545 $(if $(filter $(1),$(STATS.MODULE_TYPE)), 3546 $(eval LOCAL_RECORDED_MODULE_TYPE := true) 3547 $(eval STATS.MODULE_TYPE.$(1) += 1), 3548 $(error Invalid module type: $(1)))))) 3549endef 3550 3551########################################################### 3552## Compatibility suite tools 3553########################################################### 3554 3555# Return a list of output directories for a given suite and the current LOCAL_MODULE. 3556# Can be passed a subdirectory to use for the common testcase directory. 3557define compatibility_suite_dirs 3558 $(strip \ 3559 $(if $(COMPATIBILITY_TESTCASES_OUT_$(1)), \ 3560 $(if $(COMPATIBILITY_TESTCASES_OUT_INCLUDE_MODULE_FOLDER_$(1))$(LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY),\ 3561 $(COMPATIBILITY_TESTCASES_OUT_$(1))/$(LOCAL_MODULE)$(2),\ 3562 $(COMPATIBILITY_TESTCASES_OUT_$(1)))) \ 3563 $($(my_prefix)OUT_TESTCASES)/$(LOCAL_MODULE)$(2)) 3564endef 3565 3566# For each suite: 3567# 1. Copy the files to the many suite output directories. 3568# And for test config files, we'll check the .xml is well-formed before copy. 3569# 2. Add all the files to each suite's dependent files list. 3570# 3. Do the dependency addition to my_all_targets. 3571# 4. Save the module name to COMPATIBILITY.$(suite).MODULES for each suite. 3572# 5. Collect files to dist to ALL_COMPATIBILITY_DIST_FILES. 3573# Requires for each suite: use my_compat_dist_config_$(suite) to define the test config. 3574# and use my_compat_dist_$(suite) to define the others. 3575define create-suite-dependencies 3576$(foreach suite, $(LOCAL_COMPATIBILITY_SUITE), \ 3577 $(eval $(if $(strip $(module_license_metadata)),\ 3578 $$(foreach f,$$(my_compat_dist_$(suite)),$$(call declare-copy-target-license-metadata,$$(call word-colon,2,$$(f)),$$(call word-colon,1,$$(f)))),\ 3579 $$(eval my_test_data += $$(my_compat_dist_$(suite))) \ 3580 )) \ 3581 $(eval $(if $(strip $(module_license_metadata)),\ 3582 $$(foreach f,$$(my_compat_dist_config_$(suite)),$$(call declare-copy-target-license-metadata,$$(call word-colon,2,$$(f)),$$(call word-colon,1,$$(f)))),\ 3583 $$(eval my_test_config += $$(my_compat_dist_config_$(suite))) \ 3584 )) \ 3585 $(if $(filter $(suite),$(ALL_COMPATIBILITY_SUITES)),,\ 3586 $(eval ALL_COMPATIBILITY_SUITES += $(suite)) \ 3587 $(eval COMPATIBILITY.$(suite).FILES :=) \ 3588 $(eval COMPATIBILITY.$(suite).MODULES :=) \ 3589 $(eval COMPATIBILITY.$(suite).API_MAP_FILES :=)) \ 3590 $(eval COMPATIBILITY.$(suite).FILES += \ 3591 $$(foreach f,$$(my_compat_dist_$(suite)),$$(call word-colon,2,$$(f))) \ 3592 $$(foreach f,$$(my_compat_dist_config_$(suite)),$$(call word-colon,2,$$(f))) \ 3593 $$(my_compat_dist_test_data_$(suite))) \ 3594 $(eval COMPATIBILITY.$(suite).API_MAP_FILES += $$(my_compat_api_map_$(suite))) \ 3595 $(eval COMPATIBILITY.$(suite).SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES += $(LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES)) \ 3596 $(eval ALL_COMPATIBILITY_DIST_FILES += $$(my_compat_dist_$(suite))) \ 3597 $(eval COMPATIBILITY.$(suite).MODULES += $$(my_register_name))) \ 3598$(eval $(my_all_targets) : \ 3599 $(sort $(foreach suite,$(LOCAL_COMPATIBILITY_SUITE), \ 3600 $(foreach f,$(my_compat_dist_$(suite)), $(call word-colon,2,$(f))))) \ 3601 $(call copy-many-xml-files-checked, \ 3602 $(sort $(foreach suite,$(LOCAL_COMPATIBILITY_SUITE),$(my_compat_dist_config_$(suite)))))) 3603endef 3604 3605########################################################### 3606## Path Cleaning 3607########################################################### 3608 3609# Remove "dir .." combinations (but keep ".. ..") 3610# 3611# $(1): The expanded path, where / is converted to ' ' to work with $(word) 3612define _clean-path-strip-dotdot 3613$(strip \ 3614 $(if $(word 2,$(1)), 3615 $(if $(call streq,$(word 2,$(1)),..), 3616 $(if $(call streq,$(word 1,$(1)),..), 3617 $(word 1,$(1)) $(call _clean-path-strip-dotdot,$(wordlist 2,$(words $(1)),$(1))) 3618 , 3619 $(call _clean-path-strip-dotdot,$(wordlist 3,$(words $(1)),$(1))) 3620 ) 3621 , 3622 $(word 1,$(1)) $(call _clean-path-strip-dotdot,$(wordlist 2,$(words $(1)),$(1))) 3623 ) 3624 , 3625 $(1) 3626 ) 3627) 3628endef 3629 3630# Remove any leading .. from the path (in case of /..) 3631# 3632# Should only be called if the original path started with / 3633# $(1): The expanded path, where / is converted to ' ' to work with $(word) 3634define _clean-path-strip-root-dotdots 3635$(strip $(if $(call streq,$(firstword $(1)),..), 3636 $(call _clean-path-strip-root-dotdots,$(wordlist 2,$(words $(1)),$(1))), 3637 $(1))) 3638endef 3639 3640# Call _clean-path-strip-dotdot until the path stops changing 3641# $(1): Non-empty if this path started with a / 3642# $(2): The expanded path, where / is converted to ' ' to work with $(word) 3643define _clean-path-expanded 3644$(strip \ 3645 $(eval _ep := $(call _clean-path-strip-dotdot,$(2))) 3646 $(if $(1),$(eval _ep := $(call _clean-path-strip-root-dotdots,$(_ep)))) 3647 $(if $(call streq,$(2),$(_ep)), 3648 $(_ep), 3649 $(call _clean-path-expanded,$(1),$(_ep)))) 3650endef 3651 3652# Clean the file path -- remove //, dir/.., extra . 3653# 3654# This should be the same semantics as golang's filepath.Clean 3655# 3656# $(1): The file path to clean 3657define clean-path 3658$(strip \ 3659 $(if $(call streq,$(words $(1)),1), 3660 $(eval _rooted := $(filter /%,$(1))) 3661 $(eval _expanded_path := $(filter-out .,$(subst /,$(space),$(1)))) 3662 $(eval _path := $(if $(_rooted),/)$(subst $(space),/,$(call _clean-path-expanded,$(_rooted),$(_expanded_path)))) 3663 $(if $(_path), 3664 $(_path), 3665 . 3666 ) 3667 , 3668 $(if $(call streq,$(words $(1)),0), 3669 ., 3670 $(error Call clean-path with only one path (without spaces)) 3671 ) 3672 ) 3673) 3674endef 3675 3676ifeq ($(TEST_MAKE_clean_path),true) 3677 define my_test 3678 $(if $(call streq,$(call clean-path,$(1)),$(2)),, 3679 $(eval my_failed := true) 3680 $(warning clean-path test '$(1)': expected '$(2)', got '$(call clean-path,$(1))')) 3681 endef 3682 my_failed := 3683 3684 # Already clean 3685 $(call my_test,abc,abc) 3686 $(call my_test,abc/def,abc/def) 3687 $(call my_test,a/b/c,a/b/c) 3688 $(call my_test,.,.) 3689 $(call my_test,..,..) 3690 $(call my_test,../..,../..) 3691 $(call my_test,../../abc,../../abc) 3692 $(call my_test,/abc,/abc) 3693 $(call my_test,/,/) 3694 3695 # Empty is current dir 3696 $(call my_test,,.) 3697 3698 # Remove trailing slash 3699 $(call my_test,abc/,abc) 3700 $(call my_test,abc/def/,abc/def) 3701 $(call my_test,a/b/c/,a/b/c) 3702 $(call my_test,./,.) 3703 $(call my_test,../,..) 3704 $(call my_test,../../,../..) 3705 $(call my_test,/abc/,/abc) 3706 3707 # Remove doubled slash 3708 $(call my_test,abc//def//ghi,abc/def/ghi) 3709 $(call my_test,//abc,/abc) 3710 $(call my_test,///abc,/abc) 3711 $(call my_test,//abc//,/abc) 3712 $(call my_test,abc//,abc) 3713 3714 # Remove . elements 3715 $(call my_test,abc/./def,abc/def) 3716 $(call my_test,/./abc/def,/abc/def) 3717 $(call my_test,abc/.,abc) 3718 3719 # Remove .. elements 3720 $(call my_test,abc/def/ghi/../jkl,abc/def/jkl) 3721 $(call my_test,abc/def/../ghi/../jkl,abc/jkl) 3722 $(call my_test,abc/def/..,abc) 3723 $(call my_test,abc/def/../..,.) 3724 $(call my_test,/abc/def/../..,/) 3725 $(call my_test,abc/def/../../..,..) 3726 $(call my_test,/abc/def/../../..,/) 3727 $(call my_test,abc/def/../../../ghi/jkl/../../../mno,../../mno) 3728 $(call my_test,/../abc,/abc) 3729 3730 # Combinations 3731 $(call my_test,abc/./../def,def) 3732 $(call my_test,abc//./../def,def) 3733 $(call my_test,abc/../../././../def,../../def) 3734 3735 ifdef my_failed 3736 $(error failed clean-path test) 3737 endif 3738endif 3739 3740########################################################### 3741## Given a filepath, returns nonempty if the path cannot be 3742## validated to be contained in the current directory 3743## This is, this function checks for '/' and '..' 3744## 3745## $(1): path to validate 3746define try-validate-path-is-subdir 3747$(strip \ 3748 $(if $(filter /%,$(1)), 3749 $(1) starts with a slash 3750 ) 3751 $(if $(filter ../%,$(call clean-path,$(1))), 3752 $(1) escapes its parent using '..' 3753 ) 3754 $(if $(strip $(1)), 3755 , 3756 '$(1)' is empty 3757 ) 3758) 3759endef 3760 3761define validate-path-is-subdir 3762$(if $(call try-validate-path-is-subdir,$(1)), 3763 $(call pretty-error, Illegal path: $(call try-validate-path-is-subdir,$(1))) 3764) 3765endef 3766 3767########################################################### 3768## Given a space-delimited list of filepaths, returns 3769## nonempty if any cannot be validated to be contained in 3770## the current directory 3771## 3772## $(1): path list to validate 3773define try-validate-paths-are-subdirs 3774$(strip \ 3775 $(foreach my_path,$(1),\ 3776 $(call try-validate-path-is-subdir,$(my_path))\ 3777 ) 3778) 3779endef 3780 3781define validate-paths-are-subdirs 3782$(if $(call try-validate-paths-are-subdirs,$(1)), 3783 $(call pretty-error,Illegal paths:\'$(call try-validate-paths-are-subdirs,$(1))\') 3784) 3785endef 3786 3787########################################################### 3788## Tests of try-validate-path-is-subdir 3789## and try-validate-paths-are-subdirs 3790define test-validate-paths-are-subdirs 3791$(eval my_error := $(call try-validate-path-is-subdir,/tmp)) \ 3792$(if $(call streq,$(my_error),/tmp starts with a slash), 3793, 3794 $(error incorrect error message for path /tmp. Got '$(my_error)') 3795) \ 3796$(eval my_error := $(call try-validate-path-is-subdir,../sibling)) \ 3797$(if $(call streq,$(my_error),../sibling escapes its parent using '..'), 3798, 3799 $(error incorrect error message for path ../sibling. Got '$(my_error)') 3800) \ 3801$(eval my_error := $(call try-validate-path-is-subdir,child/../../sibling)) \ 3802$(if $(call streq,$(my_error),child/../../sibling escapes its parent using '..'), 3803, 3804 $(error incorrect error message for path child/../../sibling. Got '$(my_error)') 3805) \ 3806$(eval my_error := $(call try-validate-path-is-subdir,)) \ 3807$(if $(call streq,$(my_error),'' is empty), 3808, 3809 $(error incorrect error message for empty path ''. Got '$(my_error)') 3810) \ 3811$(eval my_error := $(call try-validate-path-is-subdir,subdir/subsubdir)) \ 3812$(if $(call streq,$(my_error),), 3813, 3814 $(error rejected valid path 'subdir/subsubdir'. Got '$(my_error)') 3815) 3816 3817$(eval my_error := $(call try-validate-paths-are-subdirs,a/b /c/d e/f)) 3818$(if $(call streq,$(my_error),/c/d starts with a slash), 3819, 3820 $(error incorrect error message for path list 'a/b /c/d e/f'. Got '$(my_error)') 3821) 3822$(eval my_error := $(call try-validate-paths-are-subdirs,a/b c/d)) 3823$(if $(call streq,$(my_error),), 3824, 3825 $(error rejected valid path list 'a/b c/d'. Got '$(my_error)') 3826) 3827endef 3828# run test 3829$(strip $(call test-validate-paths-are-subdirs)) 3830 3831########################################################### 3832## Validate jacoco class filters and convert them to 3833## file arguments 3834## Jacoco class filters are comma-separated lists of class 3835## files (android.app.Application), and may have '*' as the 3836## last character to match all classes in a package 3837## including subpackages. 3838define jacoco-class-filter-to-file-args 3839$(strip $(call jacoco-validate-file-args,\ 3840 $(subst $(comma),$(space),\ 3841 $(subst .,/,\ 3842 $(strip $(1)))))) 3843endef 3844 3845define jacoco-validate-file-args 3846$(strip $(1)\ 3847 $(call validate-paths-are-subdirs,$(1)) 3848 $(foreach arg,$(1),\ 3849 $(if $(findstring ?,$(arg)),$(call pretty-error,\ 3850 '?' filters are not supported in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\ 3851 $(if $(findstring *,$(patsubst %*,%,$(arg))),$(call pretty-error,\ 3852 '*' is only supported at the end of a filter in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\ 3853 )) 3854endef 3855 3856########################################################### 3857## Other includes 3858########################################################### 3859 3860# Include any vendor specific definitions.mk file 3861-include $(TOPDIR)vendor/*/build/core/definitions.mk 3862-include $(TOPDIR)device/*/build/core/definitions.mk 3863-include $(TOPDIR)product/*/build/core/definitions.mk 3864# Also the project-specific definitions.mk file 3865-include $(TOPDIR)vendor/*/*/build/core/definitions.mk 3866-include $(TOPDIR)device/*/*/build/core/definitions.mk 3867-include $(TOPDIR)product/*/*/build/core/definitions.mk 3868 3869# broken: 3870# $(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file))) 3871 3872########################################################### 3873## Misc notes 3874########################################################### 3875 3876#DEPDIR = .deps 3877#df = $(DEPDIR)/$(*F) 3878 3879#SRCS = foo.c bar.c ... 3880 3881#%.o : %.c 3882# @$(MAKEDEPEND); \ 3883# cp $(df).d $(df).P; \ 3884# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 3885# -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \ 3886# rm -f $(df).d 3887# $(COMPILE.c) -o $@ $< 3888 3889#-include $(SRCS:%.c=$(DEPDIR)/%.P) 3890 3891 3892#%.o : %.c 3893# $(COMPILE.c) -MD -o $@ $< 3894# @cp $*.d $*.P; \ 3895# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 3896# -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \ 3897# rm -f $*.d 3898 3899 3900########################################################### 3901# Append the information to generate a RRO package for the 3902# source module. 3903# 3904# $(1): Source module name. 3905# $(2): Whether $(3) is a manifest package name or not. 3906# $(3): Manifest package name if $(2) is true. 3907# Otherwise, android manifest file path of the 3908# source module. 3909# $(4): Whether LOCAL_EXPORT_PACKAGE_RESOURCES is set or 3910# not for the source module. 3911# $(5): Resource overlay list. 3912# $(6): Target partition 3913########################################################### 3914define append_enforce_rro_sources 3915 $(eval ENFORCE_RRO_SOURCES += \ 3916 $(strip $(1))||$(strip $(2))||$(strip $(3))||$(strip $(4))||$(call normalize-path-list, $(strip $(5)))||$(strip $(6)) \ 3917 ) 3918endef 3919 3920########################################################### 3921# Generate all RRO packages for source modules stored in 3922# ENFORCE_RRO_SOURCES 3923########################################################### 3924define generate_all_enforce_rro_packages 3925$(foreach source,$(ENFORCE_RRO_SOURCES), \ 3926 $(eval _o := $(subst ||,$(space),$(source))) \ 3927 $(eval enforce_rro_source_module := $(word 1,$(_o))) \ 3928 $(eval enforce_rro_source_is_manifest_package_name := $(word 2,$(_o))) \ 3929 $(eval enforce_rro_source_manifest_package_info := $(word 3,$(_o))) \ 3930 $(eval enforce_rro_use_res_lib := $(word 4,$(_o))) \ 3931 $(eval enforce_rro_source_overlays := $(subst :, ,$(word 5,$(_o)))) \ 3932 $(eval enforce_rro_partition := $(word 6,$(_o))) \ 3933 $(eval include $(BUILD_SYSTEM)/generate_enforce_rro.mk) \ 3934 $(eval ALL_MODULES.$$(enforce_rro_source_module).REQUIRED_FROM_TARGET += $$(LOCAL_PACKAGE_NAME)) \ 3935) 3936endef 3937 3938########################################################### 3939## Find system_$(VER) in LOCAL_SDK_VERSION 3940## note: system_server_* is excluded. It's a different API surface 3941## 3942## $(1): LOCAL_SDK_VERSION 3943########################################################### 3944define has-system-sdk-version 3945$(filter-out system_server_%,$(filter system_%,$(1))) 3946endef 3947 3948########################################################### 3949## Get numerical version in LOCAL_SDK_VERSION 3950## 3951## $(1): LOCAL_SDK_VERSION 3952########################################################### 3953define get-numeric-sdk-version 3954$(filter-out current,\ 3955 $(if $(call has-system-sdk-version,$(1)),$(patsubst system_%,%,$(1)),$(1))) 3956endef 3957 3958########################################################### 3959## Verify module name meets character requirements: 3960## a-z A-Z 0-9 3961## _.+-,@~ 3962## 3963## This is a subset of bazel's target name restrictions: 3964## https://docs.bazel.build/versions/master/build-ref.html#name 3965## 3966## Kati has problems with '=': https://github.com/google/kati/issues/138 3967########################################################### 3968define verify-module-name 3969$(if $(filter-out $(LOCAL_MODULE),$(subst /,,$(LOCAL_MODULE))), \ 3970 $(call pretty-warning,Module name contains a /$(comma) use LOCAL_MODULE_STEM and LOCAL_MODULE_RELATIVE_PATH instead)) \ 3971$(if $(call _invalid-name-chars,$(LOCAL_MODULE)), \ 3972 $(call pretty-error,Invalid characters in module name: $(call _invalid-name-chars,$(LOCAL_MODULE)))) 3973endef 3974define _invalid-name-chars 3975$(subst _,,$(subst .,,$(subst +,,$(subst -,,$(subst $(comma),,$(subst @,,$(subst ~,,$(subst 0,,$(subst 1,,$(subst 2,,$(subst 3,,$(subst 4,,$(subst 5,,$(subst 6,,$(subst 7,,$(subst 8,,$(subst 9,,$(subst a,,$(subst b,,$(subst c,,$(subst d,,$(subst e,,$(subst f,,$(subst g,,$(subst h,,$(subst i,,$(subst j,,$(subst k,,$(subst l,,$(subst m,,$(subst n,,$(subst o,,$(subst p,,$(subst q,,$(subst r,,$(subst s,,$(subst t,,$(subst u,,$(subst v,,$(subst w,,$(subst x,,$(subst y,,$(subst z,,$(call to-lower,$(1))))))))))))))))))))))))))))))))))))))))))))) 3976endef 3977.KATI_READONLY := verify-module-name _invalid-name-chars 3978 3979########################################################### 3980## Verify module stem meets character requirements: 3981## a-z A-Z 0-9 3982## _.+-,@~ 3983## 3984## This is a subset of bazel's target name restrictions: 3985## https://docs.bazel.build/versions/master/build-ref.html#name 3986## 3987## $(1): The module stem variable to check 3988########################################################### 3989define verify-module-stem 3990$(if $(filter-out $($(1)),$(subst /,,$($(1)))), \ 3991 $(call pretty-warning,Module stem \($(1)\) contains a /$(comma) use LOCAL_MODULE_RELATIVE_PATH instead)) \ 3992$(if $(call _invalid-name-chars,$($(1))), \ 3993 $(call pretty-error,Invalid characters in module stem \($(1)\): $(call _invalid-name-chars,$($(1))))) 3994endef 3995.KATI_READONLY := verify-module-stem 3996 3997$(KATI_obsolete_var \ 3998 create-empty-package \ 3999 initialize-package-file \ 4000 add-jni-shared-libs-to-package \ 4001 inherit-package,\ 4002 These functions have been removed) 4003 4004########################################################### 4005## Verify the variants of a VNDK library are identical 4006## 4007## $(1): Path to the core variant shared library file. 4008## $(2): Path to the vendor variant shared library file. 4009## $(3): TOOLS_PREFIX 4010########################################################### 4011LIBRARY_IDENTITY_CHECK_SCRIPT := build/make/tools/check_identical_lib.sh 4012define verify-vndk-libs-identical 4013@echo "Checking VNDK vendor variant: $(2)" 4014$(hide) CLANG_BIN="$(LLVM_PREBUILTS_PATH)" \ 4015 CROSS_COMPILE="$(strip $(3))" \ 4016 XZ="$(XZ)" \ 4017 $(LIBRARY_IDENTITY_CHECK_SCRIPT) $(SOONG_STRIP_PATH) $(1) $(2) 4018endef 4019 4020# Convert Soong libraries that have SDK variant 4021define use_soong_sdk_libraries 4022 $(foreach l,$(1),$(if $(filter $(l),$(SOONG_SDK_VARIANT_MODULES)),\ 4023 $(l).sdk,$(l))) 4024endef 4025