android-ndk-1.5_r1 の makefile (2)
日中に色々確認したメモ。
NDK_APP_MODULES は build/core/setup-toolchain.mk の末端の以下の部分で設定されている模様。
# For each app, compute intermediate directories and parse module sources $(foreach _app,$(NDK_APPS),\ $(eval include $(BUILD_SYSTEM)/setup-app.mk)\ )
上記は NDK_APPS から一つづつ値を取り出して _app にセットしつつ build/core/setup-app.mk を呼び出している。で、setup-app.mk 中の先頭箇所にてごにょごにょしてます。
NDK_APP_NAME := $(_app) NDK_APP_APPLICATION_MK := $(NDK_APP.$(_app).Application.mk) $(foreach __name,$(NDK_APP_VARS),\ $(eval NDK_$(__name) := $(NDK_APP.$(_app).$(__name)))\ )
NDK_APP_VARS は definitions.mk にて以下のナニ。
# ============================================================================= # # Application.mk support # # ============================================================================= # the list of variables that *must* be defined in Application.mk files NDK_APP_VARS_REQUIRED := APP_MODULES APP_PROJECT_PATH # the list of variables that *may* be defined in Application.mk files NDK_APP_VARS_OPTIONAL := APP_OPTIM APP_CPPFLAGS APP_CFLAGS APP_CXXFLAGS # the list of all variables that may appear in an Application.mk file NDK_APP_VARS := $(NDK_APP_VARS_REQUIRED) $(NDK_APP_VARS_OPTIONAL)
APP_MODULES という値も設定されてます。しかしここで微妙なのが例えば以下の記述。
$(eval NDK_$(__name) := $(NDK_APP.$(_app).$(__name)))\
例えば NDK_APP_MODULE であれば hello-jni とかが代入されるんでしょうけど
$(NDK_APP.$(_app).$(__name))
がどのように評価されるのかが謎。ダレカタスケテ状態だったりします。
結局
ピリオドは特別な意味はなくって単純に変数名な事が判明。複数プロジェクトの make に対応するためにこんな作りになっているみたい。どうやら add-application.mk にて云々されている様子。
流れ的に
- apps/*/Application.mk を取り出して一つづつ _application.mk にセットして build/core/add-application.mk を include
- アプリ固有の NDK_APP.hello-jni.* (例) な変数定義
- build/core/setup-toolchain.mk を incluse
- NDK_APPS から一つづつ値を取り出して _app にセットして build/core/setup-app.mk を include
- NDK_$(__name) に $(NDK_APP.hello-jni.$(__name)) の値を設定
- ビルドターゲットの設定とか
- 例えば ndk-app-hello-jni は $(NDK_APP_MODULES) に依存
- 上記の場合は hello-jni が値として NDK_APP_MODULES に格納?
- sources/*/Android.mk の include とか
- NDK_APPS から一つづつ値を取り出して _app にセットして build/core/setup-app.mk を include
って、結局 libhello-jni.so を作るルールが見えんぞ。以下? (ex. hello-jni)
- setup-app.mk の以下の部分
# make the application depend on the modules it requires .PHONY: ndk-app-$(_app) ndk-app-$(_app): $(NDK_APP_MODULES) all: ndk-app-$(_app)
-
- 上記は hello-jni だと ndk-app-hello-jni で NDK_APP_MODULES は hello-jni ?
- hello-jni の Android.mk が以下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
- build/core/build-shared-library.mk について
- $(LOCAL_INSTALLED_MODULES) は $(LOCAL_BUILT_MODULE) に依存 (中身略
- $(LOCAL_BUILT_MODULE) は $(LOCAL_MODULE) を加工したもの
- $(LOCAL_BUILT_MODULE) は $(LOCAL_OBJECTS) に依存
- $(LOCAL_OBJECTS) は compile-c-source にて LOCAL_SRC_FILES の .c を .o に置き換えたナニ
- build-binary.mk によれば LOCALSRC_FILES に記述したソースファイルは強制でコンパイルされて .o が LOCAL_OBJECTS に格納されるはず
- てコトはライブラリ作るのは結構楽なのか (本当?
- でもかなり無理やり気味っちゃそうかも
相当ざっくりな理解かも。てか全部きっちり読むのは相当なリキが必要ッス。