Android.mk进阶用法
1.学会使用函数和shell命令组合完成复杂的事情:
define all-cpp-files-under
$(patsubst ./%, %, $(shell cd $(LOCAL_PATH); find -L $(1) -name "*.cpp" ))
define all-cpp-files-under-except
$(patsubst ./%, %, $(shell cd $(LOCAL_PATH); find -L $(1) -name "*.cpp" -and -not $(1)))
makefile里面的三个常用命令:
1、wildcard : 扩展通配符,用于查找一个目录下的所有符合条件的文件
2、notdir : 去除路径,仅保留文件名
3、patsubst :替换通配符,也可以是任意文本替换
CPP_FILE_LIST := $(call all-subdir-cpp-files) \
$(wildcard $(LOCAL_PATH)/platform/*.cpp) \
$(wildcard $(LOCAL_PATH)/platform/android/*.cpp) \
$(wildcard $(LOCAL_PATH)/platform/android/jni/*.cpp)
wildcard 可以遍历指定目录下的所有特定的文件,但是不支持递归遍历,所以需要逐个指定
LOCAL_SRC_FILES := $(CPP_FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(C_FILE_LIST:$(LOCAL_PATH)/%=%)
$(CPP_FILE_LIST:$(LOCAL_PATH)/%=%) 这个又是一个文本替换技巧。意思是,把CPP_FILE_LIST里面的所有$(LOCAL_PATH)/去掉。之所以有这样的替换是因为LOCAL_SRC_FILES已经包含了LOCAL_PATH,其文件名应该是相对于Android.mk的相对路径。如果SRC_FILES里面还包含LOCAL_PATH的路径那就出错了。同样这也是我们在#1 #2处需要将查找到的文件名中的"./"去除掉的原因。
2. 加入静态库,加了LOCAL_WHOLE_STATIC_LIBRARIES代表编译器会将静态库完整链接而不会进行删减优化
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_libpng_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_jpeg_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libxml2_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libtiff_static
3. 对于一个新产品,想定义一些在别的仓库中都能访问的变量,以达到根据产品选择不同的文件进行编译,或者选择不同的配置,可以这么操作:
在device.mk 中定义自己要定的变量:
YOUR_STR := "xxx" YOUR_VAL := 666
然后在自己的仓库的Android.mk中,使用
ifeq ($(YOUR_STR), "xxx") .... endif