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