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 とか

って、結局 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 に格納されるはず
    • てコトはライブラリ作るのは結構楽なのか (本当?
    • でもかなり無理やり気味っちゃそうかも

相当ざっくりな理解かも。てか全部きっちり読むのは相当なリキが必要ッス。