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/=%))
256724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerNDK_ROOT := $(NDK_ROOT:%/=%)
266724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifeq ($(NDK_ROOT),)
276724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    # for the case when we're invoked from the NDK install path
286724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    NDK_ROOT := .
296724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif
306724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifdef NDK_LOG
316724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(info Android NDK: NDK installation path auto-detected: '$(NDK_ROOT)')
326724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif
336724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifneq ($(words $(NDK_ROOT)),1)
346724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(info Android NDK: You NDK installation path contains spaces.)
356724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(info Android NDK: Please re-install to a different location to fix the issue !)
366724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(error Aborting.)
376724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif
386724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
396724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerinclude $(NDK_ROOT)/build/core/init.mk
406724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
416724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# ====================================================================
426724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
43fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# If NDK_PROJECT_PATH is not defined, find the application's project
44fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# path by looking at the manifest file in the current directory or
45fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# any of its parents. If none is found, try again with 'jni/Android.mk'
46fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner#
47fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# It turns out that some people use ndk-build to generate static
48fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner# libraries without a full Android project tree.
496724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
506724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# ====================================================================
516724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
52fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerfind-project-dir = $(strip $(call find-project-dir-inner,$1,$2))
536724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
546724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerfind-project-dir-inner = \
55a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    $(eval __found_project_path := )\
566724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(eval __find_project_path := $1)\
57fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    $(eval __find_project_file := $2)\
586724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(call find-project-dir-inner-2)\
59a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    $(__found_project_path)
606724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
616724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerfind-project-dir-inner-2 = \
62fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    $(call ndk_log,Looking for $(__find_project_file) in $(__find_project_path))\
63fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    $(eval __find_project_manifest := $(strip $(wildcard $(__find_project_path)/$(__find_project_file))))\
646724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(if $(__find_project_manifest),\
65a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner        $(call ndk_log,    Found it !)\
66a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner        $(eval __found_project_path := $(__find_project_path))\
67a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner        ,\
686724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner        $(eval __find_project_parent := $(patsubst %/,%,$(dir $(__find_project_path))))\
696724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner        $(if $(__find_project_parent),\
706724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner            $(eval __find_project_path := $(__find_project_parent))\
716724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner            $(call find-project-dir-inner-2)\
726724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner        )\
736724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    )
746724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
75fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' TurnerNDK_PROJECT_PATH := $(strip $(NDK_PROJECT_PATH))
76fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerifndef NDK_PROJECT_PATH
77fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    NDK_PROJECT_PATH := $(call find-project-dir,$(strip $(shell pwd)),AndroidManifest.xml)
78fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerendif
79fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerifndef NDK_PROJECT_PATH
80fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    NDK_PROJECT_PATH := $(call find-project-dir,$(strip $(shell pwd)),jni/Android.mk)
81fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turnerendif
82a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifndef NDK_PROJECT_PATH
83fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    $(call __ndk_info,Could not find application project directory !)
84fba9e492fc1bda504161a37225bd2ba05e1f4a2bDavid 'Digit' Turner    $(call __ndk_info,Please define the NDK_PROJECT_PATH variable to point to it.)
856724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(call __ndk_error,Aborting)
866724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif
876724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
886724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Check that there are no spaces in the project path, or bad things will happen
89a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifneq ($(words $(NDK_PROJECT_PATH)),1)
90a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    $(call __ndk_info,Your Android application project path contains spaces: '$(NDK_PROJECT_PATH)')
916724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(call __ndk_info,The Android NDK build cannot work here. Please move your project to a different location.)
926724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    $(call __ndk_error,Aborting.)
936724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif
946724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
95a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerNDK_APPLICATION_MK := $(strip $(wildcard $(NDK_PROJECT_PATH)/jni/Application.mk))
966724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerifndef NDK_APPLICATION_MK
976724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner    NDK_APPLICATION_MK := $(NDK_ROOT)/build/core/default-application.mk
986724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerendif
996724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
100a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner$(call ndk_log,Found project path: $(NDK_PROJECT_PATH))
101a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
1026724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Place all generated files here
103824b722a8b00de0cf6dcbd93015caf66cbf71c8aDavid 'Digit' TurnerNDK_APP_OUT := $(NDK_PROJECT_PATH)/obj
1046724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
1056724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Fake an application named 'local'
1066724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner_app            := local
1076724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner_application_mk := $(NDK_APPLICATION_MK)
1086724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerNDK_APPS        := $(_app)
1096724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
1106724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerinclude $(BUILD_SYSTEM)/add-application.mk
1116724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
112a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# If a goal is DUMP_xxx then we dump a variable xxx instead
113a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# of building anything
114a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner#
115a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerDUMP_VAR     := $(patsubst DUMP_%,%,$(filter DUMP_%,$(MAKECMDGOALS)))
116a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerMAKECMDGOALS := $(filter-out DUMP_$(DUMP_VAR),$(MAKECMDGOALS))
117a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
118a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifneq (,$(DUMP_VAR))
119a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
120a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# We only support a single DUMP_XXX goal at a time for now.
121a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerifneq ($(words $(DUMP_VAR)),1)
122a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    $(call __ndk_error,!!TOO-MANY-DUMP-VARIABLES!!)
123a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerendif
124a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
125a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner$(foreach _app,$(NDK_APPS),\
126a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner  $(eval include $(BUILD_SYSTEM)/setup-app.mk)\
127a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner)
128a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
129a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' TurnerDUMP_$(DUMP_VAR):
130a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner	@echo $($(DUMP_VAR))
131a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerelse
132a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    # Build it
133a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner    include $(BUILD_SYSTEM)/build-all.mk
134a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turnerendif
135