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