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