无需手动添加源文件和头文件目录的android.mk文件

时间:2022-03-16 12:46:14

不知道为什么,cocos2d-x火了这么久了,从win32工程转一个android工程并编译出包这个过程,居然到现在还没有一个一键转换为eclipse工程并且能直接正常编译的东西?大概是我孤陋寡闻不知道也说不定。

这台新买的笔记本上cygwin安装了两个晚上终于算是安装的勉强能用了,晚上看了下mk文件,又顿时对要维护源文件列表LOCAL_SRC_FILES和头文件路径LOCAL_C_INCLUDES蛋疼不已。

网上搜索了下,LOCAL_SRC_FILES的自动包含可谓满地跑,但不知为什么头文件包含路径的自动处理却一个也没看到。真正去看了下make的过程,当前路径一直在变化,又看了下makefile的语法,似乎没有合适的字符串操作(patsubst只能过滤掉固定的东西)。好在makefile还留了个shell的调用接口,虽然据说会有一定的效率损失。


其实想想,include目录这种东西,其实路径也没几个,而且写的认真点的人,在cpp include的时候,说不定就已经用了../../之类的路径。就不会有像我拿到手的测试工程一样,有要加很多个目录的困扰。实在不行,在mk文件中,硬编码工程的绝对路径再find,说起来效率还高点。但我就是个蛋疼帝……在makefile里加sed,真心有点麻烦。*里一个仁兄的回答看起来不能用,不知道是不是因为我是cgwwin而不是正式unix环境的原因。http://*.com/questions/3800257/sed-in-makefile-usage。好几个小时shell和makefile鼓捣来鼓捣去到睡眼惺忪的时候,总算是给折腾好了,下面就是成果,虽然其实没有多大的实际意义大概……


#android.mk with common source files and header files
#Ruoqian,Chen<piao.polar@gmail.com>
#2013.6.28
LOCAL_PATH := $(call my-dir)
CUR_PATH := $(shell pwd)
#REDUCE_CLASSES := $(shell ${$(CUR_PATH)%Classes*})
#REDUCE_PROJ_ANDROID := $(shell ${$(REDUCE_CLASSES)%proj.android*})
#REDUCE_CLASSES := $(shell $(echo $(CUR_PATH)|sed 's/Classes.*//g'))
#FULL_PATH := /cygdrive/g/SDK/cocos2d-2.1rc0-x-2.1.3/MyGame/proj.android/jni
REDUCE_CLASSES := $(shell echo $(CUR_PATH)| sed -e "s/Classes.*//g" )
REDUCE_PROJ_ANDROID := $(shell echo $(REDUCE_CLASSES)| sed -e "s/proj.android.*//g" )
PROJECT_DIR := $(REDUCE_PROJ_ANDROID)
JNI_DIR := $(PROJECT_DIR)proj.android/jni

include $(CLEAR_VARS)

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_CPPFLAGS += -fexceptions


define all-source-files
$(patsubst jni/%,%, $(shell find $(LOCAL_PATH)/../../Classes/ $(LOCAL_PATH)/hellocpp -name "*.cpp|*.c"))
endef

LOCAL_SRC_FILES := $(call all-source-files)

#LOCAL_SRC_FILES := hellocpp/main.cpp \
# ../../Classes/AppDelegate.cpp \
# ../../Classes/HelloWorldScene.cpp


define all-include-dirs
$(shell find $(PROJECT_DIR)Classes/ $(JNI_DIR)/hellocpp -type d))
endef

LOCAL_C_INCLUDES := $(call all-include-dirs)

#LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions)