Android.mk 파일은 안드로이드 프로젝트를 빌드할 때 Android NDK에 코딩한 C와 C++ 소스 파일들을 설명해 주기 위해 작성하는 파일입니다.
이 파일을 이용해 작성 한 소스들을 modules로 만들 수 있습니다.
하나의 모듈은 static library나 shared library가 될 수 있습니다. shared library들은 application package에 설치되거나 복사됩니다.
또한, shared library를 생성하기 사용되어 질 수도 있습니다.
(1) LOCAL_PATH := $(call my-dir)
Android.mk 파일은 반드시 LOCAL_PATH 변수를 먼저 선언해야 합니다. 개발 소스 트리에서 소스 파일들의 위치를 나타내기 위해 사용됩니다.
빌드 시스템에서 제공하는 'my-dir' 매크로 함수는 현재 디렉토리의 경로를 리턴합니다.
(2) include $(CLEAR_VARS)
빌드 시스템에서 제공하는 CLEAR_VARS 변수는 LOCAL_PATH를 제외한 LOCAL_XXX 형식의 많은 변수들을 초기화 시켜줍니다.
모든 빌드 제어 파일들의 변수들은 전역변수이기 때문에 초기화가 필요합니다.
(3) LOCAL_MODULE := game_shared
LOCAL_MOULDE 변수는 Android.mk 파일에 있는 각 모듈을 구분하기 위해 지정해줘야 합니다. 변수명은 반드시 유일(unique)해야 하고 공백이 있어서는 안됩니다.
빌드 시스템은 생성되는 파일에 따라 접두사(prefix)나 접미사(suffix)가 붙습니다. 예를 들면, foo라는 shared library module은 libfoo.so가 됩니다.
그림에서는 변수에 game_shared를 넣었으니 libgame_shared.so라는 이름의 파일이 생성될 것입니다.
(4) LOCAL_MODULE_FILENAME := libgame
이 변수는 LOCAL_MODULE에서 생성되는 파일들의 이름을 재정의 해주는 역할을 하며, 써도 되고 안써도 되는 옵션 변수입니다.
기본 설정으로는 module <foo>는 항상 static library 인 lib<foo>.a나 shared library인 lib<foo>.so를 생성합니다.
LOCAL_MODULE_FILENAME을 정의하면 이름을 바꿀 수 있습니다. 그림에서는 변수에 libgame이라고 넣었으니, libgame.so라는 파일이 생성됩니다.
(5) LOCAL_SRC_FILES
모듈을 빌드할 때 사용하는 소스 파일들의 리스트입니다. 컴파일 할 파일들(.cpp)만 리스트에 게재해두면, 빌드 시스템에서 자동으로 의존성(dependencies)을
처리해줄 것입니다. 그리고 파일 리스트를 작성할 때 경로명에 유닉스 스타일의 앞 슬래쉬(/)를 사용해야 합니다. 윈도우 스타일의 백 슬래쉬(\)을 사용하면
올바르게 처리되지 않습니다. LOCAL_SRC_FILE에는 개발하면서 생성한 cpp 파일을 추가합니다.
(6) LOCAL_C_INCLUDES
모든 소스들(C,C++와 Assembly)을 컴파일 할 때, 추가적으로 덧붙여서 포함(include)하는 경로 리스트라고 할 수 있습니다. 예를 들면,
LOCAL_C_INCLUDES := sources/foo와
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo는 같습니다.
(7) LOCAL_WHOLE_STATIC_LIBRARIES
이 변수는 "whole archives"로서 사용되는 라이브러리 모듈을 Linker에 표현하기 위해 사용합니다.
--whole-archive flag에 대해서는 GNU linker's documentation을 찾아보시기 바랍니다.
그리고 이 변수는 여러 static library간에 서로 물고 물리는 의존성(circular dependencies)를 가질 때 유용합니다.
shared library를 빌드할 때, whole static library들로부터 만들어진 모든 object 파일들은 최종 바이너리 파일에 강제적으로 추가됩니다.
위 그림에서는 box2d_static을 추가하여 libgame.so파일에 강제적으로 box2d 관련 object 파일들이 추가되도록 하였습니다.
(8) include $(BUILD_SHARED_LIBRARY)
빌드 시스템에서 제공하는 BUILD_SHARED_LIBRARY는 가장 최근에 작성된 'include $(CLEAR_VARS)' 이후에 정의된 LOCAL_XXX 변수들의 모든 정보를 모으고,
무엇을 빌드할지 정하고, 그것을 어떻게 수행할지를 담당하는 GNU Makefile script 파일을 가리키는 변수입니다.
(9) import-module
$(call import-module,<name>)
NDK_MODULE_PATH 환경 변수로 설정한 디렉토리에서 <name>으로 이름 붙여진 모듈을 찾아서 그 모듈의 Android.mk 파일을 자동으로 포함시킵니다.
그림에서는 Box2D 디렉토리를 추가해서 Box2D 디렉토리에 있는 Android.mk 파일을 추가하였습니다.