android开发中,常常遇到须要在andoid.mk文件中包含特定的cpp文件(或c文件)android
LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/ClipingNodeLayer.cpp\ ../../Classes/MainScene.cpp\ ../../Classes/MenuTab.cpp
改成c++
# 遍历目录及子目录的函数 define walk $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e))) endef # 遍历Classes目录 ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes) FILE_LIST := hellocpp/main.cpp # 从全部文件中提取出全部.cpp文件 FILE_LIST += $(filter %.cpp, $(ALLFILES)) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
另有一例shell
define all-cpp-files-under $(patsubst ./%,%, \ $(shell cd $(LOCAL_PATH) ; \ find $(1) -name "*.cpp" -and -not -name ".*" -and -not -name "CCEditBoxImplWindow.cpp") \ ) endef define all-subdir-cpp-files $(call all-cpp-files-under,.) endef LOCAL_SRC_FILES := $(call all-subdir-cpp-files)
使用这个方法能够遍历子目录全部.cpp文件,替换find的参数能够实现遍历和过滤任意文件。
Android.mk编写变得很是简洁和方便,无需再维护文件列表了。函数
另附一个更加简单的宏,能够实现遍历一个目录下的全部文件(可是不会递归调用)code
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/../*.cpp)
经过wildcard能够进行文件遍历,若是是单目录结构,经过这个一样能够达到很是简洁的效果。若是是c++代码的话(*.cpp文件),须要使用下面的方式,不然可能找不到文件:递归
FILE_LIST := $(wildcard $(LOCAL_PATH)/../*.cpp) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
增强版本(遍历全部文件,可是忽略某一个目录的文件),经过-prune能够指定忽略 "LogicLayer"这个目录ip
define all-cpp-files-under $(patsubst ./%,%, \ $(shell cd $(LOCAL_PATH) ; \ find $(1) -name LogicLayer -prune -o -name "*.cpp" -and -not -name ".*") \ ) endef LOCAL_SRC_FILES := $(call all-subdir-cpp-files)