Makefile Android.mk 引發的思索
轉至:https://www.cnblogs.com/quansir/p/4269951.html
在我們編寫 Android 平臺 cocos2d-x 遊戲的時候,我們除了編寫 Classes 之內的源代碼文件之外,我們還需要維護其編譯文件 Android.mk,如我們在 Classes 添加新的源文件,那麼我們就要在 Android.mk 配置添加其編譯路徑,如:
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp
每添加一個源文件,我們就要手動添加一個配置,始其能夠被編譯,同樣的,在 proj.linux 的 Makefile 文件也有這樣的情況:
OBJECTS = ./main.o \
../Classes/AppDelegate.o \
../Classes/HelloWorldScene.o
當然讓我們手動維護其配置,當然可以,不過麻煩非常,對於像我這樣“懶惰”之人,當然需要想辦法讓其自動管理嘍 ~
自動編譯、自動維護
如果要自動維護編譯文件之內的源代碼文件,我們需要的無非就是所有的源代碼文件及其路徑,而這樣的工作可以通過 Linux 強大的命令 find 來實現自動完成,Android.mk 文件如下:
複製代碼
複製代碼
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game_shared
LOCAL_MODULE_FILENAME := libgame
# 定義 all-cpp-files 返回當前路徑和 Classes 路徑想的所有 cpp 文件,注意:這裏只考慮 cpp 而沒有 c,如果需要自行添加
define all-cpp-files
$(patsubst jni/%,%, $(shell find $(LOCAL_PATH)/../../Classes/ $(LOCAL_PATH)/hellocpp -name "*.cpp"))
endef
# 這裏使用新的方式替換換來的方式,以自動添加源文件
LOCAL_SRC_FILES := $(call all-cpp-files)
#LOCAL_SRC_FILES := hellocpp/main.cpp \
# ../../Classes/AppDelegate.cpp \
# ../../Classes/HelloWorldScene.cpp
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) # 根據自己需要是否啓用,上面的靜態庫同樣
複製代碼
複製代碼
這樣一個 Android.mk 算是萬能的配置了,基本能滿足我們編寫 cocos2d-x 遊戲的大多數需求了,當然如果你使用了第三方庫,當然還是需要手動添加一下配置了,不過就源文件來說,不需要手動維護,倒是省事許多。下面在貼一個 Makefile 的萬能配置:
複製代碼
複製代碼
CC = gcc
CXX = g++
TARGET = leafsoar # 爲了保持通用性,乾脆起個不相干的目標文件,此名隨意
CCFLAGS = -Wall
CXXFLAGS = -Wall
VISIBILITY =
# COCOS2DX_ROOT = /home/leafsoar/... # 如果已經配置過此環境變量,可以不需要此,否則添加此變量值
COCOS2DX_PATH = $(COCOS2DX_ROOT)/cocos2dx
INCLUDES = -I../ \
-I../Classes \
-I$(COCOS2DX_PATH) \
-I$(COCOS2DX_PATH)/platform/third_party/linux \
-I$(COCOS2DX_PATH)/platform/third_party/linux/libfreetype2 \
-I$(COCOS2DX_PATH)/cocoa \
-I$(COCOS2DX_PATH)/include \
-I$(COCOS2DX_PATH)/platform \
-I$(COCOS2DX_PATH)/platform/linux \
-I$(COCOS2DX_PATH)/platform/third_party/linux/glew-1.7.0/glew-1.7.0/include/ \
-I$(COCOS2DX_PATH)/kazmath/include \
-I$(COCOS2DX_PATH)/platform/third_party/linux/libxml2 \
-I$(COCOS2DX_PATH)/platform/third_party/linux/libjpeg \
-I$(COCOS2DX_ROOT)/CocosDenshion/include \
# -I$(COCOS2DX_ROOT)/extensions/ \ # 根據自己需要是否包含 extensions 擴展
DEFINES = -DLINUX
# 獲取源文件列表
define all-cpp-files
$(patsubst ./%,%, $(shell find ../Classes ./ -name "*.cpp"))
endef
# 我是打算讓所以編譯後的 ".o" 臨時文件,全部生成在 "obj" 目錄,而不是和源代碼同目錄
define all-cpp-dir
$(patsubst ../%,obj/%, $(shell find ../Classes -type d))
endef
# obj 默認目錄
OBJDIR=obj/Classes
# 獲取所有的編譯文件列表
OBJECTS=$(patsubst %.cpp,$(OBJDIR)/%.o,$(call all-cpp-files))
# 獲取所有的編譯文件路徑,如果不存在路徑則,編譯可能出現問題
OBJECTS_DIR=$(call all-cpp-dir)
# 如果目錄不存在,則創建相應的目錄,-p 命令保證了,如果存在,不需要重新創建,這樣沒有修改的源文件就無需重新編譯,提高速度
$(shell mkdir -p obj)
$(shell mkdir -p $(OBJECTS_DIR))
#echo:
# @echo $(OBJECTS_DIR)
#OBJECTS = ./main.o \
# ../Classes/AppDelegate.o
LBITS := $(shell getconf LONG_BIT)
ifeq ($(LBITS),64)
STATICLIBS_DIR = $(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/libraries/lib64
else
STATICLIBS_DIR = $(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/libraries
endif
STATICLIBS =
STATICLIBS = $(STATICLIBS_DIR)/libfreetype.a \
$(STATICLIBS_DIR)/libxml2.a \
$(STATICLIBS_DIR)/libpng.a \
$(STATICLIBS_DIR)/libjpeg.a \
$(STATICLIBS_DIR)/libtiff.a \
# $(STATICLIBS_DIR)/libGLEW.a \
SHAREDLIBS =
ifeq ($(LBITS),64)
SHAREDLIBS_DIR = $(COCOS2DX_ROOT)/CocosDenshion/third_party/fmod/lib64/api/lib
SHAREDLIBS = -L$(SHAREDLIBS_DIR) -lfmodex64
else
SHAREDLIBS_DIR = $(COCOS2DX_ROOT)/CocosDenshion/third_party/fmod/api/lib
SHAREDLIBS = -L$(SHAREDLIBS_DIR) -lfmodex
endif
SHAREDLIBS += -lglfw -lGL
SHAREDLIBS += -Wl,-rpath,$(SHAREDLIBS_DIR)
SHAREDLIBS += -L$(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/glew-1.7.0/glew-1.7.0/lib -lGLEW
SHAREDLIBS += -Wl,-rpath,$(COCOS2DX_ROOT)/cocos2dx/platform/third_party/linux/glew-1.7.0/glew-1.7.0/lib
BIN_DIR_ROOT=bin
BIN_DIR = $(BIN_DIR_ROOT)
debug: BIN_DIR = $(BIN_DIR_ROOT)/debug
debug: CCFLAGS += -g3 -O0
debug: CXXFLAGS += -g3 -O0
debug: SHAREDLIBS += -L$(COCOS2DX_ROOT)/lib/linux/Debug -lcocos2d -lrt -lz -lcocosdenshion
debug: SHAREDLIBS += -Wl,-rpath,$(COCOS2DX_ROOT)/lib/linux/Debug/
debug: DEFINES += -DDEBUG
debug: $(TARGET)
release: BIN_DIR = $(BIN_DIR_ROOT)/release
release: CCFLAGS += -O3
release: CXXFLAGS += -O3
release: SHAREDLIBS += -L.$(COCOS2DX_ROOT)/lib/linux/Release -lcocos2d -lrt -lz -lcocosdenshion
release: SHAREDLIBS += -Wl,-rpath,$(COCOS2DX_ROOT)/lib/linux/Release/
release: DEFINES += -DNDEBUG
release: $(TARGET)
####### Build rules
$(TARGET): $(OBJECTS)
mkdir -p $(BIN_DIR)
$(CXX) $(CXXFLAGS) $(INCLUDES) $(DEFINES) $(OBJECTS) -o $(BIN_DIR)/$(TARGET) $(SHAREDLIBS) $(STATICLIBS)
####### Compile
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) $(INCLUDES) $(DEFINES) $(VISIBILITY) -c $< -o $@
%.o: %.c
$(CC) $(CCFLAGS) $(INCLUDES) $(DEFINES) $(VISIBILITY) -c $< -o $@
clean:
rm -f $(OBJECTS) $(TARGET) core