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