Cocos CmakeList编译流程

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()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值