definitions.mk revision 544ecbef57ecf42fbe8a99a1a6cd6816a347f587
148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Copyright (C) 2009 The Android Open Source Project
248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Licensed under the Apache License, Version 2.0 (the "License");
448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# you may not use this file except in compliance with the License.
548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# You may obtain a copy of the License at
648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#      http://www.apache.org/licenses/LICENSE-2.0
848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Unless required by applicable law or agreed to in writing, software
1048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# distributed under the License is distributed on an "AS IS" BASIS,
1148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# See the License for the specific language governing permissions and
1348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# limitations under the License.
1448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
1548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Common definitions for the Android NDK build system
1648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
1748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
1848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# We use the GNU Make Standard Library
1935f944d26f33fff3e59ab449c991b18260a5fa0bDavid 'Digit' Turnerinclude $(NDK_ROOT)/build/gmsl/gmsl
2048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
2148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# If NDK_TRACE is enabled then calls to the library functions are
2248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# traced to stdout using warning messages with their arguments
2348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
2448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerifdef NDK_TRACE
2548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner__ndk_tr1 = $(warning $0('$1'))
2648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner__ndk_tr2 = $(warning $0('$1','$2'))
2748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner__ndk_tr3 = $(warning $0('$1','$2','$3'))
2848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerelse
2948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner__ndk_tr1 :=
3048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner__ndk_tr2 :=
3148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner__ndk_tr3 :=
3248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerendif
3348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
3448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
3548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : empty
3648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : an empty macro
3748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(empty)
3848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
3948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerempty :=
4048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
4148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
4248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : space
4348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : a single space
4448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(space)
4548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
4648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerspace  := $(empty) $(empty)
4748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
48bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turnerspace4 := $(space)$(space)$(space)$(space)
49bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner
5048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
5148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : last2
5248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: a list
5348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : the penultimate (next-to-last) element of a list
5448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call last2, <LIST>)
5548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
5648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerlast2 = $(word $(words $1), x $1)
5748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
5848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
5948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : last3
6048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: a list
6148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : the antepenultimate (second-next-to-last) element of a list
6248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call last3, <LIST>)
6348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
6448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerlast3 = $(word $(words $1), x x $1)
6548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
6648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
67bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# Function : remove-duplicates
68bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# Arguments: a list
69bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# Returns  : the list with duplicate items removed, order is preserved.
70bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# Usage    : $(call remove-duplicates, <LIST>)
71bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# Note     : This is equivalent to the 'uniq' function provided by GMSL,
72bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner#            however this implementation is non-recursive and *much*
73bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner#            faster. It will also not explode the stack with a lot of
74bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner#            items like 'uniq' does.
75bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# -----------------------------------------------------------------------------
76bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turnerremove-duplicates = $(strip \
77bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner  $(eval __uniq_ret :=) \
78bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner  $(foreach __uniq_item,$1,\
79bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner    $(if $(findstring $(__uniq_item),$(__uniq_ret)),,\
80bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner      $(eval __uniq_ret += $(__uniq_item))\
81bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner    )\
82bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner  )\
83bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner  $(__uniq_ret))
84bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner
85bafbfe8866f1016cc9c651d9e9ead21a0b7eb16eDavid 'Digit' Turner# -----------------------------------------------------------------------------
8648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : this-makefile
8748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : the name of the current Makefile in the inclusion stack
8848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(this-makefile)
8948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
9048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerthis-makefile = $(lastword $(MAKEFILE_LIST))
9148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
9248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
9348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : local-makefile
9448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : the name of the last parsed Android.mk file
9548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(local-makefile)
9648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
9748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerlocal-makefile = $(lastword $(filter %Android.mk,$(MAKEFILE_LIST)))
9848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
9948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
10048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : assert-defined
10148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: list of variable names
10248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
10348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call assert-defined, VAR1 VAR2 VAR3...)
10448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale: Checks that all variables listed in $1 are defined, or abort the
10548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            build
10648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
10748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerassert-defined = $(foreach __varname,$(strip $1),\
10848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(if $(strip $($(__varname))),,\
10948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner    $(call __ndk_error, Assertion failure: $(__varname) is not defined)\
11048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  )\
11148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner)
11248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
11348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
11448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : clear-vars
11548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: list of variable names
11648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            2: file where the variable should be defined
11748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
11848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call clear-vars, VAR1 VAR2 VAR3...)
11948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale: Clears/undefines all variables in argument list
12048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
12148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerclear-vars = $(foreach __varname,$1,$(eval $(__varname) := $(empty)))
12248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
12348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
12448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : check-required-vars
12548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: list of variable names
12648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            2: file where the variable(s) should be defined
12748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
12848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call check-required-vars, VAR1 VAR2 VAR3..., <file>)
12948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale: Checks that all required vars listed in $1 were defined by $2
13048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            or abort the build with an error
13148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
13248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnercheck-required-vars = $(foreach __varname,$1,\
13348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(if $(strip $($(__varname))),,\
13448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner    $(call __ndk_info, Required variable $(__varname) is not defined by $2)\
13548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner    $(call __ndk_error,Aborting)\
13648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  )\
13748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner)
13848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
1391579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# -----------------------------------------------------------------------------
1401579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Function : host-path
1411579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Arguments: 1: file path
1421579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Returns  : file path, as understood by the host file system
1431579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Usage    : $(call host-path,<path>)
1441579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Rationale: This function is used to translate Cygwin paths into
145462c63197acacd294d9835dd5afb6913058ea57aDavid 'Digit' Turner#            Cygwin-specific ones. On other platforms, it will just
1461579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner#            return its argument.
1471579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# -----------------------------------------------------------------------------
148462c63197acacd294d9835dd5afb6913058ea57aDavid 'Digit' Turnerifeq ($(HOST_OS),cygwin)
1491022d8d9fa56b2a82982e3ab56dc2b7576c0fb03David 'Digit' Turnerhost-path = $(if $(strip $1),$(call cygwin-to-host-path,$1))
1501579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerelse
1511579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerhost-path = $1
1521579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerendif
1531579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner
1541579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# -----------------------------------------------------------------------------
155ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Function : host-rm
156ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Arguments: 1: list of files
157ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Usage    : $(call host-rm,<files>)
158ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Rationale: This function expands to the host-specific shell command used
159ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            to remove some files.
160ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
161ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerifeq ($(HOST_OS),windows)
1625f4cab0bea0af60cf3fcb37fbd8bbd64461b575fDavid 'Digit' Turnerhost-rm = \
1634f2c24bb8f6aaadc376151ceb39975763a53e3ebAndrew Hsieh    $(eval __host_rm_files := $(foreach __host_rm_file,$1,$(subst /,\,$(wildcard $(__host_rm_file)))))\
1645f4cab0bea0af60cf3fcb37fbd8bbd64461b575fDavid 'Digit' Turner    $(if $(__host_rm_files),del /f/q $(__host_rm_files) >NUL 2>NUL)
165ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerelse
166ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerhost-rm = rm -f $1
167ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerendif
168ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
169ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
170ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Function : host-rmdir
171ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Arguments: 1: list of files or directories
172ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Usage    : $(call host-rm,<files>)
173ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Rationale: This function expands to the host-specific shell command used
174ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            to remove some files _and_ directories.
175ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
176ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerifeq ($(HOST_OS),windows)
1774f2c24bb8f6aaadc376151ceb39975763a53e3ebAndrew Hsiehhost-rmdir = \
1784f2c24bb8f6aaadc376151ceb39975763a53e3ebAndrew Hsieh    $(eval __host_rmdir_files := $(foreach __host_rmdir_file,$1,$(subst /,\,$(wildcard $(__host_rmdir_file)))))\
1795f4cab0bea0af60cf3fcb37fbd8bbd64461b575fDavid 'Digit' Turner    $(if $(__host_rmdir_files),del /f/s/q $(__host_rmdir_files) >NUL 2>NUL)
180ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerelse
18172ab69d4859feabb36868b17cd614cf7a4be6149David 'Digit' Turnerhost-rmdir = rm -rf $1
182ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerendif
183ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
184ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
185ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Function : host-mkdir
186ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Arguments: 1: directory path
187ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Usage    : $(call host-mkdir,<path>
188ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Rationale: This function expands to the host-specific shell command used
189ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            to create a path if it doesn't exist.
190ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
191ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerifeq ($(HOST_OS),windows)
192544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerhost-mkdir = md $(subst /,\,"$1") >NUL 2>NUL || rem
193ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerelse
194ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerhost-mkdir = mkdir -p $1
195ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerendif
196ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
197ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
198ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Function : host-cp
199ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Arguments: 1: source file
200ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            2: target file
201ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Usage    : $(call host-cp,<src-file>,<dst-file>)
202ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Rationale: This function expands to the host-specific shell command used
203ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            to copy a single file
204ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
205ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerifeq ($(HOST_OS),windows)
2065f4cab0bea0af60cf3fcb37fbd8bbd64461b575fDavid 'Digit' Turnerhost-cp = copy /b/y $(subst /,\,"$1" "$2") > NUL
207ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerelse
208ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerhost-cp = cp -f $1 $2
209ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerendif
210ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
211ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
212ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Function : host-install
213ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Arguments: 1: source file
214ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            2: target file
215ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Usage    : $(call host-install,<src-file>,<dst-file>)
216ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# Rationale: This function expands to the host-specific shell command used
217ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            to install a file or directory, while preserving its timestamps
218ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner#            (if possible).
219ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
220ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerifeq ($(HOST_OS),windows)
2215f4cab0bea0af60cf3fcb37fbd8bbd64461b575fDavid 'Digit' Turnerhost-install = copy /b/y $(subst /,\,"$1" "$2") > NUL
222ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerelse
223ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerhost-install = install -p $1 $2
224ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turnerendif
225ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
226ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner# -----------------------------------------------------------------------------
2271579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Function : host-c-includes
2281579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Arguments: 1: list of file paths (e.g. "foo bar")
2291579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Returns  : list of include compiler options (e.g. "-Ifoo -Ibar")
2301579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Usage    : $(call host-c-includes,<paths>)
2311579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# Rationale: This function is used to translate Cygwin paths into
232462c63197acacd294d9835dd5afb6913058ea57aDavid 'Digit' Turner#            Cygwin-specific ones. On other platforms, it will just
2331579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner#            return its argument.
2341579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner# -----------------------------------------------------------------------------
235462c63197acacd294d9835dd5afb6913058ea57aDavid 'Digit' Turnerifeq ($(HOST_OS),cygwin)
2361579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerhost-c-includes = $(patsubst %,-I%,$(call host-path,$1))
2371579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerelse
2381579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerhost-c-includes = $(1:%=-I%)
2391579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerendif
2401579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner
2411253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh# -----------------------------------------------------------------------------
2421253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh# Function : copy-if-differ
2431253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh# Arguments: 1: source file
2441253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh#            2: destination file
2451253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh# Usage    : $(call copy-if-differ,<src-file>,<dst-file>)
2461253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh# Rationale: This function copy source file to destination file if contents are
2471253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh#            different.
2481253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh# -----------------------------------------------------------------------------
2491253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsiehifeq ($(HOST_OS),windows)
2501253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsiehcopy-if-differ = $(HOST_CMP) -s $1 $2 > NUL || copy /b/y $(subst /,\,"$1" "$2") > NUL
2511253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsiehelse
2521253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsiehcopy-if-differ = $(HOST_CMP) -s $1 $2 > /dev/null 2>&1 || cp -f $1 $2
2531253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsiehendif
254fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner
255fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# -----------------------------------------------------------------------------
256544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Function : generate-dir
257544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Arguments: 1: directory path
258544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Returns  : Generate a rule, but not dependency, to create a directory with
259544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner#            host-mkdir.
260544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Usage    : $(call generate-dir,<path>)
261544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# -----------------------------------------------------------------------------
262544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerdefine ev-generate-dir
263544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner__ndk_dir := $1
264544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerifeq (,$$(__ndk_dir_flag__$1))
265544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner__ndk_dir_flag__$1 := true
266544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner$1:
267544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner	@$$(call host-mkdir,$$@)
268544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerendif
269544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerendef
270544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
271544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnergenerate-dir = $(eval $(call ev-generate-dir,$1))
272544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
273544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# -----------------------------------------------------------------------------
274544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Function : generate-file-dir
275544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Arguments: 1: file path
276544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Returns  : Generate a dependency and a rule to ensure that the parent
277544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner#            directory of the input file path will be created before it.
278544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner#            This is used to enforce a call to host-mkdir.
279544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Usage    : $(call generate-file-dir,<file>)
280544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# Rationale: Many object files will be stored in the same output directory.
281544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner#            Introducing a dependency on the latter avoids calling mkdir -p
282544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner#            for every one of them.
283544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner#
284544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# -----------------------------------------------------------------------------
285544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
286544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerdefine ev-generate-file-dir
287544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner__ndk_file_dir := $(call parent-dir,$1)
288544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner$$(call generate-dir,$$(__ndk_file_dir))
289544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner$1: $$(__ndk_file_dir)
290544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnerendef
291544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
292544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turnergenerate-file-dir = $(eval $(call ev-generate-file-dir,$1))
293544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
294544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner# -----------------------------------------------------------------------------
2957a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# Function : generate-list-file
2967a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# Arguments: 1: list of strings (possibly very long)
2977a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            2: file name
2987a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# Returns  : write the content of a possibly very long string list to a file.
2997a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            this shall be used in commands and will work around limitations
3007a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            of host command-line lengths.
3017a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# Usage    : $(call host-echo-to-file,<string-list>,<file>)
3027a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# Rationale: When there is a very large number of objects and/or libraries at
3037a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            link time, the size of the command becomes too large for the
3047a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            host system's maximum. Various tools however support the
3057a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            @<listfile> syntax, where <listfile> is the path of a file
3067a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            which content will be parsed as if they were options.
3077a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#
3087a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            This function is used to generate such a list file from a long
3097a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#            list of strings in input.
3107a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner#
3117a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# -----------------------------------------------------------------------------
3127a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
313616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# Helper functions because the GNU Make $(word ...) function does
314616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# not accept a 0 index, so we need to bump any of these to 1 when
315616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# we find them.
316616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner#
317616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerindex-is-zero = $(filter 0 00 000 0000 00000 000000 0000000,$1)
318616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerbump-0-to-1 = $(if $(call index-is-zero,$1),1,$1)
319616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
320616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# Same as $(wordlist ...) except the start index, if 0, is bumped to 1
321616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerindex-word-list = $(wordlist $(call bump-0-to-1,$1),$2,$3)
322616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
323616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# NOTE: With GNU Make $1 and $(1) are equivalent, which means
324616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner#       that $10 is equivalent to $(1)0, and *not* $(10).
325616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
326616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# Used to generate a slice of up to 10 items starting from index $1,
327616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# If $1 is 0, it will be bumped to 1 (and only 9 items will be printed)
328616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# $1: start (tenth) index. Can be 0
329616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# $2: word list
330616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner#
331616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-start-gen-10
33222c5065bae39793e5c3b0c5654c7e4f76f2de5f4David 'Digit' Turner	$$(hide) $$(HOST_ECHO_N) "$(call index-word-list,$10,$19,$2) " >> $$@
333616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendef
334616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
335616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# Used to generate a slice of always 10 items starting from index $1
336616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# $1: start (tenth) index. CANNOT BE 0
337616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# $2: word list
338616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-always-gen-10
33922c5065bae39793e5c3b0c5654c7e4f76f2de5f4David 'Digit' Turner	$$(hide) $$(HOST_ECHO_N) "$(wordlist $10,$19,$2) " >> $$@
340616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendef
341616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
342616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# Same as list-file-always-gen-10, except that the word list might be
343616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner# empty at position $10 (i.e. $(1)0)
344616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-maybe-gen-10
345616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $10,$2),)
34622c5065bae39793e5c3b0c5654c7e4f76f2de5f4David 'Digit' Turner	$$(hide) $$(HOST_ECHO_N) "$(wordlist $10,$19,$2) " >> $$@
3477a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnerendif
3487a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnerendef
3497a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
350616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-start-gen-100
351616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-10,$10,$2)
352616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$11,$2)
353616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$12,$2)
354616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$13,$2)
355616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$14,$2)
356616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$15,$2)
357616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$16,$2)
358616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$17,$2)
359616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$18,$2)
360616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$19,$2)
361616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendef
362616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
363616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-always-gen-100
364616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$10,$2)
365616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$11,$2)
366616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$12,$2)
367616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$13,$2)
368616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$14,$2)
369616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$15,$2)
370616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$16,$2)
371616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$17,$2)
372616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$18,$2)
373616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$19,$2)
374616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendef
375616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
376616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-maybe-gen-100
377616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $(call bump-0-to-1,$100),$2),)
378616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $199,$2),)
379616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-10,$10,$2)
380616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$11,$2)
381616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$12,$2)
382616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$13,$2)
383616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$14,$2)
384616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$15,$2)
385616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$16,$2)
386616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$17,$2)
387616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$18,$2)
388616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$19,$2)
389616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerelse
390616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $150,$2),)
391616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-10,$10,$2)
392616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$11,$2)
393616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$12,$2)
394616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$13,$2)
395616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-10,$14,$2)
396616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$15,$2)
397616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$16,$2)
398616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$17,$2)
399616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$18,$2)
400616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$19,$2)
401616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerelse
402616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-10,$10,$2)
403616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$11,$2)
404616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$12,$2)
405616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$13,$2)
406616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-10,$14,$2)
407616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendif
408616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendif
409616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendif
410616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendef
411616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
412616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerdefine list-file-maybe-gen-1000
413616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $(call bump-0-to-1,$1000),$2),)
414616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $1999,$2),)
415616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-100,$10,$2)
416616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$11,$2)
417616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$12,$2)
418616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$13,$2)
419616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$14,$2)
420616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$15,$2)
421616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$16,$2)
422616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$17,$2)
423616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$18,$2)
424616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$19,$2)
425616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerelse
426616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerifneq ($(word $1500,$2),)
427616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-100,$10,$2)
428616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$11,$2)
429616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$12,$2)
430616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$13,$2)
431616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-always-gen-100,$14,$2)
432616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$15,$2)
433616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$16,$2)
434616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$17,$2)
435616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$18,$2)
436616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$19,$2)
437616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerelse
438616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-start-gen-100,$10,$2)
439616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$11,$2)
440616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$12,$2)
441616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$13,$2)
442616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-100,$14,$2)
443616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendif
444616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendif
445616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendif
446616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turnerendef
447616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
448616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner
4497a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnerdefine generate-list-file-ev
4507a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner__list_file := $2
4517a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
4521253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh.PHONY: $$(__list_file).tmp
4537a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
454544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner$$(call generate-file-dir,$$(__list_file).tmp)
455544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
4561253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh$$(__list_file).tmp:
45722c5065bae39793e5c3b0c5654c7e4f76f2de5f4David 'Digit' Turner	$$(hide) $$(HOST_ECHO_N) "" > $$@
458616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-1000,0,$1)
459616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-1000,1,$1)
460616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-1000,2,$1)
461616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-1000,3,$1)
462616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-1000,4,$1)
463616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner$(call list-file-maybe-gen-1000,5,$1)
4641253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh
4651253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh$$(__list_file): $$(__list_file).tmp
4661253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh	$$(hide) $$(call copy-if-differ,$$@.tmp,$$@)
4671253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh	$$(hide) $$(call host-rm,$$@.tmp)
4681253fb9584ff236b9fb2886cfc0986416751822dAndrew Hsieh
4697a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnerendef
4707a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
4717a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnergenerate-list-file = $(eval $(call generate-list-file-ev,$1,$2))
4727a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
4737a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner# -----------------------------------------------------------------------------
474fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# Function : link-whole-archives
475fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# Arguments: 1: list of whole static libraries
476fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# Returns  : linker flags to use the whole static libraries
477fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# Usage    : $(call link-whole-archives,<libraries>)
478fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# Rationale: This function is used to put the list of whole static libraries
479fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner#            inside a -Wl,--whole-archive ... -Wl,--no-whole-archive block.
480fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner#            If the list is empty, it returns an empty string.
481fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner#            This function also calls host-path to translate the library
482fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner#            paths.
483fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner# -----------------------------------------------------------------------------
484fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turnerlink-whole-archives = $(if $(strip $1),$(call link-whole-archive-flags,$1))
485fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turnerlink-whole-archive-flags = -Wl,--whole-archive $(call host-path,$1) -Wl,--no-whole-archive
486fc53a9dd8c214b498c00b3028c86de7085c2cab6David 'Digit' Turner
487419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# =============================================================================
488419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
489419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Modules database
490419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
491419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# The following declarations are used to manage the list of modules
492419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# defined in application's Android.mk files.
493419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
494419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Technical note:
495419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#    We use __ndk_modules to hold the list of all modules corresponding
496419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#    to a given application.
497419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
498419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#    For each module 'foo', __ndk_modules.foo.<field> is used
499419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#    to store module-specific information.
500419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
501419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#        type         -> type of module (e.g. 'static', 'shared', ...)
502419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#        depends      -> list of other modules this module depends on
503419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
5048700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#    Also, LOCAL_XXXX values defined for a module are recorded in XXXX, e.g.:
5058700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#
5068700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        PATH   -> recorded LOCAL_PATH for the module
5078700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        CFLAGS -> recorded LOCAL_CFLAGS for the module
5088700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        ...
5098700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#
5108700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#    Some of these are created by build scripts like BUILD_STATIC_LIBRARY:
5118700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#
5128700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        MAKEFILE -> The Android.mk where the module is defined.
5138700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        LDFLAGS  -> Final linker flags
5148700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        OBJECTS  -> List of module objects
5158700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#        BUILT_MODULE -> location of module built file (e.g. obj/<app>/<abi>/libfoo.so)
5168700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#
517419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#    Note that some modules are never installed (e.g. static libraries).
518419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
519419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# =============================================================================
520419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
5218700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# The list of LOCAL_XXXX variables that are recorded for each module definition
5228700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# These are documented by docs/ANDROID-MK.TXT. Exception is LOCAL_MODULE
5238700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#
5248700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turnermodules-LOCALS := \
5258700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    MODULE \
526bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    MODULE_FILENAME \
5278700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    PATH \
5288700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    SRC_FILES \
5298700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    CPP_EXTENSION \
5308700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    C_INCLUDES \
5318700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    CFLAGS \
5328700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    CXXFLAGS \
5338700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    CPPFLAGS \
5348700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    STATIC_LIBRARIES \
535b1a60f32cc6b482c1209e1d53e773add926dc520David 'Digit' Turner    WHOLE_STATIC_LIBRARIES \
5368700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    SHARED_LIBRARIES \
5378700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    LDLIBS \
5388700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    ALLOW_UNDEFINED_SYMBOLS \
5398700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    ARM_MODE \
5408700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    ARM_NEON \
5418700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    DISABLE_NO_EXECUTE \
542f74c373729bcd1519debe03cda90ef3fd3366848Nick Kralevich    DISABLE_RELRO \
5438700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    EXPORT_CFLAGS \
5448700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    EXPORT_CPPFLAGS \
5458700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    EXPORT_LDLIBS \
546a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner    EXPORT_C_INCLUDES \
5477daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    FILTER_ASM \
548c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    CPP_FEATURES \
5497a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner    SHORT_COMMANDS \
5508700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner
5518700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# The following are generated by the build scripts themselves
552d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
553d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_MAKEFILE will contain the path to the Android.mk defining the module
554d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += MAKEFILE
555d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
556d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_LDFLAGS will contain the set of final linker flags for the module
557d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += LDFLAGS
558d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
559d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_OBJECTS will contain the list of object files generated from the
560d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# module's sources, if any.
561d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += OBJECTS
562d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
563d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_BUILT_MODULE will contain the location of the symbolic version of
564d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# the generated module (i.e. the one containing all symbols used during
565d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# native debugging). It is generally under $PROJECT/obj/local/
566d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += BUILT_MODULE
567d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
568d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_OBJS_DIR will contain the location where the object files for
569d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# this module will be stored. Usually $PROJECT/obj/local/<module>/obj
570d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += OBJS_DIR
571d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
572d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_INSTALLED will contain the location of the installed version
573d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# of the module. Usually $PROJECT/libs/<abi>/<prefix><module><suffix>
574d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# where <prefix> and <suffix> depend on the module class.
575d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += INSTALLED
576d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
577d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# LOCAL_MODULE_CLASS will contain the type of the module
578d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# (e.g. STATIC_LIBRARY, SHARED_LIBRARY, etc...)
579d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-LOCALS += MODULE_CLASS
5808700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner
581419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# the list of managed fields per module
582d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodules-fields = depends \
5838700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner                 $(modules-LOCALS)
584419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
58548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
58648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : modules-clear
58748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: None
58848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
58948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call modules-clear)
59048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale: clears the list of defined modules known by the build system
59148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
592419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodules-clear = \
593419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(foreach __mod,$(__ndk_modules),\
594419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner        $(foreach __field,$(modules-fields),\
595419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner            $(eval __ndk_modules.$(__mod).$(__field) := $(empty))\
596419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner        )\
597419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    )\
598d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner    $(eval __ndk_modules := $(empty_set)) \
599d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner    $(eval __ndk_top_modules := $(empty)) \
600499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner    $(eval __ndk_import_list := $(empty)) \
601d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner    $(eval __ndk_import_depth := $(empty))
60248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
60348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
6046724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Function : modules-get-list
6056724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Arguments: None
6066724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Returns  : The list of all recorded modules
6076724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Usage    : $(call modules-get-list)
6086724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# -----------------------------------------------------------------------------
6096724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnermodules-get-list = $(__ndk_modules)
6106724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
6116724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# -----------------------------------------------------------------------------
612d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner# Function : modules-get-top-list
613d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner# Arguments: None
614d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner# Returns  : The list of all recorded non-imported modules
615d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner# Usage    : $(call modules-get-top-list)
616d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner# -----------------------------------------------------------------------------
617d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turnermodules-get-top-list = $(__ndk_top_modules)
618d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner
619d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner# -----------------------------------------------------------------------------
620d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Function : module-add
62148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: module name
62248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
623d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Usage    : $(call module-add,<modulename>)
62448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale: add a new module. If it is already defined, print an error message
6258700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#            and abort. This will record all LOCAL_XXX variables for the module.
62648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
627419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodule-add = \
628d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner  $(call assert-defined,LOCAL_MAKEFILE LOCAL_BUILT_MODULE LOCAL_OBJS_DIR LOCAL_MODULE_CLASS)\
62948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(if $(call set_is_member,$(__ndk_modules),$1),\
630d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(call __ndk_info,Trying to define local module '$1' in $(LOCAL_MAKEFILE).)\
631d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(call __ndk_info,But this module was already defined by $(__ndk_modules.$1.MAKEFILE).)\
632d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(call __ndk_error,Aborting.)\
63348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  )\
63448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(eval __ndk_modules := $(call set_insert,$(__ndk_modules),$1))\
635d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner  $(if $(strip $(__ndk_import_depth)),,\
636d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner    $(eval __ndk_top_modules := $(call set_insert,$(__ndk_top_modules),$1))\
637d49e5db44f5a514683ef600db88f8be0b40c3bfdDavid 'Digit' Turner  )\
638d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner  $(if $(call module-class-is-installable,$(LOCAL_MODULE_CLASS)),\
639d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(eval LOCAL_INSTALLED := $(NDK_APP_DST_DIR)/$(notdir $(LOCAL_BUILT_MODULE)))\
640d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner  )\
6418700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner  $(foreach __local,$(modules-LOCALS),\
6428700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    $(eval __ndk_modules.$1.$(__local) := $(LOCAL_$(__local)))\
643c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner  )\
644c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner  $(call module-handle-c++-features,$1)
6458700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner
6468700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner
647d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Retrieve the class of module $1
648d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodule-get-class = $(__ndk_modules.$1.MODULE_CLASS)
649e7943289cc2df73a99668615639c97ffe6240fceDavid 'Digit' Turner
650419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Retrieve built location of module $1
6518700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turnermodule-get-built = $(__ndk_modules.$1.BUILT_MODULE)
652419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
653d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Returns $(true) is module $1 is installable
654d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# An installable module is one that will be copied to $PROJECT/libs/<abi>/
655d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# (e.g. shared libraries).
656d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
6577a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnermodule-is-installable = $(call module-class-is-installable,$(call module-get-class,$1))
6587a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
6597a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Returns $(true) if module $1 is prebuilt
6607a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# A prebuilt module is one declared with BUILD_PREBUILT_SHARED_LIBRARY or
6617a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# BUILD_PREBUILT_STATIC_LIBRARY
6627a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
6637a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnermodule-is-prebuilt = $(call module-class-is-prebuilt,$(call module-get-class,$1))
6648700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner
6658700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# -----------------------------------------------------------------------------
666a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Function : module-get-export
667a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Arguments: 1: module name
668a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner#            2: export variable name without LOCAL_EXPORT_ prefix (e.g. 'CFLAGS')
669a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Returns  : Exported value
670a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Usage    : $(call module-get-export,<modulename>,<varname>)
671a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Rationale: Return the recorded value of LOCAL_EXPORT_$2, if any, for module $1
672a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# -----------------------------------------------------------------------------
673a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turnermodule-get-export = $(__ndk_modules.$1.EXPORT_$2)
674a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner
675a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# -----------------------------------------------------------------------------
676a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Function : module-get-listed-export
677a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Arguments: 1: list of module names
678a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner#            2: export variable name without LOCAL_EXPORT_ prefix (e.g. 'CFLAGS')
679a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Returns  : Exported values
680a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Usage    : $(call module-get-listed-export,<module-list>,<varname>)
681a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# Rationale: Return the recorded value of LOCAL_EXPORT_$2, if any, for modules
682a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner#            listed in $1.
683a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# -----------------------------------------------------------------------------
684a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turnermodule-get-listed-export = $(strip \
685a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner    $(foreach __listed_module,$1,\
686a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner        $(call module-get-export,$(__listed_module),$2)\
687a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner    ))
688a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner
689a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner# -----------------------------------------------------------------------------
6908700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# Function : modules-restore-locals
6918700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# Arguments: 1: module name
6928700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# Returns  : None
6938700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# Usage    : $(call module-restore-locals,<modulename>)
6948700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# Rationale: Restore the recorded LOCAL_XXX definitions for a given module.
6958700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# -----------------------------------------------------------------------------
6968700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turnermodule-restore-locals = \
6978700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    $(foreach __local,$(modules-LOCALS),\
6988700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner        $(eval LOCAL_$(__local) := $(__ndk_modules.$1.$(__local)))\
6998700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    )
700419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
701419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Dump all module information. Only use this for debugging
702419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodules-dump-database = \
703419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(info Modules: $(__ndk_modules)) \
704419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(foreach __mod,$(__ndk_modules),\
705bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner        $(info $(space4)$(__mod):)\
706419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner        $(foreach __field,$(modules-fields),\
707bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner            $(eval __fieldval := $(strip $(__ndk_modules.$(__mod).$(__field))))\
708bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner            $(if $(__fieldval),\
709bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                $(if $(filter 1,$(words $(__fieldval))),\
710bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                    $(info $(space4)$(space4)$(__field): $(__fieldval)),\
711bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                    $(info $(space4)$(space4)$(__field): )\
712bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                    $(foreach __fielditem,$(__fieldval),\
713bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                        $(info $(space4)$(space4)$(space4)$(__fielditem))\
714bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                    )\
715bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner                )\
716bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner            )\
717419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner        )\
718419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    )\
719d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(info --- end of modules list)
720419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
721419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
722419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# -----------------------------------------------------------------------------
723419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Function : module-add-static-depends
724419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Arguments: 1: module name
725419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#            2: list/set of static library modules this module depends on.
726419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Returns  : None
727419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Usage    : $(call module-add-static-depends,<modulename>,<list of module names>)
728419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Rationale: Record that a module depends on a set of static libraries.
729419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#            Use module-get-static-dependencies to retrieve final list.
730419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# -----------------------------------------------------------------------------
731419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodule-add-static-depends = \
732a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner    $(call module-add-depends-any,$1,$2,depends) \
733419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
734419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# -----------------------------------------------------------------------------
735419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Function : module-add-shared-depends
736419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Arguments: 1: module name
737419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#            2: list/set of shared library modules this module depends on.
738419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Returns  : None
739419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Usage    : $(call module-add-shared-depends,<modulename>,<list of module names>)
740419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Rationale: Record that a module depends on a set of shared libraries.
741419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#            Use modulge-get-shared-dependencies to retrieve final list.
742419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# -----------------------------------------------------------------------------
743419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodule-add-shared-depends = \
744a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turner    $(call module-add-depends-any,$1,$2,depends) \
745419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
746419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Used internally by module-add-static-depends and module-add-shared-depends
747419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# NOTE: this function must not modify the existing dependency order when new depends are added.
748419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
749a5501b02c2f2a9e1bf9fce42a3faf601adc070e9David 'Digit' Turnermodule-add-depends-any = \
750419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __ndk_modules.$1.$3 += $(filter-out $(__ndk_modules.$1.$3),$(call strip-lib-prefix,$2)))
751419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
7528700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner# Used to recompute all dependencies once all module information has been recorded.
7538700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner#
7548700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turnermodules-compute-dependencies = \
7558700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    $(foreach __module,$(__ndk_modules),\
7568700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner        $(call module-compute-depends,$(__module))\
7578700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner    )
758419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
7598700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turnermodule-compute-depends = \
7605b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    $(call module-add-static-depends,$1,$(__ndk_modules.$1.STATIC_LIBRARIES))\
761b1a60f32cc6b482c1209e1d53e773add926dc520David 'Digit' Turner    $(call module-add-static-depends,$1,$(__ndk_modules.$1.WHOLE_STATIC_LIBRARIES))\
7624013467963a9051585d23d6a0b157685605d2aa6David 'Digit' Turner    $(call module-add-shared-depends,$1,$(__ndk_modules.$1.SHARED_LIBRARIES))\
7638700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turner
7648700ca93c26e2908670a9982c68f4b8a2bf7dce4David 'Digit' Turnermodule-get-installed = $(__ndk_modules.$1.INSTALLED)
765419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
766419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# -----------------------------------------------------------------------------
767419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Function : modules-get-all-dependencies
768419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Arguments: 1: list of module names
769419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Returns  : List of all the modules $1 depends on transitively.
770419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Usage    : $(call modules-all-get-dependencies,<list of module names>)
771419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Rationale: This computes the closure of all module dependencies starting from $1
772419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# -----------------------------------------------------------------------------
7735edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turnermodule-get-all-dependencies = $(strip \
7745edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner    $(call modules-get-closure,$1,depends))
775419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
776419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodules-get-closure = \
7775edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner    $(eval __closure_deps  := $(strip $(call strip-lib-prefix,$1))) \
778419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __closure_wq    := $(__closure_deps)) \
779419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __closure_field := $(strip $2)) \
780419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(call modules-closure)\
781419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(__closure_deps)
782419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
783bb16bc7001669b23fa74f678d8ddff71e062967eDavid 'Digit' Turner# Used internally by modules-get-all-dependencies
784419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Note the tricky use of conditional recursion to work around the fact that
785419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# the GNU Make language does not have any conditional looping construct
786419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# like 'while'.
787419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
788419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turnermodules-closure = \
789419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __closure_mod := $(call first,$(__closure_wq))) \
790419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __closure_wq  := $(call rest,$(__closure_wq))) \
7915edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner    $(eval __closure_val := $(call strip-lib-prefix,$(__ndk_modules.$(__closure_mod).$(__closure_field)))) \
7925edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner    $(eval __closure_new := $(filter-out $(__closure_deps),$(__closure_val)))\
793419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __closure_deps += $(__closure_new)) \
794419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(eval __closure_wq   := $(strip $(__closure_wq) $(__closure_new)))\
795419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner    $(if $(__closure_wq),$(call modules-closure)) \
796419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
7975edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# -----------------------------------------------------------------------------
7981208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# Function : module-get-depends
7991208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# Arguments: 1: list of module names
8001208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner#            2: local module type (e.g. SHARED_LIBRARIES)
8011208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# Returns  : List all the <local-type> modules $1 depends on transitively.
8021208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# Usage    : $(call module-get-depends,<list of module names>,<local-type>)
8031208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# Rationale: This computes the closure of all local module dependencies starting from $1
8041208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# -----------------------------------------------------------------------------
8051208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turnermodule-get-depends = $(strip $(call modules-get-closure,$1,$2))
8061208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner
8071208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner
8081208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# -----------------------------------------------------------------------------
8095edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# Function : modules-get-all-installable
8105edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# Arguments: 1: list of module names
8115edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# Returns  : List of all the installable modules $1 depends on transitively.
8125edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# Usage    : $(call modules-all-get-installable,<list of module names>)
8135edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# Rationale: This computes the closure of all installable module dependencies starting from $1
8145edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# -----------------------------------------------------------------------------
8155edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner# For now, only the closure of LOCAL_SHARED_LIBRARIES is enough
8161322b9f426ef6aca8b6ce569411cdd3443c1caf4David 'Digit' Turnermodules-get-all-installable = $(strip \
8171322b9f426ef6aca8b6ce569411cdd3443c1caf4David 'Digit' Turner    $(foreach __alldep,$(call module-get-depends,$1,depends),\
8181322b9f426ef6aca8b6ce569411cdd3443c1caf4David 'Digit' Turner        $(if $(call module-is-installable,$(__alldep)),$(__alldep))\
8191322b9f426ef6aca8b6ce569411cdd3443c1caf4David 'Digit' Turner    ))
8205edfe75d8ad0f19be9d05908822ed47628ba80baDavid 'Digit' Turner
8215b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# Return the C++ extension of a given module
8221208fe621223ae853a954fd0e0aaf0b0ed46ecdaDavid 'Digit' Turner# $1: module name
8234013467963a9051585d23d6a0b157685605d2aa6David 'Digit' Turnermodule-get-cpp-extension = $(strip \
8245b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    $(if $(__ndk_modules.$1.CPP_EXTENSION),\
8255b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner        $(__ndk_modules.$1.CPP_EXTENSION),\
8265b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner        .cpp\
8274013467963a9051585d23d6a0b157685605d2aa6David 'Digit' Turner    ))
8285b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner
8295b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# Return the list of C++ sources of a given module
8305b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner#
8315b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turnermodule-get-c++-sources = \
8325b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    $(filter %$(call module-get-cpp-extension,$1),$(__ndk_modules.$1.SRC_FILES))
8335b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner
8345b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# Returns true if a module has C++ sources
8355b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner#
836c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-has-c++-sources = $(strip $(call module-get-c++-sources,$1))
837c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
8385b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner
8395b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# Add C++ dependencies to any module that has C++ sources.
8405b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# $1: list of C++ runtime static libraries (if any)
8415b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# $2: list of C++ runtime shared libraries (if any)
8425b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner#
8435b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turnermodules-add-c++-dependencies = \
8445b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    $(foreach __module,$(__ndk_modules),\
845c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        $(if $(call module-has-c++-sources,$(__module)),\
8464013467963a9051585d23d6a0b157685605d2aa6David 'Digit' Turner            $(call ndk_log,Module '$(__module)' has C++ sources)\
8475b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner            $(call module-add-c++-deps,$(__module),$1,$2),\
8485b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner        )\
8495b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    )
8505b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner
851c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
852c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# Return the compiler flags used to compile a C++ module
853c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# Order matters and should match the one used by the build command
854c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-get-c++-flags = $(strip \
855c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(__ndk_modules.$1.CFLAGS) \
856c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(__ndk_modules.$1.CPPFLAGS) \
857c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(__ndk_modules.$1.CXXFLAGS))
858c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
859c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# This function is used to remove certain flags from a module compiler flags
860c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# $1: Module name
861c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# $2: List of flags to remove
862c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
863c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-filter-out-compiler-flags = \
864c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(eval __ndk_modules.$1.CFLAGS   := $(filter-out $2,$(__ndk_modules.$1.CFLAGS)))\
865c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(eval __ndk_modules.$1.CPPFLAGS := $(filter-out $2,$(__ndk_modules.$1.CPPFLAGS)))\
866c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(eval __ndk_modules.$1.CXXFLAGS := $(filter-out $2,$(__ndk_modules.$1.CXXFLAGS)))
867c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
868c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# Return true if a module's compiler flags enable rtti
869c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# We just look at -frtti and -fno-rtti on the command-line
870c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# and keep the last one of these flags.
871c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-flags-have-rtti = $(strip \
872c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        $(filter -frtti,\
873c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner            $(lastword $(filter -frtti -fno-rtti,$(call module-get-c++-flags,$1)))\
874c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        )\
875c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    )
876c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
877c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# Same with C++ exception support (i.e. -fexceptions and -fno-exceptions)
878c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
879c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-flags-have-exceptions = $(strip \
880c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        $(filter -fexceptions,\
881c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner            $(lastword $(filter -fexceptions -fno-execeptions,$(call module-get-c++-flags,$1)))\
882c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        )\
883c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    )
884c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
885c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# Handle the definition of LOCAL_CPP_FEATURES, i.e.:
886c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
887c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#  - If it is defined, check that it only contains valid values
888c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#  - If it is undefined, try to compute its value automatically by
889c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#    looking at the C++ compiler flags used to build the module
890c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
891c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# After this, we remove all features flags from the module's command-line
892c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# And add only the correct ones back in LOCAL_CPP_FLAGS
893c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
894c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-handle-c++-features = \
895c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(if $(strip $(__ndk_modules.$1.CPP_FEATURES)),\
896c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        $(eval __cxxbad := $(filter-out rtti exceptions,$(__ndk_modules.$1.CPP_FEATURES)))\
897c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        $(if $(__cxxbad),\
898c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner            $(call __ndk_info,WARNING: Ignoring invalid values in LOCAL_CPP_FEATURES definition in $(__ndk_modules.$1.MAKEFILE): $(__cxxbad))\
899c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner            $(eval __ndk_modules.$1.CPP_FEATURES := $(strip $(filter-out $(__cxxbad),$(__ndk_modules.$1.CPP_FEATURES))))\
900c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        )\
901c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    ,\
902c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        $(eval __ndk_modules.$1.CPP_FEATURES := $(strip \
903c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner            $(if $(call module-flags-have-rtti,$1),rtti) \
904c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner            $(if $(call module-flags-have-exceptions,$1),exceptions) \
905c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner        )) \
906c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    )\
907c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(call module-filter-out-compiler-flags,$1,-frtti -fno-rtti -fexceptions -fno-exceptions)\
908c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
909c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# Returns true if a module or its dependencies have specific C++ features
910c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# (i.e. RTTI or Exceptions)
911c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
912c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# $1: module name
913c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner# $2: list of features (e.g. 'rtti' or 'exceptions')
914c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner#
915c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turnermodule-has-c++-features = $(strip \
916c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(eval __cxxdeps  := $(call module-get-all-dependencies,$1))\
917c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(eval __cxxflags := $(foreach __cxxdep,$(__cxxdeps),$(__ndk_modules.$(__cxxdep).CPP_FEATURES)))\
918c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    $(if $(filter $2,$(__cxxflags)),true,)\
919c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner    )
920c55bfcf671107b1b678f5a66a3ec74cbeb3927cbDavid 'Digit' Turner
9215b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# Add standard C++ dependencies to a given module
9225b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner#
9235b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# $1: module name
9245b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# $2: list of C++ runtime static libraries (if any)
9255b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner# $3: list of C++ runtime shared libraries (if any)
9265b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner#
9275b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turnermodule-add-c++-deps = \
9285b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    $(eval __ndk_modules.$1.STATIC_LIBRARIES += $(2))\
9295b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner    $(eval __ndk_modules.$1.SHARED_LIBRARIES += $(3))
9305b690c13f5d908a403e2d09cfa7ac50c8767a897David 'Digit' Turner
931419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner
932419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# =============================================================================
933419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
934419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# Utility functions
935419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner#
936419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner# =============================================================================
93748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
93848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
939a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turner# Function : parent-dir
940a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turner# Arguments: 1: path
941a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turner# Returns  : Parent dir or path of $1, with final separator removed.
942a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turner# -----------------------------------------------------------------------------
943a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turnerparent-dir = $(patsubst %/,%,$(dir $1))
944a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turner
9457a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
9467a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# -----------------------------------------------------------------------------
9477a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Function : pretty-dir
9487a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Arguments: 1: path
9497a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Returns  : Remove NDK_PROJECT_PATH prefix from a given path. This can be
9507a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#            used to perform pretty-printing for logs.
9517a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# -----------------------------------------------------------------------------
95225fc114e97e8e31af9c8a47f80ca4fbd134bf912David 'Digit' Turnerpretty-dir = $(patsubst $(NDK_ROOT)/%,<NDK>/%,\
95325fc114e97e8e31af9c8a47f80ca4fbd134bf912David 'Digit' Turner                 $(patsubst $(NDK_PROJECT_PATH)/%,%,$1))
9547a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
955a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turner# -----------------------------------------------------------------------------
95648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : check-user-define
95748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: name of variable that must be defined by the user
95848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            2: name of Makefile where the variable should be defined
95948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            3: name/description of the Makefile where the check is done, which
96048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#               must be included by $2
96148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
96248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
96348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnercheck-user-define = $(if $(strip $($1)),,\
96448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(call __ndk_error,Missing $1 before including $3 in $2))
96548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
96648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
96748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# This is used to check that LOCAL_MODULE is properly defined by an Android.mk
96848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# file before including one of the $(BUILD_SHARED_LIBRARY), etc... files.
96948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
97048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : check-user-LOCAL_MODULE
97148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: name/description of the included build Makefile where the
97248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#               check is done
97348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
97448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call check-user-LOCAL_MODULE, BUILD_SHARED_LIBRARY)
97548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
97648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnercheck-defined-LOCAL_MODULE = \
97748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(call check-user-define,LOCAL_MODULE,$(local-makefile),$(1)) \
97848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(if $(call seq,$(words $(LOCAL_MODULE)),1),,\
97948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner    $(call __ndk_info,LOCAL_MODULE definition in $(local-makefile) must not contain space)\
98048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner    $(call __ndk_error,Please correct error. Aborting)\
98148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  )
98248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
98348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
984bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# This is used to check that LOCAL_MODULE_FILENAME, if defined, is correct.
985bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner#
986bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Function : check-user-LOCAL_MODULE_FILENAME
987bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Returns  : None
988bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Usage    : $(call check-user-LOCAL_MODULE_FILENAME)
989bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# -----------------------------------------------------------------------------
990bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turnercheck-LOCAL_MODULE_FILENAME = \
991bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner  $(if $(strip $(LOCAL_MODULE_FILENAME)),\
992bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    $(if $(call seq,$(words $(LOCAL_MODULE_FILENAME)),1),,\
993bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner        $(call __ndk_info,$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain spaces)\
994bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner        $(call __ndk_error,Plase correct error. Aborting)\
995bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    )\
996bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    $(if $(filter %.a %.so,$(LOCAL_MODULE_FILENAME)),\
997bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner        $(call __ndk_info,$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_MODULE_FILENAME should not include file extensions)\
998bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    )\
999bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner  )
1000bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner
1001bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# -----------------------------------------------------------------------------
1002bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Function  : handle-module-filename
1003bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Arguments : 1: default file prefix
1004bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner#             2: file suffix
1005bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Returns   : None
1006bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Usage     : $(call handle-module-filename,<prefix>,<suffix>)
1007bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Rationale : To be used to check and or set the module's filename through
1008bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner#             the LOCAL_MODULE_FILENAME variable.
1009bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# -----------------------------------------------------------------------------
1010bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turnerhandle-module-filename = $(eval $(call ev-handle-module-filename,$1,$2))
1011bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner
10127a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
10137a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Check that LOCAL_MODULE_FILENAME is properly defined
10147a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# - with one single item
10157a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# - without a library file extension
10167a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# - with no directory separators
10177a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
10187a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerdefine ev-check-module-filename
10197a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerifneq (1,$$(words $$(LOCAL_MODULE_FILENAME)))
10207a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $$(call __ndk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain any space)
10217a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $$(call __ndk_error,Aborting)
10227a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerendif
10237a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerifneq (,$$(filter %.a %.so,$$(LOCAL_MODULE_FILENAME)))
10247a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $$(call __ndk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain a file extension)
10257a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $$(call __ndk_error,Aborting)
10267a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerendif
10277a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerifneq (1,$$(words $$(subst /, ,$$(LOCAL_MODULE_FILENAME))))
10287a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $$(call __ndk_info,$$(LOCAL_MAKEFILE):$$(LOCAL_MODULE): LOCAL_MODULE_FILENAME must not contain directory separators)
10297a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $$(call __ndk_error,Aborting)
10307a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerendif
10317a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerendef
1032bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner
10337a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
10347a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Check the definition of LOCAL_MODULE_FILENAME. If none exists,
10357a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# infer it from the LOCAL_MODULE name.
10367a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
1037bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# $1: default file prefix
1038bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# $2: default file suffix
10397a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
1040bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turnerdefine ev-handle-module-filename
1041bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' TurnerLOCAL_MODULE_FILENAME := $$(strip $$(LOCAL_MODULE_FILENAME))
10427a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerifndef LOCAL_MODULE_FILENAME
10437a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    LOCAL_MODULE_FILENAME := $1$$(LOCAL_MODULE)
1044bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turnerendif
10457a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner$$(eval $$(call ev-check-module-filename))
1046bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' TurnerLOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME)$2
1047bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turnerendef
1048bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner
10497a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerhandle-prebuilt-module-filename = $(eval $(call ev-handle-prebuilt-module-filename,$1))
10507a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
10517a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
10527a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Check the definition of LOCAL_MODULE_FILENAME for a _prebuilt_ module.
10537a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# If none exists, infer it from $(LOCAL_SRC_FILES)
10547a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
10557a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# $1: default file suffix
10567a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
10577a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerdefine ev-handle-prebuilt-module-filename
10587a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' TurnerLOCAL_MODULE_FILENAME := $$(strip $$(LOCAL_MODULE_FILENAME))
10597a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerifndef LOCAL_MODULE_FILENAME
10607a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    LOCAL_MODULE_FILENAME := $$(notdir $(LOCAL_SRC_FILES))
10617a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME:%.a=%)
10627a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    LOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME:%.so=%)
10637a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerendif
10647a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' TurnerLOCAL_MODULE_FILENAME := $$(LOCAL_MODULE_FILENAME)$1
10657a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner$$(eval $$(call ev-check-module-filename))
10667a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnerendef
10677a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
10687a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
1069bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# -----------------------------------------------------------------------------
1070bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Function  : handle-module-built
1071bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Returns   : None
1072bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Usage     : $(call handle-module-built)
1073bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# Rationale : To be used to automatically compute the location of the generated
1074bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner#             binary file, and the directory where to place its object files.
1075bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# -----------------------------------------------------------------------------
1076bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turnerhandle-module-built = \
1077bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    $(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(LOCAL_MODULE_FILENAME))\
1078bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner    $(eval LOCAL_OBJS_DIR     := $(TARGET_OBJS)/$(LOCAL_MODULE))
1079bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner
1080bb9dc1a386532db74f47dd0af1930b27e8402926David 'Digit' Turner# -----------------------------------------------------------------------------
108148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Strip any 'lib' prefix in front of a given string.
108248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
108348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : strip-lib-prefix
108448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: module name
108548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : module name, without any 'lib' prefix if any
108648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call strip-lib-prefix,$(LOCAL_MODULE))
108748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
108848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerstrip-lib-prefix = $(1:lib%=%)
108948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
109048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
109148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# This is used to strip any lib prefix from LOCAL_MODULE, then check that
109248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# the corresponding module name is not already defined.
109348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
109448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : check-user-LOCAL_MODULE
109548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: path of Android.mk where this LOCAL_MODULE is defined
109648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : None
109748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
109848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
109948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnercheck-LOCAL_MODULE = \
1100419390feceb0c39fd3cad8ec6e5253fb74c946a5David 'Digit' Turner  $(eval LOCAL_MODULE := $$(call strip-lib-prefix,$$(LOCAL_MODULE)))
110148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
110248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
110348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : my-dir
110448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : the directory of the current Makefile
110548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(my-dir)
110648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
1107a775f5537568f4768cd61931bb1b5314694adc96David 'Digit' Turnermy-dir = $(call parent-dir,$(lastword $(MAKEFILE_LIST)))
110848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
110948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
111048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function : all-makefiles-under
111148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments: 1: directory path
111248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : a list of all makefiles immediately below some directory
111348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(call all-makefiles-under, <some path>)
111448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
111548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerall-makefiles-under = $(wildcard $1/*/Android.mk)
111648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
111748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
111848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : all-subdir-makefiles
111948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : list of all makefiles in subdirectories of the current Makefile's
112048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            location
112148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(all-subdir-makefiles)
112248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
112348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerall-subdir-makefiles = $(call all-makefiles-under,$(call my-dir))
112448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
11255bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# =============================================================================
11265bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11275bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Source file tagging support.
11285bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11295bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Each source file listed in LOCAL_SRC_FILES can have any number of
11305bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# 'tags' associated to it. A tag name must not contain space, and its
11315bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# usage can vary.
11325bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11335bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# For example, the 'debug' tag is used to sources that must be built
11345bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# in debug mode, the 'arm' tag is used for sources that must be built
11355bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# using the 32-bit instruction set on ARM platforms, and 'neon' is used
11365bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# for sources that must be built with ARM Advanced SIMD (a.k.a. NEON)
11375bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# support.
11385bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11395bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# More tags might be introduced in the future.
11405bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11415bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#  LOCAL_SRC_TAGS contains the list of all tags used (initially empty)
11425bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#  LOCAL_SRC_FILES contains the list of all source files.
11435bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#  LOCAL_SRC_TAG.<tagname> contains the set of source file names tagged
11445bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      with <tagname>
11455bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#  LOCAL_SRC_FILES_TAGS.<filename> contains the set of tags for a given
11465bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      source file name
11475bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11485bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Tags are processed by a toolchain-specific function (e.g. TARGET-compute-cflags)
11495bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# which will call various functions to compute source-file specific settings.
11505bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# These are currently stored as:
11515bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11525bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#  LOCAL_SRC_FILES_TARGET_CFLAGS.<filename> contains the list of
11535bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      target-specific C compiler flags used to compile a given
11545bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      source file. This is set by the function TARGET-set-cflags
11555bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      defined in the toolchain's setup.mk script.
11565bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11575bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#  LOCAL_SRC_FILES_TEXT.<filename> contains the 'text' that will be
11585bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      displayed along the label of the build output line. For example
11595bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#      'thumb' or 'arm  ' with ARM-based toolchains.
11605bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#
11615bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# =============================================================================
11625bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
11635bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
11645bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : clear-all-src-tags
11655bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Returns  : remove all source file tags and associated data.
11665bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(clear-all-src-tags)
11675bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
11685bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerclear-all-src-tags = \
11695bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __tag,$(LOCAL_SRC_TAGS), \
11705bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner    $(eval LOCAL_SRC_TAG.$(__tag) := $(empty)) \
11715bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner) \
11725bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __src,$(LOCAL_SRC_FILES), \
11735bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner    $(eval LOCAL_SRC_FILES_TAGS.$(__src) := $(empty)) \
11745bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner    $(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) := $(empty)) \
11755bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner    $(eval LOCAL_SRC_FILES_TEXT.$(__src) := $(empty)) \
11765bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner) \
11775bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(eval LOCAL_SRC_TAGS := $(empty_set))
11785bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
11795bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
11805bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : tag-src-files
11815bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: list of source files to tag
11825bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            2: tag name (must not contain space)
11835bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call tag-src-files,<list-of-source-files>,<tagname>)
11845bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Rationale: Add a tag to a list of source files
11855bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
11865bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnertag-src-files = \
11875bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(eval LOCAL_SRC_TAGS := $(call set_insert,$2,$(LOCAL_SRC_TAGS))) \
11885bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(eval LOCAL_SRC_TAG.$2 := $(call set_union,$1,$(LOCAL_SRC_TAG.$2))) \
11895bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __src,$1, \
11905bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner    $(eval LOCAL_SRC_FILES_TAGS.$(__src) += $2) \
11915bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner)
11925bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
11935bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
11945bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : get-src-files-with-tag
11955bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: tag name
11965bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call get-src-files-with-tag,<tagname>)
11975bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Return   : The list of source file names that have been tagged with <tagname>
11985bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
11995bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerget-src-files-with-tag = $(LOCAL_SRC_TAG.$1)
12005bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12015bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12025bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : get-src-files-without-tag
12035bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: tag name
12045bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call get-src-files-without-tag,<tagname>)
12055bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Return   : The list of source file names that have NOT been tagged with <tagname>
12065bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12075bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerget-src-files-without-tag = $(filter-out $(LOCAL_SRC_TAG.$1),$(LOCAL_SRC_FILES))
12085bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12095bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12105bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : set-src-files-target-cflags
12115bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: list of source files
12125bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            2: list of compiler flags
12135bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call set-src-files-target-cflags,<sources>,<flags>)
12145bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Rationale: Set or replace the set of compiler flags that will be applied
12155bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            when building a given set of source files. This function should
12165bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            normally be called from the toolchain-specific function that
12175bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            computes all compiler flags for all source files.
12185bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12195bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerset-src-files-target-cflags = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) := $2))
12205bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12215bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12225bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : add-src-files-target-cflags
12235bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: list of source files
12245bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            2: list of compiler flags
12255bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call add-src-files-target-cflags,<sources>,<flags>)
12265bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Rationale: A variant of set-src-files-target-cflags that can be used
12275bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            to append, instead of replace, compiler flags for specific
12285bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            source files.
12295bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12305bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turneradd-src-files-target-cflags = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) += $2))
12315bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12325bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12335bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : get-src-file-target-cflags
12345bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: single source file name
12355bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call get-src-file-target-cflags,<source>)
12365bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Rationale: Return the set of target-specific compiler flags that must be
12375bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            applied to a given source file. These must be set prior to this
12385bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            call using set-src-files-target-cflags or add-src-files-target-cflags
12395bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12405bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerget-src-file-target-cflags = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$1)
12415bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12425bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12435bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : set-src-files-text
12445bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: list of source files
12455bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            2: text
12465bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call set-src-files-text,<sources>,<text>)
12475bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Rationale: Set or replace the 'text' associated to a set of source files.
12485bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            The text is a very short string that complements the build
12495bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            label. For example, it will be either 'thumb' or 'arm  ' for
12505bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            ARM-based toolchains. This function must be called by the
12515bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            toolchain-specific functions that processes all source files.
12525bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12535bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerset-src-files-text = $(foreach __src,$1,$(eval LOCAL_SRC_FILES_TEXT.$(__src) := $2))
12545bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12555bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12565bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Macro    : get-src-file-text
12575bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Arguments: 1: single source file
12585bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Usage    : $(call get-src-file-text,<source>)
12595bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# Rationale: Return the 'text' associated to a given source file when
12605bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner#            set-src-files-text was called.
12615bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# -----------------------------------------------------------------------------
12625bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerget-src-file-text = $(LOCAL_SRC_FILES_TEXT.$1)
12635bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
12645bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner# This should only be called for debugging the source files tagging system
12655bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turnerdump-src-file-tags = \
12665bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(info LOCAL_SRC_TAGS := $(LOCAL_SRC_TAGS)) \
12675bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(info LOCAL_SRC_FILES = $(LOCAL_SRC_FILES)) \
12685bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __tag,$(LOCAL_SRC_TAGS),$(info LOCAL_SRC_TAG.$(__tag) = $(LOCAL_SRC_TAG.$(__tag)))) \
12695bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TAGS.$(__src) = $(LOCAL_SRC_FILES_TAGS.$(__src)))) \
12705bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(info WITH arm = $(call get-src-files-with-tag,arm)) \
12715bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(info WITHOUT arm = $(call get-src-files-without-tag,arm)) \
12725bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src) = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$(__src)))) \
12735bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner$(foreach __src,$(LOCAL_SRC_FILES),$(info LOCAL_SRC_FILES_TEXT.$(__src) = $(LOCAL_SRC_FILES_TEXT.$(__src)))) \
12745bc892834ff140ef11625fdf7602d09e229f73dcDavid 'Digit' Turner
127548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
127648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# =============================================================================
127748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
127848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Application.mk support
127948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
128048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# =============================================================================
128148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
128248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# the list of variables that *must* be defined in Application.mk files
1283a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerNDK_APP_VARS_REQUIRED :=
128448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
128548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# the list of variables that *may* be defined in Application.mk files
12865815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' TurnerNDK_APP_VARS_OPTIONAL := APP_OPTIM APP_CPPFLAGS APP_CFLAGS APP_CXXFLAGS \
1287a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner                         APP_PLATFORM APP_BUILD_SCRIPT APP_ABI APP_MODULES \
1288616aae78295c7618af87d0b3f53335c358945460David 'Digit' Turner                         APP_PROJECT_PATH APP_STL APP_SHORT_COMMANDS
128948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
129048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# the list of all variables that may appear in an Application.mk file
1291dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner# or defined by the build scripts.
1292dfc478bcac20693422ee56a423377403bba46932David 'Digit' TurnerNDK_APP_VARS := $(NDK_APP_VARS_REQUIRED) \
1293dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner                $(NDK_APP_VARS_OPTIONAL) \
1294fd204377de03a20556b38acf0dc2bdb195729343David 'Digit' Turner                APP_DEBUG \
1295dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner                APP_DEBUGGABLE \
1296dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner                APP_MANIFEST
129748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
129848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# =============================================================================
129948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
130048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Android.mk support
130148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
130248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# =============================================================================
130348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
130448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# =============================================================================
130548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
130648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Build commands support
130748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
130848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# =============================================================================
130948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
1310c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turnerget-object-name = $(strip \
1311c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner    $(subst ../,__/,\
1312c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner        $(eval __obj := $1)\
1313c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner        $(foreach __ext,.c .s .S $(LOCAL_CPP_EXTENSION),\
1314c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner            $(eval __obj := $(__obj:%$(__ext)=%.o))\
1315c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner        )\
1316c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner        $(__obj)\
1317c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner    ))
1318c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner
131948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
132048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Macro    : hide
132148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns  : nothing
132248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage    : $(hide)<make commands>
132348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale: To be used as a prefix for Make build commands to hide them
132448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            by default during the build. To show them, set V=1 in your
132548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            environment or command-line.
132648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
132748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            For example:
132848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
132948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#                foo.o: foo.c
133048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#                -->|$(hide) <build-commands>
133148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
133248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#            Where '-->|' stands for a single tab character.
133348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
133448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
133548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerifeq ($(V),1)
133648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerhide = $(empty)
133748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerelse
133848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerhide = @
133948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerendif
134048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
134128246be1383b51ebb84596f465e2e25fbac46f5dDavid 'Digit' Turner# cmd-convert-deps
13421579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner#
13438d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner# On Cygwin, we need to convert the .d dependency file generated by
134462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# the gcc toolchain by transforming any Windows paths inside it into
13458d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner# Cygwin paths that GNU Make can understand (i.e. C:/Foo => /cygdrive/c/Foo)
134628246be1383b51ebb84596f465e2e25fbac46f5dDavid 'Digit' Turner#
13478d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner# To do that, we will force the compiler to write the dependency file to
134862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# <foo>.d.org, which will will later convert through a clever sed script
134962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# that is auto-generated by our build system.
135028246be1383b51ebb84596f465e2e25fbac46f5dDavid 'Digit' Turner#
135162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# The script is invoked with:
13528d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner#
135362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#    $(NDK_DEPENDENCIES_CONVERTER) foo.d
135462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner#
135562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# It will look if foo.d.org exists, and if so, process it
135662e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# to generate foo.d, then remove the original foo.d.org.
13578d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner#
13588d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner# On other systems, we simply tell the compiler to write to the .d file directly.
13591579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner#
13607dab8adb7172b44f92315312d54f6bbfa13b59b7David 'Digit' Turner# NOTE: In certain cases, no dependency file will be generated by the
13617dab8adb7172b44f92315312d54f6bbfa13b59b7David 'Digit' Turner#       compiler (e.g. when compiling an assembly file as foo.s)
13627dab8adb7172b44f92315312d54f6bbfa13b59b7David 'Digit' Turner#
13638d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner# convert-deps is used to compute the name of the compiler-generated dependency file
13648d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner# cmd-convert-deps is a command used to convert it to a Cygwin-specific path
13658d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turner#
1366462c63197acacd294d9835dd5afb6913058ea57aDavid 'Digit' Turnerifeq ($(HOST_OS),cygwin)
13678d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turnerconvert-deps = $1.org
136862e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turnercmd-convert-deps = && $(NDK_DEPENDENCIES_CONVERTER) $1
136928246be1383b51ebb84596f465e2e25fbac46f5dDavid 'Digit' Turnerelse
13708d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turnerconvert-deps = $1
13718d06600aad07ddf7b6f80c0242269e0e44b3d99aDavid 'Digit' Turnercmd-convert-deps = 
13721579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turnerendif
13731579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner
13747daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# This assumes that many variables have been pre-defined:
13757daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# _SRC: source file
13767daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# _OBJ: destination file
13777daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# _CC: 'compiler' command
13787daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# _FLAGS: 'compiler' flags
13797daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# _TEXT: Display text (e.g. "Compile++ thumb", must be EXACTLY 15 chars long)
13807daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner#
13817daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerdefine ev-build-file
13827daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(_OBJ): PRIVATE_SRC      := $$(_SRC)
13837daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(_OBJ): PRIVATE_OBJ      := $$(_OBJ)
13841579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner$$(_OBJ): PRIVATE_DEPS     := $$(call host-path,$$(_OBJ).d)
13857daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(_OBJ): PRIVATE_MODULE   := $$(LOCAL_MODULE)
13867daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(_OBJ): PRIVATE_TEXT     := "$$(_TEXT)"
13877daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(_OBJ): PRIVATE_CC       := $$(_CC)
13887daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(_OBJ): PRIVATE_CFLAGS   := $$(_FLAGS)
13897a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
13907a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnerifeq ($$(LOCAL_SHORT_COMMANDS),true)
13917a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner_OPTIONS_LISTFILE := $$(_OBJ).cflags
13927a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner$$(_OBJ): $$(call generate-list-file,$$(_FLAGS),$$(_OPTIONS_LISTFILE))
13937a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner$$(_OBJ): PRIVATE_CFLAGS := @$$(call host-path,$$(_OPTIONS_LISTFILE))
13947a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner$$(_OBJ): $$(_OPTIONS_LISTFILE)
13957a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turnerendif
13967a06c124be094134d81920a8f9fe363f6f30abd1David 'Digit' Turner
1397544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner$$(call generate-file-dir,$$(_OBJ))
1398544ecbef57ecf42fbe8a99a1a6cd6816a347f587David 'Digit' Turner
139962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner$$(_OBJ): $$(_SRC) $$(LOCAL_MAKEFILE) $$(NDK_APP_APPLICATION_MK) $$(NDK_DEPENDENCIES_CONVERTER)
1400ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner	@$$(HOST_ECHO) "$$(PRIVATE_TEXT)  : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))"
1401ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner	$$(hide) $$(PRIVATE_CC) -MMD -MP -MF $$(call convert-deps,$$(PRIVATE_DEPS)) $$(PRIVATE_CFLAGS) $$(call host-path,$$(PRIVATE_SRC)) -o $$(call host-path,$$(PRIVATE_OBJ)) \
140228246be1383b51ebb84596f465e2e25fbac46f5dDavid 'Digit' Turner	$$(call cmd-convert-deps,$$(PRIVATE_DEPS))
14037daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerendef
14047daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14057daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# This assumes the same things than ev-build-file, but will handle
14067daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner# the definition of LOCAL_FILTER_ASM as well.
14077daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerdefine ev-build-source-file
14087daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' TurnerLOCAL_DEPENDENCY_DIRS += $$(dir $$(_OBJ))
14097daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerifndef LOCAL_FILTER_ASM
14107daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # Trivial case: Directly generate an object file
14117daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(eval $$(call ev-build-file))
14127daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerelse
14137daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # This is where things get hairy, we first transform
14147daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # the source into an assembler file, send it to the
14157daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # filter, then generate a final object file from it.
14167daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  #
14177daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14187daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # First, remember the original settings and compute
14197daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # the location of our temporary files.
14207daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  #
14217daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _ORG_SRC := $$(_SRC)
14227daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _ORG_OBJ := $$(_OBJ)
14237daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _ORG_FLAGS := $$(_FLAGS)
14247daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _ORG_TEXT  := $$(_TEXT)
14257daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14267daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _OBJ_ASM_ORIGINAL := $$(patsubst %.o,%.s,$$(_ORG_OBJ))
14277daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _OBJ_ASM_FILTERED := $$(patsubst %.o,%.filtered.s,$$(_ORG_OBJ))
14287daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14297daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # If the source file is a plain assembler file, we're going to
14307daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # use it directly in our filter.
14317daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  ifneq (,$$(filter %.s,$$(_SRC)))
14327daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    _OBJ_ASM_ORIGINAL := $$(_SRC)
14337daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  endif
14347daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14351579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner  #$$(info SRC=$$(_SRC) OBJ=$$(_OBJ) OBJ_ORIGINAL=$$(_OBJ_ASM_ORIGINAL) OBJ_FILTERED=$$(_OBJ_ASM_FILTERED))
14367daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14377daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # We need to transform the source into an assembly file, instead of
14387daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # an object. The proper way to do that depends on the file extension.
14397daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  #
14407daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # For C and C++ source files, simply replace the -c by an -S in the
14417daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # compilation command (this forces the compiler to generate an
14427daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # assembly file).
14437daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  #
14447daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # For assembler templates (which end in .S), replace the -c with -E
14457daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # to send it to the preprocessor instead.
14467daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  #
14477daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # Don't do anything for plain assembly files (which end in .s)
14487daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  #
14497daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  ifeq (,$$(filter %.s,$$(_SRC)))
14507daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    _OBJ   := $$(_OBJ_ASM_ORIGINAL)
14517daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    ifneq (,$$(filter %.S,$$(_SRC)))
14527daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner      _FLAGS := $$(patsubst -c,-E,$$(_ORG_FLAGS))
14537daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    else
14547daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner      _FLAGS := $$(patsubst -c,-S,$$(_ORG_FLAGS))
14557daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    endif
14567daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner    $$(eval $$(call ev-build-file))
14577daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  endif
14587daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14597daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # Next, process the assembly file with the filter
14607daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(_OBJ_ASM_FILTERED): PRIVATE_SRC    := $$(_OBJ_ASM_ORIGINAL)
14617daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(_OBJ_ASM_FILTERED): PRIVATE_DST    := $$(_OBJ_ASM_FILTERED)
14627daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(_OBJ_ASM_FILTERED): PRIVATE_FILTER := $$(LOCAL_FILTER_ASM)
14637daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(_OBJ_ASM_FILTERED): PRIVATE_MODULE := $$(LOCAL_MODULE)
14647daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(_OBJ_ASM_FILTERED): $$(_OBJ_ASM_ORIGINAL)
1465ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner	@$$(HOST_ECHO) "AsmFilter      : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))"
1466ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner	$$(hide) $$(PRIVATE_FILTER) $$(PRIVATE_SRC) $$(PRIVATE_DST)
14677daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
14687daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # Then, generate the final object, we need to keep assembler-specific
14697daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  # flags which look like -Wa,<option>:
14707daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _SRC   := $$(_OBJ_ASM_FILTERED)
14717daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _OBJ   := $$(_ORG_OBJ)
14727daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _FLAGS := $$(filter -Wa%,$$(_ORG_FLAGS)) -c
14737daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  _TEXT  := "Assembly     "
14747daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner  $$(eval $$(call ev-build-file))
14757daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerendif
14767daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turnerendef
14777daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
147848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
147948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Template  : ev-compile-c-source
148048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments : 1: single C source file name (relative to LOCAL_PATH)
148148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#             2: target object file (without path)
148248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns   : None
148348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage     : $(eval $(call ev-compile-c-source,<srcfile>,<objfile>)
148448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale : Internal template evaluated by compile-c-source and
148548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#             compile-s-source
148648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
148748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerdefine  ev-compile-c-source
148848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner_SRC:=$$(LOCAL_PATH)/$(1)
148948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner_OBJ:=$$(LOCAL_OBJS_DIR)/$(2)
149048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
14917daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner_FLAGS := $$($$(my)CFLAGS) \
14927daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(call get-src-file-target-cflags,$(1)) \
14931579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner          $$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(LOCAL_PATH)) \
14947daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(LOCAL_CFLAGS) \
14957daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(NDK_APP_CFLAGS) \
14961579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner          $$(call host-c-includes,$$($(my)C_INCLUDES)) \
14971579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner          -c \
149848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
14997daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner_TEXT := "Compile $$(call get-src-file-text,$1)"
150097f5b9de8f353ad15d5edd7cc77974d6fefe2caaDavid 'Digit' Turner_CC   := $$(NDK_CCACHE) $$(TARGET_CC)
150148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
15027daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(eval $$(call ev-build-source-file))
150348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerendef
150448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
150548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
150648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function  : compile-c-source
150748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments : 1: single C source file name (relative to LOCAL_PATH)
1508c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner#             2: object file
150948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns   : None
1510c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner# Usage     : $(call compile-c-source,<srcfile>,<objfile>)
151148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale : Setup everything required to build a single C source file
151248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
1513c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turnercompile-c-source = $(eval $(call ev-compile-c-source,$1,$2))
151448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
151548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
151648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function  : compile-s-source
151748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments : 1: single Assembly source file name (relative to LOCAL_PATH)
1518c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner#             2: object file
151948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns   : None
1520c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner# Usage     : $(call compile-s-source,<srcfile>,<objfile>)
152148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale : Setup everything required to build a single Assembly source file
152248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
1523c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turnercompile-s-source = $(eval $(call ev-compile-c-source,$1,$2))
152448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
152548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
152648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
152748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Template  : ev-compile-cpp-source
152848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments : 1: single C++ source file name (relative to LOCAL_PATH)
152948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#             2: target object file (without path)
153048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns   : None
153148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage     : $(eval $(call ev-compile-cpp-source,<srcfile>,<objfile>)
153248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale : Internal template evaluated by compile-cpp-source
153348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
153448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
153548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerdefine  ev-compile-cpp-source
153648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner_SRC:=$$(LOCAL_PATH)/$(1)
153748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner_OBJ:=$$(LOCAL_OBJS_DIR)/$(2)
15387daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner_FLAGS := $$($$(my)CXXFLAGS) \
15397daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(call get-src-file-target-cflags,$(1)) \
15401579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner          $$(call host-c-includes, $$(LOCAL_C_INCLUDES) $$(LOCAL_PATH)) \
15417daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(LOCAL_CFLAGS) \
15427daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(LOCAL_CPPFLAGS) \
15437daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(LOCAL_CXXFLAGS) \
15447daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(NDK_APP_CFLAGS) \
15457daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(NDK_APP_CPPFLAGS) \
15467daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner          $$(NDK_APP_CXXFLAGS) \
15471579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner          $$(call host-c-includes,$$($(my)C_INCLUDES)) \
15481579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner          -c \
15497daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
155097f5b9de8f353ad15d5edd7cc77974d6fefe2caaDavid 'Digit' Turner_CC   := $$(NDK_CCACHE) $$($$(my)CXX)
15517daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner_TEXT := "Compile++ $$(call get-src-file-text,$1)"
15527daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner
15537daefc38f01900f8a903d9955f7f8d6262d88f32David 'Digit' Turner$$(eval $$(call ev-build-source-file))
155448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerendef
155548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
155648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
155748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Function  : compile-cpp-source
155848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Arguments : 1: single C++ source file name (relative to LOCAL_PATH)
1559c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turner#           : 2: object file name
156048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Returns   : None
156148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Usage     : $(call compile-c-source,<srcfile>)
156248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Rationale : Setup everything required to build a single C++ source file
156348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# -----------------------------------------------------------------------------
1564c6faf8bffb4884b59265aadcbaa22c8026c41649David 'Digit' Turnercompile-cpp-source = $(eval $(call ev-compile-cpp-source,$1,$2))
156548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
15666a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#
15676a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#  Module imports
15686a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#
15696a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner
15706a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# Initialize import list
15716a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turnerimport-init = $(eval __ndk_import_dirs :=)
15726a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner
15736a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# Add an optional single directory to the list of import paths
15746a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#
15756a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turnerimport-add-path-optional = \
15766a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner  $(if $(strip $(wildcard $1)),\
15776a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(call ndk_log,Adding import directory: $1)\
15786a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(eval __ndk_import_dirs += $1)\
15796a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner  )\
15806a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner
15816a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# Add a directory to the list of import paths
15826a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# This will warn if the directory does not exist
15836a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#
15846a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turnerimport-add-path = \
15856a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner  $(if $(strip $(wildcard $1)),\
15866a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(call ndk_log,Adding import directory: $1)\
15876a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(eval __ndk_import_dirs += $1)\
15886a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner  ,\
15896a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(call __ndk_info,WARNING: Ignoring unknown import directory: $1)\
15906a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner  )\
15916a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner
15926a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turnerimport-find-module = $(strip \
15936a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner      $(eval __imported_module :=)\
15946a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner      $(foreach __import_dir,$(__ndk_import_dirs),\
15956a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner        $(if $(__imported_module),,\
15966a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner          $(call ndk_log,  Probing $(__import_dir)/$1/Android.mk)\
15976a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner          $(if $(strip $(wildcard $(__import_dir)/$1/Android.mk)),\
15986a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner            $(eval __imported_module := $(__import_dir)/$1)\
15996a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner          )\
16006a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner        )\
16016a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner      )\
16026a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner      $(__imported_module)\
16036a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    )
16046a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner
16056a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# described in docs/IMPORT-MODULE.TXT
16066a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# $1: tag name for the lookup
16076a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#
1608b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# Small technical note on __ndk_import_depth: we use this variable to
1609b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# record the depth of recursive import-module calls. The variable is
1610b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# initially empty, and we append a "x" to it each time import-module is
1611b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# called. I.e. for three recursive calls to import-module, we would get
1612b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# the values:
1613b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner#
1614b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner#   first call:   x
1615b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner#   second call:  xx
1616b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner#   third call:   xxx
1617b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner#
1618b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# This is used in module-add to add the top-level modules (i.e. those
1619b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# that are not added with import-module) to __ndk_top_modules, corresponding
1620b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner# to the default list of wanted modules (see setup-toolchain.mk).
1621b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner#
16226a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turnerimport-module = \
1623499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner    $(eval __import_tag := $(strip $1))\
1624499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner    $(if $(call seq,$(words $(__import_tag)),1),,\
1625499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      $(call __ndk_info,$(call local-makefile): Cannot import module with spaces in tag: '$(__import_tag)')\
1626499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner    )\
1627499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner    $(if $(call set_is_member,$(__ndk_import_list),$(__import_tag)),\
1628499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      $(call ndk_log,Skipping duplicate import for module with tag '$(__import_tag)')\
16296a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    ,\
1630499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      $(call ndk_log,Looking for imported module with tag '$(__import_tag)')\
1631499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      $(eval __imported_path := $(call import-find-module,$(__import_tag)))\
1632499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      $(if $(__imported_path),\
1633b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        $(call ndk_log,    Found in $(__imported_path))\
1634b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        $(eval __ndk_import_depth := $(__ndk_import_depth)x) \
1635b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        $(eval __ndk_import_list := $(call set_insert,$(__ndk_import_list),$(__import_tag)))\
1636499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner        $(eval include $(__imported_path)/Android.mk)\
1637b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        $(eval __ndk_import_depth := $(__ndk_import_depth:%x=%))\
1638499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      ,\
1639499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner        $(call __ndk_info,$(call local-makefile): Cannot find module with tag '$(__import_tag)' in import path)\
1640499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner        $(call __ndk_info,Are you sure your NDK_MODULE_PATH variable is properly defined ?)\
1641b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        $(call __ndk_info,The following directories were searched:)\
1642b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        $(for __import_dir,$(__ndk_import_dirs),\
1643b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner          $(call __ndk_info,    $(__import_dir))\
1644b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner        )\
1645499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner        $(call __ndk_error,Aborting.)\
1646499fa5d674e2e85437c69e1ee32a8b8aec3965adDavid 'Digit' Turner      )\
1647b81b0563abbeedd1f1c135359b1a8ee1fb8069edDavid 'Digit' Turner   )
16486a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner
16496a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner# Only used for debugging
16506a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner#
16516a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turnerimport-debug = \
16526a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(info IMPORT DIRECTORIES:)\
16536a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    $(foreach __dir,$(__ndk_import_dirs),\
16546a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner      $(info -- $(__dir))\
16556a8948dccbcde263f30c9d83ba09de47a2e19395David 'Digit' Turner    )\
1656d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1657d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1658d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#  Module classes
1659d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1660d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' TurnerNDK_MODULE_CLASSES :=
1661d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1662d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Register a new module class
1663d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# $1: class name (e.g. STATIC_LIBRARY)
1664d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# $2: optional file prefix (e.g. 'lib')
1665d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# $3: optional file suffix (e.g. '.so')
1666d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1667d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodule-class-register = \
1668d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(eval NDK_MODULE_CLASSES += $1) \
1669d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(eval NDK_MODULE_CLASS.$1.FILE_PREFIX := $2) \
1670d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(eval NDK_MODULE_CLASS.$1.FILE_SUFFIX := $3) \
1671d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(eval NDK_MODULE_CLASS.$1.INSTALLABLE := $(false)) \
1672d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1673d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Same a module-class-register, for installable modules
1674d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1675d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# An installable module is one that will be copied to $PROJECT/libs/<abi>/
1676d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# during the NDK build.
1677d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1678d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# $1: class name
1679d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# $2: optional file prefix
1680d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# $3: optional file suffix
1681d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1682d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodule-class-register-installable = \
1683d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(call module-class-register,$1,$2,$3) \
1684d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner    $(eval NDK_MODULE_CLASS.$1.INSTALLABLE := $(true))
1685d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
16867a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnermodule-class-set-prebuilt = \
16877a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner    $(eval NDK_MODULE_CLASS.$1.PREBUILT := $(true))
16887a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
1689d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Returns $(true) if $1 is a valid/registered LOCAL_MODULE_CLASS value
1690d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1691d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodule-class-check = $(call set_is_member,$(NDK_MODULE_CLASSES),$1)
1692d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1693d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Returns $(true) if $1 corresponds to an installable module class
1694d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1695d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turnermodule-class-is-installable = $(if $(NDK_MODULE_CLASS.$1.INSTALLABLE),$(true),$(false))
1696d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
16977a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# Returns $(true) if $1 corresponds to an installable module class
16987a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner#
16997a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turnermodule-class-is-prebuilt = $(if $(NDK_MODULE_CLASS.$1.PREBUILT),$(true),$(false))
1700d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1701d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1702d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# Register valid module classes
1703d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner#
1704d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1705d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# static libraries:
1706d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# <foo> -> lib<foo>.a by default
1707d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner$(call module-class-register,STATIC_LIBRARY,lib,.a)
1708d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1709d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# shared libraries:
1710d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# <foo> -> lib<foo>.so
1711d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# a shared library is installable.
1712d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner$(call module-class-register-installable,SHARED_LIBRARY,lib,.so)
1713d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
1714d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# executable
1715d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# <foo> -> <foo>
1716d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# an executable is installable.
1717d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner$(call module-class-register-installable,EXECUTABLE,,)
1718d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner
17197a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# prebuilt shared library
1720d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# <foo> -> <foo>  (we assume it is already well-named)
1721d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner# it is installable
1722d9851e70410ee5b14f5e9b772dd015e44a558c89David 'Digit' Turner$(call module-class-register-installable,PREBUILT_SHARED_LIBRARY,,)
17237a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner$(call module-class-set-prebuilt,PREBUILT_SHARED_LIBRARY)
17247a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner
17257a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# prebuilt static library
17267a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner# <foo> -> <foo> (we assume it is already well-named)
17277a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner$(call module-class-register,PREBUILT_STATIC_LIBRARY,,)
17287a6b17ae18e87e522a4449eff37800421a8bb6abDavid 'Digit' Turner$(call module-class-set-prebuilt,PREBUILT_STATIC_LIBRARY)
17291579cd933a0e3a1bdd494a312fb5b9e75a03be87David 'Digit' Turner
173026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
173126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# C++ STL support
173226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
173326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
173426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# The list of registered STL implementations we support
173526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' TurnerNDK_STL_LIST :=
173626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
173726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Used internally to register a given STL implementation, see below.
173826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
173926f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $1: STL name as it appears in APP_STL (e.g. system)
174026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $2: STL module name (e.g. cxx-stl/system)
174126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $3: list of static libraries all modules will depend on
174226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $4: list of shared libraries all modules will depend on
174326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
174426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turnerndk-stl-register = \
174526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(eval __ndk_stl := $(strip $1)) \
174626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(eval NDK_STL_LIST += $(__ndk_stl)) \
174726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(eval NDK_STL.$(__ndk_stl).IMPORT_MODULE := $(strip $2)) \
174826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(eval NDK_STL.$(__ndk_stl).STATIC_LIBS := $(strip $3)) \
174926f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(eval NDK_STL.$(__ndk_stl).SHARED_LIBS := $(strip $4))
175026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
175126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Called to check that the value of APP_STL is a valid one.
175226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $1: STL name as it apperas in APP_STL (e.g. 'system')
175326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
175426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turnerndk-stl-check = \
175526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(if $(call set_is_member,$(NDK_STL_LIST),$1),,\
175626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner        $(call __ndk_info,Invalid APP_STL value: $1)\
175726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner        $(call __ndk_info,Please use one of the following instead: $(NDK_STL_LIST))\
175826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner        $(call __ndk_error,Aborting))
175926f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
176026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Called before the top-level Android.mk is parsed to
176126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# select the STL implementation.
176226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $1: STL name as it appears in APP_STL (e.g. system)
176326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
176426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turnerndk-stl-select = \
176526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(call import-module,$(NDK_STL.$1.IMPORT_MODULE))
176626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
176726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Called after all Android.mk files are parsed to add
176826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# proper STL dependencies to every C++ module.
176926f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# $1: STL name as it appears in APP_STL (e.g. system)
177026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
177126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turnerndk-stl-add-dependencies = \
177226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    $(call modules-add-c++-dependencies,\
177326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner        $(NDK_STL.$1.STATIC_LIBS),\
177426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner        $(NDK_STL.$1.SHARED_LIBS))
177526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
177626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
177726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
177826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
177926f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Register the 'system' STL implementation
178026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
178126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner$(call ndk-stl-register,\
178226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    system,\
178326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    cxx-stl/system,\
178426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    libstdc++,\
178526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    )
178626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
178726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Register the 'stlport_static' STL implementation
178826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
178926f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner$(call ndk-stl-register,\
179026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    stlport_static,\
17912ca50e007226d9d571c94aec476ef5fdf8c4d3fdDavid 'Digit' Turner    cxx-stl/stlport,\
179226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    stlport_static,\
179326f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    )
179426f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner
179526f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner# Register the 'stlport_shared' STL implementation
179626f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner#
179726f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner$(call ndk-stl-register,\
179826f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    stlport_shared,\
17992ca50e007226d9d571c94aec476ef5fdf8c4d3fdDavid 'Digit' Turner    cxx-stl/stlport,\
180026f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    ,\
180126f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    stlport_shared\
180226f23925041dfcbfde15e5c98d9e7c80fd2a7408David 'Digit' Turner    )
18032ca50e007226d9d571c94aec476ef5fdf8c4d3fdDavid 'Digit' Turner
180481dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner# Register the 'gnustl_static' STL implementation
180581dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner#
180681dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner$(call ndk-stl-register,\
180781dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner    gnustl_static,\
180881dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner    cxx-stl/gnu-libstdc++,\
180981dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner    gnustl_static,\
181081dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner    \
181181dd1b4207dac8328a0ef33b676fcc773f4ca9a1David 'Digit' Turner    )
1812c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner
18130059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner$(call ndk-stl-register,\
18140059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner    gnustl_shared,\
18150059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner    cxx-stl/gnu-libstdc++,\
18160059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner    ,\
18170059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner    gnustl_shared\
18180059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner    )
18190059fb2aa9c710cfe7dfd3d67a1cdc7b5e3e284aDavid 'Digit' Turner
1820c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner# Register the static version of the GAbi++ C++ runtime
1821c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner#
1822c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner$(call ndk-stl-register,\
1823c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    gabi++_static,\
1824c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    cxx-stl/gabi++,\
1825c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    gabi++_static,\
1826c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    )
1827c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner
1828c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner# Register the shared version of the GAbi++ C++ runtime
1829c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner#
1830c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner$(call ndk-stl-register,\
1831c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    gabi++_shared,\
1832c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    cxx-stl/gabi++,\
1833c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    gabi++_shared,\
1834c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    )
1835c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner
1836c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner# The 'none' APP_STL value corresponds to no C++ support at
1837c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner# all. Used by some of the STLport and GAbi++ test projects.
1838c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner#
1839c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner$(call ndk-stl-register,\
1840c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    none,\
1841c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    cxx-stl/system,\
1842c38f5f527a59f1d849371d662f8882d325edc3bfDavid 'Digit' Turner    )
1843