cmake_minimum_required(VERSION 3.8)
option(APP_NAME "Project Name" "CocosGame")
project(${APP_NAME} CXX)
set(CC_LIB_NAME cocos)
set(CC_PROJECT_DIR ${CMAKE_CURRENT_LIST_DIR})
set(CC_PROJ_SOURCES)
set(CC_COMMON_SOURCES)
set(CC_ALL_SOURCES)
include(${CMAKE_CURRENT_LIST_DIR}/../common/CMakeLists.txt) # 引入外部的CMake
# 重点关注的逻辑在这里
cc_android_before_target(${CC_LIB_NAME})
add_library(${CC_LIB_NAME} SHARED ${CC_ALL_SOURCES})
cc_android_after_target(${CC_LIB_NAME})
上面主要就是看一下cc_android_before_target和cc_android_after_target两个函数。这两个方法在下面
${COCOS_X_PATH}/CMakeLists.txt可以找到。
enable_language(C ASM)
set(DEVELOPMENT_TEAM "" CACHE STRING "APPLE Developtment Team")
set(RES_DIR "" CACHE STRING "Resource path")
set(COCOS_X_PATH "" CACHE STRING "Path to engine/native/")
set(TARGET_OSX_VERSION "10.14" CACHE STRING "Target MacOSX version" FORCE)
set(TARGET_IOS_VERSION "11.0" CACHE STRING "Target iOS version" FORCE)
set(CMAKE_CXX_STANDARD 17)
option(CC_DEBUG_FORCE "Force enable CC_DEBUG in release mode" OFF)
option(USE_SE_V8 "Use V8 JavaScript Engine" ON)
option(USE_V8_DEBUGGER "Compile v8 inspector ws server" ON)
option(USE_V8_DEBUGGER_FORCE "Force enable debugger in release mode" OFF)
option(USE_SOCKET "Enable WebSocket & SocketIO" ON)
option(USE_AUDIO "Enable Audio" ON) #Enable AudioEngine
option(USE_EDIT_BOX "Enable EditBox" ON)
option(USE_SE_JSC "Use JavaScriptCore on MacOSX/iOS" OFF)
option(USE_VIDEO "Enable VideoPlayer Component" ON)
option(USE_WEBVIEW "Enable WebView Component" ON)
option(USE_MIDDLEWARE "Enable Middleware" ON)
option(USE_DRAGONBONES "Enable Dragonbones" ON)
option(USE_SPINE "Enable Spine" ON)
option(USE_WEBSOCKET_SERVER "Enable WebSocket Server" OFF)
option(USE_JOB_SYSTEM_TASKFLOW "Use taskflow as job system backend" OFF)
option(USE_JOB_SYSTEM_TBB "Use tbb as job system backend" OFF)
option(USE_PHYSICS_PHYSX "Use PhysX Physics" ON)
option(USE_OCCLUSION_QUERY "Use Occlusion Query" ON)
option(USE_DEBUG_RENDERER "Use Debug Renderer" ON)
option(USE_GEOMETRY_RENDERER "Use Geometry Renderer" ON)
option(USE_WEBP "Use Webp" ON)
if(NOT RES_DIR) # 对应外部设置的RES_DIR变量
message(FATAL_ERROR "RES_DIR is not set!")
endif()
# 这个文件包含了大量的set,没有任何的逻辑
include(${RES_DIR}/proj/cfg.cmake)
# localCfg.cmake 是空逻辑
if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/localCfg.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/localCfg.cmake)
endif()
# 这个变量定义在cfg.cmake,指向的是3.6.3/resources/resources/3d/engine/native
if(NOT COCOS_X_PATH)
message(FATAL_ERROR "COCOS_X_PATH is not set!")
endif()
if(USE_XR OR USE_AR_MODULE)
include(${CMAKE_CURRENT_LIST_DIR}/xr.cmake)
endif()
# engine相关的逻辑
include(${COCOS_X_PATH}/CMakeLists.txt)
# 入口源代码
list(APPEND CC_COMMON_SOURCES
${CMAKE_CURRENT_LIST_DIR}/Classes/Game.h
${CMAKE_CURRENT_LIST_DIR}/Classes/Game.cpp
)
在engine/common
里面有加载engine相关的逻辑,我们看下engine大概处理了哪些
-
${COCOS_X_PATH}/CMakeLists.txt
第一行就有
include(${CMAKE_CURRENT_LIST_DIR}/cmake/predefine.cmake)
在predefine.cmake中有
## predefined configurations for game applications
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/common.cmake)
if(APPLE)
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/apple.cmake)
elseif(WINDOWS)
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/windows.cmake)
elseif(LINUX)
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/linux.cmake)
elseif(ANDROID)
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/android.cmake)
elseif(OPENHARMONY)
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/openharmony.cmake)
elseif(OHOS)
include(${CMAKE_CURRENT_LIST_DIR}/../../templates/cmake/ohos.cmake)
elseif(QNX)
elseif(EMSCRIPTEN)
else()
message(FATAL_ERROR "Unhandled platform specified cmake utils!")
endif()
所以逻辑就又分发到了templates里面,其实里面的逻辑也就刚好只有这2个marco,而这2个marco也就刚好就是我们要找的marco
macro(cc_android_before_target target_name)
list(APPEND CC_ALL_SOURCES ${CC_COMMON_SOURCES} ${CC_PROJ_SOURCES})
cc_common_before_target(${target_name})
endmacro()
macro(cc_android_after_target target_name)
target_link_libraries(${target_name}
"-Wl,--whole-archive" cocos_jni "-Wl,--no-whole-archive"
${ENGINE_NAME}
)
set_target_properties(${target_name} PROPERTIES LINK_FLAGS " -Wl,--gc-sections")
target_include_directories(${target_name} PRIVATE
${CC_PROJECT_DIR}/../common/Classes
)
cc_common_after_target(${target_name})
endmacro()
cmake/commo.cmake
macro(cc_common_after_target target_name)
if(TARGET plugin_registry)
target_link_libraries(${target_name} plugin_registry)
endif()
target_compile_definitions(${target_name} PRIVATE
GAME_NAME="${CC_EXECUTABLE_NAME}"
)
if(XXTEAKEY)
target_compile_definitions(${target_name} PRIVATE
SCRIPT_XXTEAKEY="${XXTEAKEY}"
)
endif()
cc_load_hooks("Post")
endmacro()
macro(cc_common_before_target target_name)
set(CC_TARGET_NAME ${target_name})
if(NOT CC_TARGET_NAME)
message(FATAL_ERROR "CC_TARGET_NAME is not set!")
endif()
if(NOT SKIP_SCAN_PLUGINS AND USE_PLUGINS)
cc_gen_plugin_cmake_hook()
else()
message(STATUS " Skip search plugins")
endif()
cc_load_hooks("Pre")
if(USE_PLUGINS)
cc_plugin_entry()
endif()
endmacro()