多目录的Android.mk编写--遍历目录下所有C文件

Update:Android.mk 中的LOCAL_SRC_FILES, LOCAL_C_INCLUDES

我在先前的两篇post
编写Android.mk中的LOCAL_SRC_FILES的终极技巧

编写 android.mk LOCAL_C_INCLUDES的技巧

中提到了一些编译android.mk文件的技巧,由于都涉及到了shell命令,导致不能完全在windows下工作,下面我使用纯净的makefile语法重新编写了脚本

# 配置自己的源文件目录和源文件后缀名

MY_FILES_PATH :=  $(LOCAL_PATH) \

                   $(LOCAL_PATH)/../../Classes

 

MY_FILES_SUFFIX := %.cpp%.c

 

# 递归遍历目录下的所有的文件

rwildcard=$(wildcard$1$2) $(foreach d,$(wildcard$1*),$(call rwildcard,$d/,$2))

 

# 获取相应的源文件

MY_ALL_FILES := $(foreach src_path,$(MY_FILES_PATH),$(call rwildcard,$(src_path),*.*) )

MY_ALL_FILES := $(MY_ALL_FILES:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%)

MY_SRC_LIST  := $(filter$(MY_FILES_SUFFIX),$(MY_ALL_FILES))

MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)

 

# 去除字串的重复单词

define uniq =

  $(eval seen :=)

  $(foreach _,$1,$(if$(filter$_,${seen}),,$(eval seen += $_)))

  ${seen}

endef

 

# 递归遍历获取所有目录

MY_ALL_DIRS := $(dir$(foreach src_path,$(MY_FILES_PATH),$(call rwildcard,$(src_path),*/) ) )

MY_ALL_DIRS := $(call uniq,$(MY_ALL_DIRS))

 

# 赋值给NDK编译系统

LOCAL_SRC_FILES  :=$(MY_SRC_LIST)

LOCAL_C_INCLUDES := $(MY_ALL_DIRS)

完全使用makefile语法编写,可以工作在所有平台上

我已经在cocos2d-x中提交了一个pull request https://github.com/cocos2d/cocos2d-x/pull/3921,希望能被集成到cocos2d-x的代码库中,以后使用就不需要自己修改了


PS:如何debug一个android.mk文件

有一个办法,那就是在编译过程输出android.mk文件中变量的值,就可以观察分析问题所在了,使用代码

$(warning$(LOCAL_SRC_FILES))

就可以在编译过程中从终端窗口中观察到变量LOCAL_SRC_FILES的值



转载自:

http://blog.ready4go.com/blog/2013/10/12/update-android-dot-mk-with-local-src-files-and-local-c-includes/

你可能感兴趣的:(c,android,jni,遍历,makefile)