Makefile Android.mk 引發的思索(轉)

 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章