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