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