不知道为什么,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,真心有点麻烦。stackoverflow里一个仁兄的回答看起来不能用,不知道是不是因为我是cgwwin而不是正式unix环境的原因。http://stackoverflow.com/questions/3800257/sed-in-makefile-usage。好几个小时shell和makefile鼓捣来鼓捣去到睡眼惺忪的时候,总算是给折腾好了,下面就是成果,虽然其实没有多大的实际意义大概……
#android.mk with common source files and header files #Ruoqian,Chen<[email protected]> #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)