16724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Copyright (C) 2010 The Android Open Source Project 26724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 36724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Licensed under the Apache License, Version 2.0 (the "License"); 46724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# you may not use this file except in compliance with the License. 56724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# You may obtain a copy of the License at 66724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 76724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# http://www.apache.org/licenses/LICENSE-2.0 86724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 96724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Unless required by applicable law or agreed to in writing, software 106724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# distributed under the License is distributed on an "AS IS" BASIS, 116724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 126724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# See the License for the specific language governing permissions and 136724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# limitations under the License. 146724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 156724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 166724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# This file is designed to be called from the 'ndk-build' script 176724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# or similar wrapper tool. 186724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 196724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 206724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Detect the NDK installation path by processing this Makefile's location. 216724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# This assumes we are located under $NDK_ROOT/build/core/main.mk 226724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 236724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerNDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST))) 246724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerNDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%)) 251e631212bdc6f4d5f889cc5357ae631dccb01b8eDavid 'Digit' TurnerNDK_ROOT := $(subst \,/,$(NDK_ROOT)) 266724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerNDK_ROOT := $(NDK_ROOT:%/=%) 276724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifeq ($(NDK_ROOT),) 286724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner # for the case when we're invoked from the NDK install path 296724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner NDK_ROOT := . 306724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif 316724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifdef NDK_LOG 326724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(info Android NDK: NDK installation path auto-detected: '$(NDK_ROOT)') 336724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif 346724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifneq ($(words $(NDK_ROOT)),1) 356724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(info Android NDK: You NDK installation path contains spaces.) 366724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(info Android NDK: Please re-install to a different location to fix the issue !) 376724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(error Aborting.) 386724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif 396724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 406724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerinclude $(NDK_ROOT)/build/core/init.mk 416724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 426724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# ==================================================================== 436724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 44fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# If NDK_PROJECT_PATH is not defined, find the application's project 45fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# path by looking at the manifest file in the current directory or 46fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# any of its parents. If none is found, try again with 'jni/Android.mk' 47fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# 484507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner# Note that we first look at the current directory to avoid using 494507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner# absolute NDK_PROJECT_PATH values. This reduces the length of all 504507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner# source, object and binary paths that are passed to build commands. 514507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner# 52fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# It turns out that some people use ndk-build to generate static 53fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# libraries without a full Android project tree. 546724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# 556724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# ==================================================================== 566724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 5713273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turnerifeq ($(HOST_OS),windows) 5813273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# On Windows, defining host-dir-parent is a bit more tricky because the 5913273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# GNU Make $(dir ...) function doesn't return an empty string when it 6013273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# reaches the top of the directory tree, and we want to enforce this to 6113273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# avoid infinite loops. 6213273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# 6313273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# $(dir C:) -> C: (empty expected) 6413273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# $(dir C:/) -> C:/ (empty expected) 6513273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# $(dir C:\) -> C:\ (empty expected) 6613273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# $(dir C:/foo) -> C:/ (correct) 6713273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# $(dir C:\foo) -> C:\ (correct) 6813273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# 6913273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turnerhost-dir-parent = $(strip \ 7013273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner $(eval __host_dir_node := $(patsubst %/,%,$(subst \,/,$1)))\ 7113273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner $(eval __host_dir_parent := $(dir $(__host_dir_node)))\ 7213273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner $(filter-out $1,$(__host_dir_parent))\ 7313273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner ) 7413273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turnerelse 7513273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turnerhost-dir-parent = $(patsubst %/,%,$(dir $1)) 7613273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turnerendif 7713273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner 78bf6d1d006d2aaab4a353b5e3c7d423a3d632f3c4David 'Digit' Turnerfind-project-dir = $(strip $(call find-project-dir-inner,$(abspath $1),$2)) 796724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 806724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerfind-project-dir-inner = \ 81a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(eval __found_project_path := )\ 826724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(eval __find_project_path := $1)\ 83fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner $(eval __find_project_file := $2)\ 846724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(call find-project-dir-inner-2)\ 85a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(__found_project_path) 866724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 876724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerfind-project-dir-inner-2 = \ 88fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner $(call ndk_log,Looking for $(__find_project_file) in $(__find_project_path))\ 89fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner $(eval __find_project_manifest := $(strip $(wildcard $(__find_project_path)/$(__find_project_file))))\ 906724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(if $(__find_project_manifest),\ 91a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(call ndk_log, Found it !)\ 92a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(eval __found_project_path := $(__find_project_path))\ 93a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner ,\ 9413273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner $(eval __find_project_parent := $(call host-dir-parent,$(__find_project_path)))\ 956724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(if $(__find_project_parent),\ 966724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(eval __find_project_path := $(__find_project_parent))\ 976724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(call find-project-dir-inner-2)\ 986724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner )\ 996724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner ) 1006724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 101fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' TurnerNDK_PROJECT_PATH := $(strip $(NDK_PROJECT_PATH)) 10213273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner 10313273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# To keep paths as short as possible during the build, we first look if the 10413273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# current directory is the top of our project path. If this is the case, we 10513273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# will define NDK_PROJECT_PATH to simply '.' 10613273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# 10713273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# Otherwise, we will use find-project-dir which will first get the absolute 10813273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# path of the current directory the climb back the hierarchy until we find 10913273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# something. The result will always be a much longer definition for 11013273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# NDK_PROJECT_PATH 11113273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner# 112fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerifndef NDK_PROJECT_PATH 1134507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner ifneq (,$(strip $(wildcard AndroidManifest.xml))) 1144507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner NDK_PROJECT_PATH := . 1154507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner else 1164507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner ifneq (,$(strip $(wildcard jni/Android.mk))) 1174507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner NDK_PROJECT_PATH := . 1184507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner endif 1194507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner endif 1204507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turnerendif 1214507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turnerifndef NDK_PROJECT_PATH 1224507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turner NDK_PROJECT_PATH := $(call find-project-dir,.,jni/Android.mk) 1234507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turnerendif 1244507f6d3f5eb8ec568420b08255d897600915a75David 'Digit' Turnerifndef NDK_PROJECT_PATH 12513273ef24b1bac62626d4bbfd4f09dd3ecf02de1David 'Digit' Turner NDK_PROJECT_PATH := $(call find-project-dir,.,AndroidManifest.xml) 126fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerendif 127a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifndef NDK_PROJECT_PATH 128fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner $(call __ndk_info,Could not find application project directory !) 129fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner $(call __ndk_info,Please define the NDK_PROJECT_PATH variable to point to it.) 1306724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(call __ndk_error,Aborting) 1316724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif 1326724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 1336724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Check that there are no spaces in the project path, or bad things will happen 134a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifneq ($(words $(NDK_PROJECT_PATH)),1) 135a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(call __ndk_info,Your Android application project path contains spaces: '$(NDK_PROJECT_PATH)') 1366724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(call __ndk_info,The Android NDK build cannot work here. Please move your project to a different location.) 1376724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner $(call __ndk_error,Aborting.) 1386724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif 1396724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 140a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerNDK_APPLICATION_MK := $(strip $(wildcard $(NDK_PROJECT_PATH)/jni/Application.mk)) 1416724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifndef NDK_APPLICATION_MK 1426724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner NDK_APPLICATION_MK := $(NDK_ROOT)/build/core/default-application.mk 1436724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif 1446724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 145a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner$(call ndk_log,Found project path: $(NDK_PROJECT_PATH)) 146a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner 1476724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Place all generated files here 148ff7cd04c9fb4fc916998f7b2735ef75b839cbef5David 'Digit' TurnerNDK_APP_OUT := $(strip $(NDK_OUT)) 149ff7cd04c9fb4fc916998f7b2735ef75b839cbef5David 'Digit' Turnerifndef NDK_APP_OUT 150ff7cd04c9fb4fc916998f7b2735ef75b839cbef5David 'Digit' Turner NDK_APP_OUT := $(NDK_PROJECT_PATH)/obj 151ff7cd04c9fb4fc916998f7b2735ef75b839cbef5David 'Digit' Turnerendif 152ff7cd04c9fb4fc916998f7b2735ef75b839cbef5David 'Digit' Turner$(call ndk_log,Ouput path: $(NDK_APP_OUT)) 1536724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 1546724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Fake an application named 'local' 1556724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner_app := local 1566724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner_application_mk := $(NDK_APPLICATION_MK) 1576724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerNDK_APPS := $(_app) 1586724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 15962e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# For cygwin, put generated dependency conversion script here 16062e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# Do not define this variable for other host platforms 16162e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner# 16262e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turnerifeq ($(HOST_OS),cygwin) 16362e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' TurnerNDK_DEPENDENCIES_CONVERTER := $(NDK_APP_OUT)/convert-dependencies.sh 16462e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turnerendif 16562e94189bb3a26ea1f31e8e0cf921d9cb9b5c91eDavid 'Digit' Turner 1666724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerinclude $(BUILD_SYSTEM)/add-application.mk 1676724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner 168a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# If a goal is DUMP_xxx then we dump a variable xxx instead 169a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# of building anything 170a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# 171a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerDUMP_VAR := $(patsubst DUMP_%,%,$(filter DUMP_%,$(MAKECMDGOALS))) 172a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerMAKECMDGOALS := $(filter-out DUMP_$(DUMP_VAR),$(MAKECMDGOALS)) 173a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner 1745b65625ab0a6a50f332b9970a8cca513d9775788David 'Digit' Turnerinclude $(BUILD_SYSTEM)/setup-imports.mk 1755b65625ab0a6a50f332b9970a8cca513d9775788David 'Digit' Turner 176a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifneq (,$(DUMP_VAR)) 177a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner 178a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# We only support a single DUMP_XXX goal at a time for now. 179a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifneq ($(words $(DUMP_VAR)),1) 180a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(call __ndk_error,!!TOO-MANY-DUMP-VARIABLES!!) 181a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerendif 182a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner 183a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner$(foreach _app,$(NDK_APPS),\ 184a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner $(eval include $(BUILD_SYSTEM)/setup-app.mk)\ 185a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner) 186a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner 187a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerDUMP_$(DUMP_VAR): 188a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner @echo $($(DUMP_VAR)) 189a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerelse 190a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner # Build it 191a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner include $(BUILD_SYSTEM)/build-all.mk 192a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerendif 193