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