Android.mk 語法和變數介紹
阿新 • • 發佈:2018-11-15
一、簡介
Android.mk 是一種指令碼語言,是將 C/C++ 原始檔粘合至 NDK 的構建檔案。
官網對 Android.mk 的介紹:https://developer.android.com/ndk/guides/android_mk
二、一些超級基本的語法
例如我們使用 #
表示註釋,使用 $()
表示取值,使用 :=
表示賦值,使用 +=
表示附加等等。
在學習之前,我們起碼得看得懂這些。
示例:
# 註釋內容使用 "#" 號
# call 是呼叫一個系統提供的巨集函式,此處是 my-dir
# $() 是取值
# := 是賦值
LOCAL_PATH := $(call my-dir)
# 我們也可以使用 ifeq 和 ifneq 進行條件判斷
ifeq ($(HOST_OS, linux)
...(省略)
else
...(省略)
endif
# 使用 := 是賦值,當某一行很長時,可以使用反斜槓 \ 換行
LOCAL_SRC_FILES := adb.c \
utils.c
# 使用 += 是附加
LOCAL_SRC_FILES += $(USB_SRCS)
三、常用變數名
變數名 | 說明 |
---|---|
LOCAL_PATH | 用來指定當前原始碼所在的目錄,它不會被 CLEAR_VARS 清除,一般第一步就是定義該變數,寫法也很固定,即:LOCAL_PATH := $(call my-dir) |
CLEAR_VARS | 清除很多除 LOCAL_PATH 外的變數。因為所有的 Makefile 都是在同一個編譯環境在執行的,變數的定義理論上都是全域性的,所以每個模組編譯開始前進行清理工作是非常必要的。寫法也很固定,即:include $(CLEAR_VARS) |
LOCAL_MODULE | 模組名,整個編譯系統中唯一存在,命名時中間不能有空格,且系統會幫你新增諸如 “lib” 字首和 “.a” 或 “.so” 字尾等 |
LOCAL_MODULE_PATH | 模組的輸出路徑 |
LOCAL_MODULE_TAGS | 模組的一些標籤,標籤之間使用空格隔開 |
LOCAL_SRC_FILES | 此變數包含構建系統用於生成模組的原始檔列表,可使用相對路徑或絕對路徑,但為了移植性應儘量選擇使用相對路徑 |
LOCAL_CC | 指定 C 編譯器 |
LOCAL_CXX | 指定 C++ 編譯器 |
LOCAL_CPP_EXTENSION | 可以使用此可選變數為 C++ 原始檔指明 .cpp 以外的副檔名,如:LOCAL_CPP_EXTENSION := .cxx .cpp .cc |
LOCAL_CFLAGS | 此可選變數為構建系統設定在構建 C 和 C++ 原始檔時要傳遞的編譯器標誌。 此功能對於指定額外的巨集定義或編譯選項可能很有用 |
LOCAL_CPPFLAGS(LOCAL_CXXFLAGS) | 僅當構建 C++ 原始檔時才會傳遞一組可選的編譯器標誌。 它們將出現在編譯器命令列中的 LOCAL_CFLAGS 後面 |
LOCAL_C_INCLUDES | 編譯所需的額外標頭檔案,可以使用此可選變數指定相對於 NDK root 目錄的路徑列表 |
LOCAL_STATIC_LIBRARIES | 編譯所需的靜態庫列表 |
LOCAL_SHARED_LIBRARIES | 編譯所需的動態庫列表 |
LOCAL_JAVA_LIBRARIES | 編譯所需的 Java 類庫 |
LOCAL_LDLIBS | 編譯所需的其他連結器標誌列表。它可讓您使用 -l 字首傳遞特定系統庫的名稱。 例如,以下示例指示連結器生成在載入時連結到 /system/lib/libz.so 的模組: LOCAL_LDLIBS := -lz |
LOCAL_LDFLAGS | 構建共享庫或可執行檔案時供構建系統使用的其他連結器標誌列表 |
BUILD_HOST_STATIC_LIBRARY BUILD_HOST_SHARED_LIBRARY BUILD_HOST_EXECUTABLE BUILD_STATIC_LIBRARY BUILD_SHARED_LIBRARY BUILD_EXECUTABLE BUILD_RAW_STATIC_LIBRARY BUILD_RAW_EXECUTABLE … |
各種形式的編譯模板,生成指定形式的檔案 |
示例
LOCAL_PATH := $(call my-dir)
LOCAL_PREBUILT_DIR := prebuilt
# 預編譯模組1
include $(CLEAR_VARS)
LOCAL_MODULE := fastcv_android
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libfastcv_android.a
include $(PREBUILT_STATIC_LIBRARY)
# 預編譯模組2
include $(CLEAR_VARS)
LOCAL_MODULE := api_fastcv
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libapi_fastcv.a
include $(PREBUILT_STATIC_LIBRARY)
# 預編譯模組3
include $(CLEAR_VARS)
LOCAL_MODULE := fmath_android_armv7
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libfmath_android.a
include $(PREBUILT_STATIC_LIBRARY)
# 預編譯模組4
include $(CLEAR_VARS)
LOCAL_MODULE := api_fmath
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libapi_fmath.a
include $(PREBUILT_STATIC_LIBRARY)
# 目標模組
include $(CLEAR_VARS)
LOCAL_MODULE := demo
# 原始檔
LOCAL_SRC_FILES := hello.cpp \
world.cpp \
# 額外的標頭檔案
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(LOCAL_PREBUILT_DIR)/include
# 需要連結的系統庫
LOCAL_LDLIBS := -llog -lz -L$(SYSROOT)/usr/lib/$(TARGET_ARCH_ABI) -ljnigraphics
# 一些巨集定義和編譯選項
LOCAL_CFLAGS := -DFASTCV_USE_ARM -DUSE_ARM
LOCAL_CFLAGS += -std=c++11
# 連結上面預編譯的靜態庫
LOCAL_STATIC_LIBRARIES := -L$(LOCAL_PATH)/lib api_fastcv fastcv_android fmath_android api_fmath
# 編譯所需要動態庫
LOCAL_SHARED_LIBRARIES := face_api
# 指定生成動態庫
include $(BUILD_SHARED_LIBRARY)
注意到,一個模組總是以 include $(CLEAR_VARS)
開始,以 include $(BUILD_SHARED_LIBRARY)
結束(這裡也可以是其它的編譯模板,如 BUILD_STATIC_LIBRARY)。
四、NDK 提供的函式巨集
使用 $(call <function>)
來呼叫函式。
下表介紹 NDK 提供的 GNU Make 函式巨集。當然一些廠商原始碼也會提供一些定製化的函式。
函式 | 說明 |
---|---|
my-dir | 此巨集返回最後包含的 makefile 的路徑,通常是當前 Android.mk 的目錄 |
all-subdir-makefiles | 返回位於當前 my-dir 路徑所有子目錄中的 Android.mk 檔案列表 |
this-makefile | 返回當前 makefile(構建系統從中呼叫函式)的路徑 |
parent-makefile | 返回包含樹中父 makefile 的路徑(包含當前 makefile 的 makefile 路徑) |
grand-parent-makefile | 返回包含樹中祖父 makefile 的路徑(包含當前父 makefile 的 makefile 路徑) |
import-module | 用於按模組的名稱查詢和包含模組的 Android.mk 檔案的函式。 典型的示例如下所示:$(call import-module,<name>) |