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
1648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# this script is used to record an application definition in the
1748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# NDK build system, before performing any build whatsoever.
1848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
1948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# It is included repeatedly from build/core/main.mk and expects a
2048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# variable named '_application_mk' which points to a given Application.mk
2148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# file that will be included here. The latter must define a few variables
2248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# to describe the application to the build system, and the rest of the
2348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# code here will perform book-keeping and basic checks
2448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner#
2548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
266724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner$(call assert-defined, _application_mk _app)
275815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner$(call ndk_log,Parsing $(_application_mk))
2848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
2948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner$(call clear-vars, $(NDK_APP_VARS))
3048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
3148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turnerinclude $(_application_mk)
3248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
3348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner$(call check-required-vars,$(NDK_APP_VARS_REQUIRED),$(_application_mk))
3448ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
356724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner_map := NDK_APP.$(_app)
365815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner
3748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# strip the 'lib' prefix in front of APP_MODULES modules
3848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' TurnerAPP_MODULES := $(call strip-lib-prefix,$(APP_MODULES))
3948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
40a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerAPP_PROJECT_PATH := $(strip $(APP_PROJECT_PATH))
41a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifndef APP_PROJECT_PATH
42a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    APP_PROJECT_PATH := $(NDK_PROJECT_PATH)
43a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerendif
44a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
455815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner# check whether APP_PLATFORM is defined. If not, look for default.properties in
465815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner# the $(APP_PROJECT_PATH) and extract the value with awk's help. If nothing is here,
475815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner# revert to the default value (i.e. "android-3").
485815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner#
495815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner# NOTE: APP_PLATFORM is an experimental feature for now.
505815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner#
515815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' TurnerAPP_PLATFORM := $(strip $(APP_PLATFORM))
525815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turnerifndef APP_PLATFORM
535815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner    _local_props := $(strip $(wildcard $(APP_PROJECT_PATH)/default.properties))
545815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner    ifdef _local_props
550b2676bac67c271de9989357f6e3b2e762a7adf1David 'Digit' Turner        APP_PLATFORM := $(strip $(shell $(HOST_AWK) -f $(BUILD_AWK)/extract-platform.awk < $(_local_props)))
565815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner        $(call ndk_log,  Found APP_PLATFORM=$(APP_PLATFORM) in $(_local_props))
575815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner    else
585815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner        APP_PLATFORM := android-3
595815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner        $(call ndk_log,  Defaulted to APP_PLATFORM=$(APP_PLATFORM))
605815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner    endif
615815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turnerendif
625815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner
63f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turner# SPECIAL CASE: android-6 and android-7 are the same thing than android-5
64f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turner#               with regards to the NDK. Adjust accordingly!
65f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turnerifneq (,$(filter android-6 android-7,$(APP_PLATFORM)))
66f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turner    APP_PLATFORM := android-5
67f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turner    $(call ndk_log,  Adjusting APP_PLATFORM to $(APP_PLATFORM))
68f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turnerendif
69f13db29e2847a3760e403332ea3243915e0f4bf3David 'Digit' Turner
7019f4e359965dd2c7f1b215e699f152fb7946f1f5David 'Digit' Turner# Check that the value of APP_PLATFORM corresponds to a known platform
7119f4e359965dd2c7f1b215e699f152fb7946f1f5David 'Digit' Turner# If not, we're going to use the max supported platform value.
7219f4e359965dd2c7f1b215e699f152fb7946f1f5David 'Digit' Turner#
735815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner_bad_platform := $(strip $(filter-out $(NDK_ALL_PLATFORMS),$(APP_PLATFORM)))
745815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turnerifdef _bad_platform
75a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    $(call ndk_log,Application $(_name) targets unknown platform '$(_bad_platform)')
7619f4e359965dd2c7f1b215e699f152fb7946f1f5David 'Digit' Turner    APP_PLATFORM := android-$(NDK_MAX_PLATFORM_LEVEL)
77a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    $(call ndk_log,Switching to $(APP_PLATFORM))
785815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turnerendif
7948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
8085459717ff102979c1b98f65d23a37538d177d22David Turner# Check that the value of APP_ABI corresponds to known ABIs
8185459717ff102979c1b98f65d23a37538d177d22David Turner#
8285459717ff102979c1b98f65d23a37538d177d22David Turner_bad_abis := $(strip $(filter-out $(NDK_ALL_ABIS),$(APP_ABI)))
8385459717ff102979c1b98f65d23a37538d177d22David Turnerifdef _bad_abis
8485459717ff102979c1b98f65d23a37538d177d22David Turner    $(call __ndk_info,Application $(_name) targets unknown ABI '$(_bad_abis)')
8585459717ff102979c1b98f65d23a37538d177d22David Turner    $(call __ndk_info,Please fix the APP_ABI definition in $(_application_mk))
8685459717ff102979c1b98f65d23a37538d177d22David Turner    $(call __ndk_info,to use a set of the following values: $(NDK_ALL_ABIS))
8785459717ff102979c1b98f65d23a37538d177d22David Turner    $(call __ndk_error,Aborting)
8885459717ff102979c1b98f65d23a37538d177d22David Turnerendif
8985459717ff102979c1b98f65d23a37538d177d22David Turner
9025f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner# If APP_BUILD_SCRIPT is defined, check that the file exists.
9125f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner# If undefined, look in $(APP_PROJECT_PATH)/jni/Android.mk
9225f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner#
9325f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' TurnerAPP_BUILD_SCRIPT := $(strip $(APP_BUILD_SCRIPT))
9425f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turnerifdef APP_BUILD_SCRIPT
9525f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    _build_script := $(strip $(wildcard $(APP_BUILD_SCRIPT)))
9625f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    ifndef _build_script
9725f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner        $(call __ndk_info,Your APP_BUILD_SCRIPT points to an unknown file: $(APP_BUILD_SCRIPT))
9825f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner        $(call __ndk_error,Aborting...)
9925f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    endif
10025f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    APP_BUILD_SCRIPT := $(_build_script)
10125f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    $(call ndk_log,  Using build script $(APP_BUILD_SCRIPT))
10225f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turnerelse
10325f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    _build_script := $(strip $(wildcard $(APP_PROJECT_PATH)/jni/Android.mk))
10425f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    ifndef _build_script
10525f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner        $(call __ndk_info,There is no Android.mk under $(APP_PROJECT_PATH)/jni)
10625f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner        $(call __ndk_info,If this is intentional, please define APP_BUILD_SCRIPT to point)
10725f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner        $(call __ndk_info,to a valid NDK build script.)
10825f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner        $(call __ndk_error,Aborting...)
10925f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    endif
11025f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    APP_BUILD_SCRIPT := $(_build_script)
11125f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner    $(call ndk_log,  Defaulted to APP_BUILD_SCRIPT=$(APP_BUILD_SCRIPT))
11225f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turnerendif
11325f47bc03dbe536d2fb4a231316a38a2d0a8ee59David 'Digit' Turner
114219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# Extract the debuggable flag from the application's manifest
115219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# NOTE: To make unit-testing simpler, handle the case where there is no manifest.
116219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner#
117219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' TurnerAPP_DEBUGGABLE := false
118219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' TurnerAPP_MANIFEST := $(strip $(wildcard $(APP_PROJECT_PATH)/AndroidManifest.xml))
119219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerifdef APP_MANIFEST
120219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    APP_DEBUGGABLE := $(shell $(HOST_AWK) -f $(BUILD_AWK)/extract-debuggable.awk $(APP_MANIFEST))
121219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerendif
122219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner
123219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerifdef NDK_LOG
124219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner  ifeq ($(APP_DEBUGGABLE),true)
125219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    $(call ndk_log,Application '$(_app)' *is* debuggable)
126219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner  else
127219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    $(call ndk_log,Application '$(_app)' is not debuggable)
128219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner  endif
129219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerendif
130219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner
131219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# LOCAL_BUILD_MODE will be either release or debug
132219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner#
133219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# If APP_OPTIM is defined in the Application.mk, just use this.
134219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner#
135219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# Otherwise, set to 'debug' if android:debuggable is set to TRUE,
136219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# and to 'release' if not.
137219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner#
138219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerifneq ($(APP_OPTIM),)
139219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    # check that APP_OPTIM, if defined, is either 'release' or 'debug'
140219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    $(if $(filter-out release debug,$(APP_OPTIM)),\
141219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner        $(call __ndk_info, The APP_OPTIM defined in $(_application_mk) must only be 'release' or 'debug')\
142219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner        $(call __ndk_error,Aborting)\
143219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    )
144219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    $(call ndk_log,Selecting optimization mode through Application.mk: $(APP_OPTIM))
145219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerelse
146219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    ifeq ($(APP_DEBUGGABLE),true)
147219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner        $(call ndk_log,Selecting debug optimization mode (app is debuggable))
148219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner        APP_OPTIM := debug
149219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    else
150219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner        $(call ndk_log,Selecting release optimization mode (app is not debuggable))
151219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner        APP_OPTIM := release
152219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner    endif
153219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerendif
154219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner
155219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# set release/debug build flags. We always use the -g flag because
156219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# we generate symbol versions of the binaries that are later stripped
157219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner# when they are copied to the final project's libs/<abi> directory.
158219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner#
159219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerifeq ($(APP_OPTIM),debug)
160219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner  APP_CFLAGS := -O0 -g $(APP_CFLAGS)
161219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerelse
162219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner  APP_CFLAGS := -O2 -DNDEBUG -g $(APP_CFLAGS)
163219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turnerendif
164219eddd0f8d4ee578d5afb895decc60a364a7191David 'Digit' Turner
1655815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner$(if $(call get,$(_map),defined),\
1665815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner  $(call __ndk_info,Weird, the application $(_name) is already defined by $(call get,$(_map),defined))\
16748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner  $(call __ndk_error,Aborting)\
16848ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner)
16948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
1705815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner$(call set,$(_map),defined,$(_application_mk))
17148ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
17248ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Record all app-specific variable definitions
17348ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner$(foreach __name,$(NDK_APP_VARS),\
1745815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner  $(call set,$(_map),$(__name),$($(__name)))\
17548ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner)
17648ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
17748ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner# Record the Application.mk for debugging
1785815d77ccd68a5f6f8f7d6f4fa5dfbd05828d33fDavid 'Digit' Turner$(call set,$(_map),Application.mk,$(_application_mk))
17948ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' Turner
18048ef1859ef0bb25547e5aceeedb9b175c6193bc5David 'Digit' TurnerNDK_ALL_APPS += $(_name)
181