Files
SunnyLand/cmake/BuildHelpers.cmake
T
2025-10-10 07:54:19 +08:00

73 lines
2.9 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================
# 构建辅助函数模块
# ============================================
# 功能:资源复制、DLL复制等构建辅助功能
# ============================================
# 配置资源文件复制
# 用法:setup_asset_copy(目标名称)
# ============================================
function(setup_asset_copy TARGET_NAME)
# 使用独立的脚本模块,而非运行时生成
set(COPY_SCRIPT ${CMAKE_SOURCE_DIR}/cmake/scripts/CopyAssets.cmake)
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND}
-DSOURCE_DIR=${CMAKE_SOURCE_DIR}/assets
-DTARGET_DIR=$<TARGET_FILE_DIR:${TARGET_NAME}>/assets
-DIMGUI_INI_SOURCE=${CMAKE_SOURCE_DIR}/imgui.ini
-P ${COPY_SCRIPT}
COMMENT "Check and copy asset files"
VERBATIM
)
endfunction()
# ============================================
# 配置Windows DLL复制
# 用法:setup_windows_dll_copy(目标名称)
# ============================================
function(setup_windows_dll_copy TARGET_NAME)
if(NOT WIN32)
return()
endif()
message(STATUS "配置Windows DLL自动检测和复制...")
# 1. 复制prebuilt目录中的预编译DLL(如果存在)
if(EXISTS ${CMAKE_SOURCE_DIR}/prebuilt/bin)
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/prebuilt/bin $<TARGET_FILE_DIR:${TARGET_NAME}>
COMMENT "Copy prebuilt DLLs to executable directory"
VERBATIM
)
endif()
# 2. 自动检测并复制所有运行时DLL依赖(CMake 3.21+)
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
# 使用独立的脚本模块,但DLL_LIST必须用file(GENERATE)展开
# 因为$<TARGET_RUNTIME_DLLS>只能在生成阶段解析
set(COPY_SCRIPT ${CMAKE_SOURCE_DIR}/cmake/scripts/CopyDLLs.cmake)
# 生成包装脚本 - 直接include而非execute_process,避免命令行参数传递问题
file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/copy_dlls_wrapper_$<CONFIG>.cmake CONTENT "
# DLL复制包装脚本 - 用于展开生成器表达式
set(DLL_LIST \"$<TARGET_RUNTIME_DLLS:${TARGET_NAME}>\")
set(TARGET_DIR \"$<TARGET_FILE_DIR:${TARGET_NAME}>\")
# 直接包含脚本文件,避免通过命令行参数传递列表
include(\"${COPY_SCRIPT}\")
")
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/copy_dlls_wrapper_$<CONFIG>.cmake
COMMENT "Auto-detect and copy runtime DLLs"
VERBATIM
)
else()
message(WARNING "CMake版本 < 3.21,无法自动复制运行时DLL。")
message(WARNING "如果使用了动态库,请手动复制DLL到exe目录。")
endif()
endfunction()