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 @$(call emit-line,$(wordlist 99501,100000,$(1)),$(2)) 2588 @$(call emit-line,$(wordlist 100001,100500,$(1)),$(2)) 2589 @$(call emit-line,$(wordlist 100501,101000,$(1)),$(2)) 2590 @$(call emit-line,$(wordlist 101001,101500,$(1)),$(2)) 2591 @$(call emit-line,$(wordlist 101501,102000,$(1)),$(2)) 2592 @$(call emit-line,$(wordlist 102001,102500,$(1)),$(2)) 2593 @$(call emit-line,$(wordlist 102501,103000,$(1)),$(2)) 2594 @$(call emit-line,$(wordlist 103001,103500,$(1)),$(2)) 2595 @$(call emit-line,$(wordlist 103501,104000,$(1)),$(2)) 2596 @$(call emit-line,$(wordlist 104001,104500,$(1)),$(2)) 2597 @$(call emit-line,$(wordlist 104501,105000,$(1)),$(2)) 2598 @$(call emit-line,$(wordlist 105001,105500,$(1)),$(2)) 2599 @$(call emit-line,$(wordlist 105501,106000,$(1)),$(2)) 2600 @$(call emit-line,$(wordlist 106001,106500,$(1)),$(2)) 2601 @$(call emit-line,$(wordlist 106501,107000,$(1)),$(2)) 2602 @$(call emit-line,$(wordlist 107001,107500,$(1)),$(2)) 2603 @$(call emit-line,$(wordlist 107501,108000,$(1)),$(2)) 2604 @$(call emit-line,$(wordlist 108001,108500,$(1)),$(2)) 2605 @$(call emit-line,$(wordlist 108501,109000,$(1)),$(2)) 2606 @$(call emit-line,$(wordlist 109001,109500,$(1)),$(2)) 2607 @$(call emit-line,$(wordlist 109501,110000,$(1)),$(2)) 2608 @$(call emit-line,$(wordlist 110001,110500,$(1)),$(2)) 2609 @$(call emit-line,$(wordlist 110501,111000,$(1)),$(2)) 2610 @$(call emit-line,$(wordlist 111001,111500,$(1)),$(2)) 2611 @$(call emit-line,$(wordlist 111501,112000,$(1)),$(2)) 2612 @$(call emit-line,$(wordlist 112001,112500,$(1)),$(2)) 2613 @$(call emit-line,$(wordlist 112501,113000,$(1)),$(2)) 2614 @$(call emit-line,$(wordlist 113001,113500,$(1)),$(2)) 2615 @$(call emit-line,$(wordlist 113501,114000,$(1)),$(2)) 2616 @$(call emit-line,$(wordlist 114001,114500,$(1)),$(2)) 2617 @$(call emit-line,$(wordlist 114501,115000,$(1)),$(2)) 2618 @$(call emit-line,$(wordlist 115001,115500,$(1)),$(2)) 2619 @$(call emit-line,$(wordlist 115501,116000,$(1)),$(2)) 2620 @$(call emit-line,$(wordlist 116001,116500,$(1)),$(2)) 2621 @$(call emit-line,$(wordlist 116501,117000,$(1)),$(2)) 2622 @$(call emit-line,$(wordlist 117001,117500,$(1)),$(2)) 2623 @$(call emit-line,$(wordlist 117501,118000,$(1)),$(2)) 2624 @$(call emit-line,$(wordlist 118001,118500,$(1)),$(2)) 2625 @$(call emit-line,$(wordlist 118501,119000,$(1)),$(2)) 2626 @$(call emit-line,$(wordlist 119001,119500,$(1)),$(2)) 2627 @$(call emit-line,$(wordlist 119501,120000,$(1)),$(2)) 2628 @$(call emit-line,$(wordlist 120001,120500,$(1)),$(2)) 2629 @$(call emit-line,$(wordlist 120501,121000,$(1)),$(2)) 2630 @$(call emit-line,$(wordlist 121001,121500,$(1)),$(2)) 2631 @$(call emit-line,$(wordlist 121501,122000,$(1)),$(2)) 2632 @$(call emit-line,$(wordlist 122001,122500,$(1)),$(2)) 2633 @$(call emit-line,$(wordlist 122501,123000,$(1)),$(2)) 2634 @$(call emit-line,$(wordlist 123001,123500,$(1)),$(2)) 2635 @$(call emit-line,$(wordlist 123501,124000,$(1)),$(2)) 2636 @$(call emit-line,$(wordlist 124001,124500,$(1)),$(2)) 2637 @$(call emit-line,$(wordlist 124501,125000,$(1)),$(2)) 2638 @$(call emit-line,$(wordlist 125001,125500,$(1)),$(2)) 2639 @$(call emit-line,$(wordlist 125501,126000,$(1)),$(2)) 2640 @$(call emit-line,$(wordlist 126001,126500,$(1)),$(2)) 2641 @$(call emit-line,$(wordlist 126501,127000,$(1)),$(2)) 2642 @$(call emit-line,$(wordlist 127001,127500,$(1)),$(2)) 2643 @$(call emit-line,$(wordlist 127501,128000,$(1)),$(2)) 2644 @$(call emit-line,$(wordlist 128001,128500,$(1)),$(2)) 2645 @$(call emit-line,$(wordlist 128501,129000,$(1)),$(2)) 2646 @$(call emit-line,$(wordlist 129001,129500,$(1)),$(2)) 2647 @$(call emit-line,$(wordlist 129501,130000,$(1)),$(2)) 2648 @$(call emit-line,$(wordlist 130001,130500,$(1)),$(2)) 2649 @$(call emit-line,$(wordlist 130501,131000,$(1)),$(2)) 2650 @$(call emit-line,$(wordlist 131001,131500,$(1)),$(2)) 2651 @$(call emit-line,$(wordlist 131501,132000,$(1)),$(2)) 2652 @$(call emit-line,$(wordlist 132001,132500,$(1)),$(2)) 2653 @$(call emit-line,$(wordlist 132501,133000,$(1)),$(2)) 2654 @$(call emit-line,$(wordlist 133001,133500,$(1)),$(2)) 2655 @$(call emit-line,$(wordlist 133501,134000,$(1)),$(2)) 2656 @$(call emit-line,$(wordlist 134001,134500,$(1)),$(2)) 2657 @$(call emit-line,$(wordlist 134501,135000,$(1)),$(2)) 2658 @$(call emit-line,$(wordlist 135001,135500,$(1)),$(2)) 2659 @$(call emit-line,$(wordlist 135501,136000,$(1)),$(2)) 2660 @$(call emit-line,$(wordlist 136001,136500,$(1)),$(2)) 2661 @$(call emit-line,$(wordlist 136501,137000,$(1)),$(2)) 2662 @$(call emit-line,$(wordlist 137001,137500,$(1)),$(2)) 2663 @$(call emit-line,$(wordlist 137501,138000,$(1)),$(2)) 2664 @$(call emit-line,$(wordlist 138001,138500,$(1)),$(2)) 2665 @$(call emit-line,$(wordlist 138501,139000,$(1)),$(2)) 2666 @$(call emit-line,$(wordlist 139001,139500,$(1)),$(2)) 2667 @$(call emit-line,$(wordlist 139501,140000,$(1)),$(2)) 2668 @$(call emit-line,$(wordlist 140001,140500,$(1)),$(2)) 2669 @$(call emit-line,$(wordlist 140501,141000,$(1)),$(2)) 2670 @$(call emit-line,$(wordlist 141001,141500,$(1)),$(2)) 2671 @$(call emit-line,$(wordlist 141501,142000,$(1)),$(2)) 2672 @$(call emit-line,$(wordlist 142001,142500,$(1)),$(2)) 2673 @$(call emit-line,$(wordlist 142501,143000,$(1)),$(2)) 2674 @$(call emit-line,$(wordlist 143001,143500,$(1)),$(2)) 2675 @$(call emit-line,$(wordlist 143501,144000,$(1)),$(2)) 2676 @$(call emit-line,$(wordlist 144001,144500,$(1)),$(2)) 2677 @$(call emit-line,$(wordlist 144501,145000,$(1)),$(2)) 2678 @$(call emit-line,$(wordlist 145001,145500,$(1)),$(2)) 2679 @$(call emit-line,$(wordlist 145501,146000,$(1)),$(2)) 2680 @$(call emit-line,$(wordlist 146001,146500,$(1)),$(2)) 2681 @$(call emit-line,$(wordlist 146501,147000,$(1)),$(2)) 2682 @$(call emit-line,$(wordlist 147001,147500,$(1)),$(2)) 2683 @$(call emit-line,$(wordlist 147501,148000,$(1)),$(2)) 2684 @$(call emit-line,$(wordlist 148001,148500,$(1)),$(2)) 2685 @$(call emit-line,$(wordlist 148501,149000,$(1)),$(2)) 2686 @$(call emit-line,$(wordlist 149001,149500,$(1)),$(2)) 2687 @$(call emit-line,$(wordlist 149501,150000,$(1)),$(2)) 2688 @$(if $(wordlist 150001,150002,$(1)),$(error dump-words-to-file: Too many words ($(words $(1))))) 2689endef 2690# Return jar arguments to compress files in a given directory 2691# $(1): directory 2692# 2693# Returns an @-file argument that contains the output of a subshell 2694# that looks like -C $(1) path/to/file1 -C $(1) path/to/file2 2695# Also adds "-C out/empty ." which avoids errors in jar when 2696# there are no files in the directory. 2697define jar-args-sorted-files-in-directory 2698 @<(find $(1) -type f | sort | $(JAR_ARGS) $(1); echo "-C $(EMPTY_DIRECTORY) .") 2699endef 2700 2701# append additional Java sources(resources/Proto sources, and etc) to $(1). 2702define fetch-additional-java-source 2703$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ 2704 find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' -and -not -name '.*' >> $(1); \ 2705fi 2706endef 2707 2708# Some historical notes: 2709# - below we write the list of java files to java-source-list to avoid argument 2710# list length problems with Cygwin 2711# - we filter out duplicate java file names because eclipse's compiler 2712# doesn't like them. 2713define write-java-source-list 2714@echo "$($(PRIVATE_PREFIX)DISPLAY) Java source list: $(PRIVATE_MODULE)" 2715$(hide) rm -f $@ 2716$(call dump-words-to-file,$(sort $(PRIVATE_JAVA_SOURCES)),$@.tmp) 2717$(call fetch-additional-java-source,$@.tmp) 2718$(hide) tr ' ' '\n' < $@.tmp | $(NORMALIZE_PATH) | sort -u > $@ 2719endef 2720 2721# Common definition to invoke javac on the host and target. 2722# 2723# $(1): javac 2724# $(2): classpath_libs 2725define compile-java 2726$(hide) rm -f $@ 2727$(hide) rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(PRIVATE_ANNO_INTERMEDIATES_DIR) 2728$(hide) mkdir -p $(dir $@) 2729$(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR) $(PRIVATE_ANNO_INTERMEDIATES_DIR) 2730$(if $(PRIVATE_SRCJARS),\ 2731 $(ZIPSYNC) -d $(PRIVATE_SRCJAR_INTERMEDIATES_DIR) -l $(PRIVATE_SRCJAR_LIST_FILE) -f "*.java" $(PRIVATE_SRCJARS)) 2732$(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) $(if $(PRIVATE_SRCJARS),-o -s $(PRIVATE_SRCJAR_LIST_FILE) )] ; then \ 2733 $(SOONG_JAVAC_WRAPPER) $(JAVAC_WRAPPER) $(1) -encoding UTF-8 \ 2734 $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ 2735 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2736 $(addprefix --system=,$(PRIVATE_SYSTEM_MODULES_DIR)), \ 2737 $(addprefix -bootclasspath ,$(strip \ 2738 $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH)) \ 2739 $(PRIVATE_EMPTY_BOOTCLASSPATH)))) \ 2740 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2741 $(if $(PRIVATE_PATCH_MODULE), \ 2742 --patch-module=$(PRIVATE_PATCH_MODULE)=$(call normalize-path-list,. $(2)))) \ 2743 $(addprefix -classpath ,$(call normalize-path-list,$(strip \ 2744 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2745 $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \ 2746 $(2)))) \ 2747 $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \ 2748 -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) -s $(PRIVATE_ANNO_INTERMEDIATES_DIR) \ 2749 $(PRIVATE_JAVACFLAGS) \ 2750 \@$(PRIVATE_JAVA_SOURCE_LIST) \ 2751 $(if $(PRIVATE_SRCJARS),\@$(PRIVATE_SRCJAR_LIST_FILE)) \ 2752 || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \ 2753fi 2754$(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ 2755 -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \ 2756 $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \ 2757 | xargs rm -rf) 2758$(if $(PRIVATE_JAR_PACKAGES), \ 2759 $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \ 2760 $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \ 2761 -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \ 2762 find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete) 2763$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \ 2764 $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \ 2765 $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg)))) 2766$(hide) $(SOONG_ZIP) -jar -o $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) -D $(PRIVATE_CLASS_INTERMEDIATES_DIR) 2767$(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) 2768endef 2769 2770define transform-java-to-header.jar 2771@echo "$($(PRIVATE_PREFIX)DISPLAY) Turbine: $(PRIVATE_MODULE)" 2772@mkdir -p $(dir $@) 2773@rm -rf $(dir $@)/classes-turbine 2774@mkdir $(dir $@)/classes-turbine 2775$(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) -o -n "$(PRIVATE_SRCJARS)" ] ; then \ 2776 $(JAVA) -jar $(TURBINE) \ 2777 --output $@.premerged --temp_dir $(dir $@)/classes-turbine \ 2778 --sources \@$(PRIVATE_JAVA_SOURCE_LIST) --source_jars $(PRIVATE_SRCJARS) \ 2779 --javacopts $(PRIVATE_JAVACFLAGS) $(COMMON_JDK_FLAGS) -- \ 2780 $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2781 --system $(PRIVATE_SYSTEM_MODULES_DIR), \ 2782 --bootclasspath $(strip $(PRIVATE_BOOTCLASSPATH))) \ 2783 --classpath $(strip $(if $(PRIVATE_USE_SYSTEM_MODULES), \ 2784 $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \ 2785 $(PRIVATE_ALL_JAVA_HEADER_LIBRARIES)) \ 2786 || ( rm -rf $(dir $@)/classes-turbine ; exit 41 ) && \ 2787 $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $@.premerged $(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES) ; \ 2788else \ 2789 $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES) ; \ 2790fi 2791$(hide) $(ZIPTIME) $@.tmp 2792$(hide) $(call commit-change-for-toc,$@) 2793endef 2794 2795# Runs jarjar on an input file. Jarjar doesn't exit with a nonzero return code 2796# when there is a syntax error in a rules file and doesn't write the output 2797# file, so removes the output file before running jarjar and check if it exists 2798# after running jarjar. 2799define transform-jarjar 2800echo $($(PRIVATE_PREFIX)DISPLAY) JarJar: $@ 2801rm -f $@ 2802$(JAVA) -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ 2803[ -e $@ ] || (echo "Missing output file"; exit 1) 2804endef 2805 2806# Moves $1.tmp to $1 if necessary. This is designed to be used with 2807# .KATI_RESTAT. For kati, this function doesn't update the timestamp 2808# of $1 when $1.tmp is identical to $1 so that ninja won't rebuild 2809# targets which depend on $1. 2810define commit-change-for-toc 2811$(hide) if cmp -s $1.tmp $1 ; then \ 2812 rm $1.tmp ; \ 2813else \ 2814 mv $1.tmp $1 ; \ 2815fi 2816endef 2817 2818ifeq (,$(TARGET_BUILD_APPS)) 2819 2820## Rule to create a table of contents from a .dex file. 2821## Must be called with $(eval). 2822# $(1): The directory which contains classes*.dex files 2823define _transform-dex-to-toc 2824$1/classes.dex.toc: PRIVATE_INPUT_DEX_FILES := $1/classes*.dex 2825$1/classes.dex.toc: $1/classes.dex $(DEXDUMP) 2826 @echo Generating TOC: $$@ 2827 $(hide) ANDROID_LOG_TAGS="*:e" $(DEXDUMP) -l xml $$(PRIVATE_INPUT_DEX_FILES) > $$@.tmp 2828 $$(call commit-change-for-toc,$$@) 2829endef 2830 2831## Define a rule which generates .dex.toc and mark it as .KATI_RESTAT. 2832# $(1): The directory which contains classes*.dex files 2833define define-dex-to-toc-rule 2834$(eval $(call _transform-dex-to-toc,$1))\ 2835$(eval .KATI_RESTAT: $1/classes.dex.toc) 2836endef 2837 2838else 2839 2840# Turn off .toc optimization for apps build as we cannot build dexdump. 2841define define-dex-to-toc-rule 2842endef 2843 2844endif # TARGET_BUILD_APPS 2845 2846 2847# Takes an sdk version that might be PLATFORM_VERSION_CODENAME (for example P), 2848# returns a number greater than the highest existing sdk version if it is, or 2849# the input if it is not. 2850define codename-or-sdk-to-sdk 2851$(if $(filter $(1),$(PLATFORM_VERSION_CODENAME)),10000,$(1)) 2852endef 2853 2854# Uses LOCAL_SDK_VERSION and PLATFORM_SDK_VERSION to determine a compileSdkVersion 2855# in the form of a number or a codename (28 or P) 2856define module-sdk-version 2857$(strip \ 2858 $(if $(filter-out current system_current test_current core_current,$(LOCAL_SDK_VERSION)), \ 2859 $(call get-numeric-sdk-version,$(LOCAL_SDK_VERSION)), \ 2860 $(PLATFORM_SDK_VERSION))) 2861endef 2862 2863# Uses LOCAL_SDK_VERSION and DEFAULT_APP_TARGET_SDK to determine 2864# a targetSdkVersion in the form of a number or a codename (28 or P). 2865define module-target-sdk-version 2866$(strip \ 2867 $(if $(filter-out current system_current test_current core_current,$(LOCAL_SDK_VERSION)), \ 2868 $(call get-numeric-sdk-version,$(LOCAL_SDK_VERSION)), \ 2869 $(DEFAULT_APP_TARGET_SDK))) 2870endef 2871 2872# Uses LOCAL_MIN_SDK_VERSION, LOCAL_SDK_VERSION and DEFAULT_APP_TARGET_SDK to determine 2873# a minSdkVersion in the form of a number or a codename (28 or P). 2874define module-min-sdk-version 2875$(if $(LOCAL_MIN_SDK_VERSION),$(LOCAL_MIN_SDK_VERSION),$(call module-target-sdk-version)) 2876endef 2877 2878# Checks if module is in vendor or product 2879define module-in-vendor-or-product 2880$(if $(filter true,$(LOCAL_IN_VENDOR) $(LOCAL_IN_PRODUCT)),true) 2881endef 2882 2883define transform-classes.jar-to-dex 2884@echo "target Dex: $(PRIVATE_MODULE)" 2885@mkdir -p $(dir $@)tmp 2886$(hide) rm -f $(dir $@)classes*.dex $(dir $@)d8_input.jar 2887$(hide) $(ZIP2ZIP) -j -i $< -o $(dir $@)d8_input.jar "**/*.class" 2888$(hide) $(D8_WRAPPER) $(D8_COMMAND) \ 2889 --output $(dir $@)tmp \ 2890 $(addprefix --lib ,$(PRIVATE_D8_LIBS)) \ 2891 --min-api $(PRIVATE_MIN_SDK_VERSION) \ 2892 $(subst --main-dex-list=, --main-dex-list , \ 2893 $(filter-out --core-library --multi-dex --minimal-main-dex,$(PRIVATE_DX_FLAGS))) \ 2894 $(dir $@)d8_input.jar 2895$(hide) mv $(dir $@)tmp/* $(dir $@) 2896$(hide) rm -f $(dir $@)d8_input.jar 2897$(hide) rm -rf $(dir $@)tmp 2898endef 2899 2900# We need the extra blank line, so that the command will be on a separate line. 2901# $(1): the package 2902# $(2): the ABI name 2903# $(3): the list of shared libraies 2904define _add-jni-shared-libs-to-package-per-abi 2905$(hide) cp $(3) $(dir $(1))lib/$(2) 2906 2907endef 2908 2909# $(1): the package file 2910# $(2): if true, uncompress jni libs 2911define create-jni-shared-libs-package 2912rm -rf $(dir $(1))lib 2913mkdir -p $(addprefix $(dir $(1))lib/,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI)) 2914$(foreach abi,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI),\ 2915 $(call _add-jni-shared-libs-to-package-per-abi,$(1),$(abi),\ 2916 $(patsubst $(abi):%,%,$(filter $(abi):%,$(PRIVATE_JNI_SHARED_LIBRARIES))))) 2917$(SOONG_ZIP) $(if $(2),-L 0) -o $(1) -C $(dir $(1)) -D $(dir $(1))lib 2918rm -rf $(dir $(1))lib 2919endef 2920 2921# $(1): the jar file. 2922# $(2): the classes.dex file. 2923define create-dex-jar 2924find $(dir $(2)) -maxdepth 1 -name "classes*.dex" | sort > $(1).lst 2925$(SOONG_ZIP) -o $(1) -C $(dir $(2)) -l $(1).lst 2926endef 2927 2928# Add java resources added by the current module to an existing package. 2929# $(1) destination package. 2930define add-java-resources-to 2931 $(call _java-resources,$(1),u) 2932endef 2933 2934# Add java resources added by the current module to a new jar. 2935# $(1) destination jar. 2936define create-java-resources-jar 2937 $(call _java-resources,$(1),c) 2938endef 2939 2940define _java-resources 2941$(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(1).jar-arg-list) 2942$(hide) $(JAR) $(2)f $(1) @$(1).jar-arg-list 2943@rm -f $(1).jar-arg-list 2944endef 2945 2946# Add resources (non .class files) from a jar to a package 2947# $(1): the package file 2948# $(2): the jar file 2949# $(3): temporary directory 2950define add-jar-resources-to-package 2951 rm -rf $(3) 2952 mkdir -p $(3) 2953 zipinfo -1 $(2) > /dev/null 2954 unzip -qo $(2) -d $(3) $$(zipinfo -1 $(2) | grep -v -E "\.class$$") 2955 $(JAR) uf $(1) $(call jar-args-sorted-files-in-directory,$(3)) 2956endef 2957 2958# $(1): the output resources jar. 2959# $(2): the input jar 2960define extract-resources-jar 2961 $(ZIP2ZIP) -i $(2) -o $(1) -x '**/*.class' -x '**/*/' 2962endef 2963 2964# Sign a package using the specified key/cert. 2965# 2966define sign-package 2967$(call sign-package-arg,$@) 2968endef 2969 2970# $(1): the package file we are signing. 2971define sign-package-arg 2972$(hide) mv $(1) $(1).unsigned 2973$(hide) $(JAVA) -Djava.library.path=$$(dirname $(SIGNAPK_JNI_LIBRARY_PATH)) -jar $(SIGNAPK_JAR) \ 2974 $(if $(strip $(PRIVATE_CERTIFICATE_LINEAGE)), --lineage $(PRIVATE_CERTIFICATE_LINEAGE)) \ 2975 $(if $(strip $(PRIVATE_ROTATION_MIN_SDK_VERSION)), --rotation-min-sdk-version $(PRIVATE_ROTATION_MIN_SDK_VERSION)) \ 2976 $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \ 2977 $(PRIVATE_ADDITIONAL_CERTIFICATES) $(1).unsigned $(1).signed 2978$(hide) mv $(1).signed $(1) 2979endef 2980 2981# Align STORED entries of a package on 4-byte boundaries to make them easier to mmap. 2982# 2983define align-package 2984$(hide) if ! $(ZIPALIGN) -c -p 4 $@ >/dev/null ; then \ 2985 mv $@ $@.unaligned; \ 2986 $(ZIPALIGN) \ 2987 -f \ 2988 -p \ 2989 4 \ 2990 $@.unaligned $@.aligned; \ 2991 mv $@.aligned $@; \ 2992 fi 2993endef 2994 2995# Verifies ZIP alignment of a package. 2996# 2997define check-package-alignment 2998$(hide) if ! $(ZIPALIGN) -c -p 4 $@ >/dev/null ; then \ 2999 $(call echo-error,$@,Improper package alignment); \ 3000 exit 1; \ 3001 fi 3002endef 3003 3004# Compress a package using the standard gzip algorithm. 3005define compress-package 3006$(hide) \ 3007 mv $@ $@.uncompressed; \ 3008 $(GZIP) -9 -c $@.uncompressed > $@.compressed; \ 3009 rm -f $@.uncompressed; \ 3010 mv $@.compressed $@; 3011endef 3012 3013ifeq ($(HOST_OS),linux) 3014# Runs appcompat and store logs in $(PRODUCT_OUT)/appcompat 3015define extract-package 3016$(AAPT2) dump resources $@ | awk -F ' |=' '/^Package/{print $$3; exit}' >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && 3017endef 3018define appcompat-header 3019$(hide) \ 3020 mkdir -p $(PRODUCT_OUT)/appcompat && \ 3021 rm -f $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 3022 echo -n "Package name: " >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 3023 $(extract-package) \ 3024 echo "Module name in Android tree: $(PRIVATE_MODULE)" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 3025 echo "Local path in Android tree: $(PRIVATE_PATH)" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 3026 echo "Install path: $(patsubst $(PRODUCT_OUT)/%,%,$(PRIVATE_INSTALLED_MODULE))" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 3027 echo >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log 3028endef 3029ART_VERIDEX_APPCOMPAT:=$(HOST_OUT)/bin/appcompat 3030define run-appcompat 3031$(hide) \ 3032 echo "appcompat output:" >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log && \ 3033 ANDROID_LOG_TAGS="*:e" $(ART_VERIDEX_APPCOMPAT) --dex-file=$@ 2>&1 >> $(PRODUCT_OUT)/appcompat/$(PRIVATE_MODULE).log 3034endef 3035appcompat-files = \ 3036 $(AAPT2) \ 3037 $(ART_VERIDEX_APPCOMPAT) \ 3038else 3039appcompat-header = 3040run-appcompat = 3041appcompat-files = 3042endif # HOST_OS == linux 3043.KATI_READONLY: appcompat-header run-appcompat appcompat-files 3044 3045# Remove dynamic timestamps from packages 3046# 3047define remove-timestamps-from-package 3048$(hide) $(ZIPTIME) $@ 3049endef 3050 3051# Uncompress dex files embedded in an apk. 3052# 3053define uncompress-dexs 3054 if (zipinfo $@ '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 3055 $(ZIP2ZIP) -i $@ -o $@.tmp -0 "classes*.dex" && \ 3056 mv -f $@.tmp $@ ; \ 3057 fi 3058endef 3059 3060# Uncompress shared JNI libraries embedded in an apk. 3061# 3062define uncompress-prebuilt-embedded-jni-libs 3063 if (zipinfo $@ 'lib/*.so' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 3064 $(ZIP2ZIP) -i $@ -o $@.tmp -0 'lib/**/*.so' && mv -f $@.tmp $@ ; \ 3065 fi 3066endef 3067 3068# Verifies shared JNI libraries and dex files in an apk are uncompressed. 3069# 3070define check-jni-dex-compression 3071 if (zipinfo $@ 'lib/*.so' '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 3072 $(call echo-error,$@,Contains compressed JNI libraries and/or dex files); \ 3073 exit 1; \ 3074 fi 3075endef 3076 3077# Remove unwanted shared JNI libraries embedded in an apk. 3078# 3079define remove-unwanted-prebuilt-embedded-jni-libs 3080 $(if $(PRIVATE_EMBEDDED_JNI_LIBS), \ 3081 $(ZIP2ZIP) -i $@ -o $@.tmp \ 3082 -x 'lib/**/*.so' $(addprefix -X ,$(PRIVATE_EMBEDDED_JNI_LIBS)) && \ 3083 mv -f $@.tmp $@) 3084endef 3085 3086# TODO(joeo): If we can ever upgrade to post 3.81 make and get the 3087# new prebuilt rules to work, we should change this to copy the 3088# resources to the out directory and then copy the resources. 3089 3090# Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR 3091# in transform-java-to-classes for the sake of vm-tests. 3092define transform-host-java-to-package 3093@echo "Host Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" 3094$(call compile-java,$(HOST_JAVAC),$(PRIVATE_ALL_JAVA_LIBRARIES)) 3095endef 3096 3097# Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR 3098# in transform-java-to-classes for the sake of vm-tests. 3099define transform-host-java-to-dalvik-package 3100@echo "Dalvik Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" 3101$(call compile-java,$(HOST_JAVAC),$(PRIVATE_ALL_JAVA_HEADER_LIBRARIES)) 3102endef 3103 3104########################################################### 3105## Commands for copying files 3106########################################################### 3107 3108# Define a rule to copy a header. Used via $(eval) by copy_headers.make. 3109# $(1): source header 3110# $(2): destination header 3111define copy-one-header 3112$(2): $(1) 3113 @echo "Header: $$@" 3114 $$(copy-file-to-new-target-with-cp) 3115endef 3116 3117# Define a rule to copy a file. For use via $(eval). 3118# $(1): source file 3119# $(2): destination file 3120define copy-one-file 3121$(2): $(1) 3122 @echo "Copy: $$@" 3123 $$(copy-file-to-target) 3124endef 3125 3126# Define a rule to copy a license metadata file. For use via $(eval). 3127# $(1): source license metadata file 3128# $(2): destination license metadata file 3129# $(3): built targets 3130# $(4): installed targets 3131define copy-one-license-metadata-file 3132$(2): PRIVATE_BUILT=$(3) 3133$(2): PRIVATE_INSTALLED=$(4) 3134$(2): $(1) 3135 @echo "Copy: $$@" 3136 $$(call copy-license-metadata-file-to-target,$$(PRIVATE_BUILT),$$(PRIVATE_INSTALLED)) 3137endef 3138 3139define copy-and-uncompress-dexs 3140$(2): $(1) $(ZIPALIGN) $(ZIP2ZIP) 3141 @echo "Uncompress dexs in: $$@" 3142 $$(copy-file-to-target) 3143 $$(uncompress-dexs) 3144 $$(align-package) 3145endef 3146 3147# Create copy pair for compatibility suite 3148# Filter out $(LOCAL_INSTALLED_MODULE) to prevent overriding target 3149# $(1): source path 3150# $(2): destination path 3151# The format of copy pair is src:dst 3152define compat-copy-pair 3153$(if $(filter-out $(2), $(LOCAL_INSTALLED_MODULE)), $(1):$(2)) 3154endef 3155 3156# Create copy pair for $(1) $(2) 3157# If $(2) is substring of $(3) do nothing. 3158# $(1): source path 3159# $(2): destination path 3160# $(3): filter-out target 3161# The format of copy pair is src:dst 3162define filter-copy-pair 3163$(if $(findstring $(2), $(3)),,$(1):$(2)) 3164endef 3165 3166# Copies many files. 3167# $(1): The files to copy. Each entry is a ':' separated src:dst pair 3168# $(2): An optional directory to prepend to the destination 3169# Evaluates to the list of the dst files (ie suitable for a dependency list) 3170define copy-many-files 3171$(foreach f, $(1), $(strip \ 3172 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3173 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3174 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3175 $(if $(strip $(2)), \ 3176 $(eval _cmf_dest := $(patsubst %/,%,$(strip $(2)))/$(patsubst /%,%,$(_cmf_dest)))) \ 3177 $(if $(filter-out $(_cmf_src), $(_cmf_dest)), \ 3178 $(eval $(call copy-one-file,$(_cmf_src),$(_cmf_dest)))) \ 3179 $(_cmf_dest))) 3180endef 3181 3182# Copy the file only if it's a well-formed init script file. For use via $(eval). 3183# $(1): source file 3184# $(2): destination file 3185define copy-init-script-file-checked 3186ifdef TARGET_BUILD_UNBUNDLED 3187# TODO (b/185624993): Remove the check on TARGET_BUILD_UNBUNDLED when host_init_verifier can run 3188# without requiring the HIDL interface map. 3189$(2): $(1) 3190else ifneq ($(HOST_OS),darwin) 3191# Host init verifier doesn't exist on darwin. 3192$(2): \ 3193 $(1) \ 3194 $(HOST_INIT_VERIFIER) \ 3195 $(call intermediates-dir-for,ETC,passwd_system)/passwd_system \ 3196 $(call intermediates-dir-for,ETC,passwd_system_ext)/passwd_system_ext \ 3197 $(call intermediates-dir-for,ETC,passwd_vendor)/passwd_vendor \ 3198 $(call intermediates-dir-for,ETC,passwd_odm)/passwd_odm \ 3199 $(call intermediates-dir-for,ETC,passwd_product)/passwd_product \ 3200 $(call intermediates-dir-for,ETC,plat_property_contexts)/plat_property_contexts \ 3201 $(call intermediates-dir-for,ETC,system_ext_property_contexts)/system_ext_property_contexts \ 3202 $(call intermediates-dir-for,ETC,product_property_contexts)/product_property_contexts \ 3203 $(call intermediates-dir-for,ETC,vendor_property_contexts)/vendor_property_contexts \ 3204 $(call intermediates-dir-for,ETC,odm_property_contexts)/odm_property_contexts 3205 $(hide) $(HOST_INIT_VERIFIER) \ 3206 -p $(call intermediates-dir-for,ETC,passwd_system)/passwd_system \ 3207 -p $(call intermediates-dir-for,ETC,passwd_system_ext)/passwd_system_ext \ 3208 -p $(call intermediates-dir-for,ETC,passwd_vendor)/passwd_vendor \ 3209 -p $(call intermediates-dir-for,ETC,passwd_odm)/passwd_odm \ 3210 -p $(call intermediates-dir-for,ETC,passwd_product)/passwd_product \ 3211 --property-contexts=$(call intermediates-dir-for,ETC,plat_property_contexts)/plat_property_contexts \ 3212 --property-contexts=$(call intermediates-dir-for,ETC,system_ext_property_contexts)/system_ext_property_contexts \ 3213 --property-contexts=$(call intermediates-dir-for,ETC,product_property_contexts)/product_property_contexts \ 3214 --property-contexts=$(call intermediates-dir-for,ETC,vendor_property_contexts)/vendor_property_contexts \ 3215 --property-contexts=$(call intermediates-dir-for,ETC,odm_property_contexts)/odm_property_contexts \ 3216 $$< 3217else 3218$(2): $(1) 3219endif 3220 @echo "Copy init script: $$@" 3221 $$(copy-file-to-target) 3222endef 3223 3224# Copies many init script files and check they are well-formed. 3225# $(1): The init script files to copy. Each entry is a ':' separated src:dst pair. 3226define copy-many-init-script-files-checked 3227$(foreach f, $(1), $(strip \ 3228 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3229 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3230 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3231 $(eval $(call copy-init-script-file-checked,$(_cmf_src),$(_cmf_dest))))) 3232endef 3233 3234# Copy the file only if it's a well-formed xml file. For use via $(eval). 3235# $(1): source file 3236# $(2): destination file, must end with .xml. 3237define copy-xml-file-checked 3238$(2): $(1) $(XMLLINT) 3239 @echo "Copy xml: $$@" 3240 $(hide) $(XMLLINT) $$< >/dev/null # Don't print the xml file to stdout. 3241 $$(copy-file-to-target) 3242endef 3243 3244# Copies many xml files and check they are well-formed. 3245# $(1): The xml files to copy. Each entry is a ':' separated src:dst pair. 3246# Evaluates to the list of the dst files. (ie suitable for a dependency list.) 3247define copy-many-xml-files-checked 3248$(foreach f, $(1), $(strip \ 3249 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3250 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3251 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3252 $(eval $(call copy-xml-file-checked,$(_cmf_src),$(_cmf_dest))) \ 3253 $(_cmf_dest))) 3254endef 3255 3256# Copy the file only if it is a well-formed manifest file. For use viea $(eval) 3257# $(1): source file 3258# $(2): destination file 3259define copy-vintf-manifest-checked 3260$(2): $(1) $(HOST_OUT_EXECUTABLES)/assemble_vintf 3261 @echo "Copy xml: $$@" 3262 $(hide) mkdir -p "$$(dir $$@)" 3263 $(hide) VINTF_IGNORE_TARGET_FCM_VERSION=true\ 3264 $(HOST_OUT_EXECUTABLES)/assemble_vintf -i $$< -o $$@ 3265endef 3266 3267# Copies many vintf manifest files checked. 3268# $(1): The files to copy. Each entry is a ':' separated src:dst pair 3269define copy-many-vintf-manifest-files-checked 3270$(foreach f, $(1), $(strip \ 3271 $(eval _cmf_tuple := $(subst :, ,$(f))) \ 3272 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \ 3273 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \ 3274 $(eval $(call copy-vintf-manifest-checked,$(_cmf_src),$(_cmf_dest))))) 3275endef 3276 3277# Copy the file only if it's not an ELF file. For use via $(eval). 3278# $(1): source file 3279# $(2): destination file 3280# $(3): message to print on error 3281define copy-non-elf-file-checked 3282$(eval check_non_elf_file_timestamp := \ 3283 $(call intermediates-dir-for,FAKE,check-non-elf-file-timestamps)/$(2).timestamp) 3284$(check_non_elf_file_timestamp): $(1) $(LLVM_READOBJ) 3285 @echo "Check non-ELF: $$<" 3286 $(hide) mkdir -p "$$(dir $$@)" 3287 $(hide) rm -f "$$@" 3288 $(hide) \ 3289 if $(LLVM_READOBJ) -h "$$<" >/dev/null 2>&1; then \ 3290 $(call echo-error,$(2),$(3)); \ 3291 $(call echo-error,$(2),found ELF file: $$<); \ 3292 false; \ 3293 fi 3294 $(hide) touch "$$@" 3295 3296$(2): $(1) $(check_non_elf_file_timestamp) 3297 @echo "Copy non-ELF: $$@" 3298 $$(copy-file-to-target) 3299 3300check-elf-prebuilt-product-copy-files: $(check_non_elf_file_timestamp) 3301endef 3302 3303# The -t option to acp and the -p option to cp is 3304# required for OSX. OSX has a ridiculous restriction 3305# where it's an error for a .a file's modification time 3306# to disagree with an internal timestamp, and this 3307# macro is used to install .a files (among other things). 3308 3309# Copy a single file from one place to another, 3310# preserving permissions and overwriting any existing 3311# file. 3312# When we used acp, it could not handle high resolution timestamps 3313# on file systems like ext4. Because of that, '-t' option was disabled 3314# and copy-file-to-target was identical to copy-file-to-new-target. 3315# Keep the behavior until we audit and ensure that switching this back 3316# won't break anything. 3317define copy-file-to-target 3318@mkdir -p $(dir $@) 3319$(hide) rm -f $@ 3320$(hide) cp "$<" "$@" 3321endef 3322 3323# Same as copy-file-to-target, but assume file is a licenes metadata file, 3324# and append built from $(1) and installed from $(2). 3325define copy-license-metadata-file-to-target 3326@mkdir -p $(dir $@) 3327$(hide) rm -f $@ 3328$(hide) cp "$<" "$@" $(strip \ 3329 $(foreach b,$(1), && (grep -F 'built: "'"$(b)"'"' "$@" >/dev/null || echo 'built: "'"$(b)"'"' >>"$@")) \ 3330 $(foreach i,$(2), && (grep -F 'installed: "'"$(i)"'"' "$@" >/dev/null || echo 'installed: "'"$(i)"'"' >>"$@")) \ 3331) 3332endef 3333 3334# The same as copy-file-to-target, but use the local 3335# cp command instead of acp. 3336define copy-file-to-target-with-cp 3337@mkdir -p $(dir $@) 3338$(hide) rm -f $@ 3339$(hide) cp -p "$<" "$@" 3340endef 3341 3342# The same as copy-file-to-target, but don't preserve 3343# the old modification time. 3344define copy-file-to-new-target 3345@mkdir -p $(dir $@) 3346$(hide) rm -f $@ 3347$(hide) cp $< $@ 3348endef 3349 3350# The same as copy-file-to-new-target, but use the local 3351# cp command instead of acp. 3352define copy-file-to-new-target-with-cp 3353@mkdir -p $(dir $@) 3354$(hide) rm -f $@ 3355$(hide) cp $< $@ 3356endef 3357 3358# The same as copy-file-to-new-target, but preserve symlinks. Symlinks are 3359# converted to absolute to not break. 3360define copy-file-or-link-to-new-target 3361@mkdir -p $(dir $@) 3362$(hide) rm -f $@ 3363$(hide) if [ -h $< ]; then \ 3364 ln -s $$(realpath $<) $@; \ 3365else \ 3366 cp $< $@; \ 3367fi 3368endef 3369 3370# Copy a prebuilt file to a target location. 3371define transform-prebuilt-to-target 3372@echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)" 3373$(copy-file-to-target) 3374endef 3375 3376# Copy a prebuilt file to a target location, but preserve symlinks rather than 3377# dereference them. 3378define copy-or-link-prebuilt-to-target 3379@echo "$($(PRIVATE_PREFIX)DISPLAY) Prebuilt: $(PRIVATE_MODULE) ($@)" 3380$(copy-file-or-link-to-new-target) 3381endef 3382 3383# Copy a list of files/directories to target location, with sub dir structure preserved. 3384# For example $(HOST_OUT_EXECUTABLES)/aapt -> $(staging)/bin/aapt . 3385# $(1): the source list of files/directories. 3386# $(2): the path prefix to strip. In the above example it would be $(HOST_OUT). 3387# $(3): the target location. 3388define copy-files-with-structure 3389$(foreach t,$(1),\ 3390 $(eval s := $(patsubst $(2)%,%,$(t)))\ 3391 $(hide) mkdir -p $(dir $(3)/$(s)); cp -Rf $(t) $(3)/$(s)$(newline)) 3392endef 3393 3394# Define a rule to create a symlink to a file. 3395# $(1): any dependencies 3396# $(2): source (may be relative) 3397# $(3): full path to destination 3398define symlink-file 3399$(eval $(_symlink-file)) 3400$(eval $(call declare-license-metadata,$(3),,,,,,)) 3401$(eval $(call declare-license-deps,$(3),$(1))) 3402endef 3403 3404define _symlink-file 3405$(3): $(1) 3406 @echo "Symlink: $$@ -> $(2)" 3407 @mkdir -p $$(dir $$@) 3408 @rm -rf $$@ 3409 $(hide) ln -sf $(2) $$@ 3410endef 3411 3412# Copy an apk to a target location while removing classes*.dex 3413# $(1): source file 3414# $(2): destination file 3415# $(3): LOCAL_STRIP_DEX, if non-empty then strip classes*.dex 3416define dexpreopt-copy-jar 3417$(2): $(1) 3418 @echo "Copy: $$@" 3419 $$(copy-file-to-target) 3420 $(if $(3),$$(call dexpreopt-remove-classes.dex,$$@)) 3421endef 3422 3423# $(1): the .jar or .apk to remove classes.dex. Note that if all dex files 3424# are uncompressed in the archive, then dexopt will not do a copy of the dex 3425# files and we should not strip. 3426define dexpreopt-remove-classes.dex 3427$(hide) if (zipinfo $1 '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ 3428zip --quiet --delete $(1) classes.dex; \ 3429dex_index=2; \ 3430while zip --quiet --delete $(1) classes$${dex_index}.dex > /dev/null; do \ 3431 let dex_index=dex_index+1; \ 3432done \ 3433fi 3434endef 3435 3436# Copy an unstripped binary to the symbols directory while also extracting 3437# a hash mapping to the mapping directory. 3438# $(1): unstripped intermediates file 3439# $(2): path in symbols directory 3440define copy-unstripped-elf-file-with-mapping 3441$(call _copy-symbols-file-with-mapping,$(1),$(2),\ 3442 elf,$(patsubst $(TARGET_OUT_UNSTRIPPED)/%,$(call intermediates-dir-for,PACKAGING,elf_symbol_mapping)/%,$(2).textproto)) 3443endef 3444 3445# Copy an R8 dictionary to the packaging directory while also extracting 3446# a hash mapping to the mapping directory. 3447# $(1): unstripped intermediates file 3448# $(2): path in packaging directory 3449# $(3): path in mappings packaging directory 3450define copy-r8-dictionary-file-with-mapping 3451$(call _copy-symbols-file-with-mapping,$(1),$(2),r8,$(3)) 3452endef 3453 3454# Copy an unstripped binary or R8 dictionary to the symbols directory 3455# while also extracting a hash mapping to the mapping directory. 3456# $(1): unstripped intermediates file 3457# $(2): path in symbols directory 3458# $(3): file type (elf or r8) 3459# $(4): path in the mappings directory 3460# 3461# Regarding the restats at the end: I think you should only need to use KATI_RESTAT on $(2), but 3462# there appears to be a bug in kati where it was not adding restat=true in the ninja file unless we 3463# also added 4 to KATI_RESTAT. 3464define _copy-symbols-file-with-mapping 3465$(2): .KATI_IMPLICIT_OUTPUTS := $(4) 3466$(2): $(SYMBOLS_MAP) 3467$(2): $(1) 3468 @echo "Copy symbols with mapping: $$@" 3469 $$(copy-file-to-target) 3470 $(SYMBOLS_MAP) -$(strip $(3)) $(2) -write_if_changed $(4) 3471.KATI_RESTAT: $(2) 3472.KATI_RESTAT: $(4) 3473endef 3474 3475 3476########################################################### 3477## Commands to call R8 3478########################################################### 3479 3480# Use --debug flag for eng builds by default 3481ifeq (eng,$(TARGET_BUILD_VARIANT)) 3482R8_DEBUG_MODE := --debug 3483else 3484R8_DEBUG_MODE := 3485endif 3486 3487define transform-jar-to-dex-r8 3488@echo R8: $@ 3489$(hide) rm -f $(PRIVATE_PROGUARD_DICTIONARY) 3490$(hide) $(R8_WRAPPER) $(R8_COMMAND) \ 3491 -injars '$<' \ 3492 --min-api $(PRIVATE_MIN_SDK_VERSION) \ 3493 --no-data-resources \ 3494 --force-proguard-compatibility --output $(subst classes.dex,,$@) \ 3495 $(R8_DEBUG_MODE) \ 3496 $(PRIVATE_PROGUARD_FLAGS) \ 3497 $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR)) \ 3498 $(PRIVATE_DX_FLAGS) \ 3499 -ignorewarnings 3500$(hide) touch $(PRIVATE_PROGUARD_DICTIONARY) 3501endef 3502 3503########################################################### 3504## Stuff source generated from one-off tools 3505########################################################### 3506 3507define transform-generated-source 3508@echo "$($(PRIVATE_PREFIX)DISPLAY) Generated: $(PRIVATE_MODULE) <= $<" 3509@mkdir -p $(dir $@) 3510$(hide) $(PRIVATE_CUSTOM_TOOL) 3511endef 3512 3513 3514########################################################### 3515## Assertions about attributes of the target 3516########################################################### 3517 3518# $(1): The file to check 3519define get-file-size 3520stat -c "%s" "$(1)" | tr -d '\n' 3521endef 3522 3523# $(1): The file(s) to check (often $@) 3524# $(2): The partition size. 3525define assert-max-image-size 3526$(if $(2), \ 3527 size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); \ 3528 total=$$(( $$( echo "$$size" ) )); \ 3529 printname=$$(echo -n "$(1)" | tr " " +); \ 3530 maxsize=$$(($(2))); \ 3531 if [ "$$total" -gt "$$maxsize" ]; then \ 3532 echo "error: $$printname too large ($$total > $$maxsize)"; \ 3533 false; \ 3534 elif [ "$$total" -gt $$((maxsize - 32768)) ]; then \ 3535 echo "WARNING: $$printname approaching size limit ($$total now; limit $$maxsize)"; \ 3536 fi \ 3537 , \ 3538 true \ 3539 ) 3540endef 3541 3542 3543########################################################### 3544## Define device-specific radio files 3545########################################################### 3546INSTALLED_RADIOIMAGE_TARGET := 3547 3548# Copy a radio image file to the output location, and add it to 3549# INSTALLED_RADIOIMAGE_TARGET. 3550# $(1): filename 3551define add-radio-file 3552 $(eval $(call add-radio-file-internal,$(1),$(notdir $(1)))) 3553endef 3554define add-radio-file-internal 3555INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2) 3556$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) 3557 $$(transform-prebuilt-to-target) 3558endef 3559 3560# Version of add-radio-file that also arranges for the version of the 3561# file to be checked against the contents of 3562# $(TARGET_BOARD_INFO_FILE). 3563# $(1): filename 3564# $(2): name of version variable in board-info (eg, "version-baseband") 3565define add-radio-file-checked 3566 $(eval $(call add-radio-file-checked-internal,$(1),$(notdir $(1)),$(2))) 3567endef 3568define add-radio-file-checked-internal 3569INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2) 3570BOARD_INFO_CHECK += $(3):$(LOCAL_PATH)/$(1) 3571$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) 3572 $$(transform-prebuilt-to-target) 3573endef 3574 3575## Whether to build from source if prebuilt alternative exists 3576########################################################### 3577# $(1): module name 3578# $(2): LOCAL_PATH 3579# Expands to empty string if not from source. 3580ifeq (true,$(ANDROID_BUILD_FROM_SOURCE)) 3581define if-build-from-source 3582true 3583endef 3584else 3585define if-build-from-source 3586$(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \ 3587 $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true) 3588endef 3589endif 3590 3591# Include makefile $(1) if build from source for module $(2) 3592# $(1): the makefile to include 3593# $(2): module name 3594# $(3): LOCAL_PATH 3595define include-if-build-from-source 3596$(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1))) 3597endef 3598 3599# Return the arch for the source file of a prebuilt 3600# Return "none" if no matching arch found and return empty 3601# if the input is empty, so the result can be passed to 3602# LOCAL_MODULE_TARGET_ARCH. 3603# $(1) the list of archs supported by the prebuilt 3604define get-prebuilt-src-arch 3605$(strip $(if $(filter $(TARGET_ARCH),$(1)),$(TARGET_ARCH),\ 3606 $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),$(if $(1),none)))) 3607endef 3608 3609# ############################################################### 3610# Set up statistics gathering 3611# ############################################################### 3612STATS.MODULE_TYPE := \ 3613 HOST_STATIC_LIBRARY \ 3614 HOST_SHARED_LIBRARY \ 3615 STATIC_LIBRARY \ 3616 SHARED_LIBRARY \ 3617 EXECUTABLE \ 3618 HOST_EXECUTABLE \ 3619 PACKAGE \ 3620 PHONY_PACKAGE \ 3621 HOST_PREBUILT \ 3622 PREBUILT \ 3623 MULTI_PREBUILT \ 3624 JAVA_LIBRARY \ 3625 STATIC_JAVA_LIBRARY \ 3626 HOST_JAVA_LIBRARY \ 3627 DROIDDOC \ 3628 COPY_HEADERS \ 3629 NATIVE_TEST \ 3630 NATIVE_BENCHMARK \ 3631 HOST_NATIVE_TEST \ 3632 FUZZ_TEST \ 3633 HOST_FUZZ_TEST \ 3634 STATIC_TEST_LIBRARY \ 3635 HOST_STATIC_TEST_LIBRARY \ 3636 NOTICE_FILE \ 3637 base_rules \ 3638 HEADER_LIBRARY \ 3639 HOST_TEST_CONFIG \ 3640 TARGET_TEST_CONFIG 3641 3642$(foreach s,$(STATS.MODULE_TYPE),$(eval STATS.MODULE_TYPE.$(s) :=)) 3643define record-module-type 3644$(strip $(if $(LOCAL_RECORDED_MODULE_TYPE),, 3645 $(if $(filter-out $(SOONG_ANDROID_MK),$(LOCAL_MODULE_MAKEFILE)), 3646 $(if $(filter $(1),$(STATS.MODULE_TYPE)), 3647 $(eval LOCAL_RECORDED_MODULE_TYPE := true) 3648 $(eval STATS.MODULE_TYPE.$(1) += 1), 3649 $(error Invalid module type: $(1)))))) 3650endef 3651 3652########################################################### 3653## Compatibility suite tools 3654########################################################### 3655 3656# Return a list of output directories for a given suite and the current LOCAL_MODULE. 3657# Can be passed a subdirectory to use for the common testcase directory. 3658define compatibility_suite_dirs 3659 $(strip \ 3660 $(if $(COMPATIBILITY_TESTCASES_OUT_$(1)), \ 3661 $(if $(COMPATIBILITY_TESTCASES_OUT_INCLUDE_MODULE_FOLDER_$(1))$(LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY),\ 3662 $(COMPATIBILITY_TESTCASES_OUT_$(1))/$(LOCAL_MODULE)$(2),\ 3663 $(COMPATIBILITY_TESTCASES_OUT_$(1)))) \ 3664 $($(my_prefix)OUT_TESTCASES)/$(LOCAL_MODULE)$(2)) 3665endef 3666 3667# For each suite: 3668# 1. Copy the files to the many suite output directories. 3669# And for test config files, we'll check the .xml is well-formed before copy. 3670# 2. Add all the files to each suite's dependent files list. 3671# 3. Do the dependency addition to my_all_targets. 3672# 4. Save the module name to COMPATIBILITY.$(suite).MODULES for each suite. 3673# 5. Collect files to dist to ALL_COMPATIBILITY_DIST_FILES. 3674# Requires for each suite: use my_compat_dist_config_$(suite) to define the test config. 3675# and use my_compat_dist_$(suite) to define the others. 3676define create-suite-dependencies 3677$(foreach suite, $(LOCAL_COMPATIBILITY_SUITE), \ 3678 $(eval $(if $(strip $(module_license_metadata)),\ 3679 $$(foreach f,$$(my_compat_dist_$(suite)),$$(call declare-copy-target-license-metadata,$$(call word-colon,2,$$(f)),$$(call word-colon,1,$$(f)))),\ 3680 $$(eval my_test_data += $$(my_compat_dist_$(suite))) \ 3681 )) \ 3682 $(eval $(if $(strip $(module_license_metadata)),\ 3683 $$(foreach f,$$(my_compat_dist_config_$(suite)),$$(call declare-copy-target-license-metadata,$$(call word-colon,2,$$(f)),$$(call word-colon,1,$$(f)))),\ 3684 $$(eval my_test_config += $$(my_compat_dist_config_$(suite))) \ 3685 )) \ 3686 $(if $(filter $(suite),$(ALL_COMPATIBILITY_SUITES)),,\ 3687 $(eval ALL_COMPATIBILITY_SUITES += $(suite)) \ 3688 $(eval COMPATIBILITY.$(suite).FILES :=) \ 3689 $(eval COMPATIBILITY.$(suite).MODULES :=) \ 3690 $(eval COMPATIBILITY.$(suite).API_MAP_FILES :=)) \ 3691 $(eval COMPATIBILITY.$(suite).FILES += \ 3692 $$(foreach f,$$(my_compat_dist_$(suite)),$$(call word-colon,2,$$(f))) \ 3693 $$(foreach f,$$(my_compat_dist_config_$(suite)),$$(call word-colon,2,$$(f))) \ 3694 $$(my_compat_dist_test_data_$(suite))) \ 3695 $(eval COMPATIBILITY.$(suite).ARCH_DIRS.$(my_register_name) := $(my_compat_module_arch_dir_$(suite).$(my_register_name))) \ 3696 $(eval COMPATIBILITY.$(suite).API_MAP_FILES += $$(my_compat_api_map_$(suite))) \ 3697 $(eval COMPATIBILITY.$(suite).SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES += $(LOCAL_SOONG_INSTALLED_COMPATIBILITY_SUPPORT_FILES)) \ 3698 $(eval ALL_COMPATIBILITY_DIST_FILES += $$(my_compat_dist_$(suite))) \ 3699 $(eval COMPATIBILITY.$(suite).MODULES += $$(my_register_name))) \ 3700$(eval $(my_all_targets) : \ 3701 $(sort $(foreach suite,$(LOCAL_COMPATIBILITY_SUITE), \ 3702 $(foreach f,$(my_compat_dist_$(suite)), $(call word-colon,2,$(f))))) \ 3703 $(call copy-many-xml-files-checked, \ 3704 $(sort $(foreach suite,$(LOCAL_COMPATIBILITY_SUITE),$(my_compat_dist_config_$(suite)))))) 3705endef 3706 3707########################################################### 3708## Path Cleaning 3709########################################################### 3710 3711# Remove "dir .." combinations (but keep ".. ..") 3712# 3713# $(1): The expanded path, where / is converted to ' ' to work with $(word) 3714define _clean-path-strip-dotdot 3715$(strip \ 3716 $(if $(word 2,$(1)), 3717 $(if $(call streq,$(word 2,$(1)),..), 3718 $(if $(call streq,$(word 1,$(1)),..), 3719 $(word 1,$(1)) $(call _clean-path-strip-dotdot,$(wordlist 2,$(words $(1)),$(1))) 3720 , 3721 $(call _clean-path-strip-dotdot,$(wordlist 3,$(words $(1)),$(1))) 3722 ) 3723 , 3724 $(word 1,$(1)) $(call _clean-path-strip-dotdot,$(wordlist 2,$(words $(1)),$(1))) 3725 ) 3726 , 3727 $(1) 3728 ) 3729) 3730endef 3731 3732# Remove any leading .. from the path (in case of /..) 3733# 3734# Should only be called if the original path started with / 3735# $(1): The expanded path, where / is converted to ' ' to work with $(word) 3736define _clean-path-strip-root-dotdots 3737$(strip $(if $(call streq,$(firstword $(1)),..), 3738 $(call _clean-path-strip-root-dotdots,$(wordlist 2,$(words $(1)),$(1))), 3739 $(1))) 3740endef 3741 3742# Call _clean-path-strip-dotdot until the path stops changing 3743# $(1): Non-empty if this path started with a / 3744# $(2): The expanded path, where / is converted to ' ' to work with $(word) 3745define _clean-path-expanded 3746$(strip \ 3747 $(eval _ep := $(call _clean-path-strip-dotdot,$(2))) 3748 $(if $(1),$(eval _ep := $(call _clean-path-strip-root-dotdots,$(_ep)))) 3749 $(if $(call streq,$(2),$(_ep)), 3750 $(_ep), 3751 $(call _clean-path-expanded,$(1),$(_ep)))) 3752endef 3753 3754# Clean the file path -- remove //, dir/.., extra . 3755# 3756# This should be the same semantics as golang's filepath.Clean 3757# 3758# $(1): The file path to clean 3759define clean-path 3760$(strip \ 3761 $(if $(call streq,$(words $(1)),1), 3762 $(eval _rooted := $(filter /%,$(1))) 3763 $(eval _expanded_path := $(filter-out .,$(subst /,$(space),$(1)))) 3764 $(eval _path := $(if $(_rooted),/)$(subst $(space),/,$(call _clean-path-expanded,$(_rooted),$(_expanded_path)))) 3765 $(if $(_path), 3766 $(_path), 3767 . 3768 ) 3769 , 3770 $(if $(call streq,$(words $(1)),0), 3771 ., 3772 $(error Call clean-path with only one path (without spaces)) 3773 ) 3774 ) 3775) 3776endef 3777 3778ifeq ($(TEST_MAKE_clean_path),true) 3779 define my_test 3780 $(if $(call streq,$(call clean-path,$(1)),$(2)),, 3781 $(eval my_failed := true) 3782 $(warning clean-path test '$(1)': expected '$(2)', got '$(call clean-path,$(1))')) 3783 endef 3784 my_failed := 3785 3786 # Already clean 3787 $(call my_test,abc,abc) 3788 $(call my_test,abc/def,abc/def) 3789 $(call my_test,a/b/c,a/b/c) 3790 $(call my_test,.,.) 3791 $(call my_test,..,..) 3792 $(call my_test,../..,../..) 3793 $(call my_test,../../abc,../../abc) 3794 $(call my_test,/abc,/abc) 3795 $(call my_test,/,/) 3796 3797 # Empty is current dir 3798 $(call my_test,,.) 3799 3800 # Remove trailing slash 3801 $(call my_test,abc/,abc) 3802 $(call my_test,abc/def/,abc/def) 3803 $(call my_test,a/b/c/,a/b/c) 3804 $(call my_test,./,.) 3805 $(call my_test,../,..) 3806 $(call my_test,../../,../..) 3807 $(call my_test,/abc/,/abc) 3808 3809 # Remove doubled slash 3810 $(call my_test,abc//def//ghi,abc/def/ghi) 3811 $(call my_test,//abc,/abc) 3812 $(call my_test,///abc,/abc) 3813 $(call my_test,//abc//,/abc) 3814 $(call my_test,abc//,abc) 3815 3816 # Remove . elements 3817 $(call my_test,abc/./def,abc/def) 3818 $(call my_test,/./abc/def,/abc/def) 3819 $(call my_test,abc/.,abc) 3820 3821 # Remove .. elements 3822 $(call my_test,abc/def/ghi/../jkl,abc/def/jkl) 3823 $(call my_test,abc/def/../ghi/../jkl,abc/jkl) 3824 $(call my_test,abc/def/..,abc) 3825 $(call my_test,abc/def/../..,.) 3826 $(call my_test,/abc/def/../..,/) 3827 $(call my_test,abc/def/../../..,..) 3828 $(call my_test,/abc/def/../../..,/) 3829 $(call my_test,abc/def/../../../ghi/jkl/../../../mno,../../mno) 3830 $(call my_test,/../abc,/abc) 3831 3832 # Combinations 3833 $(call my_test,abc/./../def,def) 3834 $(call my_test,abc//./../def,def) 3835 $(call my_test,abc/../../././../def,../../def) 3836 3837 ifdef my_failed 3838 $(error failed clean-path test) 3839 endif 3840endif 3841 3842########################################################### 3843## Given a filepath, returns nonempty if the path cannot be 3844## validated to be contained in the current directory 3845## This is, this function checks for '/' and '..' 3846## 3847## $(1): path to validate 3848define try-validate-path-is-subdir 3849$(strip \ 3850 $(if $(filter /%,$(1)), 3851 $(1) starts with a slash 3852 ) 3853 $(if $(filter ../%,$(call clean-path,$(1))), 3854 $(1) escapes its parent using '..' 3855 ) 3856 $(if $(strip $(1)), 3857 , 3858 '$(1)' is empty 3859 ) 3860) 3861endef 3862 3863define validate-path-is-subdir 3864$(if $(call try-validate-path-is-subdir,$(1)), 3865 $(call pretty-error, Illegal path: $(call try-validate-path-is-subdir,$(1))) 3866) 3867endef 3868 3869########################################################### 3870## Given a space-delimited list of filepaths, returns 3871## nonempty if any cannot be validated to be contained in 3872## the current directory 3873## 3874## $(1): path list to validate 3875define try-validate-paths-are-subdirs 3876$(strip \ 3877 $(foreach my_path,$(1),\ 3878 $(call try-validate-path-is-subdir,$(my_path))\ 3879 ) 3880) 3881endef 3882 3883define validate-paths-are-subdirs 3884$(if $(call try-validate-paths-are-subdirs,$(1)), 3885 $(call pretty-error,Illegal paths:\'$(call try-validate-paths-are-subdirs,$(1))\') 3886) 3887endef 3888 3889########################################################### 3890## Tests of try-validate-path-is-subdir 3891## and try-validate-paths-are-subdirs 3892define test-validate-paths-are-subdirs 3893$(eval my_error := $(call try-validate-path-is-subdir,/tmp)) \ 3894$(if $(call streq,$(my_error),/tmp starts with a slash), 3895, 3896 $(error incorrect error message for path /tmp. Got '$(my_error)') 3897) \ 3898$(eval my_error := $(call try-validate-path-is-subdir,../sibling)) \ 3899$(if $(call streq,$(my_error),../sibling escapes its parent using '..'), 3900, 3901 $(error incorrect error message for path ../sibling. Got '$(my_error)') 3902) \ 3903$(eval my_error := $(call try-validate-path-is-subdir,child/../../sibling)) \ 3904$(if $(call streq,$(my_error),child/../../sibling escapes its parent using '..'), 3905, 3906 $(error incorrect error message for path child/../../sibling. Got '$(my_error)') 3907) \ 3908$(eval my_error := $(call try-validate-path-is-subdir,)) \ 3909$(if $(call streq,$(my_error),'' is empty), 3910, 3911 $(error incorrect error message for empty path ''. Got '$(my_error)') 3912) \ 3913$(eval my_error := $(call try-validate-path-is-subdir,subdir/subsubdir)) \ 3914$(if $(call streq,$(my_error),), 3915, 3916 $(error rejected valid path 'subdir/subsubdir'. Got '$(my_error)') 3917) 3918 3919$(eval my_error := $(call try-validate-paths-are-subdirs,a/b /c/d e/f)) 3920$(if $(call streq,$(my_error),/c/d starts with a slash), 3921, 3922 $(error incorrect error message for path list 'a/b /c/d e/f'. Got '$(my_error)') 3923) 3924$(eval my_error := $(call try-validate-paths-are-subdirs,a/b c/d)) 3925$(if $(call streq,$(my_error),), 3926, 3927 $(error rejected valid path list 'a/b c/d'. Got '$(my_error)') 3928) 3929endef 3930# run test 3931$(strip $(call test-validate-paths-are-subdirs)) 3932 3933########################################################### 3934## Validate jacoco class filters and convert them to 3935## file arguments 3936## Jacoco class filters are comma-separated lists of class 3937## files (android.app.Application), and may have '*' as the 3938## last character to match all classes in a package 3939## including subpackages. 3940define jacoco-class-filter-to-file-args 3941$(strip $(call jacoco-validate-file-args,\ 3942 $(subst $(comma),$(space),\ 3943 $(subst .,/,\ 3944 $(strip $(1)))))) 3945endef 3946 3947define jacoco-validate-file-args 3948$(strip $(1)\ 3949 $(call validate-paths-are-subdirs,$(1)) 3950 $(foreach arg,$(1),\ 3951 $(if $(findstring ?,$(arg)),$(call pretty-error,\ 3952 '?' filters are not supported in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\ 3953 $(if $(findstring *,$(patsubst %*,%,$(arg))),$(call pretty-error,\ 3954 '*' is only supported at the end of a filter in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\ 3955 )) 3956endef 3957 3958########################################################### 3959## Other includes 3960########################################################### 3961 3962# Include any vendor specific definitions.mk file 3963-include $(TOPDIR)vendor/*/build/core/definitions.mk 3964-include $(TOPDIR)device/*/build/core/definitions.mk 3965-include $(TOPDIR)product/*/build/core/definitions.mk 3966# Also the project-specific definitions.mk file 3967-include $(TOPDIR)vendor/*/*/build/core/definitions.mk 3968-include $(TOPDIR)device/*/*/build/core/definitions.mk 3969-include $(TOPDIR)product/*/*/build/core/definitions.mk 3970 3971# broken: 3972# $(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file))) 3973 3974########################################################### 3975## Misc notes 3976########################################################### 3977 3978#DEPDIR = .deps 3979#df = $(DEPDIR)/$(*F) 3980 3981#SRCS = foo.c bar.c ... 3982 3983#%.o : %.c 3984# @$(MAKEDEPEND); \ 3985# cp $(df).d $(df).P; \ 3986# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 3987# -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \ 3988# rm -f $(df).d 3989# $(COMPILE.c) -o $@ $< 3990 3991#-include $(SRCS:%.c=$(DEPDIR)/%.P) 3992 3993 3994#%.o : %.c 3995# $(COMPILE.c) -MD -o $@ $< 3996# @cp $*.d $*.P; \ 3997# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 3998# -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \ 3999# rm -f $*.d 4000 4001 4002########################################################### 4003# Append the information to generate a RRO package for the 4004# source module. 4005# 4006# $(1): Source module name. 4007# $(2): Whether $(3) is a manifest package name or not. 4008# $(3): Manifest package name if $(2) is true. 4009# Otherwise, android manifest file path of the 4010# source module. 4011# $(4): Whether LOCAL_EXPORT_PACKAGE_RESOURCES is set or 4012# not for the source module. 4013# $(5): Resource overlay list. 4014# $(6): Target partition 4015########################################################### 4016define append_enforce_rro_sources 4017 $(eval ENFORCE_RRO_SOURCES += \ 4018 $(strip $(1))||$(strip $(2))||$(strip $(3))||$(strip $(4))||$(call normalize-path-list, $(strip $(5)))||$(strip $(6)) \ 4019 ) 4020endef 4021 4022########################################################### 4023# Generate all RRO packages for source modules stored in 4024# ENFORCE_RRO_SOURCES 4025########################################################### 4026define generate_all_enforce_rro_packages 4027$(foreach source,$(ENFORCE_RRO_SOURCES), \ 4028 $(eval _o := $(subst ||,$(space),$(source))) \ 4029 $(eval enforce_rro_source_module := $(word 1,$(_o))) \ 4030 $(eval enforce_rro_source_is_manifest_package_name := $(word 2,$(_o))) \ 4031 $(eval enforce_rro_source_manifest_package_info := $(word 3,$(_o))) \ 4032 $(eval enforce_rro_use_res_lib := $(word 4,$(_o))) \ 4033 $(eval enforce_rro_source_overlays := $(subst :, ,$(word 5,$(_o)))) \ 4034 $(eval enforce_rro_partition := $(word 6,$(_o))) \ 4035 $(eval include $(BUILD_SYSTEM)/generate_enforce_rro.mk) \ 4036 $(eval ALL_MODULES.$$(enforce_rro_source_module).REQUIRED_FROM_TARGET += $$(LOCAL_PACKAGE_NAME)) \ 4037) 4038endef 4039 4040########################################################### 4041## Find system_$(VER) in LOCAL_SDK_VERSION 4042## note: system_server_* is excluded. It's a different API surface 4043## 4044## $(1): LOCAL_SDK_VERSION 4045########################################################### 4046define has-system-sdk-version 4047$(filter-out system_server_%,$(filter system_%,$(1))) 4048endef 4049 4050########################################################### 4051## Get numerical version in LOCAL_SDK_VERSION 4052## 4053## $(1): LOCAL_SDK_VERSION 4054########################################################### 4055define get-numeric-sdk-version 4056$(filter-out current,\ 4057 $(if $(call has-system-sdk-version,$(1)),$(patsubst system_%,%,$(1)),$(1))) 4058endef 4059 4060########################################################### 4061## Verify module name meets character requirements: 4062## a-z A-Z 0-9 4063## _.+-,@~ 4064## 4065## This is a subset of bazel's target name restrictions: 4066## https://docs.bazel.build/versions/master/build-ref.html#name 4067## 4068## Kati has problems with '=': https://github.com/google/kati/issues/138 4069########################################################### 4070define verify-module-name 4071$(if $(filter-out $(LOCAL_MODULE),$(subst /,,$(LOCAL_MODULE))), \ 4072 $(call pretty-warning,Module name contains a /$(comma) use LOCAL_MODULE_STEM and LOCAL_MODULE_RELATIVE_PATH instead)) \ 4073$(if $(call _invalid-name-chars,$(LOCAL_MODULE)), \ 4074 $(call pretty-error,Invalid characters in module name: $(call _invalid-name-chars,$(LOCAL_MODULE)))) 4075endef 4076define _invalid-name-chars 4077$(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))))))))))))))))))))))))))))))))))))))))))))) 4078endef 4079.KATI_READONLY := verify-module-name _invalid-name-chars 4080 4081########################################################### 4082## Verify module stem meets character requirements: 4083## a-z A-Z 0-9 4084## _.+-,@~ 4085## 4086## This is a subset of bazel's target name restrictions: 4087## https://docs.bazel.build/versions/master/build-ref.html#name 4088## 4089## $(1): The module stem variable to check 4090########################################################### 4091define verify-module-stem 4092$(if $(filter-out $($(1)),$(subst /,,$($(1)))), \ 4093 $(call pretty-warning,Module stem \($(1)\) contains a /$(comma) use LOCAL_MODULE_RELATIVE_PATH instead)) \ 4094$(if $(call _invalid-name-chars,$($(1))), \ 4095 $(call pretty-error,Invalid characters in module stem \($(1)\): $(call _invalid-name-chars,$($(1))))) 4096endef 4097.KATI_READONLY := verify-module-stem 4098 4099$(KATI_obsolete_var \ 4100 create-empty-package \ 4101 initialize-package-file \ 4102 add-jni-shared-libs-to-package \ 4103 inherit-package,\ 4104 These functions have been removed) 4105 4106########################################################### 4107## Verify the variants of a VNDK library are identical 4108## 4109## $(1): Path to the core variant shared library file. 4110## $(2): Path to the vendor variant shared library file. 4111## $(3): TOOLS_PREFIX 4112########################################################### 4113LIBRARY_IDENTITY_CHECK_SCRIPT := build/make/tools/check_identical_lib.sh 4114define verify-vndk-libs-identical 4115@echo "Checking VNDK vendor variant: $(2)" 4116$(hide) CLANG_BIN="$(LLVM_PREBUILTS_PATH)" \ 4117 CROSS_COMPILE="$(strip $(3))" \ 4118 XZ="$(XZ)" \ 4119 $(LIBRARY_IDENTITY_CHECK_SCRIPT) $(SOONG_STRIP_PATH) $(1) $(2) 4120endef 4121 4122# Convert Soong libraries that have SDK variant 4123define use_soong_sdk_libraries 4124 $(foreach l,$(1),$(if $(filter $(l),$(SOONG_SDK_VARIANT_MODULES)),\ 4125 $(l).sdk,$(l))) 4126endef 4127