1. 程式人生 > >Android.mk 語法和變數介紹

Android.mk 語法和變數介紹

一、簡介

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>)