Android.mk添加目录中所有源文件

Android NDK开发中,经常遇到需要在andoid.mk文件中包含特定的cpp文件(或c文件)

LOCAL_SRC_FILES := main.cpp \
    mylib/src1.cpp \
    mylib/Classes/src2.cpp\
    mylib/Classes/src3.cpp\
    mylib/Classes/src4.cpp

改为

# 遍历目录及子目录的函数
define walk
$(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
endef

# 遍历mylib目录
MYLIB_FILES = $(call walk, $(LOCAL_PATH)/mylib)
SRC_FILES := main.cpp
# 从所有文件中提取出所有.cpp文件
SRC_FILES += $(filter %.cpp, $(MYLIB_FILES))

LOCAL_SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)

另有一例

define all-cpp-files-under
$(patsubst ./%,%, \
  $(shell cd $(LOCAL_PATH) ; \
    find $(1) -name "*.cpp" or -name "*.c" -and -not -name ".*" -and -not -name "exclude.cpp") \
 )
endef

define all-subdir-cpp-files
$(call all-cpp-files-under,.)
endef

LOCAL_SRC_FILES := $(call all-subdir-cpp-files)

使用这个方法可以遍历子目录所有 .cpp/.c 文件,替换find的参数可以实现遍历和过滤任意文件。Android.mk编写变得非常简洁和方便,无需再维护文件列表。

另附一个更加简单的宏,可以实现遍历一个目录下的所有文件(但是不会递归调用)

LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/mylib/*.cpp)

通过wildcard可以进行文件遍历,如果是单目录结构,通过这个同样可以达到非常简洁的效果。如果是c++代码(*.cpp文件),需要使用下面的方式,否则可能找不到文件:

FILE_LIST := $(wildcard $(LOCAL_PATH)/mylib/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

加强版本(遍历所有文件,但是忽略某一个目录的文件),通过-prune可以指定忽略 "exclude_dir" 这个目录

define all-cpp-files-under
  $(patsubst ./%,%, \
  $(shell cd $(LOCAL_PATH) ; \
    find $(1) -name exclude_dir -prune -o -name "*.cpp" -and -not -name ".*") \
  )
endef

LOCAL_SRC_FILES := $(call all-subdir-cpp-files)
上一篇 Makefile反过滤函数filter-out
下一篇 Android NDK开发常见问题
目录
文章列表
1 以太坊学习4:以太坊常用功能简介
以太坊学习4:以太坊常用功能简介
2
GooglePlay已禁止自行下载apk的方式更新APP
GooglePlay已禁止自行下载apk的方式更新APP
3
React Native混合原生开发之集成RN到原生项目与RN首屏白屏优化
React Native混合原生开发之集成RN到原生项目与RN首屏白屏优化
4
PHP实现图片等比例缩略图
PHP实现图片等比例缩略图
5
Android TextView文字倾斜
Android TextView文字倾斜
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。