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