blob: de1948ff6584bb7158452d01ecd7f990ec33397d [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001#
2# Copyright (C) 2008 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17##
18## Common build system definitions. Mostly standard
19## commands for building various types of targets, which
20## are used by others to construct the final targets.
21##
22
23# These are variables we use to collect overall lists
24# of things being processed.
25
26# Full paths to all of the documentation
27ALL_DOCS:=
28
29# The short names of all of the targets in the system.
30# For each element of ALL_MODULES, two other variables
31# are defined:
32# $(ALL_MODULES.$(target)).BUILT
33# $(ALL_MODULES.$(target)).INSTALLED
34# The BUILT variable contains LOCAL_BUILT_MODULE for that
35# target, and the INSTALLED variable contains the LOCAL_INSTALLED_MODULE.
36# Some targets may have multiple files listed in the BUILT and INSTALLED
37# sub-variables.
38ALL_MODULES:=
39
40# Full paths to targets that should be added to the "make droid"
41# set of installed targets.
42ALL_DEFAULT_INSTALLED_MODULES:=
43
The Android Open Source Project88b60792009-03-03 19:28:42 -080044# The list of tags that have been defined by
45# LOCAL_MODULE_TAGS. Each word in this variable maps
46# to a corresponding ALL_MODULE_TAGS.<tagname> variable
47# that contains all of the INSTALLED_MODULEs with that tag.
48ALL_MODULE_TAGS:=
49
50# Similar to ALL_MODULE_TAGS, but contains the short names
51# of all targets for a particular tag. The top-level variable
52# won't have the list of tags; ust ALL_MODULE_TAGS to get
53# the list of all known tags. (This means that this variable
54# will always be empty; it's just here as a placeholder for
55# its sub-variables.)
56ALL_MODULE_NAME_TAGS:=
57
The Android Open Source Project88b60792009-03-03 19:28:42 -080058# Full path to all files that are made by some tool
59ALL_GENERATED_SOURCES:=
60
61# Full path to all asm, C, C++, lex and yacc generated C files.
62# These all have an order-only dependency on the copied headers
63ALL_C_CPP_ETC_OBJECTS:=
64
Iliyan Malchevb375e712011-03-08 16:19:48 -080065# The list of dynamic binaries that haven't been stripped/compressed/etc.
The Android Open Source Project88b60792009-03-03 19:28:42 -080066ALL_ORIGINAL_DYNAMIC_BINARIES:=
67
68# These files go into the SDK
69ALL_SDK_FILES:=
70
71# Files for dalvik. This is often build without building the rest of the OS.
72INTERNAL_DALVIK_MODULES:=
73
74# All findbugs xml files
75ALL_FINDBUGS_FILES:=
76
Ying Wangfd626f22011-12-12 12:57:38 -080077# GPL module license files
78ALL_GPL_MODULE_LICENSE_FILES:=
79
Ying Wang9485a572013-02-22 14:32:30 -080080# Target and host installed module's dependencies on shared libraries.
Ying Wangd6b1d612013-04-15 17:32:21 -070081# They are list of "<module_name>:<installed_file>:lib1,lib2...".
Ying Wang9485a572013-02-22 14:32:30 -080082TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES :=
Ying Wang966c1e02014-05-20 14:43:51 -070083$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_DEPENDENCIES_ON_SHARED_LIBRARIES :=
Ying Wang9485a572013-02-22 14:32:30 -080084HOST_DEPENDENCIES_ON_SHARED_LIBRARIES :=
Ying Wang966c1e02014-05-20 14:43:51 -070085$(HOST_2ND_ARCH_VAR_PREFIX)HOST_DEPENDENCIES_ON_SHARED_LIBRARIES :=
Dan Willemsen057aaea2015-08-14 12:59:50 -070086HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES :=
Dan Willemsen9ecbf832016-02-05 16:20:19 -080087$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_DEPENDENCIES_ON_SHARED_LIBRARIES :=
Ying Wang9485a572013-02-22 14:32:30 -080088
Ying Wangae25ec12012-06-19 10:40:37 -070089# Generated class file names for Android resource.
90# They are escaped and quoted so can be passed safely to a bash command.
91ANDROID_RESOURCE_GENERATED_CLASSES := 'R.class' 'R$$*.class' 'Manifest.class' 'Manifest$$*.class'
92
Dan Willemsen057aaea2015-08-14 12:59:50 -070093# Display names for various build targets
94TARGET_DISPLAY := target
95HOST_DISPLAY := host
96HOST_CROSS_DISPLAY := host cross
97
The Android Open Source Project88b60792009-03-03 19:28:42 -080098###########################################################
99## Debugging; prints a variable list to stdout
100###########################################################
101
102# $(1): variable name list, not variable values
103define print-vars
104$(foreach var,$(1), \
105 $(info $(var):) \
106 $(foreach word,$($(var)), \
107 $(info $(space)$(space)$(word)) \
108 ) \
109 )
110endef
111
112###########################################################
Joe Onorato64d85d02009-04-09 19:31:12 -0700113## Evaluates to true if the string contains the word true,
114## and empty otherwise
115## $(1): a var to test
116###########################################################
117
118define true-or-empty
119$(filter true, $(1))
120endef
121
122
123###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800124## Retrieve the directory of the current makefile
Ying Wang3bbfddd2014-03-01 15:32:04 -0800125## Must be called before including any other makefile!!
The Android Open Source Project88b60792009-03-03 19:28:42 -0800126###########################################################
127
128# Figure out where we are.
129define my-dir
Dave Bortb3926412009-05-19 16:12:22 -0700130$(strip \
Ying Wang68f1c772012-04-23 21:29:18 -0700131 $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
Ying Wang3bbfddd2014-03-01 15:32:04 -0800132 $(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
133 $(error my-dir must be called before including any other makefile.) \
Dave Bortb3926412009-05-19 16:12:22 -0700134 , \
Ying Wang68f1c772012-04-23 21:29:18 -0700135 $(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
Dave Bortb3926412009-05-19 16:12:22 -0700136 ) \
137 )
The Android Open Source Project88b60792009-03-03 19:28:42 -0800138endef
139
Colin Cross4cbf8eb2016-05-27 15:23:13 -0700140
141define _filter-soong-makefile
142$(if $(wildcard $(patsubst %/Android.mk,%/Android.bp,$(1))),\
143 $(info skipping $(1) ...)\
144 $(call _filter-soong-bpfile $(patsubst %/Android.mk,%/Android.bp,$(1))),\
145 $(1))
146endef
147
148define _filter-soong-bpfile
149$(if $(wildcard $(patsubst %/Android.bp,%/Android.soong.mk,$(1))),\
150 $(patsubst %/Android.bp,%/Android.soong.mk,$(1)))
151endef
152
The Android Open Source Project88b60792009-03-03 19:28:42 -0800153###########################################################
Colin Cross861ab992016-01-11 12:33:23 -0800154## Remove any makefiles that are being handled by soong
Colin Cross4cbf8eb2016-05-27 15:23:13 -0700155##
156## If passed an Android.mk file, returns the Android.mk file
157## if no Android.bp file exists and the same path. If an
158## Android.bp file exists, or if passed an Android.bp file,
159## returns the Android.soong.mk file at the same path if it
160## exists, or nothing if it does not.
Colin Cross861ab992016-01-11 12:33:23 -0800161###########################################################
Colin Cross861ab992016-01-11 12:33:23 -0800162define filter-soong-makefiles
Colin Cross4cbf8eb2016-05-27 15:23:13 -0700163$(sort $(foreach mk,$(1),\
164 $(if $(filter %/Android.bp,$(mk)),\
165 $(call _filter-soong-bpfile,$(mk)),\
166 $(call _filter-soong-makefile,$(mk)))))
Colin Cross861ab992016-01-11 12:33:23 -0800167endef
Colin Cross861ab992016-01-11 12:33:23 -0800168
169###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800170## Retrieve a list of all makefiles immediately below some directory
171###########################################################
172
173define all-makefiles-under
Colin Cross4cbf8eb2016-05-27 15:23:13 -0700174$(call filter-soong-makefiles,$(wildcard $(1)/*/Android.mk $(1)/*/Android.bp))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800175endef
176
177###########################################################
178## Look under a directory for makefiles that don't have parent
179## makefiles.
180###########################################################
181
182# $(1): directory to search under
183# Ignores $(1)/Android.mk
184define first-makefiles-under
Colin Cross861ab992016-01-11 12:33:23 -0800185$(call filter-soong-makefiles,\
186 $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) \
Colin Cross4cbf8eb2016-05-27 15:23:13 -0700187 --mindepth=2 $(addprefix --dir=,$(1)) Android.bp Android.mk))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800188endef
189
190###########################################################
191## Retrieve a list of all makefiles immediately below your directory
Ying Wang3bbfddd2014-03-01 15:32:04 -0800192## Must be called before including any other makefile!!
The Android Open Source Project88b60792009-03-03 19:28:42 -0800193###########################################################
194
195define all-subdir-makefiles
196$(call all-makefiles-under,$(call my-dir))
197endef
198
199###########################################################
200## Look in the named list of directories for makefiles,
201## relative to the current directory.
Ying Wang3bbfddd2014-03-01 15:32:04 -0800202## Must be called before including any other makefile!!
The Android Open Source Project88b60792009-03-03 19:28:42 -0800203###########################################################
204
205# $(1): List of directories to look for under this directory
206define all-named-subdir-makefiles
Colin Cross4cbf8eb2016-05-27 15:23:13 -0700207$(call filter-soong-makefiles,\
208 $(wildcard $(addsuffix /Android.mk, $(addprefix $(call my-dir)/,$(1))))\
209 $(wildcard $(addsuffix /Android.bp, $(addprefix $(call my-dir)/,$(1)))))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800210endef
211
212###########################################################
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700213## Find all of the directories under the named directories with
214## the specified name.
215## Meant to be used like:
216## INC_DIRS := $(call all-named-dirs-under,inc,.)
217###########################################################
218
219define all-named-dirs-under
220$(call find-subdir-files,$(2) -type d -name "$(1)")
221endef
222
223###########################################################
224## Find all the directories under the current directory that
225## haves name that match $(1)
226###########################################################
227
228define all-subdir-named-dirs
229$(call all-named-dirs-under,$(1),.)
230endef
231
232###########################################################
233## Find all of the files under the named directories with
234## the specified name.
235## Meant to be used like:
236## SRC_FILES := $(call all-named-files-under,*.h,src tests)
237###########################################################
238
239define all-named-files-under
240$(call find-files-in-subdirs,$(LOCAL_PATH),"$(1)",$(2))
241endef
242
243###########################################################
244## Find all of the files under the current directory with
245## the specified name.
246###########################################################
247
248define all-subdir-named-files
249$(call all-named-files-under,$(1),.)
250endef
251
252###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800253## Find all of the java files under the named directories.
254## Meant to be used like:
255## SRC_FILES := $(call all-java-files-under,src tests)
256###########################################################
257
258define all-java-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700259$(call all-named-files-under,*.java,$(1))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800260endef
261
262###########################################################
263## Find all of the java files from here. Meant to be used like:
264## SRC_FILES := $(call all-subdir-java-files)
265###########################################################
266
267define all-subdir-java-files
268$(call all-java-files-under,.)
269endef
270
271###########################################################
272## Find all of the c files under the named directories.
273## Meant to be used like:
274## SRC_FILES := $(call all-c-files-under,src tests)
275###########################################################
276
277define all-c-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700278$(call all-named-files-under,*.c,$(1))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800279endef
280
281###########################################################
282## Find all of the c files from here. Meant to be used like:
283## SRC_FILES := $(call all-subdir-c-files)
284###########################################################
285
286define all-subdir-c-files
287$(call all-c-files-under,.)
288endef
289
290###########################################################
Dan Willemsen379f9f92015-09-29 16:26:28 -0700291## Find all of the cpp files under the named directories.
292## LOCAL_CPP_EXTENSION is respected if set.
293## Meant to be used like:
294## SRC_FILES := $(call all-cpp-files-under,src tests)
295###########################################################
296
297define all-cpp-files-under
298$(sort $(patsubst ./%,%, \
299 $(shell cd $(LOCAL_PATH) ; \
300 find -L $(1) -name "*$(or $(LOCAL_CPP_EXTENSION),.cpp)" -and -not -name ".*") \
301 ))
302endef
303
304###########################################################
305## Find all of the cpp files from here. Meant to be used like:
306## SRC_FILES := $(call all-subdir-cpp-files)
307###########################################################
308
309define all-subdir-cpp-files
310$(call all-cpp-files-under,.)
311endef
312
313###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800314## Find all files named "I*.aidl" under the named directories,
315## which must be relative to $(LOCAL_PATH). The returned list
316## is relative to $(LOCAL_PATH).
317###########################################################
318
319define all-Iaidl-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700320$(call all-named-files-under,I*.aidl,$(1))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800321endef
322
323###########################################################
324## Find all of the "I*.aidl" files under $(LOCAL_PATH).
325###########################################################
326
327define all-subdir-Iaidl-files
328$(call all-Iaidl-files-under,.)
329endef
330
331###########################################################
Bjorn Bringerta89c9902010-02-02 17:36:20 +0000332## 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
337define all-logtags-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700338$(call all-named-files-under,*.logtags,$(1))
Bjorn Bringerta89c9902010-02-02 17:36:20 +0000339endef
340
341###########################################################
Ying Wanga5fc87a2010-11-02 18:43:16 -0700342## 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
347define all-proto-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700348$(call all-named-files-under,*.proto,$(1))
Ying Wanga5fc87a2010-11-02 18:43:16 -0700349endef
350
351###########################################################
Ying Wang0bd59a02010-07-15 17:17:52 -0700352## 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
357define all-renderscript-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700358$(call find-subdir-files,$(1) \( -name "*.rs" -or -name "*.fs" \) -and -not -name ".*")
Ying Wang0bd59a02010-07-15 17:17:52 -0700359endef
360
361###########################################################
Elliott Hughese3b044a2014-02-11 13:48:35 -0800362## 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
367define all-S-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700368$(call all-named-files-under,*.S,$(1))
Elliott Hughese3b044a2014-02-11 13:48:35 -0800369endef
370
371###########################################################
Jean-Baptiste Queru0a3cfdc2009-12-17 17:47:28 -0800372## 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
377define all-html-files-under
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700378$(call all-named-files-under,*.html,$(1))
Jean-Baptiste Queru0a3cfdc2009-12-17 17:47:28 -0800379endef
380
381###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800382## Find all of the html files from here. Meant to be used like:
383## SRC_FILES := $(call all-subdir-html-files)
384###########################################################
385
386define all-subdir-html-files
Jean-Baptiste Queru0a3cfdc2009-12-17 17:47:28 -0800387$(call all-html-files-under,.)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800388endef
389
390###########################################################
391## Find all of the files matching pattern
392## SRC_FILES := $(call find-subdir-files, <pattern>)
393###########################################################
394
395define find-subdir-files
Dan Willemsen4d66adf2015-09-22 16:54:12 -0700396$(sort $(patsubst ./%,%,$(shell cd $(LOCAL_PATH) ; find -L $(1))))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800397endef
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
407define find-subdir-subdir-files
Dan Willemsen4d66adf2015-09-22 16:54:12 -0700408$(sort $(filter-out $(patsubst %,$(1)/%,$(3)),$(patsubst ./%,%,$(shell cd \
409 $(LOCAL_PATH) ; find -L $(1) -maxdepth 1 -name $(2)))))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800410endef
411
412###########################################################
413## Find all of the files matching pattern
414## SRC_FILES := $(call all-subdir-java-files)
415###########################################################
416
417define find-subdir-assets
Dan Willemsen4d66adf2015-09-22 16:54:12 -0700418$(sort $(if $(1),$(patsubst ./%,%, \
Shinichiro Hamajid8f9f7d2016-05-12 18:15:28 +0900419 $(shell if [ -d $(1) ] ; then cd $(1) ; find -L ./ -not -name '.*' -and -type f ; fi)), \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800420 $(warning Empty argument supplied to find-subdir-assets) \
Dan Willemsen4d66adf2015-09-22 16:54:12 -0700421))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800422endef
423
424###########################################################
425## Find various file types in a list of directories relative to $(LOCAL_PATH)
426###########################################################
427
428define find-other-java-files
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700429$(call all-java-files-under,$(1))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800430endef
431
432define find-other-html-files
Dan Willemsen92f5fcc2015-10-12 15:26:52 -0700433$(call all-html-files-under,$(1))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800434endef
435
436###########################################################
Ying Wang85898bc2013-12-04 16:04:49 -0800437# 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
445define find-files-in-subdirs
Dan Willemsen4d66adf2015-09-22 16:54:12 -0700446$(sort $(patsubst ./%,%, \
Ying Wang85898bc2013-12-04 16:04:49 -0800447 $(shell cd $(1) ; \
448 find -L $(3) -name $(2) -and -not -name ".*") \
Dan Willemsen4d66adf2015-09-22 16:54:12 -0700449 ))
Ying Wang85898bc2013-12-04 16:04:49 -0800450endef
451
452###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800453## 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
460define find-parent-file
461$(strip \
Dan Willemsen7c3e3f82015-09-29 16:30:21 -0700462 $(eval _fpf := $(sort $(wildcard $(foreach f, $(2), $(strip $(1))/$(f))))) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800463 $(if $(_fpf),$(_fpf), \
464 $(if $(filter-out ./ .,$(1)), \
465 $(call find-parent-file,$(patsubst %/,%,$(dir $(1))),$(2)) \
466 ) \
467 ) \
468)
469endef
470
471###########################################################
472## Function we can evaluate to introduce a dynamic dependency
473###########################################################
474
475define add-dependency
476$(1): $(2)
477endef
478
479###########################################################
Yohann Rousselb4c49cb2014-09-08 14:45:14 +0200480## Reverse order of a list
481###########################################################
482
483define reverse-list
484$(if $(1),$(call reverse-list,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1))
485endef
486
487###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800488## The intermediates directory. Where object files go for
489## a given target. We could technically get away without
490## the "_intermediates" suffix on the directory, but it's
491## nice to be able to grep for that string to find out if
492## anyone's abusing the system.
493###########################################################
494
495# $(1): target class, like "APPS"
496# $(2): target name, like "NotePad"
497# $(3): if non-empty, this is a HOST target.
498# $(4): if non-empty, force the intermediates to be COMMON
Dan Willemsen057aaea2015-08-14 12:59:50 -0700499# $(5): if non-empty, force the intermediates to be for the 2nd arch
500# $(6): if non-empty, force the intermediates to be for the host cross os
The Android Open Source Project88b60792009-03-03 19:28:42 -0800501define intermediates-dir-for
502$(strip \
503 $(eval _idfClass := $(strip $(1))) \
504 $(if $(_idfClass),, \
505 $(error $(LOCAL_PATH): Class not defined in call to intermediates-dir-for)) \
506 $(eval _idfName := $(strip $(2))) \
507 $(if $(_idfName),, \
508 $(error $(LOCAL_PATH): Name not defined in call to intermediates-dir-for)) \
Dan Willemsen057aaea2015-08-14 12:59:50 -0700509 $(eval _idfPrefix := $(if $(strip $(3)),$(if $(strip $(6)),HOST_CROSS,HOST),TARGET)) \
Colin Crossae2986e2014-06-17 21:35:44 -0700510 $(eval _idf2ndArchPrefix := $(if $(strip $(5)),$(TARGET_2ND_ARCH_VAR_PREFIX))) \
Ying Wanga83940f2010-09-24 18:09:04 -0700511 $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800512 $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_INTERMEDIATES)) \
Dan Willemsenc6e194f2016-02-13 00:19:40 -0800513 ,$(if $(filter $(_idfClass),$(PER_ARCH_MODULE_CLASSES)),\
Colin Cross02e31d22014-01-24 13:38:08 -0800514 $(eval _idfIntBase := $($(_idf2ndArchPrefix)$(_idfPrefix)_OUT_INTERMEDIATES)) \
515 ,$(eval _idfIntBase := $($(_idfPrefix)_OUT_INTERMEDIATES)) \
516 ) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800517 ) \
518 $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \
519)
520endef
521
522# Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE
523# to determine the intermediates directory.
524#
525# $(1): if non-empty, force the intermediates to be COMMON
Ying Wang61d499b2014-01-15 16:02:16 -0800526# $(2): if non-empty, force the intermediates to be for the 2nd arch
Dan Willemsen057aaea2015-08-14 12:59:50 -0700527# $(3): if non-empty, force the intermediates to be for the host cross os
The Android Open Source Project88b60792009-03-03 19:28:42 -0800528define local-intermediates-dir
529$(strip \
530 $(if $(strip $(LOCAL_MODULE_CLASS)),, \
531 $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-intermediates-dir)) \
532 $(if $(strip $(LOCAL_MODULE)),, \
533 $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-intermediates-dir)) \
Dan Willemsen057aaea2015-08-14 12:59:50 -0700534 $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(LOCAL_IS_HOST_MODULE),$(1),$(2),$(3)) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800535)
536endef
537
538###########################################################
Colin Crossd8262642014-01-24 23:17:21 -0800539## The generated sources directory. Placing generated
540## source files directly in the intermediates directory
541## causes problems for multiarch builds, where there are
542## two intermediates directories for a single target. Put
543## them in a separate directory, and they will be copied to
544## each intermediates directory automatically.
545###########################################################
546
547# $(1): target class, like "APPS"
548# $(2): target name, like "NotePad"
549# $(3): if non-empty, this is a HOST target.
550# $(4): if non-empty, force the generated sources to be COMMON
551define generated-sources-dir-for
552$(strip \
553 $(eval _idfClass := $(strip $(1))) \
554 $(if $(_idfClass),, \
555 $(error $(LOCAL_PATH): Class not defined in call to generated-sources-dir-for)) \
556 $(eval _idfName := $(strip $(2))) \
557 $(if $(_idfName),, \
558 $(error $(LOCAL_PATH): Name not defined in call to generated-sources-dir-for)) \
559 $(eval _idfPrefix := $(if $(strip $(3)),HOST,TARGET)) \
560 $(if $(filter $(_idfPrefix)-$(_idfClass),$(COMMON_MODULE_CLASSES))$(4), \
Paul Duffin699a3222015-11-25 13:14:23 +0000561 $(eval _idfIntBase := $($(_idfPrefix)_OUT_COMMON_GEN)) \
Colin Crossd8262642014-01-24 23:17:21 -0800562 , \
563 $(eval _idfIntBase := $($(_idfPrefix)_OUT_GEN)) \
564 ) \
565 $(_idfIntBase)/$(_idfClass)/$(_idfName)_intermediates \
566)
567endef
568
569# Uses LOCAL_MODULE_CLASS, LOCAL_MODULE, and LOCAL_IS_HOST_MODULE
570# to determine the generated sources directory.
571#
572# $(1): if non-empty, force the intermediates to be COMMON
573define local-generated-sources-dir
574$(strip \
575 $(if $(strip $(LOCAL_MODULE_CLASS)),, \
576 $(error $(LOCAL_PATH): LOCAL_MODULE_CLASS not defined before call to local-generated-sources-dir)) \
577 $(if $(strip $(LOCAL_MODULE)),, \
578 $(error $(LOCAL_PATH): LOCAL_MODULE not defined before call to local-generated-sources-dir)) \
579 $(call generated-sources-dir-for,$(LOCAL_MODULE_CLASS),$(LOCAL_MODULE),$(LOCAL_IS_HOST_MODULE),$(1)) \
580)
581endef
582
583###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800584## Convert "path/to/libXXX.so" to "-lXXX".
585## Any "path/to/libXXX.a" elements pass through unchanged.
586###########################################################
587
588define normalize-libraries
589$(foreach so,$(filter %.so,$(1)),-l$(patsubst lib%.so,%,$(notdir $(so))))\
590$(filter-out %.so,$(1))
591endef
592
593# TODO: change users to call the common version.
594define normalize-host-libraries
595$(call normalize-libraries,$(1))
596endef
597
598define normalize-target-libraries
599$(call normalize-libraries,$(1))
600endef
601
602###########################################################
603## Convert a list of short module names (e.g., "framework", "Browser")
604## into the list of files that are built for those modules.
605## NOTE: this won't return reliable results until after all
606## sub-makefiles have been included.
607## $(1): target list
608###########################################################
609
610define module-built-files
611$(foreach module,$(1),$(ALL_MODULES.$(module).BUILT))
612endef
613
614###########################################################
615## Convert a list of short modules names (e.g., "framework", "Browser")
616## into the list of files that are installed for those modules.
617## NOTE: this won't return reliable results until after all
618## sub-makefiles have been included.
619## $(1): target list
620###########################################################
621
622define module-installed-files
623$(foreach module,$(1),$(ALL_MODULES.$(module).INSTALLED))
624endef
625
626###########################################################
Joe Onorato64d85d02009-04-09 19:31:12 -0700627## Convert a list of short modules names (e.g., "framework", "Browser")
628## into the list of files that should be used when linking
629## against that module as a public API.
630## TODO: Allow this for more than JAVA_LIBRARIES modules
631## NOTE: this won't return reliable results until after all
632## sub-makefiles have been included.
633## $(1): target list
634###########################################################
635
636define module-stubs-files
637$(foreach module,$(1),$(ALL_MODULES.$(module).STUBS))
638endef
639
640###########################################################
641## Evaluates to the timestamp file for a doc module, which
642## is the dependency that should be used.
643## $(1): doc module
644###########################################################
645
646define doc-timestamp-for
647$(OUT_DOCS)/$(strip $(1))-timestamp
648endef
649
650
651###########################################################
Ying Wang912f8282010-09-28 17:27:56 -0700652## Convert "core ext framework" to "out/.../javalib.jar ..."
The Android Open Source Project88b60792009-03-03 19:28:42 -0800653## $(1): library list
654## $(2): Non-empty if IS_HOST_MODULE
655###########################################################
656
657# $(1): library name
658# $(2): Non-empty if IS_HOST_MODULE
659define _java-lib-dir
660$(call intermediates-dir-for, \
Ying Wang912f8282010-09-28 17:27:56 -0700661 JAVA_LIBRARIES,$(1),$(2),COMMON)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800662endef
663
664# $(1): library name
665# $(2): Non-empty if IS_HOST_MODULE
666define _java-lib-full-classes.jar
Ying Wangea04f822016-03-02 17:25:01 -0800667$(call _java-lib-dir,$(1),$(2))/$(if $(2),javalib,classes)$(COMMON_JAVA_PACKAGE_SUFFIX)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800668endef
669
Ying Wangea04f822016-03-02 17:25:01 -0800670# Get the jar files (you can pass to "javac -classpath") of static or shared
671# Java libraries that you want to link against.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800672# $(1): library name list
673# $(2): Non-empty if IS_HOST_MODULE
674define java-lib-files
675$(foreach lib,$(1),$(call _java-lib-full-classes.jar,$(lib),$(2)))
676endef
677
Ying Wangea04f822016-03-02 17:25:01 -0800678# Get the dependency files (you can put on the right side of "|" of a build rule)
679# of the Java libraries.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800680# $(1): library name list
681# $(2): Non-empty if IS_HOST_MODULE
Ying Wangea04f822016-03-02 17:25:01 -0800682# Historically for target Java libraries we used a different file (javalib.jar)
683# as the dependency.
684# Now we can use classes.jar as dependency, so java-lib-deps is the same
685# as java-lib-files.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800686define java-lib-deps
Ying Wangea04f822016-03-02 17:25:01 -0800687$(call java-lib-files,$(1),$(2))
688endef
689
690# Get the jar files (you can pass to "javac -classpath") of host dalvik Java libraries.
691# You can also use them as dependency files.
692# A host dalvik Java library is different from a host Java library in that
693# the java lib file is classes.jar, not javalib.jar.
694# $(1): library name list
695define host-dex-java-lib-files
696$(foreach lib,$(1),$(call _java-lib-dir,$(lib),true)/classes.jar)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800697endef
698
699###########################################################
Yohann Rousselb4c49cb2014-09-08 14:45:14 +0200700## Convert "core ext framework" to "out/.../classes.jack ..."
701## $(1): library list
702## $(2): Non-empty if IS_HOST_MODULE
703###########################################################
704
705# $(1): library name
706# $(2): Non-empty if IS_HOST_MODULE
707define _jack-lib-full-classes
708$(call _java-lib-dir,$(1),$(2))/classes.jack
709endef
710
711# $(1): library name list
712# $(2): Non-empty if IS_HOST_MODULE
713define jack-lib-files
714$(foreach lib,$(1),$(call _jack-lib-full-classes,$(lib),$(2)))
715endef
716
Yohann Rousselb4c49cb2014-09-08 14:45:14 +0200717###########################################################
Joe Onorato8dc8faa2010-09-14 13:09:48 -0400718## Run rot13 on a string
719## $(1): the string. Must be one line.
720###########################################################
721define rot13
722$(shell echo $(1) | tr 'a-zA-Z' 'n-za-mN-ZA-M')
723endef
724
725
726###########################################################
727## Returns true if $(1) and $(2) are equal. Returns
728## the empty string if they are not equal.
729###########################################################
730define streq
731$(strip $(if $(strip $(1)),\
732 $(if $(strip $(2)),\
733 $(if $(filter-out __,_$(subst $(strip $(1)),,$(strip $(2)))$(subst $(strip $(2)),,$(strip $(1)))_),,true), \
734 ),\
735 $(if $(strip $(2)),\
736 ,\
737 true)\
738 ))
739endef
740
741###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800742## Convert "a b c" into "a:b:c"
743###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800744define normalize-path-list
745$(subst $(space),:,$(strip $(1)))
746endef
747
748###########################################################
Joe Onorato64d85d02009-04-09 19:31:12 -0700749## Read the word out of a colon-separated list of words.
750## This has the same behavior as the built-in function
751## $(word n,str).
752##
753## The individual words may not contain spaces.
754##
755## $(1): 1 based index
756## $(2): value of the form a:b:c...
757###########################################################
758
759define word-colon
760$(word $(1),$(subst :,$(space),$(2)))
761endef
762
763###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800764## Convert "a=b c= d e = f" into "a=b c=d e=f"
765##
766## $(1): list to collapse
767## $(2): if set, separator word; usually "=", ":", or ":="
768## Defaults to "=" if not set.
769###########################################################
770
771define collapse-pairs
772$(eval _cpSEP := $(strip $(if $(2),$(2),=)))\
773$(subst $(space)$(_cpSEP)$(space),$(_cpSEP),$(strip \
774 $(subst $(_cpSEP), $(_cpSEP) ,$(1))))
775endef
776
The Android Open Source Project88b60792009-03-03 19:28:42 -0800777###########################################################
Ying Wang7e8d4422011-06-17 17:05:35 -0700778## Given a list of pairs, if multiple pairs have the same
779## first components, keep only the first pair.
780##
781## $(1): list of pairs
782## $(2): the separator word, such as ":", "=", etc.
783define uniq-pairs-by-first-component
784$(eval _upbfc_fc_set :=)\
785$(strip $(foreach w,$(1), $(eval _first := $(word 1,$(subst $(2),$(space),$(w))))\
786 $(if $(filter $(_upbfc_fc_set),$(_first)),,$(w)\
787 $(eval _upbfc_fc_set += $(_first)))))\
788$(eval _upbfc_fc_set :=)\
789$(eval _first:=)
790endef
791
792###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800793## MODULE_TAG set operations
794###########################################################
795
796# Given a list of tags, return the targets that specify
797# any of those tags.
798# $(1): tag list
799define modules-for-tag-list
Ying Wang634f7992014-11-18 12:41:53 -0800800$(sort $(foreach tag,$(1),$(foreach m,$(ALL_MODULE_NAME_TAGS.$(tag)),$(ALL_MODULES.$(m).INSTALLED))))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800801endef
802
803# Same as modules-for-tag-list, but operates on
804# ALL_MODULE_NAME_TAGS.
805# $(1): tag list
806define module-names-for-tag-list
807$(sort $(foreach tag,$(1),$(ALL_MODULE_NAME_TAGS.$(tag))))
808endef
809
810# Given an accept and reject list, find the matching
811# set of targets. If a target has multiple tags and
812# any of them are rejected, the target is rejected.
813# Reject overrides accept.
814# $(1): list of tags to accept
815# $(2): list of tags to reject
816#TODO(dbort): do $(if $(strip $(1)),$(1),$(ALL_MODULE_TAGS))
Jean-Baptiste Queru75127b72010-01-07 11:44:22 -0800817#TODO(jbq): as of 20100106 nobody uses the second parameter
The Android Open Source Project88b60792009-03-03 19:28:42 -0800818define get-tagged-modules
819$(filter-out \
820 $(call modules-for-tag-list,$(2)), \
821 $(call modules-for-tag-list,$(1)))
822endef
823
Joe Onorato64d85d02009-04-09 19:31:12 -0700824###########################################################
825## Append a leaf to a base path. Properly deals with
826## base paths ending in /.
827##
828## $(1): base path
829## $(2): leaf path
830###########################################################
831
832define append-path
833$(subst //,/,$(1)/$(2))
834endef
835
The Android Open Source Project88b60792009-03-03 19:28:42 -0800836
837###########################################################
Dan Willemsendd5a5d32016-06-15 19:20:57 -0700838## Color-coded warnings and errors in build rules
839##
840## $(1): message to print
841###########################################################
842define echo-warning
843echo -e "\e[1;35mwarning:\e[0m \e[1m" $(1) "\e[0m\n"
844endef
845
846define echo-error
847echo -e "\e[1;31merror:\e[0m \e[1m" $(1) "\e[0m\n"
848endef
849
850
851###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800852## Package filtering
853###########################################################
854
855# Given a list of installed modules (short or long names)
856# return a list of the packages (yes, .apk packages, not
857# modules in general) that are overridden by this list and,
858# therefore, should not be installed.
859# $(1): mixed list of installed modules
860# TODO: This is fragile; find a reliable way to get this information.
861define _get-package-overrides
862 $(eval ### Discard any words containing slashes, unless they end in .apk, \
863 ### in which case trim off the directory component and the suffix. \
864 ### If there are no slashes, keep the entire word.)
865 $(eval _gpo_names := $(subst /,@@@ @@@,$(1)))
866 $(eval _gpo_names := \
867 $(filter %.apk,$(_gpo_names)) \
868 $(filter-out %@@@ @@@%,$(_gpo_names)))
869 $(eval _gpo_names := $(patsubst %.apk,%,$(_gpo_names)))
870 $(eval _gpo_names := $(patsubst @@@%,%,$(_gpo_names)))
871
872 $(eval ### Remove any remaining words that contain dots.)
873 $(eval _gpo_names := $(subst .,@@@ @@@,$(_gpo_names)))
874 $(eval _gpo_names := $(filter-out %@@@ @@@%,$(_gpo_names)))
875
876 $(eval ### Now we have a list of any words that could possibly refer to \
877 ### packages, although there may be words that do not. Only \
878 ### real packages will be present under PACKAGES.*, though.)
879 $(foreach _gpo_name,$(_gpo_names),$(PACKAGES.$(_gpo_name).OVERRIDES))
880endef
881
882define get-package-overrides
Conley Owensd7a1a9b2011-12-22 09:46:19 -0800883$(sort $(strip $(call _get-package-overrides,$(1))))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800884endef
885
886###########################################################
887## Output the command lines, or not
888###########################################################
889
890ifeq ($(strip $(SHOW_COMMANDS)),)
891define pretty
892@echo $1
893endef
The Android Open Source Project88b60792009-03-03 19:28:42 -0800894else
895define pretty
896endef
The Android Open Source Project88b60792009-03-03 19:28:42 -0800897endif
898
899###########################################################
Shinichiro Hamaji2e45fd02016-01-25 18:59:43 +0900900## Commands for munging the dependency files the compiler generates
The Android Open Source Project88b60792009-03-03 19:28:42 -0800901###########################################################
Ying Wangc23f4ef2012-09-07 17:04:06 -0700902# $(1): the input .d file
903# $(2): the output .P file
904define transform-d-to-p-args
905$(hide) cp $(1) $(2); \
906 sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
907 -e '/^$$/ d' -e 's/$$/ :/' < $(1) >> $(2); \
908 rm -f $(1)
909endef
The Android Open Source Project88b60792009-03-03 19:28:42 -0800910
911define transform-d-to-p
Ying Wangc23f4ef2012-09-07 17:04:06 -0700912$(call transform-d-to-p-args,$(@:%.o=%.d),$(@:%.o=%.P))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800913endef
914
915###########################################################
Shinichiro Hamaji2e45fd02016-01-25 18:59:43 +0900916## Commands for including the dependency files the compiler generates
917###########################################################
918# $(1): the .P file
919# $(2): the main build target
Shinichiro Hamaji2e45fd02016-01-25 18:59:43 +0900920define include-depfile
921$(eval $(2) : .KATI_DEPFILE := $1)
922endef
Shinichiro Hamaji2e45fd02016-01-25 18:59:43 +0900923
Shinichiro Hamaji4037c422016-03-03 18:12:52 +0900924# $(1): object files
925define include-depfiles-for-objs
926$(foreach obj, $(1), $(call include-depfile, $(obj:%.o=%.P), $(obj)))
927endef
928
Shinichiro Hamaji2e45fd02016-01-25 18:59:43 +0900929###########################################################
Dan Willemsen3bb168f2016-01-19 20:07:08 -0800930## Track source files compiled to objects
931###########################################################
932# $(1): list of sources
933# $(2): list of matching objects
934define track-src-file-obj
935$(eval $(call _track-src-file-obj,$(1)))
936endef
937define _track-src-file-obj
938i := w
939$(foreach s,$(1),
940my_tracked_src_files += $(s)
941my_src_file_obj_$(s) := $$(word $$(words $$(i)),$$(2))
942i += w)
943endef
944
945# $(1): list of sources
946# $(2): list of matching generated sources
947define track-src-file-gen
948$(eval $(call _track-src-file-gen,$(2)))
949endef
950define _track-src-file-gen
951i := w
952$(foreach s,$(1),
953my_tracked_gen_files += $(s)
954my_src_file_gen_$(s) := $$(word $$(words $$(i)),$$(1))
955i += w)
956endef
957
958# $(1): list of generated sources
959# $(2): list of matching objects
960define track-gen-file-obj
961$(call track-src-file-obj,$(foreach f,$(1),\
962 $(or $(my_src_file_gen_$(f)),$(f))),$(2))
963endef
964
965###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800966## Commands for running lex
967###########################################################
968
Ying Wang64088f22016-01-11 16:28:45 -0800969define transform-l-to-c-or-cpp
The Android Open Source Project88b60792009-03-03 19:28:42 -0800970@echo "Lex: $(PRIVATE_MODULE) <= $<"
Colin Crossb6da5892015-07-16 17:14:27 -0700971@mkdir -p $(dir $@)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800972$(hide) $(LEX) -o$@ $<
973endef
974
975###########################################################
976## Commands for running yacc
977##
The Android Open Source Project88b60792009-03-03 19:28:42 -0800978###########################################################
979
Ying Wang64088f22016-01-11 16:28:45 -0800980define transform-y-to-c-or-cpp
The Android Open Source Project88b60792009-03-03 19:28:42 -0800981@echo "Yacc: $(PRIVATE_MODULE) <= $<"
Colin Crossb6da5892015-07-16 17:14:27 -0700982@mkdir -p $(dir $@)
Ying Wang64088f22016-01-11 16:28:45 -0800983$(YACC) $(PRIVATE_YACCFLAGS) \
984 --defines=$(basename $@).h \
985 -o $@ $<
The Android Open Source Project88b60792009-03-03 19:28:42 -0800986endef
987
Ying Wang0bd59a02010-07-15 17:17:52 -0700988###########################################################
Tim Murraya7aa8002012-10-29 16:06:00 -0700989## Commands to compile RenderScript to Java
Ying Wang0bd59a02010-07-15 17:17:52 -0700990###########################################################
Ying Wang0bd59a02010-07-15 17:17:52 -0700991
Shinichiro Hamaji52a1d6c2016-02-01 17:59:01 +0900992## Merge multiple .d files generated by llvm-rs-cc. This is necessary
993## because ninja can handle only a single depfile per build target.
994## .d files generated by llvm-rs-cc define .stamp, .bc, and optionally
995## .java as build targets. However, there's no way to let ninja know
996## dependencies to .bc files and .java files, so we give up build
997## targets for them. As we write the .stamp file as the target by
998## ourselves, the awk script removes the first lines before the colon
999## and append a backslash to the last line to concatenate contents of
1000## multiple files.
1001# $(1): .d files to be merged
1002# $(2): merged .d file
1003define _merge-renderscript-d
1004$(hide) echo '$@: $(backslash)' > $2
1005$(foreach d,$1, \
1006 $(hide) awk 'start { sub(/( \\)?$$/, " \\"); print } /:/ { start=1 }' < $d >> $2$(newline))
1007$(hide) echo >> $2
1008endef
1009
Ying Wang0bd59a02010-07-15 17:17:52 -07001010define transform-renderscripts-to-java-and-bc
1011@echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
1012$(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
1013$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/res/raw
1014$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/src
Ying Wang7d83ef82011-05-25 17:16:22 -07001015$(hide) $(PRIVATE_RS_CC) \
Ying Wangebfddaa2010-07-30 18:37:29 -07001016 -o $(PRIVATE_RS_OUTPUT_DIR)/res/raw \
1017 -p $(PRIVATE_RS_OUTPUT_DIR)/src \
Ying Wang24e1c012010-10-07 18:57:57 -07001018 -d $(PRIVATE_RS_OUTPUT_DIR) \
1019 -a $@ -MD \
Stephen Hinesc963eae2011-08-10 13:53:05 -07001020 $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \
Stephen Hines914f7a22011-12-06 18:43:24 -08001021 $(PRIVATE_RS_FLAGS) \
Ying Wang51280272010-09-01 13:28:52 -07001022 $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \
Ying Wangebfddaa2010-07-30 18:37:29 -07001023 $(PRIVATE_RS_SOURCE_FILES)
Shinichiro Hamaji52a1d6c2016-02-01 17:59:01 +09001024$(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d)
1025$(call transform-d-to-p-args,$@.d,$@.P)
Ying Wang0bd59a02010-07-15 17:17:52 -07001026$(hide) mkdir -p $(dir $@)
1027$(hide) touch $@
1028endef
1029
Stephen Hinese719f282012-11-28 16:52:41 -08001030define transform-bc-to-so
Stephen Hines9ac9b532013-02-27 00:51:08 -08001031@echo "Renderscript compatibility: $(notdir $@) <= $(notdir $<)"
Stephen Hinese719f282012-11-28 16:52:41 -08001032$(hide) mkdir -p $(dir $@)
Stephen Hinesf6925132012-12-17 14:23:14 -08001033$(hide) $(BCC_COMPAT) -O3 -o $(dir $@)/$(notdir $(<:.bc=.o)) -fPIC -shared \
Stephen Hines52626d22014-09-02 19:09:35 -07001034 -rt-path $(RS_PREBUILT_CLCORE) -mtriple $(RS_COMPAT_TRIPLE) $<
Stephen Hines7d6ec712012-12-13 19:24:50 -08001035$(hide) $(PRIVATE_CXX) -shared -Wl,-soname,$(notdir $@) -nostdlib \
Stephen Hinesf6925132012-12-17 14:23:14 -08001036 -Wl,-rpath,\$$ORIGIN/../lib \
Stephen Hines9541f582013-01-18 16:27:23 -08001037 $(dir $@)/$(notdir $(<:.bc=.o)) \
Tim Murray1a6f09a2013-03-05 11:07:15 -08001038 $(RS_PREBUILT_COMPILER_RT) \
Miao Wange23e8082014-11-15 14:25:33 -08001039 -o $@ $(TARGET_GLOBAL_LDFLAGS) -Wl,--hash-style=sysv -L prebuilts/gcc/ \
Ying Wangbfc43692015-03-05 11:29:30 -08001040 $(RS_PREBUILT_LIBPATH) -L $(TARGET_OUT_INTERMEDIATE_LIBRARIES) \
Stephen Hines8db4cce2013-03-27 16:51:38 -07001041 -lRSSupport -lm -lc
Stephen Hinese719f282012-11-28 16:52:41 -08001042endef
1043
Tim Murraya7aa8002012-10-29 16:06:00 -07001044###########################################################
1045## Commands to compile RenderScript to C++
1046###########################################################
1047
1048define transform-renderscripts-to-cpp-and-bc
1049@echo "RenderScript: $(PRIVATE_MODULE) <= $(PRIVATE_RS_SOURCE_FILES)"
1050$(hide) rm -rf $(PRIVATE_RS_OUTPUT_DIR)
1051$(hide) mkdir -p $(PRIVATE_RS_OUTPUT_DIR)/
1052$(hide) $(PRIVATE_RS_CC) \
1053 -o $(PRIVATE_RS_OUTPUT_DIR)/ \
1054 -d $(PRIVATE_RS_OUTPUT_DIR) \
1055 -a $@ -MD \
1056 -reflect-c++ \
Noah Presler4796a8c2015-08-13 17:04:10 -07001057 $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \
Tim Murraya7aa8002012-10-29 16:06:00 -07001058 $(PRIVATE_RS_FLAGS) \
Ying Wang81ab8332014-05-28 16:17:09 -07001059 $(addprefix -I , $(PRIVATE_RS_INCLUDES)) \
Tim Murraya7aa8002012-10-29 16:06:00 -07001060 $(PRIVATE_RS_SOURCE_FILES)
Shinichiro Hamaji2e45fd02016-01-25 18:59:43 +09001061$(call _merge-renderscript-d,$(PRIVATE_DEP_FILES),$@.d)
1062$(call transform-d-to-p-args,$@.d,$@.P)
Tim Murraya7aa8002012-10-29 16:06:00 -07001063$(hide) mkdir -p $(dir $@)
1064$(hide) touch $@
1065endef
1066
The Android Open Source Project88b60792009-03-03 19:28:42 -08001067
1068###########################################################
1069## Commands for running aidl
1070###########################################################
1071
1072define transform-aidl-to-java
1073@mkdir -p $(dir $@)
1074@echo "Aidl: $(PRIVATE_MODULE) <= $<"
1075$(hide) $(AIDL) -d$(patsubst %.java,%.P,$@) $(PRIVATE_AIDL_FLAGS) $< $@
1076endef
1077#$(AIDL) $(PRIVATE_AIDL_FLAGS) $< - | indent -nut -br -npcs -l1000 > $@
1078
Christopher Wiley2df75d12015-10-14 17:27:24 -07001079define transform-aidl-to-cpp
1080@mkdir -p $(dir $@)
1081@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR)
1082@echo "Generating C++ from AIDL: $(PRIVATE_MODULE) <= $<"
Christopher Wiley087f3272016-01-19 09:26:10 -08001083$(hide) $(AIDL_CPP) -d$(basename $@).aidl.P $(PRIVATE_AIDL_FLAGS) \
Christopher Wiley2df75d12015-10-14 17:27:24 -07001084 $< $(PRIVATE_HEADER_OUTPUT_DIR) $@
1085endef
1086
Christopher Wiley257796c2016-01-19 08:58:35 -08001087## Given a .aidl file path generate the rule to compile it a .cpp file.
1088# $(1): a .aidl source file
1089# $(2): a directory to place the generated .cpp files in
1090# $(3): name of a variable to add the path to the generated source file to
1091#
1092# You must call this with $(eval).
1093define define-aidl-cpp-rule
1094define-aidl-cpp-rule-src := $(patsubst %.aidl,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1))))
1095$$(define-aidl-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(AIDL_CPP)
1096 $$(transform-aidl-to-cpp)
1097$(3) += $$(define-aidl-cpp-rule-src)
1098endef
The Android Open Source Project88b60792009-03-03 19:28:42 -08001099
Doug Zongker9bd49622009-11-30 14:28:59 -08001100###########################################################
1101## Commands for running java-event-log-tags.py
1102###########################################################
1103
1104define transform-logtags-to-java
1105@mkdir -p $(dir $@)
1106@echo "logtags: $@ <= $<"
Shinichiro Hamajid3ce14c2016-03-29 03:29:21 +09001107$(hide) $(JAVATAGS) -o $@ $< $(PRIVATE_MERGED_TAG)
Doug Zongker9bd49622009-11-30 14:28:59 -08001108endef
1109
The Android Open Source Project88b60792009-03-03 19:28:42 -08001110
1111###########################################################
Ying Wanga5fc87a2010-11-02 18:43:16 -07001112## Commands for running protoc to compile .proto into .java
1113###########################################################
1114
1115define transform-proto-to-java
1116@mkdir -p $(dir $@)
1117@echo "Protoc: $@ <= $(PRIVATE_PROTO_SRC_FILES)"
1118@rm -rf $(PRIVATE_PROTO_JAVA_OUTPUT_DIR)
1119@mkdir -p $(PRIVATE_PROTO_JAVA_OUTPUT_DIR)
Ben Murdochfc2bad52013-07-25 11:44:53 +01001120$(hide) for f in $(PRIVATE_PROTO_SRC_FILES); do \
1121 $(PROTOC) \
Ulas Kirazci28b46fc2013-07-24 14:32:14 -07001122 $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \
Ulas Kirazci6e485b52013-07-25 12:28:19 -07001123 $(PRIVATE_PROTO_JAVA_OUTPUT_OPTION)="$(PRIVATE_PROTO_JAVA_OUTPUT_PARAMS):$(PRIVATE_PROTO_JAVA_OUTPUT_DIR)" \
Ben Murdochfc2bad52013-07-25 11:44:53 +01001124 $(PRIVATE_PROTOC_FLAGS) \
1125 $$f || exit 33; \
1126 done
Ying Wanga5fc87a2010-11-02 18:43:16 -07001127$(hide) touch $@
1128endef
1129
1130######################################################################
Ying Wangfaeb6932015-04-07 11:59:34 -07001131## Commands for running protoc to compile .proto into .pb.cc (or.pb.c) and .pb.h
Ying Wanga5fc87a2010-11-02 18:43:16 -07001132######################################################################
1133define transform-proto-to-cc
Ying Wanga5fc87a2010-11-02 18:43:16 -07001134@echo "Protoc: $@ <= $<"
Colin Crossb6da5892015-07-16 17:14:27 -07001135@mkdir -p $(dir $@)
Ying Wanga5fc87a2010-11-02 18:43:16 -07001136$(hide) $(PROTOC) \
1137 $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \
Ying Wang33c0d952010-11-05 11:30:58 -07001138 $(PRIVATE_PROTOC_FLAGS) \
Ying Wangfaeb6932015-04-07 11:59:34 -07001139 $<
Ying Wang05f9f352016-05-05 20:02:08 -07001140@# aprotoc outputs only .cc. Rename it to .cpp if necessary.
1141$(if $(PRIVATE_RENAME_CPP_EXT),\
1142 $(hide) mv $(basename $@).cc $@)
Wink Saville042d4dc2014-05-06 15:45:57 -07001143endef
Ying Wanga5fc87a2010-11-02 18:43:16 -07001144
Ying Wanga5fc87a2010-11-02 18:43:16 -07001145
Christopher Wileybc2be462015-07-29 17:14:24 -07001146######################################################################
Christopher Wiley9b17dea2015-08-20 09:08:17 -07001147## Commands for generating DBus adaptors from .dbus-xml files.
Christopher Wileybc2be462015-07-29 17:14:24 -07001148######################################################################
Christopher Wiley529f1762015-08-14 14:55:32 -07001149define generate-dbus-adaptors
1150@echo "Generating DBus adaptors for $(PRIVATE_MODULE)"
1151@mkdir -p $(dir $@)
Christopher Wileybc2be462015-07-29 17:14:24 -07001152$(hide) $(DBUS_GENERATOR) \
1153 --service-config=$(PRIVATE_DBUS_SERVICE_CONFIG) \
Christopher Wiley529f1762015-08-14 14:55:32 -07001154 --adaptor=$@ \
1155 $<
1156endef
1157
1158######################################################################
Christopher Wiley9b17dea2015-08-20 09:08:17 -07001159## Commands for generating DBus proxies from .dbus-xml files.
Christopher Wiley529f1762015-08-14 14:55:32 -07001160######################################################################
1161define generate-dbus-proxies
1162@echo "Generating DBus proxies for $(PRIVATE_MODULE)"
1163@mkdir -p $(dir $@)
1164$(hide) $(DBUS_GENERATOR) \
1165 --service-config=$(PRIVATE_DBUS_SERVICE_CONFIG) \
1166 --proxy=$@ \
Christopher Wiley9b17dea2015-08-20 09:08:17 -07001167 $(filter %.dbus-xml,$^)
Christopher Wileybc2be462015-07-29 17:14:24 -07001168endef
1169
1170
Ying Wanga5fc87a2010-11-02 18:43:16 -07001171###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -08001172## Commands for running gcc to compile a C++ file
1173###########################################################
1174
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001175define transform-cpp-to-o-compiler-args
Ying Wangddbcad82011-04-18 11:45:44 -07001176 $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
Ying Wanga6a9ab02016-03-30 18:34:43 -07001177 $$(cat $(PRIVATE_IMPORT_INCLUDES)) \
Ying Wang4761e562011-04-12 11:06:35 -07001178 $(addprefix -isystem ,\
1179 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
1180 $(filter-out $(PRIVATE_C_INCLUDES), \
Ying Wangddbcad82011-04-18 11:45:44 -07001181 $(PRIVATE_TARGET_PROJECT_INCLUDES) \
Ying Wang4761e562011-04-12 11:06:35 -07001182 $(PRIVATE_TARGET_C_INCLUDES)))) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001183 -c \
1184 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Ying Wang1a081002010-07-13 14:55:47 -07001185 $(PRIVATE_TARGET_GLOBAL_CFLAGS) \
1186 $(PRIVATE_TARGET_GLOBAL_CPPFLAGS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001187 $(PRIVATE_ARM_CFLAGS) \
1188 ) \
Doug Kwan9a8ecf92011-05-10 21:50:58 -07001189 $(PRIVATE_RTTI_FLAG) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001190 $(PRIVATE_CFLAGS) \
1191 $(PRIVATE_CPPFLAGS) \
1192 $(PRIVATE_DEBUG_CFLAGS) \
Dan Albertd1600412015-06-10 16:33:43 -07001193 $(PRIVATE_CFLAGS_NO_OVERRIDE) \
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001194 $(PRIVATE_CPPFLAGS_NO_OVERRIDE)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001195endef
1196
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001197define clang-tidy-cpp
1198$(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
1199 -checks=$(PRIVATE_TIDY_CHECKS) \
1200 $< -- $(transform-cpp-to-o-compiler-args)
1201endef
1202
1203ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
1204define transform-cpp-to-o
1205$(if $(PRIVATE_TIDY_CHECKS),
1206 @echo "target tidy $(PRIVATE_ARM_MODE) C++: $<"
1207 $(clang-tidy-cpp))
1208endef
1209else
1210define transform-cpp-to-o
1211@echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<"
1212@mkdir -p $(dir $@)
1213$(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-cpp))
1214$(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \
1215 $(transform-cpp-to-o-compiler-args) \
1216 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
1217$(hide) $(transform-d-to-p)
1218endef
1219endif
1220
The Android Open Source Project88b60792009-03-03 19:28:42 -08001221
1222###########################################################
1223## Commands for running gcc to compile a C file
1224###########################################################
1225
1226# $(1): extra flags
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001227define transform-c-or-s-to-o-compiler-args
Ying Wangddbcad82011-04-18 11:45:44 -07001228 $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
Ying Wanga6a9ab02016-03-30 18:34:43 -07001229 $$(cat $(PRIVATE_IMPORT_INCLUDES)) \
Ying Wang4761e562011-04-12 11:06:35 -07001230 $(addprefix -isystem ,\
1231 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
1232 $(filter-out $(PRIVATE_C_INCLUDES), \
Ying Wangddbcad82011-04-18 11:45:44 -07001233 $(PRIVATE_TARGET_PROJECT_INCLUDES) \
Ying Wang4761e562011-04-12 11:06:35 -07001234 $(PRIVATE_TARGET_C_INCLUDES)))) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001235 -c \
1236 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Ying Wang1a081002010-07-13 14:55:47 -07001237 $(PRIVATE_TARGET_GLOBAL_CFLAGS) \
Stephen Hines15680292014-11-26 00:53:46 -08001238 $(PRIVATE_TARGET_GLOBAL_CONLYFLAGS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001239 $(PRIVATE_ARM_CFLAGS) \
1240 ) \
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001241 $(1)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001242endef
1243
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001244define transform-c-to-o-compiler-args
1245$(call transform-c-or-s-to-o-compiler-args, \
1246 $(PRIVATE_CFLAGS) \
1247 $(PRIVATE_CONLYFLAGS) \
1248 $(PRIVATE_DEBUG_CFLAGS) \
1249 $(PRIVATE_CFLAGS_NO_OVERRIDE))
The Android Open Source Project88b60792009-03-03 19:28:42 -08001250endef
1251
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001252define clang-tidy-c
1253$(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
1254 -checks=$(PRIVATE_TIDY_CHECKS) \
1255 $< -- $(transform-c-to-o-compiler-args)
1256endef
1257
1258ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
1259define transform-c-to-o
1260$(if $(PRIVATE_TIDY_CHECKS),
1261 @echo "target tidy $(PRIVATE_ARM_MODE) C: $<"
1262 $(clang-tidy-c))
1263endef
1264else
1265define transform-c-to-o
1266@echo "target $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<"
1267@mkdir -p $(dir $@)
1268$(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-c))
1269$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \
1270 $(transform-c-to-o-compiler-args) \
1271 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
1272$(hide) $(transform-d-to-p)
1273endef
1274endif
1275
The Android Open Source Project88b60792009-03-03 19:28:42 -08001276define transform-s-to-o-no-deps
1277@echo "target asm: $(PRIVATE_MODULE) <= $<"
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001278@mkdir -p $(dir $@)
1279$(RELATIVE_PWD) $(PRIVATE_CC) \
1280 $(call transform-c-or-s-to-o-compiler-args, $(PRIVATE_ASFLAGS)) \
1281 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
The Android Open Source Project88b60792009-03-03 19:28:42 -08001282endef
1283
1284define transform-s-to-o
1285$(transform-s-to-o-no-deps)
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001286$(transform-d-to-p)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001287endef
1288
Ying Wang7b913ce2014-06-05 19:05:47 -07001289# YASM compilation
1290define transform-asm-to-o
1291@mkdir -p $(dir $@)
1292$(hide) $(YASM) \
1293 $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
Ying Wangfe1e5c32015-03-09 18:57:40 -07001294 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_YASM_FLAGS) \
Ying Wang7b913ce2014-06-05 19:05:47 -07001295 $(PRIVATE_ASFLAGS) \
1296 -o $@ $<
1297endef
1298
The Android Open Source Project88b60792009-03-03 19:28:42 -08001299###########################################################
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001300## Commands for running gcc to compile an Objective-C file
1301## This should never happen for target builds but this
1302## will error at build time.
1303###########################################################
1304
1305define transform-m-to-o-no-deps
1306@echo "target ObjC: $(PRIVATE_MODULE) <= $<"
Ying Wang65d78522012-08-10 16:30:42 -07001307$(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS))
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001308endef
1309
1310define transform-m-to-o
1311$(transform-m-to-o-no-deps)
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001312$(transform-d-to-p)
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001313endef
1314
1315###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -08001316## Commands for running gcc to compile a host C++ file
1317###########################################################
1318
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001319define transform-host-cpp-to-o-compiler-args
Ying Wangddbcad82011-04-18 11:45:44 -07001320 $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
Ying Wanga6a9ab02016-03-30 18:34:43 -07001321 $$(cat $(PRIVATE_IMPORT_INCLUDES)) \
Ying Wangddbcad82011-04-18 11:45:44 -07001322 $(addprefix -isystem ,\
The Android Open Source Project88b60792009-03-03 19:28:42 -08001323 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Ying Wangddbcad82011-04-18 11:45:44 -07001324 $(filter-out $(PRIVATE_C_INCLUDES), \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001325 $($(PRIVATE_PREFIX)PROJECT_INCLUDES) \
Logan Chiene6f65432013-12-10 19:07:41 +08001326 $(PRIVATE_HOST_C_INCLUDES)))) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001327 -c \
1328 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Logan Chiene6f65432013-12-10 19:07:41 +08001329 $(PRIVATE_HOST_GLOBAL_CFLAGS) \
1330 $(PRIVATE_HOST_GLOBAL_CPPFLAGS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001331 ) \
1332 $(PRIVATE_CFLAGS) \
1333 $(PRIVATE_CPPFLAGS) \
1334 $(PRIVATE_DEBUG_CFLAGS) \
Dan Albertd1600412015-06-10 16:33:43 -07001335 $(PRIVATE_CFLAGS_NO_OVERRIDE) \
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001336 $(PRIVATE_CPPFLAGS_NO_OVERRIDE)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001337endef
1338
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001339define clang-tidy-host-cpp
1340$(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
1341 -checks=$(PRIVATE_TIDY_CHECKS) \
1342 $< -- $(transform-host-cpp-to-o-compiler-args)
1343endef
1344
1345ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
1346define transform-host-cpp-to-o
1347$(if $(PRIVATE_TIDY_CHECKS),
1348 @echo "tidy $($(PRIVATE_PREFIX)DISPLAY) C++: $<"
1349 $(clang-tidy-host-cpp))
1350endef
1351else
1352define transform-host-cpp-to-o
1353@echo "$($(PRIVATE_PREFIX)DISPLAY) C++: $(PRIVATE_MODULE) <= $<"
1354@mkdir -p $(dir $@)
1355$(if $(PRIVATE_TIDY_CHECKS),$(clang-tidy-host-cpp))
1356$(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \
1357 $(transform-host-cpp-to-o-compiler-args) \
1358 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
1359$(hide) $(transform-d-to-p)
1360endef
1361endif
1362
The Android Open Source Project88b60792009-03-03 19:28:42 -08001363
1364###########################################################
1365## Commands for running gcc to compile a host C file
1366###########################################################
1367
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001368define transform-host-c-or-s-to-o-common-args
Ying Wangddbcad82011-04-18 11:45:44 -07001369 $(addprefix -I , $(PRIVATE_C_INCLUDES)) \
Ying Wanga6a9ab02016-03-30 18:34:43 -07001370 $$(cat $(PRIVATE_IMPORT_INCLUDES)) \
Ying Wangddbcad82011-04-18 11:45:44 -07001371 $(addprefix -isystem ,\
The Android Open Source Project88b60792009-03-03 19:28:42 -08001372 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Ying Wangddbcad82011-04-18 11:45:44 -07001373 $(filter-out $(PRIVATE_C_INCLUDES), \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001374 $($(PRIVATE_PREFIX)PROJECT_INCLUDES) \
Logan Chiene6f65432013-12-10 19:07:41 +08001375 $(PRIVATE_HOST_C_INCLUDES)))) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001376 -c \
1377 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Logan Chiene6f65432013-12-10 19:07:41 +08001378 $(PRIVATE_HOST_GLOBAL_CFLAGS) \
Stephen Hines15680292014-11-26 00:53:46 -08001379 $(PRIVATE_HOST_GLOBAL_CONLYFLAGS) \
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001380 )
The Android Open Source Project88b60792009-03-03 19:28:42 -08001381endef
1382
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001383# $(1): extra flags
1384define transform-host-c-or-s-to-o-no-deps
1385@mkdir -p $(dir $@)
1386$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \
1387 $(transform-host-c-or-s-to-o-common-args) \
1388 $(1) \
1389 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
The Android Open Source Project88b60792009-03-03 19:28:42 -08001390endef
1391
Chih-Hung Hsieha9a55c72016-03-31 16:30:23 -07001392define transform-host-c-to-o-compiler-args
1393 $(transform-host-c-or-s-to-o-common-args) \
1394 $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) \
1395 $(PRIVATE_DEBUG_CFLAGS) $(PRIVATE_CFLAGS_NO_OVERRIDE)
1396endef
1397
1398define clang-tidy-host-c
1399$(hide) $(PATH_TO_CLANG_TIDY) $(PRIVATE_TIDY_FLAGS) \
1400 -checks=$(PRIVATE_TIDY_CHECKS) \
1401 $< -- $(transform-host-c-to-o-compiler-args)
1402endef
1403
1404ifneq (,$(filter 1 true,$(WITH_TIDY_ONLY)))
1405define transform-host-c-to-o
1406$(if $(PRIVATE_TIDY_CHECKS),
1407 @echo "tidy $($(PRIVATE_PREFIX)DISPLAY) C: $<"
1408 $(clang-tidy-host-c))
1409endef
1410else
1411define transform-host-c-to-o
1412@echo "$($(PRIVATE_PREFIX)DISPLAY) C: $(PRIVATE_MODULE) <= $<"
1413@mkdir -p $(dir $@)
1414$(if $(PRIVATE_TIDY_CHECKS), $(clang-tidy-host-c))
1415$(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \
1416 $(transform-host-c-to-o-compiler-args) \
1417 -MD -MF $(patsubst %.o,%.d,$@) -o $@ $<
1418$(hide) $(transform-d-to-p)
1419endef
1420endif
1421
The Android Open Source Project88b60792009-03-03 19:28:42 -08001422define transform-host-s-to-o-no-deps
Dan Willemsen057aaea2015-08-14 12:59:50 -07001423@echo "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<"
The Android Open Source Project88b60792009-03-03 19:28:42 -08001424$(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS))
1425endef
1426
The Android Open Source Project88b60792009-03-03 19:28:42 -08001427define transform-host-s-to-o
1428$(transform-host-s-to-o-no-deps)
1429$(transform-d-to-p)
1430endef
1431
1432###########################################################
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001433## Commands for running gcc to compile a host Objective-C file
1434###########################################################
1435
1436define transform-host-m-to-o-no-deps
Dan Willemsen057aaea2015-08-14 12:59:50 -07001437@echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<"
Dan Willemsendf9acac2016-03-03 17:37:50 -08001438$(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS) $(PRIVATE_CFLAGS_NO_OVERRIDE))
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001439endef
1440
David 'Digit' Turner5ca286d2011-02-11 16:19:31 +01001441define transform-host-m-to-o
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001442$(transform-host-m-to-o-no-deps)
1443$(transform-d-to-p)
1444endef
1445
Scott James Remnantdd86e5a2015-09-17 15:40:49 -07001446###########################################################
1447## Commands for running gcc to compile a host Objective-C++ file
1448###########################################################
1449
1450define transform-host-mm-to-o
1451$(transform-host-cpp-to-o)
1452endef
1453
Ying Wangfb22a422015-03-10 18:03:11 -07001454
1455###########################################################
1456## Rules to compile a single C/C++ source with ../ in the path
1457###########################################################
1458# Replace "../" in object paths with $(DOTDOT_REPLACEMENT).
1459DOTDOT_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.
1466define compile-dotdot-cpp-file
1467o := $(intermediates)/$(patsubst %$(LOCAL_CPP_EXTENSION),%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
1468$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
1469 $$(transform-$$(PRIVATE_HOST)cpp-to-o)
Shinichiro Hamaji72904772016-03-16 06:40:04 +09001470$$(call include-depfiles-for-objs, $$(o))
Ying Wangfb22a422015-03-10 18:03:11 -07001471$(3) += $$(o)
1472endef
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.
1479define compile-dotdot-c-file
1480o := $(intermediates)/$(patsubst %.c,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
1481$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
1482 $$(transform-$$(PRIVATE_HOST)c-to-o)
Shinichiro Hamaji72904772016-03-16 06:40:04 +09001483$$(call include-depfiles-for-objs, $$(o))
Ying Wangfb22a422015-03-10 18:03:11 -07001484$(3) += $$(o)
1485endef
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.
1492define compile-dotdot-s-file
1493o := $(intermediates)/$(patsubst %.S,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
1494$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
1495 $$(transform-$$(PRIVATE_HOST)s-to-o)
Shinichiro Hamaji72904772016-03-16 06:40:04 +09001496$$(call include-depfiles-for-objs, $$(o))
Ying Wangfb22a422015-03-10 18:03:11 -07001497$(3) += $$(o)
1498endef
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.
1505define compile-dotdot-s-file-no-deps
1506o := $(intermediates)/$(patsubst %.s,%.o,$(subst ../,$(DOTDOT_REPLACEMENT),$(1)))
1507$$(o) : $(TOPDIR)$(LOCAL_PATH)/$(1) $(2)
1508 $$(transform-$$(PRIVATE_HOST)s-to-o-no-deps)
1509$(3) += $$(o)
1510endef
1511
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +02001512###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -08001513## Commands for running ar
1514###########################################################
1515
Ying Wange4b24eb2010-05-27 11:55:39 -07001516define _concat-if-arg2-not-empty
1517$(if $(2),$(hide) $(1) $(2))
1518endef
1519
1520# Split long argument list into smaller groups and call the command repeatedly
Torne (Richard Coles)bffaef22012-06-15 16:03:52 +01001521# Call the command at least once even if there are no arguments, as otherwise
1522# the output file won't be created.
Ying Wange4b24eb2010-05-27 11:55:39 -07001523#
1524# $(1): the command without arguments
1525# $(2): the arguments
1526define split-long-arguments
Torne (Richard Coles)bffaef22012-06-15 16:03:52 +01001527$(hide) $(1) $(wordlist 1,500,$(2))
Ying Wange4b24eb2010-05-27 11:55:39 -07001528$(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)))
1534endef
1535
Ying Wanga02d3d92011-01-27 18:48:00 -08001536# $(1): the full path of the source static library.
1537define _extract-and-include-single-target-whole-static-lib
Ying Wanga02d3d92011-01-27 18:48:00 -08001538$(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
1539 rm -rf $$ldir; \
1540 mkdir -p $$ldir; \
Christopher Ferris44203f32015-01-07 17:14:03 -08001541 cp $(1) $$ldir; \
1542 lib_to_include=$$ldir/$(notdir $(1)); \
Ying Wanga02d3d92011-01-27 18:48:00 -08001543 filelist=; \
Christopher Ferris44203f32015-01-07 17:14:03 -08001544 subdir=0; \
Ying Wang6feb6d52014-04-17 10:03:35 -07001545 for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) t $(1)`; do \
Christopher Ferris44203f32015-01-07 17:14:03 -08001546 if [ -e $$ldir/$$f ]; then \
1547 mkdir $$ldir/$$subdir; \
1548 ext=$$subdir/; \
1549 subdir=$$((subdir+1)); \
1550 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) m $$lib_to_include $$f; \
1551 else \
1552 ext=; \
1553 fi; \
1554 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \
1555 filelist="$$filelist $$ldir/$$ext$$f"; \
Ying Wanga02d3d92011-01-27 18:48:00 -08001556 done ; \
Ying Wang61d499b2014-01-15 16:02:16 -08001557 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \
1558 $(PRIVATE_ARFLAGS) $@ $$filelist
Ying Wanga02d3d92011-01-27 18:48:00 -08001559
1560endef
1561
Dan Alberte0f44ac2014-05-23 12:26:51 -07001562# $(1): the full path of the source static library.
1563define extract-and-include-whole-static-libs-first
1564$(if $(strip $(1)),
Dan Alberte0f44ac2014-05-23 12:26:51 -07001565$(hide) cp $(1) $@)
1566endef
1567
Dan Bornstein3d02eac2009-10-21 11:12:56 -07001568define extract-and-include-target-whole-static-libs
Dan Alberte0f44ac2014-05-23 12:26:51 -07001569$(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)))
1570$(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \
Ying Wanga02d3d92011-01-27 18:48:00 -08001571 $(call _extract-and-include-single-target-whole-static-lib, $(lib)))
Dima Zavin46e9bec2009-05-27 19:41:07 -07001572endef
1573
The Android Open Source Project88b60792009-03-03 19:28:42 -08001574# Explicitly delete the archive first so that ar doesn't
1575# try to add to an existing archive.
1576define transform-o-to-static-lib
Colin Crossb6da5892015-07-16 17:14:27 -07001577@echo "target StaticLib: $(PRIVATE_MODULE) ($@)"
The Android Open Source Project88b60792009-03-03 19:28:42 -08001578@mkdir -p $(dir $@)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001579@rm -f $@
Dan Bornstein3d02eac2009-10-21 11:12:56 -07001580$(extract-and-include-target-whole-static-libs)
Ying Wang6feb6d52014-04-17 10:03:35 -07001581$(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_AR) \
1582 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_ARFLAGS) \
Ying Wang854607e2015-04-02 18:02:33 -07001583 $(PRIVATE_ARFLAGS) $@,$(PRIVATE_ALL_OBJECTS))
The Android Open Source Project88b60792009-03-03 19:28:42 -08001584endef
1585
1586###########################################################
1587## Commands for running host ar
1588###########################################################
1589
Ying Wanga02d3d92011-01-27 18:48:00 -08001590# $(1): the full path of the source static library.
1591define _extract-and-include-single-host-whole-static-lib
Ying Wanga02d3d92011-01-27 18:48:00 -08001592$(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\
1593 rm -rf $$ldir; \
1594 mkdir -p $$ldir; \
Christopher Ferris44203f32015-01-07 17:14:03 -08001595 cp $(1) $$ldir; \
1596 lib_to_include=$$ldir/$(notdir $(1)); \
Ying Wanga02d3d92011-01-27 18:48:00 -08001597 filelist=; \
Christopher Ferris44203f32015-01-07 17:14:03 -08001598 subdir=0; \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001599 for f in `$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) t $(1) | \grep '\.o$$'`; do \
Christopher Ferris44203f32015-01-07 17:14:03 -08001600 if [ -e $$ldir/$$f ]; then \
1601 mkdir $$ldir/$$subdir; \
1602 ext=$$subdir/; \
1603 subdir=$$((subdir+1)); \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001604 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) m $$lib_to_include $$f; \
Christopher Ferris44203f32015-01-07 17:14:03 -08001605 else \
1606 ext=; \
1607 fi; \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001608 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) p $$lib_to_include $$f > $$ldir/$$ext$$f; \
Christopher Ferris44203f32015-01-07 17:14:03 -08001609 filelist="$$filelist $$ldir/$$ext$$f"; \
Ying Wanga02d3d92011-01-27 18:48:00 -08001610 done ; \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001611 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) \
Ying Wang6feb6d52014-04-17 10:03:35 -07001612 $(PRIVATE_ARFLAGS) $@ $$filelist
Ying Wanga02d3d92011-01-27 18:48:00 -08001613
1614endef
1615
Dan Bornstein3d02eac2009-10-21 11:12:56 -07001616define extract-and-include-host-whole-static-libs
Dan Alberte0f44ac2014-05-23 12:26:51 -07001617$(call extract-and-include-whole-static-libs-first, $(firstword $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)))
1618$(foreach lib,$(wordlist 2,999,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)), \
Ying Wanga02d3d92011-01-27 18:48:00 -08001619 $(call _extract-and-include-single-host-whole-static-lib, $(lib)))
Dan Bornstein3d02eac2009-10-21 11:12:56 -07001620endef
1621
Ying Wang4aaa1a12016-03-22 18:23:13 -07001622ifeq ($(HOST_OS),darwin)
1623# On Darwin the host ar fails if there is nothing to add to .a at all.
1624# We work around by adding a dummy.o and then deleting it.
1625define create-dummy.o-if-no-objs
1626$(if $(PRIVATE_ALL_OBJECTS),,$(hide) touch $(dir $@)dummy.o)
1627endef
1628
1629define get-dummy.o-if-no-objs
1630$(if $(PRIVATE_ALL_OBJECTS),,$(dir $@)dummy.o)
1631endef
1632
1633define delete-dummy.o-if-no-objs
1634$(if $(PRIVATE_ALL_OBJECTS),,$(hide) $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) d $@ $(dir $@)dummy.o \
1635 && rm -f $(dir $@)dummy.o)
1636endef
1637endif # HOST_OS is darwin
1638
The Android Open Source Project88b60792009-03-03 19:28:42 -08001639# Explicitly delete the archive first so that ar doesn't
1640# try to add to an existing archive.
1641define transform-host-o-to-static-lib
Dan Willemsen057aaea2015-08-14 12:59:50 -07001642@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)"
The Android Open Source Project88b60792009-03-03 19:28:42 -08001643@mkdir -p $(dir $@)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001644@rm -f $@
Dan Bornstein3d02eac2009-10-21 11:12:56 -07001645$(extract-and-include-host-whole-static-libs)
Ying Wang4aaa1a12016-03-22 18:23:13 -07001646$(create-dummy.o-if-no-objs)
Dan Willemsen057aaea2015-08-14 12:59:50 -07001647$(call split-long-arguments,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)AR) \
1648 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_ARFLAGS) \
Ying Wang4aaa1a12016-03-22 18:23:13 -07001649 $(PRIVATE_ARFLAGS) $@,$(PRIVATE_ALL_OBJECTS) $(get-dummy.o-if-no-objs))
1650$(delete-dummy.o-if-no-objs)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001651endef
1652
1653
1654###########################################################
1655## Commands for running gcc to link a shared library or package
1656###########################################################
1657
1658# ld just seems to be so finicky with command order that we allow
1659# it to be overriden en-masse see combo/linux-arm.make for an example.
1660ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
1661define transform-host-o-to-shared-lib-inner
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001662$(hide) $(PRIVATE_CXX) \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001663 -Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \
1664 -Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \
1665 -Wl,-rpath,\$$ORIGIN/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001666 -shared -Wl,-soname,$(notdir $@) \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001667 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_LD_DIRS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001668 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Logan Chiene6f65432013-12-10 19:07:41 +08001669 $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001670 ) \
Torne (Richard Coles)a424bf72014-02-12 14:24:41 +00001671 $(PRIVATE_LDFLAGS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001672 $(PRIVATE_ALL_OBJECTS) \
1673 -Wl,--whole-archive \
1674 $(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
1675 -Wl,--no-whole-archive \
Ying Wangfcdabd42011-04-25 14:22:41 -07001676 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001677 $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
Ying Wangfcdabd42011-04-25 14:22:41 -07001678 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
Dan Albert43e128a2015-01-23 16:12:57 -08001679 $(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \
Dan Albert343ed672015-01-25 16:20:57 -08001680 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001681 $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
1682 -o $@ \
1683 $(PRIVATE_LDLIBS)
1684endef
1685endif
1686
1687define transform-host-o-to-shared-lib
Dan Willemsen057aaea2015-08-14 12:59:50 -07001688@echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001689@mkdir -p $(dir $@)
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001690$(transform-host-o-to-shared-lib-inner)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001691endef
1692
1693define transform-host-o-to-package
Dan Willemsen057aaea2015-08-14 12:59:50 -07001694@echo "$($(PRIVATE_PREFIX)DISPLAY) Package: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001695@mkdir -p $(dir $@)
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001696$(transform-host-o-to-shared-lib-inner)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001697endef
1698
1699
1700###########################################################
1701## Commands for running gcc to link a shared library or package
1702###########################################################
1703
The Android Open Source Project88b60792009-03-03 19:28:42 -08001704define transform-o-to-shared-lib-inner
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001705$(hide) $(PRIVATE_CXX) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001706 -nostdlib -Wl,-soname,$(notdir $@) \
1707 -Wl,--gc-sections \
Logan Chiene481e7d2015-01-25 21:15:12 +08001708 $(if $(filter true,$(PRIVATE_CLANG)),-shared,-Wl$(comma)-shared) \
Ying Wang1a081002010-07-13 14:55:47 -07001709 $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \
Ying Wang491fca92015-07-02 15:57:45 -07001710 $(PRIVATE_TARGET_CRTBEGIN_SO_O) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001711 $(PRIVATE_ALL_OBJECTS) \
1712 -Wl,--whole-archive \
Ying Wang80e6cce2011-01-24 23:25:36 -08001713 $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001714 -Wl,--no-whole-archive \
Ying Wangfcdabd42011-04-25 14:22:41 -07001715 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001716 $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
Ying Wangfcdabd42011-04-25 14:22:41 -07001717 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
Dan Albert7fbbc5d2015-10-08 14:16:39 -07001718 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
Dan Albert91f713a2015-03-31 15:21:30 -07001719 $(PRIVATE_TARGET_LIBATOMIC) \
1720 $(PRIVATE_TARGET_LIBGCC) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001721 $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
1722 $(PRIVATE_LDFLAGS) \
Chih-Hung Hsiehad741e62016-03-09 14:54:55 -08001723 $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
1724 -o $@ \
Ying Wang491fca92015-07-02 15:57:45 -07001725 $(PRIVATE_TARGET_CRTEND_SO_O) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001726 $(PRIVATE_LDLIBS)
1727endef
The Android Open Source Project88b60792009-03-03 19:28:42 -08001728
1729define transform-o-to-shared-lib
The Android Open Source Project88b60792009-03-03 19:28:42 -08001730@echo "target SharedLib: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001731@mkdir -p $(dir $@)
Dan Alberte088c0d2014-11-13 10:15:46 -08001732$(transform-o-to-shared-lib-inner)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001733endef
1734
The Android Open Source Project88b60792009-03-03 19:28:42 -08001735###########################################################
1736## Commands for filtering a target executable or library
1737###########################################################
1738
Ying Wangce1c5962014-03-28 17:24:39 -07001739ifneq ($(TARGET_BUILD_VARIANT),user)
1740 TARGET_STRIP_EXTRA = && $(PRIVATE_OBJCOPY) --add-gnu-debuglink=$< $@
1741 TARGET_STRIP_KEEP_SYMBOLS_EXTRA = --add-gnu-debuglink=$<
1742endif
1743
The Android Open Source Project88b60792009-03-03 19:28:42 -08001744define transform-to-stripped
The Android Open Source Project88b60792009-03-03 19:28:42 -08001745@echo "target Strip: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001746@mkdir -p $(dir $@)
Ying Wangbfb52a22014-08-20 17:12:32 -07001747$(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ \
1748 $(if $(PRIVATE_NO_DEBUGLINK),,$(TARGET_STRIP_EXTRA))
The Android Open Source Project88b60792009-03-03 19:28:42 -08001749endef
1750
Yabin Cuifab79952016-03-29 12:22:20 -07001751define transform-to-stripped-keep-mini-debug-info
1752@echo "target Strip (mini debug info): $(PRIVATE_MODULE) ($@)"
1753@mkdir -p $(dir $@)
1754$(hide) $(PRIVATE_NM) -D $< --format=posix --defined-only | awk '{ print $$1 }' | sort >$@.dynsyms
1755$(hide) $(PRIVATE_NM) $< --format=posix --defined-only | awk '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort >$@.funcsyms
1756$(hide) comm -13 $@.dynsyms $@.funcsyms >$@.keep_symbols
1757$(hide) $(PRIVATE_OBJCOPY) --only-keep-debug $< $@.debug
1758$(hide) $(PRIVATE_OBJCOPY) --rename-section .debug_frame=saved_debug_frame $@.debug $@.mini_debuginfo
1759$(hide) $(PRIVATE_OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$@.keep_symbols $@.mini_debuginfo
1760$(hide) $(PRIVATE_OBJCOPY) --rename-section saved_debug_frame=.debug_frame $@.mini_debuginfo
1761$(hide) $(PRIVATE_STRIP) --strip-all -R .comment $< -o $@
1762$(hide) rm -f $@.mini_debuginfo.xz
1763$(hide) xz $@.mini_debuginfo
1764$(hide) $(PRIVATE_OBJCOPY) --add-section .gnu_debugdata=$@.mini_debuginfo.xz $@
1765$(hide) rm -f $@.dynsyms $@.funcsyms $@.keep_symbols $@.debug $@.mini_debuginfo.xz
1766endef
1767
Christopher Ferrisa6e2f932014-03-18 14:50:09 -07001768define transform-to-stripped-keep-symbols
Christopher Ferrisa6e2f932014-03-18 14:50:09 -07001769@echo "target Strip (keep symbols): $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001770@mkdir -p $(dir $@)
Ying Wangce1c5962014-03-28 17:24:39 -07001771$(hide) $(PRIVATE_OBJCOPY) \
1772 `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \
1773 $(TARGET_STRIP_KEEP_SYMBOLS_EXTRA) $< $@
Christopher Ferrisa6e2f932014-03-18 14:50:09 -07001774endef
1775
Dmitriy Ivanov4c2d1a62015-04-20 16:59:05 -07001776###########################################################
1777## Commands for packing a target executable or library
1778###########################################################
1779
1780define pack-elf-relocations
Dmitriy Ivanov4c2d1a62015-04-20 16:59:05 -07001781@echo "target Pack Relocations: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001782$(copy-file-to-target)
Dmitriy Ivanov4c2d1a62015-04-20 16:59:05 -07001783$(hide) $(RELOCATION_PACKER) $@
1784endef
The Android Open Source Project88b60792009-03-03 19:28:42 -08001785
1786###########################################################
1787## Commands for running gcc to link an executable
1788###########################################################
1789
The Android Open Source Project88b60792009-03-03 19:28:42 -08001790define transform-o-to-executable-inner
Dan Alberte088c0d2014-11-13 10:15:46 -08001791$(hide) $(PRIVATE_CXX) -pie \
1792 -nostdlib -Bdynamic \
Evgenii Stepanov8f5e67a2015-07-10 18:06:51 -07001793 -Wl,-dynamic-linker,$(PRIVATE_LINKER) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001794 -Wl,--gc-sections \
1795 -Wl,-z,nocopyreloc \
Ying Wangc6ffc002012-09-25 17:52:10 -07001796 $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \
Ying Wang9fb35262014-02-21 16:17:05 -08001797 -Wl,-rpath-link=$(PRIVATE_TARGET_OUT_INTERMEDIATE_LIBRARIES) \
Ying Wang491fca92015-07-02 15:57:45 -07001798 $(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001799 $(PRIVATE_ALL_OBJECTS) \
1800 -Wl,--whole-archive \
1801 $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
1802 -Wl,--no-whole-archive \
Ying Wangfcdabd42011-04-25 14:22:41 -07001803 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001804 $(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
Ying Wangfcdabd42011-04-25 14:22:41 -07001805 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
Dan Albert7fbbc5d2015-10-08 14:16:39 -07001806 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
Dan Albert91f713a2015-03-31 15:21:30 -07001807 $(PRIVATE_TARGET_LIBATOMIC) \
1808 $(PRIVATE_TARGET_LIBGCC) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001809 $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
1810 $(PRIVATE_LDFLAGS) \
Chih-Hung Hsiehad741e62016-03-09 14:54:55 -08001811 $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
1812 -o $@ \
Ying Wang491fca92015-07-02 15:57:45 -07001813 $(PRIVATE_TARGET_CRTEND_O) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001814 $(PRIVATE_LDLIBS)
1815endef
The Android Open Source Project88b60792009-03-03 19:28:42 -08001816
1817define transform-o-to-executable
The Android Open Source Project88b60792009-03-03 19:28:42 -08001818@echo "target Executable: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001819@mkdir -p $(dir $@)
Dan Alberte088c0d2014-11-13 10:15:46 -08001820$(transform-o-to-executable-inner)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001821endef
1822
1823
1824###########################################################
Dan Alberte088c0d2014-11-13 10:15:46 -08001825## Commands for linking a static executable. In practice,
1826## we only use this on arm, so the other platforms don't
1827## have transform-o-to-static-executable defined.
Chih-Hung Hsieh69b1fe62015-01-20 11:00:20 -08001828## Clang driver needs -static to create static executable.
1829## However, bionic/linker uses -shared to overwrite.
1830## Linker for x86 targets does not allow coexistance of -static and -shared,
1831## so we add -static only if -shared is not used.
The Android Open Source Project88b60792009-03-03 19:28:42 -08001832###########################################################
1833
The Android Open Source Project88b60792009-03-03 19:28:42 -08001834define transform-o-to-static-executable-inner
Dan Alberte088c0d2014-11-13 10:15:46 -08001835$(hide) $(PRIVATE_CXX) \
1836 -nostdlib -Bstatic \
Chih-Hung Hsieh69b1fe62015-01-20 11:00:20 -08001837 $(if $(filter $(PRIVATE_LDFLAGS),-shared),,-static) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001838 -Wl,--gc-sections \
1839 -o $@ \
1840 $(PRIVATE_TARGET_GLOBAL_LD_DIRS) \
Ying Wang491fca92015-07-02 15:57:45 -07001841 $(PRIVATE_TARGET_CRTBEGIN_STATIC_O) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001842 $(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
1843 $(PRIVATE_LDFLAGS) \
1844 $(PRIVATE_ALL_OBJECTS) \
1845 -Wl,--whole-archive \
1846 $(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
1847 -Wl,--no-whole-archive \
1848 $(call normalize-target-libraries,$(filter-out %libcompiler_rt.a,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))))) \
1849 -Wl,--start-group \
1850 $(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
1851 $(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
Dan Albert7fbbc5d2015-10-08 14:16:39 -07001852 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
Dan Albert343ed672015-01-25 16:20:57 -08001853 $(PRIVATE_TARGET_LIBATOMIC) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001854 $(call normalize-target-libraries,$(filter %libcompiler_rt.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
Dan Albert741b36e2014-11-13 21:24:04 -08001855 $(PRIVATE_TARGET_LIBGCC) \
Dan Alberte088c0d2014-11-13 10:15:46 -08001856 -Wl,--end-group \
Ying Wang491fca92015-07-02 15:57:45 -07001857 $(PRIVATE_TARGET_CRTEND_O)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001858endef
The Android Open Source Project88b60792009-03-03 19:28:42 -08001859
1860define transform-o-to-static-executable
The Android Open Source Project88b60792009-03-03 19:28:42 -08001861@echo "target StaticExecutable: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001862@mkdir -p $(dir $@)
Dan Alberte088c0d2014-11-13 10:15:46 -08001863$(transform-o-to-static-executable-inner)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001864endef
1865
1866
1867###########################################################
1868## Commands for running gcc to link a host executable
1869###########################################################
Ying Wangfaf3d5e2014-04-04 14:37:33 -07001870ifdef BUILD_HOST_static
1871HOST_FPIE_FLAGS :=
1872else
Dan Albert4803ce22014-08-06 12:36:46 -07001873HOST_FPIE_FLAGS := -pie
Stephen Hinesa503fb32014-10-02 00:51:11 -07001874# Force the correct entry point to workaround a bug in binutils that manifests with -pie
Dan Willemsen057aaea2015-08-14 12:59:50 -07001875ifeq ($(HOST_CROSS_OS),windows)
1876HOST_CROSS_FPIE_FLAGS += -Wl,-e_mainCRTStartup
Stephen Hinesa503fb32014-10-02 00:51:11 -07001877endif
Ying Wangfaf3d5e2014-04-04 14:37:33 -07001878endif
The Android Open Source Project88b60792009-03-03 19:28:42 -08001879
1880ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
1881define transform-host-o-to-executable-inner
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001882$(hide) $(PRIVATE_CXX) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001883 $(PRIVATE_ALL_OBJECTS) \
1884 -Wl,--whole-archive \
1885 $(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
1886 -Wl,--no-whole-archive \
Ying Wangfcdabd42011-04-25 14:22:41 -07001887 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001888 $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
Ying Wangfcdabd42011-04-25 14:22:41 -07001889 $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
Dan Albert43e128a2015-01-23 16:12:57 -08001890 $(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \
Dan Albert343ed672015-01-25 16:20:57 -08001891 $(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001892 $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001893 -Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \
Dan Willemsen7fe992c2016-03-02 13:54:51 -08001894 $(foreach path,$(PRIVATE_RPATHS), \
1895 -Wl,-rpath,\$$ORIGIN/$(path)) \
Dan Willemsen057aaea2015-08-14 12:59:50 -07001896 $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_LD_DIRS) \
Conley Owensd9e7d252011-11-10 09:57:40 -08001897 $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
Logan Chiene6f65432013-12-10 19:07:41 +08001898 $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
Conley Owensd9e7d252011-11-10 09:57:40 -08001899 ) \
Torne (Richard Coles)a424bf72014-02-12 14:24:41 +00001900 $(PRIVATE_LDFLAGS) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001901 -o $@ \
1902 $(PRIVATE_LDLIBS)
1903endef
1904endif
1905
1906define transform-host-o-to-executable
Dan Willemsen057aaea2015-08-14 12:59:50 -07001907@echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)"
Colin Crossb6da5892015-07-16 17:14:27 -07001908@mkdir -p $(dir $@)
Ying Wang3a7e4cc2011-01-28 14:14:47 -08001909$(transform-host-o-to-executable-inner)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001910endef
1911
1912
1913###########################################################
1914## Commands for running javac to make .class files
1915###########################################################
1916
Ying Wangd75d8932015-09-19 10:56:35 -07001917# Add BUILD_NUMBER to apps default version name if it's unbundled build.
1918ifdef TARGET_BUILD_APPS
1919APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)-$(BUILD_NUMBER_FROM_FILE)
1920else
1921APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)
1922endif
1923
The Android Open Source Project88b60792009-03-03 19:28:42 -08001924# TODO: Right now we generate the asset resources twice, first as part
1925# of generating the Java classes, then at the end when packaging the final
1926# assets. This should be changed to do one of two things: (1) Don't generate
1927# any resource files the first time, only create classes during that stage;
1928# or (2) Don't use the -c flag with the second stage, instead taking the
1929# resource files from the first stage as additional input. My original intent
1930# was to use approach (2), but this requires a little more work in the tool.
1931# Maybe we should just use approach (1).
1932
1933# This rule creates the R.java and Manifest.java files, both of which
Ying Wang4f1ab922011-03-15 13:19:30 -07001934# are PRODUCT-neutral. Don't pass PRIVATE_PRODUCT_AAPT_CONFIG to this invocation.
The Android Open Source Project88b60792009-03-03 19:28:42 -08001935define create-resource-java-files
1936@mkdir -p $(PRIVATE_SOURCE_INTERMEDIATES_DIR)
1937@mkdir -p $(dir $(PRIVATE_RESOURCE_PUBLICS_OUTPUT))
Ying Wangc61d5932010-03-10 16:02:42 -08001938$(hide) $(AAPT) package $(PRIVATE_AAPT_FLAGS) -m \
Ying Wang4f1ab922011-03-15 13:19:30 -07001939 $(eval # PRIVATE_PRODUCT_AAPT_CONFIG is intentionally missing-- see comment.) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08001940 $(addprefix -J , $(PRIVATE_SOURCE_INTERMEDIATES_DIR)) \
1941 $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
1942 $(addprefix -P , $(PRIVATE_RESOURCE_PUBLICS_OUTPUT)) \
1943 $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \
1944 $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
Dianne Hackborn9bd54042009-05-15 18:01:20 -07001945 $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
Joe Onorato2daa2b32009-08-30 13:39:24 -07001946 $(addprefix -G , $(PRIVATE_PROGUARD_OPTIONS_FILE)) \
Ying Wangbb9c2302011-04-08 17:27:35 -07001947 $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
1948 $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
Colin Crossf37b4552015-07-16 17:15:19 -07001949 $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
Ying Wangd75d8932015-09-19 10:56:35 -07001950 $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
Ying Wang8c254822010-03-16 16:13:56 -07001951 $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
Adrian Roos6784cae2015-06-01 18:24:41 -07001952 $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
1953 --skip-symbols-without-default-localization
The Android Open Source Project88b60792009-03-03 19:28:42 -08001954endef
1955
Jeffrey Chyan7adbf972010-07-07 13:42:19 -05001956xlint_unchecked := -Xlint:unchecked
The Android Open Source Project88b60792009-03-03 19:28:42 -08001957
1958# emit-line, <word list>, <output file>
1959define emit-line
1960 $(if $(1),echo -n '$(strip $(1)) ' >> $(2))
1961endef
1962
1963# dump-words-to-file, <word list>, <output file>
1964define dump-words-to-file
1965 @rm -f $(2)
Yohann Rousself8c63cb2015-10-06 15:28:38 +02001966 @touch $(2)
The Android Open Source Project88b60792009-03-03 19:28:42 -08001967 @$(call emit-line,$(wordlist 1,200,$(1)),$(2))
1968 @$(call emit-line,$(wordlist 201,400,$(1)),$(2))
1969 @$(call emit-line,$(wordlist 401,600,$(1)),$(2))
1970 @$(call emit-line,$(wordlist 601,800,$(1)),$(2))
1971 @$(call emit-line,$(wordlist 801,1000,$(1)),$(2))
1972 @$(call emit-line,$(wordlist 1001,1200,$(1)),$(2))
1973 @$(call emit-line,$(wordlist 1201,1400,$(1)),$(2))
1974 @$(call emit-line,$(wordlist 1401,1600,$(1)),$(2))
1975 @$(call emit-line,$(wordlist 1601,1800,$(1)),$(2))
1976 @$(call emit-line,$(wordlist 1801,2000,$(1)),$(2))
1977 @$(call emit-line,$(wordlist 2001,2200,$(1)),$(2))
1978 @$(call emit-line,$(wordlist 2201,2400,$(1)),$(2))
1979 @$(call emit-line,$(wordlist 2401,2600,$(1)),$(2))
1980 @$(call emit-line,$(wordlist 2601,2800,$(1)),$(2))
1981 @$(call emit-line,$(wordlist 2801,3000,$(1)),$(2))
1982 @$(call emit-line,$(wordlist 3001,3200,$(1)),$(2))
1983 @$(call emit-line,$(wordlist 3201,3400,$(1)),$(2))
1984 @$(call emit-line,$(wordlist 3401,3600,$(1)),$(2))
1985 @$(call emit-line,$(wordlist 3601,3800,$(1)),$(2))
1986 @$(call emit-line,$(wordlist 3801,4000,$(1)),$(2))
Jesse Wilson72c941a2010-05-04 16:33:49 -07001987 @$(call emit-line,$(wordlist 4001,4200,$(1)),$(2))
1988 @$(call emit-line,$(wordlist 4201,4400,$(1)),$(2))
1989 @$(call emit-line,$(wordlist 4401,4600,$(1)),$(2))
1990 @$(call emit-line,$(wordlist 4601,4800,$(1)),$(2))
1991 @$(call emit-line,$(wordlist 4801,5000,$(1)),$(2))
Przemyslaw Szczepaniak20de4fa2015-11-20 15:05:03 +00001992 @$(call emit-line,$(wordlist 5001,5200,$(1)),$(2))
1993 @$(if $(wordlist 5201,5202,$(1)),$(error Too many words ($(words $(1)))))
The Android Open Source Project88b60792009-03-03 19:28:42 -08001994endef
1995
1996# For a list of jar files, unzip them to a specified directory,
Ying Wang3be52e62015-11-24 11:44:20 -08001997# but make sure that no META-INF files come along for the ride,
1998# unless PRIVATE_DONT_DELETE_JAR_META_INF is set.
The Android Open Source Project88b60792009-03-03 19:28:42 -08001999#
2000# $(1): files to unzip
2001# $(2): destination directory
2002define unzip-jar-files
2003 $(hide) for f in $(1); \
2004 do \
2005 if [ ! -f $$f ]; then \
2006 echo Missing file $$f; \
2007 exit 1; \
2008 fi; \
Sriram Ramanf1a55f82009-06-09 15:08:29 -07002009 unzip -qo $$f -d $(2); \
Ying Wang3be52e62015-11-24 11:44:20 -08002010 done
2011 $(if $(PRIVATE_DONT_DELETE_JAR_META_INF),,$(hide) rm -rf $(2)/META-INF)
The Android Open Source Project88b60792009-03-03 19:28:42 -08002012endef
2013
Yohann Roussel8998d572015-07-03 15:46:51 +02002014# Call jack
2015#
Yohann Roussel8998d572015-07-03 15:46:51 +02002016define call-jack
Yohann Roussel6528ea32015-10-12 18:02:51 +02002017 JACK_VERSION=$(PRIVATE_JACK_VERSION) $(JACK) $(DEFAULT_JACK_EXTRA_ARGS)
Yohann Roussel8998d572015-07-03 15:46:51 +02002018endef
2019
Brian Carlstrom78269512010-12-10 12:10:24 -08002020# Common definition to invoke javac on the host and target.
2021#
2022# Some historical notes:
2023# - below we write the list of java files to java-source-list to avoid argument
2024# list length problems with Cygwin
2025# - we filter out duplicate java file names because eclipse's compiler
2026# doesn't like them.
2027#
2028# $(1): javac
2029# $(2): bootclasspath
2030define compile-java
Joe Onorato64d85d02009-04-09 19:31:12 -07002031$(hide) rm -f $@
2032$(hide) rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR)
Brian Carlstrom78269512010-12-10 12:10:24 -08002033$(hide) mkdir -p $(dir $@)
Joe Onorato64d85d02009-04-09 19:31:12 -07002034$(hide) mkdir -p $(PRIVATE_CLASS_INTERMEDIATES_DIR)
Brian Carlstrom78269512010-12-10 12:10:24 -08002035$(call unzip-jar-files,$(PRIVATE_STATIC_JAVA_LIBRARIES),$(PRIVATE_CLASS_INTERMEDIATES_DIR))
Ying Wang015edd22011-01-20 15:01:56 -08002036$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list)
Joe Onorato64d85d02009-04-09 19:31:12 -07002037$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
Ying Wang4aedea92015-08-04 12:44:38 -07002038 find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' -and -not -name '.*' >> $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list; \
The Android Open Source Project88b60792009-03-03 19:28:42 -08002039fi
Ying Wang884738e2015-05-08 18:51:00 +00002040$(hide) tr ' ' '\n' < $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list \
Ying Wang4d688792015-10-22 16:30:00 -07002041 | $(NORMALIZE_PATH) | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
Ying Wang884738e2015-05-08 18:51:00 +00002042$(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
Ying Wange109a1d2011-12-12 17:52:03 -08002043 $(1) -encoding UTF-8 \
Ying Wang057eba02012-10-18 10:54:49 -07002044 $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
Brian Carlstrom78269512010-12-10 12:10:24 -08002045 $(2) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08002046 $(addprefix -classpath ,$(strip \
2047 $(call normalize-path-list,$(PRIVATE_ALL_JAVA_LIBRARIES)))) \
Ying Wang057eba02012-10-18 10:54:49 -07002048 $(if $(findstring true,$(PRIVATE_WARNINGS_ENABLE)),$(xlint_unchecked),) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08002049 -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
Brian Carlstrom78269512010-12-10 12:10:24 -08002050 $(PRIVATE_JAVACFLAGS) \
Ying Wang015edd22011-01-20 15:01:56 -08002051 \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \
Ying Wange109a1d2011-12-12 17:52:03 -08002052 || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \
2053fi
Joe Onorato0eccce92011-10-30 21:37:35 -07002054$(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/tools/java-layers.py \
2055 $(PRIVATE_JAVA_LAYERS_FILE) \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq,)
Ying Wang015edd22011-01-20 15:01:56 -08002056$(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list
2057$(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq
Ying Wang5758b8e2011-12-15 16:36:55 -08002058$(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
2059 -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \
2060 $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \
2061 | xargs rm -rf)
Jeff Brown4c4aa992014-05-23 18:41:19 -07002062$(if $(PRIVATE_JAR_PACKAGES), \
2063 $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type f \
2064 $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \
2065 -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))/\*) -delete ; \
2066 find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -empty -delete)
2067$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \
2068 $(foreach pkg, $(PRIVATE_JAR_EXCLUDE_PACKAGES), \
2069 $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))))
Guang Zhu5c9a1a42013-09-24 19:05:52 -07002070$(if $(PRIVATE_JAR_MANIFEST), \
Colin Crossf37b4552015-07-16 17:15:19 -07002071 $(hide) sed -e "s/%BUILD_NUMBER%/$(BUILD_NUMBER_FROM_FILE)/" \
Guang Zhu5c9a1a42013-09-24 19:05:52 -07002072 $(PRIVATE_JAR_MANIFEST) > $(dir $@)/manifest.mf && \
2073 jar -cfm $@ $(dir $@)/manifest.mf \
2074 -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ., \
2075 $(hide) jar -cf $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) .)
Ying Wang33360dd2015-01-14 14:23:56 -08002076$(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@))
Brian Carlstrom78269512010-12-10 12:10:24 -08002077endef
2078
2079define transform-java-to-classes.jar
2080@echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
2081$(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH))
The Android Open Source Project88b60792009-03-03 19:28:42 -08002082endef
2083
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002084# Invoke Jack to compile java from source to dex and jack files.
2085#
2086# Some historical notes:
2087# - below we write the list of java files to java-source-list to avoid argument
2088# list length problems with Cygwin
2089# - we filter out duplicate java file names because Jack doesn't like them.
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002090define jack-java-to-dex
2091$(hide) rm -f $@
2092$(hide) rm -f $(PRIVATE_CLASSES_JACK)
2093$(hide) rm -rf $(PRIVATE_JACK_INTERMEDIATES_DIR)
2094$(hide) mkdir -p $(dir $@)
2095$(hide) mkdir -p $(dir $(PRIVATE_CLASSES_JACK))
2096$(hide) mkdir -p $(PRIVATE_JACK_INTERMEDIATES_DIR)
Yohann Roussel37822c42015-01-09 10:36:40 +01002097$(if $(PRIVATE_JACK_INCREMENTAL_DIR),$(hide) mkdir -p $(PRIVATE_JACK_INCREMENTAL_DIR))
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002098$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list)
2099$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
2100 find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list; \
2101fi
Ying Wang884738e2015-05-08 18:51:00 +00002102$(hide) tr ' ' '\n' < $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list \
Ying Wang4d688792015-10-22 16:30:00 -07002103 | $(NORMALIZE_PATH) | sort -u > $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002104$(if $(PRIVATE_JACK_PROGUARD_FLAGS), \
2105 $(hide) echo -basedirectory $(CURDIR) > $@.flags; \
2106 echo $(PRIVATE_JACK_PROGUARD_FLAGS) >> $@.flags; \
2107)
Ying Wang33360dd2015-01-14 14:23:56 -08002108$(if $(PRIVATE_EXTRA_JAR_ARGS),
2109 $(hide) mkdir -p $@.res.tmp
2110 $(hide) $(call create-empty-package-at,$@.res.tmp.zip)
2111 $(hide) $(call add-java-resources-to,$@.res.tmp.zip)
Ying Wang3be52e62015-11-24 11:44:20 -08002112 $(hide) unzip -qo $@.res.tmp.zip -d $@.res.tmp
Ying Wang33360dd2015-01-14 14:23:56 -08002113 $(hide) rm $@.res.tmp.zip)
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002114$(hide) if [ -s $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
2115 export tmpEcjArg="@$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq"; \
2116else \
2117 export tmpEcjArg=""; \
2118fi; \
Yohann Roussel6528ea32015-10-12 18:02:51 +02002119$(call call-jack) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002120 $(strip $(PRIVATE_JACK_FLAGS)) \
Sebastien Hertzdfce8ad2015-11-19 17:53:00 +01002121 $(strip $(PRIVATE_JACK_COVERAGE_OPTIONS)) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002122 $(if $(NO_OPTIMIZE_DX), \
2123 -D jack.dex.optimize="false") \
Yohann Roussel5b2c6e22015-05-20 17:52:15 +02002124 $(if $(PRIVATE_RMTYPEDEFS), \
2125 -D jack.android.remove-typedef="true") \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002126 $(addprefix --classpath ,$(strip \
Yohann Rousselae2fc812016-04-21 16:49:10 +02002127 $(call normalize-path-list,$(PRIVATE_JACK_SHARED_LIBRARIES)))) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002128 $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
Ying Wang33360dd2015-01-14 14:23:56 -08002129 $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
Yohann Rousselc6383d62016-03-09 17:19:58 +01002130 -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002131 -D jack.import.resource.policy=keep-first \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002132 -D jack.import.type.policy=keep-first \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002133 --output-jack $(PRIVATE_CLASSES_JACK) \
Yohann Roussel37822c42015-01-09 10:36:40 +01002134 $(if $(PRIVATE_JACK_INCREMENTAL_DIR),--incremental-folder $(PRIVATE_JACK_INCREMENTAL_DIR)) \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002135 --output-dex $(PRIVATE_JACK_INTERMEDIATES_DIR) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002136 $(addprefix --config-jarjar ,$(strip $(PRIVATE_JARJAR_RULES))) \
2137 $(if $(PRIVATE_JACK_PROGUARD_FLAGS),--config-proguard $@.flags) \
2138 $$tmpEcjArg \
Yohann Rousselb2c55582015-07-02 12:10:17 +02002139 || ( rm -rf $(PRIVATE_CLASSES_JACK); exit 41 )
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002140$(hide) mv $(PRIVATE_JACK_INTERMEDIATES_DIR)/classes*.dex $(dir $@)
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002141$(hide) rm -f $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list
Ying Wang33360dd2015-01-14 14:23:56 -08002142$(if $(PRIVATE_EXTRA_JAR_ARGS),$(hide) rm -rf $@.res.tmp)
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002143$(hide) mv $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq $(PRIVATE_JACK_INTERMEDIATES_DIR).java-source-list
2144$(if $(PRIVATE_JAR_PACKAGES), $(hide) echo unsupported options PRIVATE_JAR_PACKAGES in $@; exit 53)
2145$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) echo unsupported options JAR_EXCLUDE_PACKAGES in $@; exit 53)
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002146$(if $(PRIVATE_JAR_MANIFEST), $(hide) echo unsupported options JAR_MANIFEST in $@; exit 53)
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002147endef
2148
Yohann Rousselee572682015-08-18 19:18:18 +02002149# Invoke Jack to compile java source just to check it compiles correctly.
2150#
2151# Some historical notes:
2152# - below we write the list of java files to java-source-list to avoid argument
2153# list length problems with Cygwin
2154# - we filter out duplicate java file names because Jack doesn't like them.
2155define jack-check-java
2156$(hide) rm -f $@
2157$(hide) rm -f $@.java-source-list
2158$(hide) rm -f $@.java-source-list-uniq
2159$(hide) mkdir -p $(dir $@)
2160$(if $(PRIVATE_JACK_INCREMENTAL_DIR),$(hide) mkdir -p $(PRIVATE_JACK_INCREMENTAL_DIR))
2161$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$@.java-source-list)
2162$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
2163 find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $@.java-source-list; \
2164fi
2165$(hide) tr ' ' '\n' < $@.java-source-list \
2166 | sort -u > $@.java-source-list-uniq
2167$(hide) if [ -s $@.java-source-list-uniq ] ; then \
Ying Wang85865732016-03-28 18:39:42 -07002168 $(call call-jack) \
Yohann Rousselee572682015-08-18 19:18:18 +02002169 $(strip $(PRIVATE_JACK_FLAGS)) \
Yohann Rousselee572682015-08-18 19:18:18 +02002170 $(addprefix --classpath ,$(strip \
Yohann Rousselae2fc812016-04-21 16:49:10 +02002171 $(call normalize-path-list,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES)) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
Yohann Rousselee572682015-08-18 19:18:18 +02002172 -D jack.import.resource.policy=keep-first \
Yohann Rousselc6383d62016-03-09 17:19:58 +01002173 -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
Yohann Rousselee572682015-08-18 19:18:18 +02002174 -D jack.import.type.policy=keep-first \
2175 $(if $(PRIVATE_JACK_INCREMENTAL_DIR),--incremental-folder $(PRIVATE_JACK_INCREMENTAL_DIR)) \
2176 @$@.java-source-list-uniq; \
2177fi
2178touch $@
2179endef
2180
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002181define transform-jar-to-jack
2182 $(hide) mkdir -p $(dir $@)
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002183 $(hide) mkdir -p $@.tmpjill.res
Ying Wang6cce4022015-11-24 14:09:11 -08002184 $(hide) unzip -qo $< -d $@.tmpjill.res
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002185 $(hide) find $@.tmpjill.res -iname "*.class" -delete
Yohann Roussel6528ea32015-10-12 18:02:51 +02002186 $(hide) $(call call-jack) \
Yohann Rousselccfa5c62016-01-19 16:08:34 +01002187 $(PRIVATE_JACK_FLAGS) \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002188 -D jack.import.resource.policy=keep-first \
2189 -D jack.import.type.policy=keep-first \
Yohann Rousselc6383d62016-03-09 17:19:58 +01002190 -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
Yohann Rousselccfa5c62016-01-19 16:08:34 +01002191 --import $< \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002192 --import-resource $@.tmpjill.res \
2193 --output-jack $@
2194 $(hide) rm -rf $@.tmpjill.res
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002195endef
2196
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002197# Moves $1.tmp to $1 if necessary. This is designed to be used with
2198# .KATI_RESTAT. For kati, this function doesn't update the timestamp
2199# of $1 when $1.tmp is identical to $1 so that ninja won't rebuild
Dan Willemsen1c6dc5b2016-01-06 14:28:36 -08002200# targets which depend on $1.
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002201define commit-change-for-toc
2202$(hide) if cmp -s $1.tmp $1 ; then \
2203 rm $1.tmp ; \
2204else \
2205 mv $1.tmp $1 ; \
2206fi
2207endef
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002208
Shinichiro Hamajif972a4a2015-12-09 18:06:20 +09002209## Rule to create a table of contents from a .jar file.
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002210## Must be called with $(eval).
Shinichiro Hamajif972a4a2015-12-09 18:06:20 +09002211# $(1): A .jar file
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002212define _transform-jar-to-toc
2213$1.toc: $1 | $(IJAR)
2214 @echo Generating TOC: $$@
2215 $(hide) $(IJAR) $$< $$@.tmp
2216 $$(call commit-change-for-toc,$$@)
2217endef
2218
2219## Define a rule which generates .jar.toc and mark it as .KATI_RESTAT.
Shinichiro Hamajif972a4a2015-12-09 18:06:20 +09002220# $(1): A .jar file
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002221define define-jar-to-toc-rule
Ying Wang427f8c42015-12-04 16:44:03 -08002222$(eval $(call _transform-jar-to-toc,$1))\
Shinichiro Hamaji89b255a2015-11-09 16:47:42 +09002223$(eval .KATI_RESTAT: $1.toc)
2224endef
2225
Shinichiro Hamajif972a4a2015-12-09 18:06:20 +09002226ifeq (,$(TARGET_BUILD_APPS))
2227
2228## Rule to create a table of contents from a .dex file.
2229## Must be called with $(eval).
2230# $(1): The directory which contains classes*.dex files
2231define _transform-dex-to-toc
2232$1/classes.dex.toc: PRIVATE_INPUT_DEX_FILES := $1/classes*.dex
2233$1/classes.dex.toc: $1/classes.dex $(DEXDUMP)
2234 @echo Generating TOC: $$@
2235 $(hide) $(DEXDUMP) -l xml $$(PRIVATE_INPUT_DEX_FILES) > $$@.tmp
2236 $$(call commit-change-for-toc,$$@)
2237endef
2238
2239## Define a rule which generates .dex.toc and mark it as .KATI_RESTAT.
2240# $(1): The directory which contains classes*.dex files
2241define define-dex-to-toc-rule
2242$(eval $(call _transform-dex-to-toc,$1))\
2243$(eval .KATI_RESTAT: $1/classes.dex.toc)
2244endef
2245
2246else
2247
2248# Turn off .toc optimization for apps build as we cannot build dexdump.
2249define define-dex-to-toc-rule
2250endef
2251
2252endif # TARGET_BUILD_APPS
2253
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002254
2255# Invoke Jack to compile java from source to jack files without shrink or obfuscation.
2256#
2257# Some historical notes:
2258# - below we write the list of java files to java-source-list to avoid argument
2259# list length problems with Cygwin
2260# - we filter out duplicate java file names because Jack doesn't like them.
2261define java-to-jack
2262$(hide) rm -f $@
2263$(hide) rm -rf $(PRIVATE_JACK_INTERMEDIATES_DIR)
2264$(hide) mkdir -p $(dir $@)
2265$(hide) mkdir -p $(PRIVATE_JACK_INTERMEDIATES_DIR)
Yohann Roussel37822c42015-01-09 10:36:40 +01002266$(if $(PRIVATE_JACK_INCREMENTAL_DIR),$(hide) mkdir -p $(PRIVATE_JACK_INCREMENTAL_DIR))
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002267$(call dump-words-to-file,$(PRIVATE_JAVA_SOURCES),$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list)
2268$(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \
2269 find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name '*.java' >> $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list; \
2270fi
Ying Wang884738e2015-05-08 18:51:00 +00002271$(hide) tr ' ' '\n' < $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list \
Ying Wang4d688792015-10-22 16:30:00 -07002272 | $(NORMALIZE_PATH) | sort -u > $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002273$(if $(PRIVATE_JACK_PROGUARD_FLAGS), \
2274 $(hide) echo -basedirectory $(CURDIR) > $@.flags; \
2275 echo $(PRIVATE_JACK_PROGUARD_FLAGS) >> $@.flags; \
2276)
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002277$(if $(PRIVATE_EXTRA_JAR_ARGS),
2278 $(hide) mkdir -p $@.res.tmp
2279 $(hide) $(call create-empty-package-at,$@.res.tmp.zip)
2280 $(hide) $(call add-java-resources-to,$@.res.tmp.zip)
Yohann Roussel5dd3e1d2015-01-14 16:21:39 +01002281 $(hide) unzip -qo $@.res.tmp.zip -d $@.res.tmp
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002282 $(hide) rm $@.res.tmp.zip)
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002283$(hide) if [ -s $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \
2284 export tmpEcjArg="@$(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq"; \
2285else \
2286 export tmpEcjArg=""; \
2287fi; \
Yohann Roussel6528ea32015-10-12 18:02:51 +02002288$(call call-jack) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002289 $(strip $(PRIVATE_JACK_FLAGS)) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002290 $(if $(NO_OPTIMIZE_DX), \
2291 -D jack.dex.optimize="false") \
2292 $(addprefix --classpath ,$(strip \
Yohann Rousselae2fc812016-04-21 16:49:10 +02002293 $(call normalize-path-list,$(PRIVATE_JACK_SHARED_LIBRARIES)))) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002294 $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002295 $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002296 -D jack.import.resource.policy=keep-first \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002297 -D jack.import.type.policy=keep-first \
Yohann Rousselc6383d62016-03-09 17:19:58 +01002298 -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
Yohann Roussel37822c42015-01-09 10:36:40 +01002299 $(if $(PRIVATE_JACK_INCREMENTAL_DIR),--incremental-folder $(PRIVATE_JACK_INCREMENTAL_DIR)) \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002300 --output-jack $@ \
2301 $(addprefix --config-jarjar ,$(strip $(PRIVATE_JARJAR_RULES))) \
2302 $(if $(PRIVATE_JACK_PROGUARD_FLAGS),--config-proguard $@.flags) \
2303 $$tmpEcjArg \
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002304 || ( rm -f $@ ; exit 41 )
2305$(hide) rm -f $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list
2306$(if $(PRIVATE_EXTRA_JAR_ARGS),$(hide) rm -rf $@.res.tmp)
2307$(hide) mv $(PRIVATE_JACK_INTERMEDIATES_DIR)/java-source-list-uniq $(PRIVATE_JACK_INTERMEDIATES_DIR).java-source-list
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002308$(if $(PRIVATE_JAR_PACKAGES), $(hide) echo unsupported options PRIVATE_JAR_PACKAGES in $@; exit 53)
2309$(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) echo unsupported options JAR_EXCLUDE_PACKAGES in $@; exit 53)
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002310$(if $(PRIVATE_JAR_MANIFEST), $(hide) echo unsupported options JAR_MANIFEST in $@; exit 53)
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002311endef
2312
The Android Open Source Project88b60792009-03-03 19:28:42 -08002313define transform-classes.jar-to-emma
2314$(hide) java -classpath $(EMMA_JAR) emma instr -outmode fullcopy -outfile \
Guang Zhu155afe32010-03-10 15:48:03 -08002315 $(PRIVATE_EMMA_COVERAGE_FILE) -ip $< -d $(PRIVATE_EMMA_INTERMEDIATES_DIR) \
Guang Zhu9cd3d8c2010-06-15 13:31:25 -07002316 $(addprefix -ix , $(PRIVATE_EMMA_COVERAGE_FILTER))
The Android Open Source Project88b60792009-03-03 19:28:42 -08002317endef
2318
The Android Open Source Project88b60792009-03-03 19:28:42 -08002319# Create a mostly-empty .jar file that we'll add to later.
2320# The MacOS jar tool doesn't like creating empty jar files,
2321# so we need to give it something.
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002322# $(1) package to create
2323define create-empty-package-at
2324@mkdir -p $(dir $(1))
Ying Wangc894e092015-02-26 10:34:33 -08002325$(hide) touch $(dir $(1))zipdummy
2326$(hide) (cd $(dir $(1)) && jar cf $(notdir $(1)) zipdummy)
2327$(hide) zip -qd $(1) zipdummy
2328$(hide) rm $(dir $(1))zipdummy
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002329endef
2330
2331# Create a mostly-empty .jar file that we'll add to later.
2332# The MacOS jar tool doesn't like creating empty jar files,
2333# so we need to give it something.
The Android Open Source Project88b60792009-03-03 19:28:42 -08002334define create-empty-package
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002335$(call create-empty-package-at,$@)
The Android Open Source Project88b60792009-03-03 19:28:42 -08002336endef
2337
2338#TODO: we kinda want to build different asset packages for
2339# different configurations, then combine them later (or something).
2340# Per-locale, etc.
2341# A list of dynamic and static parameters; build layers for
2342# dynamic params that lay over the static ones.
2343#TODO: update the manifest to point to the package file
Dianne Hackborn9bd54042009-05-15 18:01:20 -07002344#Note that the version numbers are given to aapt as simple default
2345#values; applications can override these by explicitly stating
2346#them in their manifest.
The Android Open Source Project88b60792009-03-03 19:28:42 -08002347define add-assets-to-package
Ying Wangc61d5932010-03-10 16:02:42 -08002348$(hide) $(AAPT) package -u $(PRIVATE_AAPT_FLAGS) \
Ying Wang4f1ab922011-03-15 13:19:30 -07002349 $(addprefix -c , $(PRIVATE_PRODUCT_AAPT_CONFIG)) \
Adam Lesinski2d1718a2014-05-09 10:57:48 -07002350 $(addprefix --preferred-density , $(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \
The Android Open Source Project88b60792009-03-03 19:28:42 -08002351 $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
2352 $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \
2353 $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
2354 $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
Ying Wangbb9c2302011-04-08 17:27:35 -07002355 $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
2356 $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
Ying Wangf39752e2014-03-20 17:28:57 -07002357 $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(TARGET_AAPT_CHARACTERISTICS))) \
Colin Crossf37b4552015-07-16 17:15:19 -07002358 $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
Ying Wangd75d8932015-09-19 10:56:35 -07002359 $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
Jeff Hamiltonbb67d212010-02-05 22:36:42 -06002360 $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
Ying Wang3dae0ee2010-09-02 15:41:01 -07002361 $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
Adrian Roos6784cae2015-06-01 18:24:41 -07002362 --skip-symbols-without-default-localization \
The Android Open Source Project88b60792009-03-03 19:28:42 -08002363 -F $@
2364endef
2365
Ying Wang8e20ef62014-06-24 20:01:52 -07002366# We need the extra blank line, so that the command will be on a separate line.
2367# $(1): the ABI name
2368# $(2): the list of shared libraies
2369define _add-jni-shared-libs-to-package-per-abi
2370$(hide) cp $(2) $(dir $@)lib/$(1)
2371
2372endef
2373
Ying Wang1f8964d2015-07-15 18:33:24 -07002374# For apps_only build, don't uncompress/page-align the jni libraries,
2375# because the apk may be run on older platforms that don't support loading jni directly from apk.
2376ifdef TARGET_BUILD_APPS
2377JNI_COMPRESS_FLAGS :=
2378ZIPALIGN_PAGE_ALIGN_FLAGS :=
2379else
2380JNI_COMPRESS_FLAGS := -0
2381ZIPALIGN_PAGE_ALIGN_FLAGS := -p
2382endif
2383
The Android Open Source Project88b60792009-03-03 19:28:42 -08002384define add-jni-shared-libs-to-package
2385$(hide) rm -rf $(dir $@)lib
Ying Wang8e20ef62014-06-24 20:01:52 -07002386$(hide) mkdir -p $(addprefix $(dir $@)lib/,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI))
2387$(foreach abi,$(PRIVATE_JNI_SHARED_LIBRARIES_ABI),\
2388 $(call _add-jni-shared-libs-to-package-per-abi,$(abi),\
2389 $(patsubst $(abi):%,%,$(filter $(abi):%,$(PRIVATE_JNI_SHARED_LIBRARIES)))))
Dan Willemsen48a621c2015-10-29 16:33:05 -07002390$(hide) (cd $(dir $@) && zip -qrX $(JNI_COMPRESS_FLAGS) $(notdir $@) lib)
The Android Open Source Project88b60792009-03-03 19:28:42 -08002391$(hide) rm -rf $(dir $@)lib
2392endef
2393
The Android Open Source Project88b60792009-03-03 19:28:42 -08002394#TODO: update the manifest to point to the dex file
2395define add-dex-to-package
Ying Wangfbc5b9f2016-03-11 10:32:01 -08002396$(call add-dex-to-package-arg,$@)
2397endef
2398
2399# $(1): the package file.
2400define add-dex-to-package-arg
2401$(hide) find $(dir $(PRIVATE_DEX_FILE)) -maxdepth 1 -name "classes*.dex" | sort | xargs zip -qjX $(1)
The Android Open Source Project88b60792009-03-03 19:28:42 -08002402endef
2403
Ying Wang85480622012-08-09 15:20:50 -07002404# Add java resources added by the current module.
Yohann Roussel22c3fa62014-11-19 14:01:06 +01002405# $(1) destination package
2406#
2407define add-java-resources-to
2408$(call dump-words-to-file, $(PRIVATE_EXTRA_JAR_ARGS), $(1).jar-arg-list)
2409$(hide) jar uf $(1) @$(1).jar-arg-list
2410@rm -f $(1).jar-arg-list
2411endef
2412
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002413# Add resources carried by static Jack libraries.
2414#
2415define add-carried-jack-resources
2416 $(hide) if [ -d $(PRIVATE_JACK_INTERMEDIATES_DIR) ] ; then \
Yohann Roussel94f86f82015-11-12 12:21:42 +01002417 find $(PRIVATE_JACK_INTERMEDIATES_DIR) -type f | sort \
Ying Wang3a562a92015-10-13 18:40:37 -07002418 | sed -e "s?^$(PRIVATE_JACK_INTERMEDIATES_DIR)/? -C \"$(PRIVATE_JACK_INTERMEDIATES_DIR)\" \"?" -e "s/$$/\"/" \
2419 > $(dir $@)jack_res_jar_flags; \
2420 if [ -s $(dir $@)jack_res_jar_flags ] ; then \
2421 jar uf $@ @$(dir $@)jack_res_jar_flags; \
Yohann Rousselb4c49cb2014-09-08 14:45:14 +02002422 fi; \
2423fi
2424endef
2425
Alex Klyubin2cfd1d12016-01-13 10:32:47 -08002426# Returns the minSdkVersion of the specified APK as a decimal number. If the
2427# version is a codename, returns the current platform SDK version (always a
2428# decimal number) instead. If the APK does not specify a minSdkVersion, returns
2429# 0 to match how the Android platform interprets this situation at runtime.
2430#
2431define get-package-min-sdk-version-int
2432$$(($(AAPT) dump badging $(1) 2>&1 | grep '^sdkVersion' || echo "sdkVersion:'0'") \
2433 | cut -d"'" -f2 | \
2434 sed -e s/^$(PLATFORM_VERSION_CODENAME)$$/$(PLATFORM_SDK_VERSION)/)
2435endef
2436
The Android Open Source Project88b60792009-03-03 19:28:42 -08002437# Sign a package using the specified key/cert.
2438#
2439define sign-package
Ying Wangfbc5b9f2016-03-11 10:32:01 -08002440$(call sign-package-arg,$@)
2441endef
2442
2443# $(1): the package file we are signing.
2444define sign-package-arg
2445$(hide) mv $(1) $(1).unsigned
Alex Klyubin9667b182015-12-10 13:38:50 -08002446$(hide) java -Djava.library.path=$(SIGNAPK_JNI_LIBRARY_PATH) -jar $(SIGNAPK_JAR) \
Alex Klyubin2cfd1d12016-01-13 10:32:47 -08002447 --min-sdk-version $(call get-package-min-sdk-version-int,$@.unsigned) \
Ying Wang31df0682012-11-13 10:55:28 -08002448 $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \
Ying Wangfbc5b9f2016-03-11 10:32:01 -08002449 $(PRIVATE_ADDITIONAL_CERTIFICATES) $(1).unsigned $(1).signed
2450$(hide) mv $(1).signed $(1)
The Android Open Source Project88b60792009-03-03 19:28:42 -08002451endef
2452
Dmitriy Ivanov13e59652014-07-23 15:27:21 -07002453# Align STORED entries of a package on 4-byte boundaries to make them easier to mmap.
The Android Open Source Project88b60792009-03-03 19:28:42 -08002454#
2455define align-package
2456$(hide) mv $@ $@.unaligned
Dmitriy Ivanov13e59652014-07-23 15:27:21 -07002457$(hide) $(ZIPALIGN) \
Ying Wang1f8964d2015-07-15 18:33:24 -07002458 -f \
2459 $(ZIPALIGN_PAGE_ALIGN_FLAGS) \
Dmitriy Ivanov13e59652014-07-23 15:27:21 -07002460 4 \
2461 $@.unaligned $@.aligned
The Android Open Source Project88b60792009-03-03 19:28:42 -08002462$(hide) mv $@.aligned $@
2463endef
2464
Dan Willemsen48a621c2015-10-29 16:33:05 -07002465# Remove dynamic timestamps from packages
2466#
2467define remove-timestamps-from-package
2468$(hide) $(ZIPTIME) $@
2469endef
2470
Ying Wang1fb01522015-05-01 14:02:26 -07002471# Uncompress shared libraries embedded in an apk.
2472#
Nick Kralevich5aa02232015-04-17 16:53:15 -07002473define uncompress-shared-libs
Ying Wang1fb01522015-05-01 14:02:26 -07002474$(hide) if unzip -l $@ $(PRIVATE_EMBEDDED_JNI_LIBS) >/dev/null ; then \
2475 rm -rf $(dir $@)uncompressedlibs && mkdir $(dir $@)uncompressedlibs; \
2476 unzip $@ $(PRIVATE_EMBEDDED_JNI_LIBS) -d $(dir $@)uncompressedlibs && \
2477 zip -d $@ 'lib/*.so' && \
Dan Willemsen5c64b4e2015-11-11 18:20:37 -08002478 ( cd $(dir $@)uncompressedlibs && find lib -type f | sort | zip -D -X -0 ../$(notdir $@) -@ ) && \
Ying Wang1fb01522015-05-01 14:02:26 -07002479 rm -rf $(dir $@)uncompressedlibs; \
2480 fi
Nick Kralevich5aa02232015-04-17 16:53:15 -07002481endef
2482
The Android Open Source Project88b60792009-03-03 19:28:42 -08002483# TODO(joeo): If we can ever upgrade to post 3.81 make and get the
2484# new prebuilt rules to work, we should change this to copy the
2485# resources to the out directory and then copy the resources.
2486
Brian Carlstrom78269512010-12-10 12:10:24 -08002487# Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR
2488# in transform-java-to-classes for the sake of vm-tests.
The Android Open Source Project88b60792009-03-03 19:28:42 -08002489define transform-host-java-to-package
Dan Willemsen057aaea2015-08-14 12:59:50 -07002490@echo "$($(PRIVATE_PREFIX)DISPLAY) Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))"
Ying Wang015edd22011-01-20 15:01:56 -08002491$(call compile-java,$(HOST_JAVAC),$(PRIVATE_BOOTCLASSPATH))
The Android Open Source Project88b60792009-03-03 19:28:42 -08002492endef
2493
2494###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -08002495## Commands for copying files
2496###########################################################
2497
2498# Define a rule to copy a header. Used via $(eval) by copy_headers.make.
2499# $(1): source header
2500# $(2): destination header
2501define copy-one-header
2502$(2): $(1)
2503 @echo "Header: $$@"
2504 $$(copy-file-to-new-target-with-cp)
2505endef
2506
2507# Define a rule to copy a file. For use via $(eval).
2508# $(1): source file
2509# $(2): destination file
2510define copy-one-file
Dan Willemsenf1a98af2016-02-29 12:45:18 -08002511$(2): $(1)
The Android Open Source Project88b60792009-03-03 19:28:42 -08002512 @echo "Copy: $$@"
2513 $$(copy-file-to-target)
2514endef
2515
Joe Onoratoe44705a2012-05-17 17:12:04 -07002516# Copies many files.
2517# $(1): The files to copy. Each entry is a ':' separated src:dst pair
2518# Evaluates to the list of the dst files (ie suitable for a dependency list)
2519define copy-many-files
2520$(foreach f, $(1), $(strip \
2521 $(eval _cmf_tuple := $(subst :, ,$(f))) \
2522 $(eval _cmf_src := $(word 1,$(_cmf_tuple))) \
2523 $(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \
2524 $(eval $(call copy-one-file,$(_cmf_src),$(_cmf_dest))) \
2525 $(_cmf_dest)))
2526endef
2527
Ying Wang3ceecfa2012-05-14 14:39:00 -07002528# Copy the file only if it's a well-formed xml file. For use via $(eval).
2529# $(1): source file
2530# $(2): destination file, must end with .xml.
2531define copy-xml-file-checked
Dan Willemsen7f016152016-02-29 17:52:39 -08002532$(2): $(1)
Ying Wang3ceecfa2012-05-14 14:39:00 -07002533 @echo "Copy xml: $$@"
2534 $(hide) xmllint $$< >/dev/null # Don't print the xml file to stdout.
2535 $$(copy-file-to-target)
2536endef
2537
The Android Open Source Project88b60792009-03-03 19:28:42 -08002538# The -t option to acp and the -p option to cp is
2539# required for OSX. OSX has a ridiculous restriction
2540# where it's an error for a .a file's modification time
2541# to disagree with an internal timestamp, and this
2542# macro is used to install .a files (among other things).
2543
2544# Copy a single file from one place to another,
2545# preserving permissions and overwriting any existing
2546# file.
Dan Willemsenf1a98af2016-02-29 12:45:18 -08002547# When we used acp, it could not handle high resolution timestamps
2548# on file systems like ext4. Because of that, '-t' option was disabled
2549# and copy-file-to-target was identical to copy-file-to-new-target.
2550# Keep the behavior until we audit and ensure that switching this back
2551# won't break anything.
The Android Open Source Project88b60792009-03-03 19:28:42 -08002552define copy-file-to-target
2553@mkdir -p $(dir $@)
Dan Willemsen3545eeb2016-02-29 12:45:18 -08002554$(hide) rm -f $@
Dan Willemsenf1a98af2016-02-29 12:45:18 -08002555$(hide) cp $< $@
The Android Open Source Project88b60792009-03-03 19:28:42 -08002556endef
2557
2558# The same as copy-file-to-target, but use the local
2559# cp command instead of acp.
2560define copy-file-to-target-with-cp
2561@mkdir -p $(dir $@)
Dan Willemsen3545eeb2016-02-29 12:45:18 -08002562$(hide) rm -f $@
2563$(hide) cp -p $< $@
The Android Open Source Project88b60792009-03-03 19:28:42 -08002564endef
2565
Dianne Hackborn9c0c4b72009-08-11 19:16:46 -07002566# The same as copy-file-to-target, but use the zipalign tool to do so.
2567define copy-file-to-target-with-zipalign
2568@mkdir -p $(dir $@)
Dan Willemsen3545eeb2016-02-29 12:45:18 -08002569$(hide) rm -f $@
Dianne Hackborn9c0c4b72009-08-11 19:16:46 -07002570$(hide) $(ZIPALIGN) -f 4 $< $@
2571endef
2572
Doug Zongker1046d202009-08-06 13:02:19 -07002573# The same as copy-file-to-target, but strip out "# comment"-style
2574# comments (for config files and such).
2575define copy-file-to-target-strip-comments
2576@mkdir -p $(dir $@)
Dan Willemsen3545eeb2016-02-29 12:45:18 -08002577$(hide) rm -f $@
Doug Zongker1046d202009-08-06 13:02:19 -07002578$(hide) sed -e 's/#.*$$//' -e 's/[ \t]*$$//' -e '/^$$/d' < $< > $@
2579endef
2580
The Android Open Source Project88b60792009-03-03 19:28:42 -08002581# The same as copy-file-to-target, but don't preserve
2582# the old modification time.
2583define copy-file-to-new-target
2584@mkdir -p $(dir $@)
Dan Willemsen3545eeb2016-02-29 12:45:18 -08002585$(hide) rm -f $@
Dan Willemsenf1a98af2016-02-29 12:45:18 -08002586$(hide) cp $< $@
The Android Open Source Project88b60792009-03-03 19:28:42 -08002587endef
2588
2589# The same as copy-file-to-new-target, but use the local
2590# cp command instead of acp.
2591define copy-file-to-new-target-with-cp
2592@mkdir -p $(dir $@)
Dan Willemsen3545eeb2016-02-29 12:45:18 -08002593$(hide) rm -f $@
2594$(hide) cp $< $@
The Android Open Source Project88b60792009-03-03 19:28:42 -08002595endef
2596
2597# Copy a prebuilt file to a target location.
2598define transform-prebuilt-to-target
2599@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)"
2600$(copy-file-to-target)
2601endef
2602
Dianne Hackborn9c0c4b72009-08-11 19:16:46 -07002603# Copy a prebuilt file to a target location, using zipalign on it.
2604define transform-prebuilt-to-target-with-zipalign
2605@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK: $(PRIVATE_MODULE) ($@)"
2606$(copy-file-to-target-with-zipalign)
2607endef
2608
Doug Zongker1046d202009-08-06 13:02:19 -07002609# Copy a prebuilt file to a target location, stripping "# comment" comments.
2610define transform-prebuilt-to-target-strip-comments
2611@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)"
2612$(copy-file-to-target-strip-comments)
2613endef
2614
Ying Wangc45a47b2015-04-08 12:24:37 -07002615# Copy a list of files/directories to target location, with sub dir structure preserved.
2616# For example $(HOST_OUT_EXECUTABLES)/aapt -> $(staging)/bin/aapt .
2617# $(1): the source list of files/directories.
2618# $(2): the path prefix to strip. In the above example it would be $(HOST_OUT).
2619# $(3): the target location.
2620define copy-files-with-structure
2621$(foreach t,$(1),\
2622 $(eval s := $(patsubst $(2)%,%,$(t)))\
2623 $(hide) mkdir -p $(dir $(3)/$(s)); cp -Rf $(t) $(3)/$(s)$(newline))
2624endef
2625
Dan Willemsendb16dd22016-05-16 14:41:49 -07002626###########################################################
Ying Wang3b2bdf12010-02-01 09:51:23 -08002627## Commands to call Proguard
2628###########################################################
Ying Wang3b2bdf12010-02-01 09:51:23 -08002629define transform-jar-to-proguard
Ying Wang7311a342013-08-21 18:32:49 -07002630@echo Proguard: $@
Mihail Dumitrescu4df82b32014-02-07 15:18:59 +00002631$(hide) $(PROGUARD) -injars $< -outjars $@ $(PRIVATE_PROGUARD_FLAGS) \
2632 $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR))
Ying Wang3b2bdf12010-02-01 09:51:23 -08002633endef
2634
Ying Wang3b2bdf12010-02-01 09:51:23 -08002635###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -08002636## Stuff source generated from one-off tools
2637###########################################################
2638
2639define transform-generated-source
2640@echo "target Generated: $(PRIVATE_MODULE) <= $<"
2641@mkdir -p $(dir $@)
2642$(hide) $(PRIVATE_CUSTOM_TOOL)
2643endef
2644
2645
2646###########################################################
2647## Assertions about attributes of the target
2648###########################################################
2649
2650# $(1): The file to check
2651ifndef get-file-size
2652$(error HOST_OS must define get-file-size)
2653endif
2654
Doug Zongker4647f122009-07-02 09:00:54 -07002655# Convert a partition data size (eg, as reported in /proc/mtd) to the
2656# size of the image used to flash that partition (which includes a
Lars Svensson9cb8c282010-12-06 15:24:58 +01002657# spare area for each page).
Doug Zongker4647f122009-07-02 09:00:54 -07002658# $(1): the partition data size
2659define image-size-from-data-size
Ying Wang4a2ecaf2011-02-09 17:24:27 -08002660$(strip $(eval _isfds_value := $$(shell echo $$$$(($(1) / $(BOARD_NAND_PAGE_SIZE) * \
2661 ($(BOARD_NAND_PAGE_SIZE)+$(BOARD_NAND_SPARE_SIZE))))))\
2662$(if $(filter 0, $(_isfds_value)),$(shell echo $$(($(BOARD_NAND_PAGE_SIZE)+$(BOARD_NAND_SPARE_SIZE)))),$(_isfds_value))\
2663$(eval _isfds_value :=))
Doug Zongker4647f122009-07-02 09:00:54 -07002664endef
2665
2666# $(1): The file(s) to check (often $@)
JP Abgrall0ed7cec2014-06-16 14:19:36 -07002667# $(2): The maximum total image size, in decimal bytes.
2668# Make sure to take into account any reserved space needed for the FS.
The Android Open Source Project88b60792009-03-03 19:28:42 -08002669#
2670# If $(2) is empty, evaluates to "true"
2671#
2672# Reserve bad blocks. Make sure that MAX(1% of partition size, 2 blocks)
2673# is left over after the image has been flashed. Round the 1% up to the
2674# next whole flash block size.
2675define assert-max-file-size
2676$(if $(2), \
Doug Zongker742fa572009-07-08 12:09:04 -07002677 size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); \
2678 total=$$(( $$( echo "$$size" ) )); \
Doug Zongker4647f122009-07-02 09:00:54 -07002679 printname=$$(echo -n "$(1)" | tr " " +); \
Doug Zongker4647f122009-07-02 09:00:54 -07002680 img_blocksize=$(call image-size-from-data-size,$(BOARD_FLASH_BLOCK_SIZE)); \
2681 twoblocks=$$((img_blocksize * 2)); \
2682 onepct=$$((((($(2) / 100) - 1) / img_blocksize + 1) * img_blocksize)); \
JP Abgrall0ed7cec2014-06-16 14:19:36 -07002683 reserve=$$((twoblocks > onepct ? twoblocks : onepct)); \
Doug Zongker4647f122009-07-02 09:00:54 -07002684 maxsize=$$(($(2) - reserve)); \
Ying Wang99bcbeb2011-12-02 10:34:45 -08002685 echo "$$printname maxsize=$$maxsize blocksize=$$img_blocksize total=$$total reserve=$$reserve"; \
Doug Zongker4647f122009-07-02 09:00:54 -07002686 if [ "$$total" -gt "$$maxsize" ]; then \
2687 echo "error: $$printname too large ($$total > [$(2) - $$reserve])"; \
2688 false; \
Doug Zongker742fa572009-07-08 12:09:04 -07002689 elif [ "$$total" -gt $$((maxsize - 32768)) ]; then \
Doug Zongker4647f122009-07-02 09:00:54 -07002690 echo "WARNING: $$printname approaching size limit ($$total now; limit $$maxsize)"; \
The Android Open Source Project88b60792009-03-03 19:28:42 -08002691 fi \
2692 , \
2693 true \
2694 )
2695endef
2696
Doug Zongker8510a1e2009-08-07 16:38:08 -07002697# Like assert-max-file-size, but the second argument is a partition
2698# size, which we'll convert to a max image size before checking it
2699# against the files.
2700#
2701# $(1): The file(s) to check (often $@)
2702# $(2): The partition size.
2703define assert-max-image-size
2704$(if $(2), \
JP Abgrall0ed7cec2014-06-16 14:19:36 -07002705 $(call assert-max-file-size,$(1),$(call image-size-from-data-size,$(2))))
Doug Zongker8510a1e2009-08-07 16:38:08 -07002706endef
2707
Doug Zongkere01100c2009-06-19 17:12:18 -07002708
2709###########################################################
2710## Define device-specific radio files
2711###########################################################
Ying Wang94de1eb2013-07-26 12:19:20 -07002712INSTALLED_RADIOIMAGE_TARGET :=
Doug Zongkere01100c2009-06-19 17:12:18 -07002713
2714# Copy a radio image file to the output location, and add it to
2715# INSTALLED_RADIOIMAGE_TARGET.
2716# $(1): filename
2717define add-radio-file
Doug Zongker14833602010-02-02 13:12:04 -08002718 $(eval $(call add-radio-file-internal,$(1),$(notdir $(1))))
Doug Zongkere01100c2009-06-19 17:12:18 -07002719endef
2720define add-radio-file-internal
Doug Zongker14833602010-02-02 13:12:04 -08002721INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2)
Dan Willemsen7f016152016-02-29 17:52:39 -08002722$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1)
Doug Zongkere01100c2009-06-19 17:12:18 -07002723 $$(transform-prebuilt-to-target)
2724endef
2725
Doug Zongker9296f092012-03-20 16:42:22 -07002726# Version of add-radio-file that also arranges for the version of the
2727# file to be checked against the contents of
2728# $(TARGET_BOARD_INFO_FILE).
2729# $(1): filename
2730# $(2): name of version variable in board-info (eg, "version-baseband")
2731define add-radio-file-checked
2732 $(eval $(call add-radio-file-checked-internal,$(1),$(notdir $(1)),$(2)))
2733endef
2734define add-radio-file-checked-internal
2735INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2)
2736BOARD_INFO_CHECK += $(3):$(LOCAL_PATH)/$(1)
Dan Willemsen7f016152016-02-29 17:52:39 -08002737$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1)
Doug Zongker9296f092012-03-20 16:42:22 -07002738 $$(transform-prebuilt-to-target)
2739endef
2740
Doug Zongkere01100c2009-06-19 17:12:18 -07002741
The Android Open Source Project88b60792009-03-03 19:28:42 -08002742###########################################################
Joe Onorato899e62a2010-02-04 17:37:21 -08002743# Override the package defined in $(1), setting the
2744# variables listed below differently.
2745#
2746# $(1): The makefile to override (relative to the source
2747# tree root)
2748# $(2): Old LOCAL_PACKAGE_NAME value.
2749# $(3): New LOCAL_PACKAGE_NAME value.
Ying Wang3dae0ee2010-09-02 15:41:01 -07002750# $(4): New LOCAL_MANIFEST_PACKAGE_NAME value.
2751# $(5): New LOCAL_CERTIFICATE value.
2752# $(6): New LOCAL_INSTRUMENTATION_FOR value.
2753# $(7): New LOCAL_MANIFEST_INSTRUMENTATION_FOR value.
Joe Onorato899e62a2010-02-04 17:37:21 -08002754#
2755# Note that LOCAL_PACKAGE_OVERRIDES is NOT cleared in
2756# clear_vars.mk.
2757###########################################################
2758define inherit-package
Ying Wang3dae0ee2010-09-02 15:41:01 -07002759 $(eval $(call inherit-package-internal,$(1),$(2),$(3),$(4),$(5),$(6),$(7)))
Joe Onorato899e62a2010-02-04 17:37:21 -08002760endef
2761
2762define inherit-package-internal
2763 LOCAL_PACKAGE_OVERRIDES \
Ying Wang3dae0ee2010-09-02 15:41:01 -07002764 := $(strip $(1))||$(strip $(2))||$(strip $(3))||$(strip $(4))||&&$(strip $(5))||&&$(strip $(6))||&&$(strip $(7)) $(LOCAL_PACKAGE_OVERRIDES)
Joe Onorato899e62a2010-02-04 17:37:21 -08002765 include $(1)
2766 LOCAL_PACKAGE_OVERRIDES \
2767 := $(wordlist 1,$(words $(LOCAL_PACKAGE_OVERRIDES)), $(LOCAL_PACKAGE_OVERRIDES))
2768endef
2769
2770# To be used with inherit-package above
2771# Evalutes to true if the package was overridden
2772define set-inherited-package-variables
2773$(strip $(call set-inherited-package-variables-internal))
2774endef
2775
2776define keep-or-override
2777$(eval $(1) := $(if $(2),$(2),$($(1))))
2778endef
2779
2780define set-inherited-package-variables-internal
2781 $(eval _o := $(subst ||, ,$(lastword $(LOCAL_PACKAGE_OVERRIDES))))
2782 $(eval _n := $(subst ||, ,$(firstword $(LOCAL_PACKAGE_OVERRIDES))))
2783 $(if $(filter $(word 2,$(_n)),$(LOCAL_PACKAGE_NAME)), \
2784 $(eval LOCAL_PACKAGE_NAME := $(word 3,$(_o))) \
2785 $(eval LOCAL_MANIFEST_PACKAGE_NAME := $(word 4,$(_o))) \
Ying Wang3dae0ee2010-09-02 15:41:01 -07002786 $(call keep-or-override,LOCAL_CERTIFICATE,$(patsubst &&%,%,$(word 5,$(_o)))) \
2787 $(call keep-or-override,LOCAL_INSTRUMENTATION_FOR,$(patsubst &&%,%,$(word 6,$(_o)))) \
2788 $(call keep-or-override,LOCAL_MANIFEST_INSTRUMENTATION_FOR,$(patsubst &&%,%,$(word 7,$(_o)))) \
Joe Onorato899e62a2010-02-04 17:37:21 -08002789 $(eval LOCAL_OVERRIDES_PACKAGES := $(sort $(LOCAL_OVERRIDES_PACKAGES) $(word 2,$(_o)))) \
2790 true \
2791 ,)
2792endef
2793
Ying Wang000e89a2012-04-30 15:48:27 -07002794###########################################################
Ying Wangc065da22012-11-14 15:57:07 -08002795## API Check
2796###########################################################
2797
2798# eval this to define a rule that runs apicheck.
2799#
2800# Args:
2801# $(1) target
2802# $(2) stable api file
2803# $(3) api file to be tested
Hui Shuec21c582014-03-13 16:21:08 -07002804# $(4) stable removed api file
Hui Shue8af17e2014-02-21 14:18:19 -08002805# $(5) removed api file to be tested
2806# $(6) arguments for apicheck
2807# $(7) command to run if apicheck failed
2808# $(8) target dependent on this api check
2809# $(9) additional dependencies
Ying Wangc065da22012-11-14 15:57:07 -08002810define check-api
Hui Shuec21c582014-03-13 16:21:08 -07002811$(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp: $(2) $(3) $(4) $(APICHECK) $(9)
Ying Wangc065da22012-11-14 15:57:07 -08002812 @echo "Checking API:" $(1)
Hui Shue8af17e2014-02-21 14:18:19 -08002813 $(hide) ( $(APICHECK_COMMAND) $(6) $(2) $(3) $(4) $(5) || ( $(7) ; exit 38 ) )
Ying Wangc065da22012-11-14 15:57:07 -08002814 $(hide) mkdir -p $$(dir $$@)
2815 $(hide) touch $$@
Hui Shue8af17e2014-02-21 14:18:19 -08002816$(8): $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp
Ying Wangc065da22012-11-14 15:57:07 -08002817endef
2818
Ying Wang63d94fa2012-12-13 18:23:01 -08002819## Whether to build from source if prebuilt alternative exists
2820###########################################################
2821# $(1): module name
2822# $(2): LOCAL_PATH
2823# Expands to empty string if not from source.
2824ifeq (true,$(ANDROID_BUILD_FROM_SOURCE))
2825define if-build-from-source
2826true
2827endef
2828else
2829define if-build-from-source
2830$(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \
2831 $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true)
2832endef
2833endif
2834
2835# Include makefile $(1) if build from source for module $(2)
2836# $(1): the makefile to include
2837# $(2): module name
2838# $(3): LOCAL_PATH
2839define include-if-build-from-source
2840$(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1)))
2841endef
2842
Ying Wanga6a6c352014-09-26 10:41:27 -07002843# Return the arch for the source file of a prebuilt
Chih-Wei Huang74ccefb2015-10-05 00:28:47 +08002844# Return "none" if no matching arch found and return empty
2845# if the input is empty, so the result can be passed to
Ying Wanga6a6c352014-09-26 10:41:27 -07002846# LOCAL_MODULE_TARGET_ARCH.
Ying Wangc0adfb72014-02-27 14:10:53 -08002847# $(1) the list of archs supported by the prebuilt
2848define get-prebuilt-src-arch
2849$(strip $(if $(filter $(TARGET_ARCH),$(1)),$(TARGET_ARCH),\
Chih-Wei Huang74ccefb2015-10-05 00:28:47 +08002850 $(if $(filter $(TARGET_2ND_ARCH),$(1)),$(TARGET_2ND_ARCH),$(if $(1),none))))
Ying Wangc0adfb72014-02-27 14:10:53 -08002851endef
2852
Ying Wangc065da22012-11-14 15:57:07 -08002853###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -08002854## Other includes
2855###########################################################
2856
2857# -----------------------------------------------------------------
2858# Rules and functions to help copy important files to DIST_DIR
2859# when requested.
2860include $(BUILD_SYSTEM)/distdir.mk
2861
Marie Lennerhagen9e5efce2010-10-20 13:41:59 +02002862# Include any vendor specific definitions.mk file
2863-include $(TOPDIR)vendor/*/build/core/definitions.mk
Andrew Boie388c04d2014-10-28 08:32:11 -07002864-include $(TOPDIR)device/*/build/core/definitions.mk
Lee Campbell04ba3122015-08-20 15:39:56 -07002865-include $(TOPDIR)product/*/build/core/definitions.mk
Marie Lennerhagen9e5efce2010-10-20 13:41:59 +02002866
The Android Open Source Project88b60792009-03-03 19:28:42 -08002867# broken:
2868# $(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file)))
2869
2870###########################################################
2871## Misc notes
2872###########################################################
2873
2874#DEPDIR = .deps
2875#df = $(DEPDIR)/$(*F)
2876
2877#SRCS = foo.c bar.c ...
2878
2879#%.o : %.c
2880# @$(MAKEDEPEND); \
2881# cp $(df).d $(df).P; \
2882# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
2883# -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \
2884# rm -f $(df).d
2885# $(COMPILE.c) -o $@ $<
2886
2887#-include $(SRCS:%.c=$(DEPDIR)/%.P)
2888
2889
2890#%.o : %.c
2891# $(COMPILE.c) -MD -o $@ $<
2892# @cp $*.d $*.P; \
2893# sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
2894# -e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
2895# rm -f $*.d