Files
envi-code/SourceCode/Code2026/cmake/functions.cmake
T
2026-09-28 15:28:50 +08:00

244 lines
6.4 KiB
CMake

function (IsZWCAD out)
if (DEFINED CACHE{ZWCAD})
set(${out} TRUE PARENT_SCOPE)
else()
set(${out} FALSE PARENT_SCOPE)
endif()
endfunction()
function(apply_arx_definitions TARGET_NAME)
if(MSVC)
target_compile_definitions(${TARGET_NAME} PRIVATE
_ALLOW_RTCc_IN_STL
_WIN32_IE=0x0600
WIN
WIN32
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1
_AFXDLL
UNICODE
_UNICODE
)
endif()
endfunction()
function(apply_arx_optimization TARGET_NAME)
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CONFIG:Debug>:/Od>
$<$<CONFIG:Debug>:/Zi>
$<$<CONFIG:Debug>:/Ob0>
)
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CONFIG:Release>:/O2>
$<$<CONFIG:Release>:/Ob2>
$<$<CONFIG:Release>:/Oi>
$<$<CONFIG:Release>:/Ot>
$<$<CONFIG:Release>:/Oy>
$<$<CONFIG:Release>:/GT>
)
target_compile_definitions(${TARGET_NAME} PRIVATE
$<$<CONFIG:Release>:_NDEBUG=1>
$<$<CONFIG:Release>:NDEBUG=1>
)
if (DEFINED(WholeProgramOptimization))
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CONFIG:Release>:/GL>
)
target_link_options(${TARGET_NAME} PRIVATE
$<$<CONFIG:Release>:/LTCG>
)
endif()
endif()
endfunction()
function (simple_link_cad_sdk
TARGET_NAME)
IsZWCAD(isZW)
if (isZW)
target_link_libraries(${TARGET_NAME} PRIVATE ThirdParty::ZRX)
else()
target_link_libraries(${TARGET_NAME} PRIVATE ThirdParty::ARX)
endif()
apply_arx_optimization(${TARGET_NAME})
apply_arx_definitions(${TARGET_NAME})
endfunction()
function (get_sdk_version out)
IsZWCAD(isZW)
set(VER ${CAD_SDK_VERSION})
if (isZW)
string(REGEX MATCH "..$" VER "${CAD_SDK_VERSION}")
endif()
set(${out} ${VER} PARENT_SCOPE)
endfunction()
function (add_def_file_name
_SOURCES
_BASE_NAME)
set (tmp "${${_SOURCES}}")
IsZWCAD(isZW)
if (isZW)
list(APPEND tmp "${_BASE_NAME}_zrx.def")
else()
list(APPEND tmp "${_BASE_NAME}.def")
endif()
set(${_SOURCES} "${tmp}" PARENT_SCOPE)
endfunction()
function(get_encryption_modes
_modes)
set (tmp "${${_modes}}")
list(APPEND tmp "BAL_REMOTE" "TRIAL_YEAR")
set(${_modes} "${tmp}" PARENT_SCOPE)
endfunction()
function(set_encryption_definitions_and_output_path
TARGET_NAME
MODE)
if (MODE STREQUAL "TRIAL_YEAR")
target_compile_definitions(${TARGET_NAME} PRIVATE
BAL_REMOTE
$<$<CONFIG:Release>:TRIAL_YEAR=${TRIAL_YEAR}>
$<$<CONFIG:Debug>:WF2023>
$<$<CONFIG:Release>:${PRODUCT}>
)
else()
target_compile_definitions(${TARGET_NAME} PRIVATE
$<$<CONFIG:Debug>:WF2023>
$<$<CONFIG:Debug>:BAL_REMOTE>
$<$<CONFIG:Release>:${PRODUCT}>
$<$<CONFIG:Release>:${MODE}>
)
endif()
set_target_properties(${TARGET_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG
"${GLOBAL_BIN_DIR}/Debug-x64-${GENERATE_DIR_TAG}/WF2023-BAL_REMOTE")
set_target_properties(${TARGET_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELEASE
"${GLOBAL_BIN_DIR}/Release-x64-${GENERATE_DIR_TAG}/${PRODUCT}-${MODE}")
set_target_properties(${TARGET_NAME} PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY_DEBUG
"${GLOBAL_LIB_DIR}/Debug-x64-${GENERATE_DIR_TAG}/WF2023-BAL_REMOTE"
)
set_target_properties(${TARGET_NAME} PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY_RELEASE
"${GLOBAL_LIB_DIR}/Release-x64-${GENERATE_DIR_TAG}/${PRODUCT}-${MODE}"
)
target_link_libraries(${TARGET_NAME} PRIVATE ThirdParty::BitAnswer)
endfunction()
function(target_link_objectarx
TARGET_NAME
_EXTENSION
)
if (ARGC LESS 2)
message(FATAL_ERROR "target_link_objectarx() 函数至少需要两个参数: TARGET_NAME 和 _EXTENSION")
endif()
target_link_libraries(${TARGET_NAME} PRIVATE ShsGlobalIncludes)
target_include_directories(${TARGET_NAME} PRIVATE "${DEP_INC_ROOT}")
simple_link_cad_sdk(${TARGET_NAME})
target_link_libraries(${TARGET_NAME} PRIVATE "rpcrt4.lib")
target_compile_definitions(${TARGET_NAME} PRIVATE
CMAKE
ARX=${SDK_VERSION}
${_EXTENSION}
)
endfunction()
function(target_set_name_and_suffix
target_name
new_name
new_suffix)
if(NOT TARGET ${target_name})
message(FATAL_ERROR "[ObjectARX-CMake] Target '${target_name}' 不存在!")
endif()
if(NOT "${new_name}" STREQUAL "")
set_target_properties(${target_name} PROPERTIES OUTPUT_NAME "${new_name}")
endif()
if(NOT "${new_suffix}" STREQUAL "")
get_target_property(target_type ${target_name} TYPE)
if ("${new_suffix}" STREQUAL ".arx" AND IS_ZWCAD)
set(new_suffix ".zrx")
endif()
set_target_properties(${target_name} PROPERTIES SUFFIX "${new_suffix}")
if(target_type MATCHES "^(SHARED_LIBRARY|MODULE_LIBRARY|EXECUTABLE)$")
set_target_properties(${target_name} PROPERTIES
IMPORT_SUFFIX ".lib"
IMPORT_PREFIX ""
)
endif()
endif()
endfunction()
function(set_debug_post_build
target_name
arx_name
ext
)
set(CONFIG_JSON "sh_output_path.json")
if (IS_ZWCAD)
set(CONFIG_JSON "zw_output_path.json")
endif()
add_custom_command(
TARGET ${target_name}
POST_BUILD
COMMAND "$<$<CONFIG:Debug>:${CMAKE_SOURCE_DIR}/copyarx.exe>"
"$<$<CONFIG:Debug>:CMAKE>"
"$<$<CONFIG:Debug>:$<TARGET_FILE:${target_name}>>"
"$<$<CONFIG:Debug>:${GENERATE_DIR_TAG}>"
"$<$<CONFIG:Debug>:${CMAKE_SOURCE_DIR}/${CONFIG_JSON}>"
COMMENT "正在调用 copyarx.exe 部署 ARX 模块..."
VERBATIM
)
endfunction()
function(add_custom_module_2 dir_path target_name folder_path)
add_subdirectory(${dir_path})
set_target_properties(${target_name} PROPERTIES
FOLDER "${folder_path}"
)
endfunction()
function(add_custom_module dir_path folder_path)
get_filename_component(target_name "${dir_path}" NAME)
add_custom_module_2(${dir_path} ${target_name} ${folder_path})
endfunction()