From 5084d65a1188cf27588fc8b125c0899f3a6d169c Mon Sep 17 00:00:00 2001 From: kindem Date: Tue, 14 Oct 2025 22:10:42 +0800 Subject: [PATCH 01/23] refactor: remove useless code --- CMake/Common.cmake | 3 --- Engine/Source/Core/Include/Core/Paths.h | 2 -- Engine/Source/Core/Src/Paths.cpp | 10 ---------- 3 files changed, 15 deletions(-) diff --git a/CMake/Common.cmake b/CMake/Common.cmake index e8bd3dac5..5f3f4a236 100644 --- a/CMake/Common.cmake +++ b/CMake/Common.cmake @@ -26,9 +26,6 @@ if (${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT}) endif () endif() -add_definitions(-DENGINE_CMAKE_SOURCE_DIRECTORY="${CMAKE_SOURCE_DIR}") -add_definitions(-DENGINE_CMAKE_BINARY_DIRECTORY="${CMAKE_BINARY_DIR}") - add_definitions(-DBUILD_CONFIG_DEBUG=$,$>,1,0>) add_definitions(-DPLATFORM_WINDOWS=$,1,0>) diff --git a/Engine/Source/Core/Include/Core/Paths.h b/Engine/Source/Core/Include/Core/Paths.h index 6f0d48445..be822fa87 100644 --- a/Engine/Source/Core/Include/Core/Paths.h +++ b/Engine/Source/Core/Include/Core/Paths.h @@ -41,8 +41,6 @@ namespace Core { static Common::Path GamePluginDir(); static Common::Path GamePluginDir(const std::string& pluginName); static Common::Path GamePluginAssetDir(const std::string& pluginName); - static Common::Path EngineCMakeSourceDir(); - static Common::Path EngineCMakeBinaryDir(); #if BUILD_TEST static Common::Path EngineTestDir(); #endif diff --git a/Engine/Source/Core/Src/Paths.cpp b/Engine/Source/Core/Src/Paths.cpp index efefd63a6..b494d3057 100644 --- a/Engine/Source/Core/Src/Paths.cpp +++ b/Engine/Source/Core/Src/Paths.cpp @@ -147,16 +147,6 @@ namespace Core { return GamePluginDir() / pluginName / "Asset"; } - Common::Path Paths::EngineCMakeSourceDir() - { - return ENGINE_CMAKE_SOURCE_DIRECTORY; - } - - Common::Path Paths::EngineCMakeBinaryDir() - { - return ENGINE_CMAKE_BINARY_DIRECTORY; - } - bool Paths::IsEnginePath(const Common::Path& inPath) { return Common::StringUtils::RegexMatch(inPath.String(), R"(Engine/.*)"); From 5eb0c34b3053844b88223857471c54ad8bd45e6d Mon Sep 17 00:00:00 2001 From: kindem Date: Thu, 16 Oct 2025 21:54:08 +0800 Subject: [PATCH 02/23] refactor: use interface library target to manager 3rd party libs --- CMake/Target.cmake | 172 +++++++--------------------- CMake/ThirdParty.cmake | 75 ++++++------ Editor/CMakeLists.txt | 7 +- Engine/Source/Core/CMakeLists.txt | 2 +- Engine/Source/Mirror/CMakeLists.txt | 1 + 5 files changed, 75 insertions(+), 182 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 29b3921b5..e3bc701a8 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -2,8 +2,6 @@ option(BUILD_TEST "Build unit tests" ON) option(BUILD_SAMPLE "Build sample" ON) set(API_HEADER_DIR ${CMAKE_BINARY_DIR}/Generated/Api CACHE PATH "" FORCE) -set(BASIC_LIBS Common CACHE STRING "" FORCE) -set(BASIC_TEST_LIBS Test CACHE STRING "" FORCE) if (${BUILD_TEST}) enable_testing() @@ -12,77 +10,7 @@ else() add_definitions(-DBUILD_TEST=0) endif() -function(exp_combine_runtime_deps) - cmake_parse_arguments(PARAMS "" "NAME" "RUNTIME_DEP" ${ARGN}) - - get_target_property(RESULT ${PARAMS_NAME} RUNTIME_DEP) - if ("${RESULT}" STREQUAL "RESULT-NOTFOUND") - set(RESULT ${PARAMS_RUNTIME_DEP}) - else() - list(APPEND RESULT ${PARAMS_RUNTIME_DEP}) - endif() - set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_DEP "${RESULT}" - ) -endfunction() - -function(exp_link_libs) - cmake_parse_arguments(PARAMS "" "NAME" "LIB" ${ARGN}) - - foreach(L ${PARAMS_LIB}) - if (NOT (TARGET ${L})) - target_link_libraries(${PARAMS_NAME} PUBLIC ${L}) - continue() - endif() - - get_target_property(3RD_TYPE ${L} 3RD_TYPE) - if (${3RD_TYPE} STREQUAL "3RD_TYPE-NOTFOUND") - target_link_libraries(${PARAMS_NAME} PUBLIC ${L}) - else() - get_target_property(INCLUDE ${L} 3RD_INCLUDE) - get_target_property(LINK ${L} 3RD_LINK) - get_target_property(LIB ${L} 3RD_LIB) - - if (NOT ("${INCLUDE}" STREQUAL "INCLUDE-NOTFOUND")) - target_include_directories(${PARAMS_NAME} PUBLIC ${INCLUDE}) - endif() - if (NOT ("${LINK}" STREQUAL "LINK-NOTFOUND")) - target_link_directories(${PARAMS_NAME} PUBLIC ${LINK}) - endif() - if (NOT ("${LIB}" STREQUAL "LIB-NOTFOUND")) - target_link_libraries(${PARAMS_NAME} PUBLIC ${LIB}) - endif() - - if (${3RD_TYPE} STREQUAL "CMakeProject") - add_dependencies(${PARAMS_NAME} ${L}) - endif() - endif() - - get_target_property(RUNTIME_DEP ${L} 3RD_RUNTIME_DEP) - if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) - exp_combine_runtime_deps( - NAME ${PARAMS_NAME} - RUNTIME_DEP "${RUNTIME_DEP}" - ) - endif() - endforeach() -endfunction() - -function(exp_link_basic_libs) - cmake_parse_arguments(PARAMS "" "NAME" "LIB" ${ARGN}) - - foreach(L ${PARAMS_LIB}) - if (NOT (${PARAMS_NAME} STREQUAL ${L})) - exp_link_libs( - NAME ${PARAMS_NAME} - LIB ${L} - ) - endif() - endforeach() -endfunction() - -function(exp_get_target_runtime_deps_recurse) +function(exp_gather_target_runtime_dependencies_recurse) cmake_parse_arguments(PARAMS "" "NAME;OUTPUT" "" ${ARGN}) get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) @@ -99,7 +27,7 @@ function(exp_get_target_runtime_deps_recurse) continue() endif() - exp_get_target_runtime_deps_recurse( + exp_gather_target_runtime_dependencies_recurse( NAME ${L} OUTPUT TEMP ) @@ -113,10 +41,10 @@ function(exp_get_target_runtime_deps_recurse) set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) endfunction() -function(exp_add_runtime_deps_copy_command) +function(exp_process_runtime_dependencies) cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME" "" ${ARGN}) - exp_get_target_runtime_deps_recurse( + exp_gather_target_runtime_dependencies_recurse( NAME ${PARAMS_NAME} OUTPUT RUNTIME_DEPS ) @@ -196,42 +124,32 @@ function(exp_add_resources_copy_command) add_dependencies(${PARAMS_NAME} ${COPY_RES_TARGET_NAME}) endfunction() -function(exp_get_target_include_dirs_recurse) +function(exp_gather_target_include_dirs) cmake_parse_arguments(PARAMS "" "NAME;OUTPUT" "" ${ARGN}) if (NOT (TARGET ${PARAMS_NAME})) return() endif() - get_target_property(3RD_TYPE ${PARAMS_NAME} 3RD_TYPE) - if ("${3RD_TYPE}" STREQUAL "3RD_TYPE-NOTFOUND") - get_target_property(TARGET_INCS ${PARAMS_NAME} INCLUDE_DIRECTORIES) - if (NOT ("${TARGET_INCS}" STREQUAL "TARGET_INCS-NOTFOUND")) - foreach(TARGET_INC ${TARGET_INCS}) - list(APPEND RESULT ${TARGET_INC}) - endforeach() - endif() - - get_target_property(TARGET_LIBS ${PARAMS_NAME} LINK_LIBRARIES) - if (NOT ("${TARGET_LIBS}" STREQUAL "TARGET_LIBS-NOTFOUND")) - foreach(TARGET_LIB ${TARGET_LIBS}) - exp_get_target_include_dirs_recurse( - NAME ${TARGET_LIB} - OUTPUT LIB_INCS - ) - foreach(LIB_INC ${LIB_INCS}) - list(APPEND RESULT ${LIB_INC}) - endforeach() - endforeach() - endif() - else () - get_target_property(3RD_INCLUDE ${PARAMS_NAME} 3RD_INCLUDE) - if (NOT ("${3RD_INCLUDE}" STREQUAL "3RD_INCLUDE-NOTFOUND")) - foreach(3RD_INC ${3RD_INCLUDE}) - list(APPEND RESULT ${3RD_INC}) + get_target_property(TARGET_INCS ${PARAMS_NAME} INTERFACE_INCLUDE_DIRECTORIES) + if (NOT ("${TARGET_INCS}" STREQUAL "TARGET_INCS-NOTFOUND")) + foreach(TARGET_INC ${TARGET_INCS}) + list(APPEND RESULT ${TARGET_INC}) + endforeach() + endif() + + get_target_property(TARGET_LIBS ${PARAMS_NAME} LINK_LIBRARIES) + if (NOT ("${TARGET_LIBS}" STREQUAL "TARGET_LIBS-NOTFOUND")) + foreach(TARGET_LIB ${TARGET_LIBS}) + exp_gather_target_include_dirs( + NAME ${TARGET_LIB} + OUTPUT LIB_INCS + ) + foreach(LIB_INC ${LIB_INCS}) + list(APPEND RESULT ${LIB_INC}) endforeach() - endif () - endif () + endforeach() + endif() list(REMOVE_DUPLICATES RESULT) set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) @@ -248,7 +166,7 @@ function(exp_add_mirror_info_source_generation_target) endif() if (DEFINED PARAMS_LIB) foreach (L ${PARAMS_LIB}) - exp_get_target_include_dirs_recurse( + exp_gather_target_include_dirs( NAME ${L} OUTPUT TARGET_INCS ) @@ -348,15 +266,11 @@ function(exp_add_executable) ${PARAMS_NAME} PRIVATE ${PARAMS_LINK} ) - exp_link_basic_libs( - NAME ${PARAMS_NAME} - LIB ${BASIC_LIBS} - ) - exp_link_libs( - NAME ${PARAMS_NAME} - LIB ${PARAMS_LIB} + target_link_libraries( + ${PARAMS_NAME} + PUBLIC ${PARAMS_LIB} ) - exp_add_runtime_deps_copy_command( + exp_process_runtime_dependencies( NAME ${PARAMS_NAME} ${NOT_INSTALL_FLAG} ) @@ -430,13 +344,9 @@ function(exp_add_library) PRIVATE ${PARAMS_PRIVATE_LINK} PUBLIC ${PARAMS_PUBLIC_LINK} ) - exp_link_basic_libs( - NAME ${PARAMS_NAME} - LIB ${BASIC_LIBS} - ) - exp_link_libs( - NAME ${PARAMS_NAME} - LIB ${PARAMS_LIB} + target_link_libraries( + ${PARAMS_NAME} + PUBLIC ${PARAMS_LIB} ) if (${MSVC}) @@ -475,9 +385,9 @@ function(exp_add_library) if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${PARAMS_TYPE}" STREQUAL "STATIC") install( TARGETS ${PARAMS_NAME} - FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Include - ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Lib - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Lib + FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Target/${PARAMS_NAME}/Include + ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Target/${PARAMS_NAME}/Lib + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Target/${PARAMS_NAME}/Lib RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Binaries ) endif () @@ -505,7 +415,7 @@ function(exp_add_test) OUTPUT_TARGET_NAME GENERATED_TARGET SEARCH_DIR ${PARAMS_REFLECT} PRIVATE_INC ${PARAMS_INC} - LIB ${PARAMS_LIB} ${BASIC_LIBS} ${BASIC_TEST_LIBS} + LIB ${PARAMS_LIB} ) endif() @@ -522,15 +432,11 @@ function(exp_add_test) ${PARAMS_NAME} PRIVATE ${PARAMS_LINK} ) - exp_link_basic_libs( - NAME ${PARAMS_NAME} - LIB ${BASIC_LIBS} ${BASIC_TEST_LIBS} - ) - exp_link_libs( - NAME ${PARAMS_NAME} - LIB ${PARAMS_LIB} + target_link_libraries( + ${PARAMS_NAME} + PRIVATE Test ${PARAMS_LIB} ) - exp_add_runtime_deps_copy_command( + exp_process_runtime_dependencies( NAME ${PARAMS_NAME} NOT_INSTALL ) diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 98c943705..f519cdbc2 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -149,11 +149,7 @@ function(exp_add_3rd_header_only_package) HASH ${HASH_VALUE} ) - add_custom_target(${NAME} ALL) - set_target_properties( - ${NAME} PROPERTIES - 3RD_TYPE "HeaderOnly" - ) + add_library(${NAME} INTERFACE) if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( @@ -165,9 +161,9 @@ function(exp_add_3rd_header_only_package) OUTPUT P_INCLUDE INPUT ${R_INCLUDE} ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_INCLUDE "${P_INCLUDE}" + target_include_directories( + ${NAME} + INTERFACE "${P_INCLUDE}" ) endif() endfunction() @@ -217,11 +213,7 @@ function(exp_add_3rd_binary_package) HASH ${HASH_VALUE} ) - add_custom_target(${NAME} ALL) - set_target_properties( - ${NAME} PROPERTIES - 3RD_TYPE "Binary" - ) + add_library(${NAME} INTERFACE) if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( @@ -234,9 +226,9 @@ function(exp_add_3rd_binary_package) INPUT ${R_INCLUDE} OUTPUT P_INCLUDE ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_INCLUDE "${P_INCLUDE}" + target_include_directories( + ${NAME} + INTERFACE "${P_INCLUDE}" ) endif() @@ -251,9 +243,9 @@ function(exp_add_3rd_binary_package) INPUT ${R_LINK} OUTPUT P_LINK ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_LINK "${P_LINK}" + target_link_directories( + ${NAME} + INTERFACE "${P_LINK}" ) endif() @@ -268,9 +260,9 @@ function(exp_add_3rd_binary_package) OUTPUT P_LIB INPUT ${R_LIB} ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_LIB "${P_LIB}" + target_link_libraries( + ${NAME} + INTERFACE "${P_LIB}" ) endif() @@ -286,7 +278,7 @@ function(exp_add_3rd_binary_package) ) set_target_properties( ${NAME} PROPERTIES - 3RD_RUNTIME_DEP "${P_RUNTIME_DEP}" + RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() endfunction() @@ -327,17 +319,15 @@ function(exp_add_3rd_cmake_package) endif () ExternalProject_Add( - ${NAME} + ${NAME}.External SOURCE_DIR ${SOURCE_DIR} BINARY_DIR ${BINARY_DIR} CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} ${PARAMS_CMAKE_ARG} BUILD_COMMAND ${CMAKE_COMMAND} --build --config $ -j 16 INSTALL_COMMAND ${CMAKE_COMMAND} --install --config $ ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_TYPE "CMakeProject" - ) + add_library(${NAME} INTERFACE) + add_dependencies(${NAME} ${NAME}.External) if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( @@ -351,9 +341,9 @@ function(exp_add_3rd_cmake_package) INPUT ${R_INCLUDE} OUTPUT P_INCLUDE ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_INCLUDE "${P_INCLUDE}" + target_include_directories( + ${NAME} + INTERFACE "${P_INCLUDE}" ) endif() @@ -369,9 +359,9 @@ function(exp_add_3rd_cmake_package) INPUT ${R_LINK} OUTPUT P_LINK ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_LINK "${P_LINK}" + target_link_directories( + ${NAME} + INTERFACE "${P_LINK}" ) endif() @@ -387,9 +377,9 @@ function(exp_add_3rd_cmake_package) INPUT ${R_LIB} OUTPUT P_LIB ) - set_target_properties( - ${NAME} PROPERTIES - 3RD_LIB "${P_LIB}" + target_link_libraries( + ${NAME} + INTERFACE "${P_LIB}" ) endif() @@ -407,7 +397,7 @@ function(exp_add_3rd_cmake_package) ) set_target_properties( ${NAME} PROPERTIES - 3RD_RUNTIME_DEP "${P_RUNTIME_DEP}" + RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() endfunction() @@ -419,11 +409,10 @@ function(exp_add_3rd_alias_package) return() endif() - add_custom_target(${PARAMS_NAME} ALL) - set_target_properties( - ${PARAMS_NAME} PROPERTIES - 3RD_TYPE "Alias" - 3RD_LIB "${PARAMS_LIB}" + add_library(${PARAMS_NAME} INTERFACE) + target_link_libraries( + ${PARAMS_NAME} + INTERFACE "${PARAMS_LIB}" ) endfunction() diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index 1b7460431..04359a504 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -35,10 +35,7 @@ exp_add_mirror_info_source_generation_target( file(GLOB_RECURSE SOURCES Src/*.cpp) qt_add_executable(Editor ${PLATFORM_EXECUTABLE_HINT} ${SOURCES} ${EDITOR_MIRROR_GENERATED_SRC}) target_include_directories(Editor PRIVATE ${EDITOR_INCLUDES}) -exp_link_libs( - NAME Editor - LIB ${EDITOR_LIBS} -) +target_link_libraries(Editor PRIVATE ${EDITOR_LIBS}) if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") set(RHI_DEP_TARGETS RHI-DirectX12 RHI-Vulkan) @@ -47,7 +44,7 @@ else() endif() add_dependencies(Editor ${EDITOR_MIRROR_GENERATED_TARGET} ${RHI_DEP_TARGETS}) -exp_add_runtime_deps_copy_command( +exp_process_runtime_dependencies( NAME Editor ) install( diff --git a/Engine/Source/Core/CMakeLists.txt b/Engine/Source/Core/CMakeLists.txt index f22b0413b..7e4e472cd 100644 --- a/Engine/Source/Core/CMakeLists.txt +++ b/Engine/Source/Core/CMakeLists.txt @@ -4,7 +4,7 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} PUBLIC_INC Include - LIB clipp + LIB Common clipp ) file(GLOB TEST_SOURCES Test/*.cpp) diff --git a/Engine/Source/Mirror/CMakeLists.txt b/Engine/Source/Mirror/CMakeLists.txt index 4b7bfa925..a7576f1b9 100644 --- a/Engine/Source/Mirror/CMakeLists.txt +++ b/Engine/Source/Mirror/CMakeLists.txt @@ -4,6 +4,7 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} PUBLIC_INC Include + LIB Common ) file(GLOB TEST_SOURCES Test/*.cpp) From 551ed22d16fc4d50bbbecfdc63d8fa566b1ffad5 Mon Sep 17 00:00:00 2001 From: kindem Date: Fri, 24 Oct 2025 22:15:55 +0800 Subject: [PATCH 03/23] refactor: use subproject to replace hard code engine string in cmake --- CMake/Common.cmake | 8 ++++---- CMake/Target.cmake | 20 ++++++++++---------- CMakeLists.txt | 3 +++ Editor/CMakeLists.txt | 10 +++++----- Engine/CMakeLists.txt | 4 ++-- Sample/CMakeLists.txt | 2 +- Tool/MirrorTool/CMakeLists.txt | 2 +- 7 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CMake/Common.cmake b/CMake/Common.cmake index 5f3f4a236..26951ff58 100644 --- a/CMake/Common.cmake +++ b/CMake/Common.cmake @@ -9,12 +9,12 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ${EXPORT_COMPILE_COMMANDS}) get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) if (${GENERATOR_IS_MULTI_CONFIG}) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/Engine/Binaries) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/Engine/Binaries) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) else () - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/Engine/Binaries) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/Engine/Binaries) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) endif () diff --git a/CMake/Target.cmake b/CMake/Target.cmake index e3bc701a8..e96803292 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -55,11 +55,11 @@ function(exp_process_runtime_dependencies) list(GET TEMP 0 SRC) list(GET TEMP 1 DST) set(COPY_COMMAND ${SRC} $/${DST}) - set(INSTALL_DST ${CMAKE_INSTALL_PREFIX}/Engine/Binaries/${DST}) + set(INSTALL_DST ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/${DST}) else () set(SRC ${R}) set(COPY_COMMAND ${SRC} $) - set(INSTALL_DST ${CMAKE_INSTALL_PREFIX}/Engine/Binaries) + set(INSTALL_DST ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries) endif () if (IS_DIRECTORY ${SRC}) @@ -109,7 +109,7 @@ function(exp_add_resources_copy_command) list(APPEND COPY_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} $/${DST}) - get_filename_component(ABSOLUTE_DST ${CMAKE_INSTALL_PREFIX}/Engine/Binaries/${DST} ABSOLUTE) + get_filename_component(ABSOLUTE_DST ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/${DST} ABSOLUTE) get_filename_component(DST_DIR ${ABSOLUTE_DST} DIRECTORY) if (NOT ${PARAMS_NOT_INSTALL}) install(FILES ${SRC} DESTINATION ${DST_DIR}) @@ -293,11 +293,11 @@ function(exp_add_executable) if (NOT ${PARAMS_NOT_INSTALL}) install( TARGETS ${PARAMS_NAME} - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Binaries + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries ) if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - install(CODE "execute_process(COMMAND install_name_tool -add_rpath @executable_path ${CMAKE_INSTALL_PREFIX}/Engine/Binaries/$)") + install(CODE "execute_process(COMMAND install_name_tool -add_rpath @executable_path ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/$)") endif () endif () endfunction() @@ -385,17 +385,17 @@ function(exp_add_library) if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${PARAMS_TYPE}" STREQUAL "STATIC") install( TARGETS ${PARAMS_NAME} - FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Target/${PARAMS_NAME}/Include - ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Target/${PARAMS_NAME}/Lib - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Target/${PARAMS_NAME}/Lib - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Binaries + FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Include + ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries ) endif () if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND "${PARAMS_TYPE}" STREQUAL "SHARED") install( FILES $ - DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Binaries + DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries ) endif () endif () diff --git a/CMakeLists.txt b/CMakeLists.txt index a6f6e8bbb..54117ca9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ project(Explosion) include(ExternalProject) include(GenerateExportHeader) +set(SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE) +set(ENGINE_SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE) + include(CMake/Common.cmake) include(CMake/Target.cmake) include(CMake/ThirdParty.cmake) diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index 04359a504..2e20ae16a 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -9,7 +9,7 @@ qt_standard_project_setup(REQUIRES ${QT_VERSION}) if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") set(PLATFORM_EXECUTABLE_HINT MACOSX_BUNDLE) - set(BUNDLE_INSTALL_DESTINATION BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Binaries) + set(BUNDLE_INSTALL_DESTINATION BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX}/${ENGINE_SUB_PROJECT_NAME}/Binaries) set(PLATFORM_FRAMEWORK_DIR ${QT_LIB_PREFIX}/lib) endif () @@ -49,7 +49,7 @@ exp_process_runtime_dependencies( ) install( TARGETS Editor - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/Engine/Binaries + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${ENGINE_SUB_PROJECT_NAME}/Binaries ${BUNDLE_INSTALL_DESTINATION} ) @@ -72,7 +72,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") COMMAND ${QT_WIN_DEPLOY_EXECUTABLE} $ ) install( - CODE "execute_process(COMMAND ${QT_WIN_DEPLOY_EXECUTABLE} ${CMAKE_INSTALL_PREFIX}/Engine/Binaries/$)" + CODE "execute_process(COMMAND ${QT_WIN_DEPLOY_EXECUTABLE} ${CMAKE_INSTALL_PREFIX}/${ENGINE_SUB_PROJECT_NAME}/Binaries/$)" ) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") set(QT_MAC_DEPLOY_EXECUTABLE ${QT_LIB_PREFIX}/bin/macdeployqt) @@ -81,7 +81,7 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") COMMAND ${QT_MAC_DEPLOY_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Editor.app -no-strip ) install( - CODE "execute_process(COMMAND ${QT_MAC_DEPLOY_EXECUTABLE} ${CMAKE_INSTALL_PREFIX}/Engine/Binaries/Editor.app -no-strip)" + CODE "execute_process(COMMAND ${QT_MAC_DEPLOY_EXECUTABLE} ${CMAKE_INSTALL_PREFIX}/${ENGINE_SUB_PROJECT_NAME}/Binaries/Editor.app -no-strip)" ) endif () @@ -184,6 +184,6 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/Web/dist $/Web ) if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/Web/dist ${CMAKE_INSTALL_PREFIX}/Engine/Binaries/Web)") + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/Web/dist ${CMAKE_INSTALL_PREFIX}/${ENGINE_SUB_PROJECT_NAME}/Binaries/Web)") endif () # ---- end web project ------------------------------------------------------------------------------- diff --git a/Engine/CMakeLists.txt b/Engine/CMakeLists.txt index dfc9b66fc..de4c581ff 100644 --- a/Engine/CMakeLists.txt +++ b/Engine/CMakeLists.txt @@ -3,10 +3,10 @@ add_subdirectory(Source) function(get_engine_shader_resources) cmake_parse_arguments(PARAMS "" "NAME" "OUTPUT" ${ARGN}) - file(GLOB_RECURSE ENGINE_SHADERS ${CMAKE_SOURCE_DIR}/Engine/Shader/*.es*) + file(GLOB_RECURSE ENGINE_SHADERS ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader/*.es*) foreach (SHADER ${ENGINE_SHADERS}) get_filename_component(SHADER_ABSOLUTE ${SHADER} ABSOLUTE) - string(REPLACE ${CMAKE_SOURCE_DIR}/Engine/Shader ../Shader/Engine COPY_DST ${SHADER_ABSOLUTE}) + string(REPLACE ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader ../Shader/${ENGINE_SUB_PROJECT_NAME} COPY_DST ${SHADER_ABSOLUTE}) list(APPEND RESULT ${SHADER}->${COPY_DST}) endforeach () diff --git a/Sample/CMakeLists.txt b/Sample/CMakeLists.txt index 69db523c6..1041e0ffa 100644 --- a/Sample/CMakeLists.txt +++ b/Sample/CMakeLists.txt @@ -22,7 +22,7 @@ function(add_sample) list(APPEND PATHS ${path}) endforeach() - list(APPEND PATHS "${CMAKE_SOURCE_DIR}/Engine/Shader/Platform.esh->../Test/Sample/ShaderInclude/Platform.esh") + list(APPEND PATHS "${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader/Platform.esh->../Test/Sample/ShaderInclude/Platform.esh") exp_add_executable( SAMPLE diff --git a/Tool/MirrorTool/CMakeLists.txt b/Tool/MirrorTool/CMakeLists.txt index fcd5a3313..293339353 100644 --- a/Tool/MirrorTool/CMakeLists.txt +++ b/Tool/MirrorTool/CMakeLists.txt @@ -21,5 +21,5 @@ exp_add_test( LIB MirrorTool.Static RES ${CMAKE_CURRENT_SOURCE_DIR}/Test/MirrorToolInput.h->../Test/Resource/Mirror/MirrorToolInput.h - ${CMAKE_SOURCE_DIR}/Engine/Source/Mirror/Include/Mirror/Meta.h->../Test/Resource/Mirror/Mirror/Meta.h + ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Source/Mirror/Include/Mirror/Meta.h->../Test/Resource/Mirror/Mirror/Meta.h ) From df33b490cfb17bec078ea31cd506eb1622259164 Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 26 Oct 2025 12:35:54 +0800 Subject: [PATCH 04/23] refactor: rename arch flag --- CMake/ThirdParty.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index f519cdbc2..4b498da14 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -173,13 +173,13 @@ function(exp_add_3rd_binary_package) set(NAME "${PARAMS_NAME}") if (${PARAMS_ARCH}) - set(COUNT_ARCH "ARCH") + set(FLAG_ARCH "ARCH") else() - set(COUNT_ARCH "") + set(FLAG_ARCH "") endif() exp_get_3rd_platform_value( - ${COUNT_ARCH} + ${FLAG_ARCH} OUTPUT VERSION_VALUE INPUT ${PARAMS_VERSION} ) @@ -202,7 +202,7 @@ function(exp_add_3rd_binary_package) set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") exp_get_3rd_platform_value( - ${COUNT_ARCH} + ${FLAG_ARCH} OUTPUT HASH_VALUE INPUT ${PARAMS_HASH} ) @@ -222,7 +222,7 @@ function(exp_add_3rd_binary_package) SOURCE_DIR ${SOURCE_DIR} ) exp_get_3rd_platform_value( - ${COUNT_ARCH} + ${FLAG_ARCH} INPUT ${R_INCLUDE} OUTPUT P_INCLUDE ) @@ -239,7 +239,7 @@ function(exp_add_3rd_binary_package) SOURCE_DIR ${SOURCE_DIR} ) exp_get_3rd_platform_value( - ${COUNT_ARCH} + ${FLAG_ARCH} INPUT ${R_LINK} OUTPUT P_LINK ) @@ -256,7 +256,7 @@ function(exp_add_3rd_binary_package) SOURCE_DIR ${SOURCE_DIR} ) exp_get_3rd_platform_value( - ${COUNT_ARCH} + ${FLAG_ARCH} OUTPUT P_LIB INPUT ${R_LIB} ) From 322233c67495de5350089d93515cae2acd5ec3ea Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 26 Oct 2025 12:40:02 +0800 Subject: [PATCH 05/23] refactor: skip private libs' install --- Engine/Source/Render/CMakeLists.txt | 1 + Tool/MirrorTool/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/Engine/Source/Render/CMakeLists.txt b/Engine/Source/Render/CMakeLists.txt index b0689bc19..e51a04ce8 100644 --- a/Engine/Source/Render/CMakeLists.txt +++ b/Engine/Source/Render/CMakeLists.txt @@ -9,6 +9,7 @@ exp_add_library( SRC ${SOURCES} PUBLIC_INC Include LIB Core RHI ${PLATFORM_LIBS} dxc spirv-cross + NOT_INSTALL ) file(GLOB SHARED_SOURCES SharedSrc/*.cpp) diff --git a/Tool/MirrorTool/CMakeLists.txt b/Tool/MirrorTool/CMakeLists.txt index 293339353..8e8034794 100644 --- a/Tool/MirrorTool/CMakeLists.txt +++ b/Tool/MirrorTool/CMakeLists.txt @@ -4,6 +4,7 @@ exp_add_library( SRC ${SOURCES} PUBLIC_INC Include LIB clipp llvm-clang Mirror + NOT_INSTALL ) file(GLOB EXE_SOURCES ExeSrc/*.cpp) From 51fe9f07aa02f864ed7fb9611be2f70e3a7987eb Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 26 Oct 2025 13:23:09 +0800 Subject: [PATCH 06/23] feat: support install third party libs --- CMake/Target.cmake | 2 +- CMake/ThirdParty.cmake | 63 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index e96803292..aad96e57c 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -374,7 +374,7 @@ function(exp_add_library) if (NOT ${PARAMS_NOT_INSTALL}) foreach (INC ${PARAMS_PUBLIC_INC}) get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) - file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h) + file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h*) target_sources( ${PARAMS_NAME} PUBLIC FILE_SET HEADERS diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 4b498da14..264107eed 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -121,7 +121,7 @@ function(exp_get_3rd_platform_value) endfunction() function(exp_add_3rd_header_only_package) - cmake_parse_arguments(PARAMS "" "NAME;PLATFORM;VERSION" "HASH;INCLUDE" ${ARGN}) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM;VERSION" "HASH;INCLUDE" ${ARGN}) set(NAME "${PARAMS_NAME}") @@ -166,10 +166,27 @@ function(exp_add_3rd_header_only_package) INTERFACE "${P_INCLUDE}" ) endif() + + if (NOT ${PARAMS_NOT_INSTALL} AND DEFINED P_INCLUDE) + foreach (INC ${P_INCLUDE}) + get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) + file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h*) + target_sources( + ${NAME} + INTERFACE FILE_SET HEADERS + BASE_DIRS ${ABSOLUTE_INC} FILES ${PUBLIC_HEADERS} + ) + endforeach () + + install( + TARGETS ${NAME} + FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Include + ) + endif () endfunction() function(exp_add_3rd_binary_package) - cmake_parse_arguments(PARAMS "ARCH" "NAME;PLATFORM" "VERSION;HASH;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) + cmake_parse_arguments(PARAMS "ARCH;NOT_INSTALL" "NAME;PLATFORM" "VERSION;HASH;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) set(NAME "${PARAMS_NAME}") if (${PARAMS_ARCH}) @@ -281,10 +298,48 @@ function(exp_add_3rd_binary_package) RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() + + if (NOT ${PARAMS_NOT_INSTALL}) + if (DEFINED P_INCLUDE) + foreach (INC ${P_INCLUDE}) + get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) + file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h*) + target_sources( + ${NAME} + INTERFACE FILE_SET HEADERS + BASE_DIRS ${ABSOLUTE_INC} FILES ${PUBLIC_HEADERS} + ) + endforeach () + + install( + TARGETS ${NAME} + FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Include + ) + endif () + + if (DEFINED P_LINK) + foreach (LINK ${P_LINK}) + file(GLOB_RECURSE LIBS ${LINK}/*.lib ${LINK}/*.a) + list(APPEND INSTALL_LIBS ${LIBS}) + endforeach () + + install( + FILES ${LIBS} + DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Lib + ) + endif () + + if (DEFINED P_RUNTIME_DEP) + install( + FILES ${P_RUNTIME_DEP} + DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Binaries + ) + endif () + endif () endfunction() function(exp_add_3rd_cmake_package) - cmake_parse_arguments(PARAMS "" "NAME;PLATFORM;VERSION" "HASH;CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM;VERSION" "HASH;CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) set(NAME "${PARAMS_NAME}") @@ -400,6 +455,8 @@ function(exp_add_3rd_cmake_package) RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() + + # TODO install endfunction() function(exp_add_3rd_alias_package) From 26260e37745a28deb14746998a3250dddfcb8801 Mon Sep 17 00:00:00 2001 From: kindem Date: Mon, 27 Oct 2025 21:02:04 +0800 Subject: [PATCH 07/23] feat: export targets for install --- CMake/Common.cmake | 7 +- CMake/Target.cmake | 89 ++++++------- CMake/ThirdParty.cmake | 193 ++++++++++++++-------------- CMakeLists.txt | 6 +- Engine/Source/Render/CMakeLists.txt | 1 - ThirdParty/CMakeLists.txt | 13 +- 6 files changed, 149 insertions(+), 160 deletions(-) diff --git a/CMake/Common.cmake b/CMake/Common.cmake index 26951ff58..713834274 100644 --- a/CMake/Common.cmake +++ b/CMake/Common.cmake @@ -1,5 +1,6 @@ -option(BUILD_EDITOR "Build Explosion editor" ON) -option(CI "Build in CI" OFF) +include(ExternalProject) +include(GenerateExportHeader) + option(USE_UNITY_BUILD "Use unity build" ON) option(EXPORT_COMPILE_COMMANDS "Whether to export all compile commands" OFF) @@ -36,8 +37,6 @@ add_definitions(-DCOMPILER_MSVC=$,1,0>) add_definitions(-DCOMPILER_APPLE_CLANG=$,1,0>) add_definitions(-DCOMPILER_GCC=$,1,0>) -add_definitions(-DBUILD_EDITOR=$) - if (${MSVC}) add_compile_options(/bigobj) add_definitions(-D_SILENCE_ALL_MS_EXT_DEPRECATION_WARNINGS=1) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index aad96e57c..74ffbf278 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -49,39 +49,14 @@ function(exp_process_runtime_dependencies) OUTPUT RUNTIME_DEPS ) foreach(R ${RUNTIME_DEPS}) - string(FIND ${R} "->" LOCATION) - if (NOT ${LOCATION} EQUAL -1) - string(REPLACE "->" ";" TEMP ${R}) - list(GET TEMP 0 SRC) - list(GET TEMP 1 DST) - set(COPY_COMMAND ${SRC} $/${DST}) - set(INSTALL_DST ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/${DST}) - else () - set(SRC ${R}) - set(COPY_COMMAND ${SRC} $) - set(INSTALL_DST ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries) - endif () - - if (IS_DIRECTORY ${SRC}) - add_custom_command( - TARGET ${PARAMS_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${COPY_COMMAND} - ) - if (NOT ${PARAMS_NOT_INSTALL}) - install( - DIRECTORY ${SRC} DESTINATION ${INSTALL_DST} - ) - endif () - else () - add_custom_command( - TARGET ${PARAMS_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${COPY_COMMAND} + add_custom_command( + TARGET ${PARAMS_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${R} $ + ) + if (NOT ${PARAMS_NOT_INSTALL}) + install( + FILES ${R} DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries ) - if (NOT ${PARAMS_NOT_INSTALL}) - install( - FILES ${SRC} DESTINATION ${INSTALL_DST} - ) - endif () endif () endforeach() endfunction() @@ -159,10 +134,16 @@ function(exp_add_mirror_info_source_generation_target) cmake_parse_arguments(PARAMS "DYNAMIC" "NAME;OUTPUT_SRC;OUTPUT_TARGET_NAME" "SEARCH_DIR;PUBLIC_INC;PRIVATE_INC;LIB;FRAMEWORK_DIR" ${ARGN}) if (DEFINED PARAMS_PUBLIC_INC) - list(APPEND INC ${PARAMS_PUBLIC_INC}) + foreach (I ${PARAMS_PUBLIC_INC}) + get_filename_component(ABSOLUTE_I ${I} ABSOLUTE) + list(APPEND INC ${ABSOLUTE_I}) + endforeach () endif() if (DEFINED PARAMS_PRIVATE_INC) - list(APPEND INC ${PARAMS_PRIVATE_INC}) + foreach (I ${PARAMS_PRIVATE_INC}) + get_filename_component(ABSOLUTE_I ${I} ABSOLUTE) + list(APPEND INC ${ABSOLUTE_I}) + endforeach () endif() if (DEFINED PARAMS_LIB) foreach (L ${PARAMS_LIB}) @@ -179,8 +160,7 @@ function(exp_add_mirror_info_source_generation_target) list(APPEND INC_ARGS "-I") foreach (I ${INC}) - get_filename_component(ABSOLUTE_I ${I} ABSOLUTE) - list(APPEND INC_ARGS ${ABSOLUTE_I}) + list(APPEND INC_ARGS ${I}) endforeach() if (DEFINED PARAMS_FRAMEWORK_DIR) @@ -293,7 +273,8 @@ function(exp_add_executable) if (NOT ${PARAMS_NOT_INSTALL}) install( TARGETS ${PARAMS_NAME} - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries + EXPORT ${SUB_PROJECT_NAME}Targets + RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries ) if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") @@ -334,10 +315,14 @@ function(exp_add_library) ${PARAMS_NAME} PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} ) + foreach (INC ${PARAMS_PUBLIC_INC}) + get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) + list(APPEND PUBLIC_INC $) + endforeach () target_include_directories( ${PARAMS_NAME} PRIVATE ${PARAMS_PRIVATE_INC} - PUBLIC ${PARAMS_PUBLIC_INC} + PUBLIC ${PUBLIC_INC} $ ) target_link_directories( ${PARAMS_NAME} @@ -373,25 +358,24 @@ function(exp_add_library) if (NOT ${PARAMS_NOT_INSTALL}) foreach (INC ${PARAMS_PUBLIC_INC}) - get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) - file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h*) - target_sources( - ${PARAMS_NAME} - PUBLIC FILE_SET HEADERS - BASE_DIRS ${ABSOLUTE_INC} FILES ${PUBLIC_HEADERS} - ) + list(APPEND INSTALL_INC ${INC}/) endforeach () + install( + DIRECTORY ${INSTALL_INC} + DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Include + ) if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${PARAMS_TYPE}" STREQUAL "STATIC") install( TARGETS ${PARAMS_NAME} - FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Include - ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries + EXPORT ${SUB_PROJECT_NAME}Targets + ARCHIVE DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib + LIBRARY DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib + RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries ) endif () + # TODO merge with upper, use install(TARGETS xxx FRAMEWORK DESTINATION xxx) if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND "${PARAMS_TYPE}" STREQUAL "SHARED") install( FILES $ @@ -458,3 +442,10 @@ function(exp_add_test) WORKING_DIRECTORY $ ) endfunction() + +install( + EXPORT ${SUB_PROJECT_NAME}Targets + FILE ${SUB_PROJECT_NAME}Targets.cmake + NAMESPACE ${SUB_PROJECT_NAME}:: + DESTINATION ${SUB_PROJECT_NAME}/CMake +) diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 264107eed..48cebe903 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -1,19 +1,22 @@ option(CUSTOM_3RD_REPO "using custom 3rd repo" OFF) +# TODO move to engine cmake if (${CUSTOM_3RD_REPO}) set(3RD_REPO ${3RD_REPO_URL} CACHE STRING "" FORCE) else() set(3RD_REPO "http://1.13.181.171" CACHE STRING "" FORCE) endif() +# TODO move to engine cmake set(3RD_DIR ${CMAKE_SOURCE_DIR}/ThirdParty CACHE PATH "" FORCE) set(3RD_ZIP_DIR ${3RD_DIR}/Zip CACHE PATH "" FORCE) set(3RD_SOURCE_DIR ${3RD_DIR}/Lib CACHE PATH "" FORCE) set(3RD_BINARY_DIR ${CMAKE_BINARY_DIR}/ThirdPartyBuild CACHE PATH "" FORCE) set(3RD_INSTALL_DIR ${CMAKE_BINARY_DIR}/ThirdPartyInstall CACHE PATH "" FORCE) +# TODO split download and config part function(exp_download_and_extract_3rd_package) - cmake_parse_arguments(PARAMS "" "URL;SAVE_AS;EXTRACT_TO;HASH" "ARG" ${ARGN}) + cmake_parse_arguments(PARAMS "" "URL;SAVE_AS;EXTRACT_TO" "ARG;HASH" ${ARGN}) if (EXISTS ${PARAMS_SAVE_AS}) message("found downloaded file for ${PARAMS_URL} -> ${PARAMS_SAVE_AS}") @@ -27,9 +30,14 @@ function(exp_download_and_extract_3rd_package) endif() if (DEFINED PARAMS_HASH) + exp_get_3rd_platform_value( + OUTPUT PLATFORM_HASH + INPUT ${PARAMS_HASH} + ) + file(SHA256 ${PARAMS_SAVE_AS} HASH_VALUE) - if (NOT (${PARAMS_HASH} STREQUAL ${HASH_VALUE})) - message(FATAL_ERROR "check hash value failed for file ${PARAMS_SAVE_AS}, given ${PARAMS_HASH} actual ${HASH_VALUE}") + if (NOT (${PLATFORM_HASH} STREQUAL ${HASH_VALUE})) + message(FATAL_ERROR "check hash value failed for file ${PARAMS_SAVE_AS}, given ${PLATFORM_HASH} actual ${HASH_VALUE}") endif () endif() @@ -63,15 +71,9 @@ function(exp_expand_3rd_path_expression) endfunction() function(exp_get_3rd_platform_value) - cmake_parse_arguments(PARAMS "ARCH" "OUTPUT" "INPUT" ${ARGN}) + cmake_parse_arguments(PARAMS "" "OUTPUT" "INPUT" ${ARGN}) - if (${PARAMS_ARCH}) - set(PLATFORM_KEYWORDS "Windows-AMD64;Darwin-arm64") - set(CURRENT_KEYWORDS "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - else() - set(PLATFORM_KEYWORDS "Windows;Darwin;Linux") - set(CURRENT_KEYWORDS "${CMAKE_SYSTEM_NAME}") - endif() + set(PLATFORM_KEYWORDS "Windows;Darwin;Linux") set(HAS_KEYWORDS FALSE) foreach (I ${PARAMS_INPUT}) @@ -89,7 +91,7 @@ function(exp_get_3rd_platform_value) set(START_LOG FALSE) foreach (I ${PARAMS_INPUT}) - if ((NOT ${START_LOG}) AND (${I} STREQUAL ${CURRENT_KEYWORDS})) + if ((NOT ${START_LOG}) AND (${I} STREQUAL ${CMAKE_SYSTEM_NAME})) set(START_LOG TRUE) continue() endif() @@ -123,8 +125,6 @@ endfunction() function(exp_add_3rd_header_only_package) cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM;VERSION" "HASH;INCLUDE" ${ARGN}) - set(NAME "${PARAMS_NAME}") - if (DEFINED PARAMS_PLATFORM) if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) return() @@ -138,18 +138,14 @@ function(exp_add_3rd_header_only_package) set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - exp_get_3rd_platform_value( - OUTPUT HASH_VALUE - INPUT ${PARAMS_HASH} - ) exp_download_and_extract_3rd_package( URL ${URL} SAVE_AS ${ZIP} EXTRACT_TO ${SOURCE_DIR} - HASH ${HASH_VALUE} + HASH ${PARAMS_HASH} ) - add_library(${NAME} INTERFACE) + add_library(${PARAMS_NAME} INTERFACE) if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( @@ -162,41 +158,31 @@ function(exp_add_3rd_header_only_package) INPUT ${R_INCLUDE} ) target_include_directories( - ${NAME} - INTERFACE "${P_INCLUDE}" + ${PARAMS_NAME} + INTERFACE $ $ ) endif() if (NOT ${PARAMS_NOT_INSTALL} AND DEFINED P_INCLUDE) foreach (INC ${P_INCLUDE}) - get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) - file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h*) - target_sources( - ${NAME} - INTERFACE FILE_SET HEADERS - BASE_DIRS ${ABSOLUTE_INC} FILES ${PUBLIC_HEADERS} - ) + list(APPEND INSTALL_INC ${INC}/) endforeach () + install( + DIRECTORY ${INSTALL_INC} + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Include + ) install( - TARGETS ${NAME} - FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Include + TARGETS ${PARAMS_NAME} + EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets ) endif () endfunction() function(exp_add_3rd_binary_package) - cmake_parse_arguments(PARAMS "ARCH;NOT_INSTALL" "NAME;PLATFORM" "VERSION;HASH;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) - - set(NAME "${PARAMS_NAME}") - if (${PARAMS_ARCH}) - set(FLAG_ARCH "ARCH") - else() - set(FLAG_ARCH "") - endif() + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM" "VERSION;HASH;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) exp_get_3rd_platform_value( - ${FLAG_ARCH} OUTPUT VERSION_VALUE INPUT ${PARAMS_VERSION} ) @@ -210,27 +196,18 @@ function(exp_add_3rd_binary_package) set(FULL_NAME "${PARAMS_NAME}-${CMAKE_SYSTEM_NAME}-${VERSION_VALUE}") endif() - if (${PARAMS_ARCH}) - set(FULL_NAME "${PARAMS_NAME}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}-${VERSION_VALUE}") - endif() - set(URL "${3RD_REPO}/${FULL_NAME}.7z") set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - exp_get_3rd_platform_value( - ${FLAG_ARCH} - OUTPUT HASH_VALUE - INPUT ${PARAMS_HASH} - ) exp_download_and_extract_3rd_package( URL ${URL} SAVE_AS ${ZIP} EXTRACT_TO ${SOURCE_DIR} - HASH ${HASH_VALUE} + HASH ${PARAMS_HASH} ) - add_library(${NAME} INTERFACE) + add_library(${PARAMS_NAME} INTERFACE) if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( @@ -239,13 +216,12 @@ function(exp_add_3rd_binary_package) SOURCE_DIR ${SOURCE_DIR} ) exp_get_3rd_platform_value( - ${FLAG_ARCH} INPUT ${R_INCLUDE} OUTPUT P_INCLUDE ) target_include_directories( - ${NAME} - INTERFACE "${P_INCLUDE}" + ${PARAMS_NAME} + INTERFACE $ $ ) endif() @@ -256,13 +232,12 @@ function(exp_add_3rd_binary_package) SOURCE_DIR ${SOURCE_DIR} ) exp_get_3rd_platform_value( - ${FLAG_ARCH} INPUT ${R_LINK} OUTPUT P_LINK ) target_link_directories( - ${NAME} - INTERFACE "${P_LINK}" + ${PARAMS_NAME} + INTERFACE $ $ ) endif() @@ -273,12 +248,11 @@ function(exp_add_3rd_binary_package) SOURCE_DIR ${SOURCE_DIR} ) exp_get_3rd_platform_value( - ${FLAG_ARCH} OUTPUT P_LIB INPUT ${R_LIB} ) target_link_libraries( - ${NAME} + ${PARAMS_NAME} INTERFACE "${P_LIB}" ) endif() @@ -294,7 +268,7 @@ function(exp_add_3rd_binary_package) OUTPUT P_RUNTIME_DEP ) set_target_properties( - ${NAME} PROPERTIES + ${PARAMS_NAME} PROPERTIES RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() @@ -302,18 +276,11 @@ function(exp_add_3rd_binary_package) if (NOT ${PARAMS_NOT_INSTALL}) if (DEFINED P_INCLUDE) foreach (INC ${P_INCLUDE}) - get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) - file(GLOB_RECURSE PUBLIC_HEADERS ${ABSOLUTE_INC}/*.h*) - target_sources( - ${NAME} - INTERFACE FILE_SET HEADERS - BASE_DIRS ${ABSOLUTE_INC} FILES ${PUBLIC_HEADERS} - ) + list(APPEND INSTALL_INC ${INC}/) endforeach () - install( - TARGETS ${NAME} - FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Include + DIRECTORY ${INSTALL_INC} + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Include ) endif () @@ -325,24 +292,27 @@ function(exp_add_3rd_binary_package) install( FILES ${LIBS} - DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Lib + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Lib ) endif () if (DEFINED P_RUNTIME_DEP) install( FILES ${P_RUNTIME_DEP} - DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/ThirdParty/${NAME}/Binaries + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries ) endif () + + install( + TARGETS ${PARAMS_NAME} + EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets + ) endif () endfunction() function(exp_add_3rd_cmake_package) cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM;VERSION" "HASH;CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) - set(NAME "${PARAMS_NAME}") - if (DEFINED PARAMS_PLATFORM) if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) return() @@ -355,18 +325,14 @@ function(exp_add_3rd_cmake_package) set(URL "${3RD_REPO}/${FULL_NAME}.7z") set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - set(BINARY_DIR "${3RD_BINARY_DIR}/${NAME}") - set(INSTALL_DIR "${3RD_INSTALL_DIR}/${NAME}/$") + set(BINARY_DIR "${3RD_BINARY_DIR}/${PARAMS_NAME}") + set(INSTALL_DIR "${3RD_INSTALL_DIR}/${PARAMS_NAME}/$") - exp_get_3rd_platform_value( - OUTPUT HASH_VALUE - INPUT ${PARAMS_HASH} - ) exp_download_and_extract_3rd_package( URL ${URL} SAVE_AS ${ZIP} EXTRACT_TO ${SOURCE_DIR} - HASH ${HASH_VALUE} + HASH ${PARAMS_HASH} ) if (NOT ${GENERATOR_IS_MULTI_CONFIG}) @@ -374,15 +340,15 @@ function(exp_add_3rd_cmake_package) endif () ExternalProject_Add( - ${NAME}.External + ${PARAMS_NAME}.External SOURCE_DIR ${SOURCE_DIR} BINARY_DIR ${BINARY_DIR} CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} ${PARAMS_CMAKE_ARG} BUILD_COMMAND ${CMAKE_COMMAND} --build --config $ -j 16 INSTALL_COMMAND ${CMAKE_COMMAND} --install --config $ ) - add_library(${NAME} INTERFACE) - add_dependencies(${NAME} ${NAME}.External) + add_library(${PARAMS_NAME} INTERFACE) + add_dependencies(${PARAMS_NAME} ${PARAMS_NAME}.External) if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( @@ -397,8 +363,8 @@ function(exp_add_3rd_cmake_package) OUTPUT P_INCLUDE ) target_include_directories( - ${NAME} - INTERFACE "${P_INCLUDE}" + ${PARAMS_NAME} + INTERFACE $ $ ) endif() @@ -415,8 +381,8 @@ function(exp_add_3rd_cmake_package) OUTPUT P_LINK ) target_link_directories( - ${NAME} - INTERFACE "${P_LINK}" + ${PARAMS_NAME} + INTERFACE $ $ ) endif() @@ -433,7 +399,7 @@ function(exp_add_3rd_cmake_package) OUTPUT P_LIB ) target_link_libraries( - ${NAME} + ${PARAMS_NAME} INTERFACE "${P_LIB}" ) endif() @@ -451,12 +417,44 @@ function(exp_add_3rd_cmake_package) OUTPUT P_RUNTIME_DEP ) set_target_properties( - ${NAME} PROPERTIES + ${PARAMS_NAME} PROPERTIES RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() - # TODO install + if (NOT ${PARAMS_NOT_INSTALL}) + if (DEFINED P_INCLUDE) + foreach (INC ${P_INCLUDE}) + list(APPEND INSTALL_INC ${INC}/) + endforeach () + install( + DIRECTORY ${INSTALL_INC} + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Include + ) + endif () + + if (DEFINED P_LINK) + foreach (LINK ${P_LINK}) + list(APPEND INSTALL_LINK ${LINK}/) + endforeach () + install( + DIRECTORY ${INSTALL_LINK} + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Lib + ) + endif () + + if (DEFINED P_RUNTIME_DEP) + install( + FILES ${P_RUNTIME_DEP} + DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries + ) + endif () + + install( + TARGETS ${PARAMS_NAME} + EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets + ) + endif () endfunction() function(exp_add_3rd_alias_package) @@ -489,16 +487,19 @@ function(exp_setup_3rd_package) set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - exp_get_3rd_platform_value( - OUTPUT HASH_VALUE - INPUT ${PARAMS_HASH} - ) exp_download_and_extract_3rd_package( URL ${URL} SAVE_AS ${ZIP} EXTRACT_TO ${SOURCE_DIR} - HASH ${HASH_VALUE} + HASH ${PARAMS_HASH} ) set(${PARAMS_NAME}_SOURCE_DIR ${SOURCE_DIR} CACHE PATH "" FORCE) endfunction() + +install( + EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets + FILE ${SUB_PROJECT_NAME}ThirdPartyTargets.cmake + NAMESPACE ThirdParty:: + DESTINATION ${SUB_PROJECT_NAME}/CMake +) diff --git a/CMakeLists.txt b/CMakeLists.txt index 54117ca9e..201559d9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,14 @@ cmake_minimum_required(VERSION 3.25) project(Explosion) -include(ExternalProject) -include(GenerateExportHeader) +option(BUILD_EDITOR "Build Explosion editor" ON) +option(CI "Build in CI" OFF) set(SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE) set(ENGINE_SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE) +add_definitions(-DBUILD_EDITOR=$) + include(CMake/Common.cmake) include(CMake/Target.cmake) include(CMake/ThirdParty.cmake) diff --git a/Engine/Source/Render/CMakeLists.txt b/Engine/Source/Render/CMakeLists.txt index e51a04ce8..b0689bc19 100644 --- a/Engine/Source/Render/CMakeLists.txt +++ b/Engine/Source/Render/CMakeLists.txt @@ -9,7 +9,6 @@ exp_add_library( SRC ${SOURCES} PUBLIC_INC Include LIB Core RHI ${PLATFORM_LIBS} dxc spirv-cross - NOT_INSTALL ) file(GLOB SHARED_SOURCES SharedSrc/*.cpp) diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index 0d43e7335..e788e3666 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -154,18 +154,15 @@ exp_add_3rd_header_only_package( # LLVM-Clang exp_add_3rd_binary_package( NAME llvm-clang - ARCH - VERSION - Windows-AMD64 19.1.6 - Darwin-arm64 19.1.6 + VERSION 19.1.6 HASH - Windows-AMD64 f68b922c87a99b22c0b53a5cbd55db86bd3870c16c4e9060efaecfb9ce49e726 - Darwin-arm64 08fdf1b6208823acadc23027fda1f12e5171101ec05fa526b545088be31fe19d + Windows f68b922c87a99b22c0b53a5cbd55db86bd3870c16c4e9060efaecfb9ce49e726 + Darwin 08fdf1b6208823acadc23027fda1f12e5171101ec05fa526b545088be31fe19d INCLUDE $/include LINK $/lib LIB - Windows-AMD64 libclang - Darwin-arm64 clang + Windows libclang + Darwin clang RUNTIME_DEP Windows $/bin/libclang.dll Darwin $/lib/libclang.dylib From ec2acfcdcefeaf364be7262ea122744f7e3ed539 Mon Sep 17 00:00:00 2001 From: kindem Date: Fri, 31 Oct 2025 23:08:28 +0800 Subject: [PATCH 08/23] refactor: move engine third party cmake code --- CMake/Target.cmake | 45 +++- CMake/ThirdParty.cmake | 182 ++++----------- ThirdParty/CMakeLists.txt | 476 ++++++++++++++++++++++++++------------ 3 files changed, 402 insertions(+), 301 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 74ffbf278..51c9d7502 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -11,15 +11,26 @@ else() endif() function(exp_gather_target_runtime_dependencies_recurse) - cmake_parse_arguments(PARAMS "" "NAME;OUTPUT" "" ${ARGN}) + cmake_parse_arguments(PARAMS "" "NAME;OUT_RUNTIME_DEP;OUT_INSTALL_RUNTIME_DEP_DIR" "" ${ARGN}) + + get_target_property(IMPORTED ${PARAMS_NAME} IMPORTED) get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) foreach(R ${RUNTIME_DEP}) - list(APPEND RESULT ${R}) + list(APPEND RESULT_RUNTIME_DEP ${R}) endforeach() endif() + if (${IMPORTED}) + get_target_property(INSTALL_RUNTIME_DEP_DIR ${PARAMS_NAME} INSTALL_RUNTIME_DEP_DIR) + if (NOT ("${INSTALL_RUNTIME_DEP_DIR}" STREQUAL "INSTALL_RUNTIME_DEP_DIR-NOTFOUND")) + foreach (R ${INSTALL_RUNTIME_DEP_DIR}) + list(APPEND RESULT_INSTALL_RUNTIME_DEP_DIR ${R}) + endforeach() + endif() + endif () + get_target_property(LINK_LIBRARIES ${PARAMS_NAME} LINK_LIBRARIES) if (NOT ("${LINK_LIBRARIES}" STREQUAL "LINK_LIBRARIES-NOTFOUND")) foreach(L ${LINK_LIBRARIES}) @@ -29,16 +40,22 @@ function(exp_gather_target_runtime_dependencies_recurse) exp_gather_target_runtime_dependencies_recurse( NAME ${L} - OUTPUT TEMP + OUT_RUNTIME_DEP TEMP_RUNTIME_DEP + OUT_INSTALL_RUNTIME_DEP_DIR TEMP_INSTALL_RUNTIME_DEP_DIR ) - foreach(T ${TEMP}) - list(APPEND RESULT ${T}) + foreach(T ${TEMP_RUNTIME_DEP}) + list(APPEND RESULT_RUNTIME_DEP ${T}) + endforeach() + foreach (T ${TEMP_INSTALL_RUNTIME_DEP_DIR}) + list(APPEND RESULT_INSTALL_RUNTIME_DEP_DIR ${T}) endforeach() endforeach() endif() - list(REMOVE_DUPLICATES RESULT) - set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) + list(REMOVE_DUPLICATES RESULT_RUNTIME_DEP) + list(REMOVE_DUPLICATES RESULT_INSTALL_RUNTIME_DEP_DIR) + set(${PARAMS_OUT_RUNTIME_DEP} ${RESULT_RUNTIME_DEP} PARENT_SCOPE) + set(${PARAMS_OUT_INSTALL_RUNTIME_DEP_DIR} ${RESULT_INSTALL_RUNTIME_DEP_DIR} PARENT_SCOPE) endfunction() function(exp_process_runtime_dependencies) @@ -46,7 +63,8 @@ function(exp_process_runtime_dependencies) exp_gather_target_runtime_dependencies_recurse( NAME ${PARAMS_NAME} - OUTPUT RUNTIME_DEPS + OUT_RUNTIME_DEP RUNTIME_DEPS + OUT_INSTALL_RUNTIME_DEP_DIR INSTALL_RUNTIME_DEP_DIRS ) foreach(R ${RUNTIME_DEPS}) add_custom_command( @@ -59,6 +77,17 @@ function(exp_process_runtime_dependencies) ) endif () endforeach() + foreach (R ${INSTALL_RUNTIME_DEP_DIRS}) + add_custom_command( + TARGET ${PARAMS_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${R}/ $ + ) + if (NOT ${PARAMS_NOT_INSTALL}) + install( + DIRECTORY ${R}/ DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries + ) + endif () + endforeach () endfunction() function(exp_expand_resource_path_expression) diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 48cebe903..cb434ca0c 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -1,20 +1,3 @@ -option(CUSTOM_3RD_REPO "using custom 3rd repo" OFF) - -# TODO move to engine cmake -if (${CUSTOM_3RD_REPO}) - set(3RD_REPO ${3RD_REPO_URL} CACHE STRING "" FORCE) -else() - set(3RD_REPO "http://1.13.181.171" CACHE STRING "" FORCE) -endif() - -# TODO move to engine cmake -set(3RD_DIR ${CMAKE_SOURCE_DIR}/ThirdParty CACHE PATH "" FORCE) -set(3RD_ZIP_DIR ${3RD_DIR}/Zip CACHE PATH "" FORCE) -set(3RD_SOURCE_DIR ${3RD_DIR}/Lib CACHE PATH "" FORCE) -set(3RD_BINARY_DIR ${CMAKE_BINARY_DIR}/ThirdPartyBuild CACHE PATH "" FORCE) -set(3RD_INSTALL_DIR ${CMAKE_BINARY_DIR}/ThirdPartyInstall CACHE PATH "" FORCE) - -# TODO split download and config part function(exp_download_and_extract_3rd_package) cmake_parse_arguments(PARAMS "" "URL;SAVE_AS;EXTRACT_TO" "ARG;HASH" ${ARGN}) @@ -123,27 +106,7 @@ function(exp_get_3rd_platform_value) endfunction() function(exp_add_3rd_header_only_package) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM;VERSION" "HASH;INCLUDE" ${ARGN}) - - if (DEFINED PARAMS_PLATFORM) - if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) - return() - endif() - set(FULL_NAME "${PARAMS_NAME}-${PARAMS_PLATFORM}-${PARAMS_VERSION}") - else() - set(FULL_NAME "${PARAMS_NAME}-${CMAKE_SYSTEM_NAME}-${PARAMS_VERSION}") - endif() - - set(URL "${3RD_REPO}/${FULL_NAME}.7z") - set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") - set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - - exp_download_and_extract_3rd_package( - URL ${URL} - SAVE_AS ${ZIP} - EXTRACT_TO ${SOURCE_DIR} - HASH ${PARAMS_HASH} - ) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;SOURCE_DIR" "INCLUDE" ${ARGN}) add_library(${PARAMS_NAME} INTERFACE) @@ -151,7 +114,7 @@ function(exp_add_3rd_header_only_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_INCLUDE} OUTPUT R_INCLUDE - SOURCE_DIR ${SOURCE_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} ) exp_get_3rd_platform_value( OUTPUT P_INCLUDE @@ -180,32 +143,7 @@ function(exp_add_3rd_header_only_package) endfunction() function(exp_add_3rd_binary_package) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM" "VERSION;HASH;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) - - exp_get_3rd_platform_value( - OUTPUT VERSION_VALUE - INPUT ${PARAMS_VERSION} - ) - - if (DEFINED PARAMS_PLATFORM) - if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) - return() - endif() - set(FULL_NAME "${PARAMS_NAME}-${PARAMS_PLATFORM}-${VERSION_VALUE}") - else() - set(FULL_NAME "${PARAMS_NAME}-${CMAKE_SYSTEM_NAME}-${VERSION_VALUE}") - endif() - - set(URL "${3RD_REPO}/${FULL_NAME}.7z") - set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") - set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - - exp_download_and_extract_3rd_package( - URL ${URL} - SAVE_AS ${ZIP} - EXTRACT_TO ${SOURCE_DIR} - HASH ${PARAMS_HASH} - ) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;SOURCE_DIR" "INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) add_library(${PARAMS_NAME} INTERFACE) @@ -213,7 +151,7 @@ function(exp_add_3rd_binary_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_INCLUDE} OUTPUT R_INCLUDE - SOURCE_DIR ${SOURCE_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} ) exp_get_3rd_platform_value( INPUT ${R_INCLUDE} @@ -229,7 +167,7 @@ function(exp_add_3rd_binary_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_LINK} OUTPUT R_LINK - SOURCE_DIR ${SOURCE_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} ) exp_get_3rd_platform_value( INPUT ${R_LINK} @@ -245,7 +183,7 @@ function(exp_add_3rd_binary_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_LIB} OUTPUT R_LIB - SOURCE_DIR ${SOURCE_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} ) exp_get_3rd_platform_value( OUTPUT P_LIB @@ -261,7 +199,7 @@ function(exp_add_3rd_binary_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_RUNTIME_DEP} OUTPUT R_RUNTIME_DEP - SOURCE_DIR ${SOURCE_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} ) exp_get_3rd_platform_value( INPUT ${R_RUNTIME_DEP} @@ -274,6 +212,11 @@ function(exp_add_3rd_binary_package) endif() if (NOT ${PARAMS_NOT_INSTALL}) + set_target_properties( + ${PARAMS_NAME} PROPERTIES + EXPORT_PROPERTIES INSTALL_RUNTIME_DEP_DIR + ) + if (DEFINED P_INCLUDE) foreach (INC ${P_INCLUDE}) list(APPEND INSTALL_INC ${INC}/) @@ -297,6 +240,10 @@ function(exp_add_3rd_binary_package) endif () if (DEFINED P_RUNTIME_DEP) + set_target_properties( + ${PARAMS_NAME} PROPERTIES + INSTALL_RUNTIME_DEP_DIR "\$\{_IMPORT_PREFIX\}/${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries" + ) install( FILES ${P_RUNTIME_DEP} DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries @@ -311,29 +258,7 @@ function(exp_add_3rd_binary_package) endfunction() function(exp_add_3rd_cmake_package) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;PLATFORM;VERSION" "HASH;CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) - - if (DEFINED PARAMS_PLATFORM) - if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) - return() - endif() - set(FULL_NAME "${PARAMS_NAME}-${PARAMS_PLATFORM}-${PARAMS_VERSION}") - else() - set(FULL_NAME "${PARAMS_NAME}-${CMAKE_SYSTEM_NAME}-${PARAMS_VERSION}") - endif() - - set(URL "${3RD_REPO}/${FULL_NAME}.7z") - set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") - set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - set(BINARY_DIR "${3RD_BINARY_DIR}/${PARAMS_NAME}") - set(INSTALL_DIR "${3RD_INSTALL_DIR}/${PARAMS_NAME}/$") - - exp_download_and_extract_3rd_package( - URL ${URL} - SAVE_AS ${ZIP} - EXTRACT_TO ${SOURCE_DIR} - HASH ${PARAMS_HASH} - ) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) if (NOT ${GENERATOR_IS_MULTI_CONFIG}) set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=$) @@ -341,9 +266,9 @@ function(exp_add_3rd_cmake_package) ExternalProject_Add( ${PARAMS_NAME}.External - SOURCE_DIR ${SOURCE_DIR} - BINARY_DIR ${BINARY_DIR} - CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} ${PARAMS_CMAKE_ARG} + SOURCE_DIR ${PARAMS_SOURCE_DIR} + BINARY_DIR ${PARAMS_BINARY_DIR} + CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${PARAMS_INSTALL_DIR} ${PARAMS_CMAKE_ARG} BUILD_COMMAND ${CMAKE_COMMAND} --build --config $ -j 16 INSTALL_COMMAND ${CMAKE_COMMAND} --install --config $ ) @@ -354,9 +279,9 @@ function(exp_add_3rd_cmake_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_INCLUDE} OUTPUT R_INCLUDE - SOURCE_DIR ${SOURCE_DIR} - BINARY_DIR ${BINARY_DIR} - INSTALL_DIR ${INSTALL_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} + BINARY_DIR ${PARAMS_BINARY_DIR} + INSTALL_DIR ${PARAMS_INSTALL_DIR} ) exp_get_3rd_platform_value( INPUT ${R_INCLUDE} @@ -372,9 +297,9 @@ function(exp_add_3rd_cmake_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_LINK} OUTPUT R_LINK - SOURCE_DIR ${SOURCE_DIR} - BINARY_DIR ${BINARY_DIR} - INSTALL_DIR ${INSTALL_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} + BINARY_DIR ${PARAMS_BINARY_DIR} + INSTALL_DIR ${PARAMS_INSTALL_DIR} ) exp_get_3rd_platform_value( INPUT ${R_LINK} @@ -390,9 +315,9 @@ function(exp_add_3rd_cmake_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_LIB} OUTPUT R_LIB - SOURCE_DIR ${SOURCE_DIR} - BINARY_DIR ${BINARY_DIR} - INSTALL_DIR ${INSTALL_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} + BINARY_DIR ${PARAMS_BINARY_DIR} + INSTALL_DIR ${PARAMS_INSTALL_DIR} ) exp_get_3rd_platform_value( INPUT ${R_LIB} @@ -408,9 +333,9 @@ function(exp_add_3rd_cmake_package) exp_expand_3rd_path_expression( INPUT ${PARAMS_RUNTIME_DEP} OUTPUT R_RUNTIME_DEP - SOURCE_DIR ${SOURCE_DIR} - BINARY_DIR ${BINARY_DIR} - INSTALL_DIR ${INSTALL_DIR} + SOURCE_DIR ${PARAMS_SOURCE_DIR} + BINARY_DIR ${PARAMS_BINARY_DIR} + INSTALL_DIR ${PARAMS_INSTALL_DIR} ) exp_get_3rd_platform_value( INPUT ${R_RUNTIME_DEP} @@ -423,6 +348,11 @@ function(exp_add_3rd_cmake_package) endif() if (NOT ${PARAMS_NOT_INSTALL}) + set_target_properties( + ${PARAMS_NAME} PROPERTIES + EXPORT_PROPERTIES INSTALL_RUNTIME_DEP_DIR + ) + if (DEFINED P_INCLUDE) foreach (INC ${P_INCLUDE}) list(APPEND INSTALL_INC ${INC}/) @@ -444,6 +374,10 @@ function(exp_add_3rd_cmake_package) endif () if (DEFINED P_RUNTIME_DEP) + set_target_properties( + ${PARAMS_NAME} PROPERTIES + INSTALL_RUNTIME_DEP_DIR "\$\{_IMPORT_PREFIX\}/${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries" + ) install( FILES ${P_RUNTIME_DEP} DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries @@ -458,11 +392,7 @@ function(exp_add_3rd_cmake_package) endfunction() function(exp_add_3rd_alias_package) - cmake_parse_arguments(PARAMS "" "NAME;PLATFORM" "LIB" ${ARGN}) - - if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) - return() - endif() + cmake_parse_arguments(PARAMS "" "NAME" "LIB" ${ARGN}) add_library(${PARAMS_NAME} INTERFACE) target_link_libraries( @@ -471,35 +401,9 @@ function(exp_add_3rd_alias_package) ) endfunction() -function(exp_setup_3rd_package) - cmake_parse_arguments(PARAMS "" "NAME;PLATFORM;VERSION" "HASH" ${ARGN}) - - set(NAME "${PARAMS_NAME}") - if (DEFINED PARAMS_PLATFORM) - if ((NOT (${PARAMS_PLATFORM} STREQUAL "All")) AND (NOT (${PARAMS_PLATFORM} STREQUAL ${CMAKE_SYSTEM_NAME}))) - return() - endif() - set(FULL_NAME "${PARAMS_NAME}-${PARAMS_PLATFORM}-${PARAMS_VERSION}") - else() - set(FULL_NAME "${PARAMS_NAME}-${CMAKE_SYSTEM_NAME}-${PARAMS_VERSION}") - endif() - set(URL "${3RD_REPO}/${FULL_NAME}.7z") - set(ZIP "${3RD_ZIP_DIR}/${FULL_NAME}.7z") - set(SOURCE_DIR "${3RD_SOURCE_DIR}/${FULL_NAME}") - - exp_download_and_extract_3rd_package( - URL ${URL} - SAVE_AS ${ZIP} - EXTRACT_TO ${SOURCE_DIR} - HASH ${PARAMS_HASH} - ) - - set(${PARAMS_NAME}_SOURCE_DIR ${SOURCE_DIR} CACHE PATH "" FORCE) -endfunction() - install( EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets FILE ${SUB_PROJECT_NAME}ThirdPartyTargets.cmake - NAMESPACE ThirdParty:: + NAMESPACE ${SUB_PROJECT_NAME}ThirdParty:: DESTINATION ${SUB_PROJECT_NAME}/CMake ) diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index e788e3666..066110d38 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -1,264 +1,420 @@ +set(3RD_REPO "http://1.13.181.171" CACHE STRING "" FORCE) +set(3RD_DIR ${CMAKE_SOURCE_DIR}/ThirdParty CACHE PATH "" FORCE) +set(3RD_ZIP_DIR ${3RD_DIR}/Zip CACHE PATH "" FORCE) +set(3RD_SOURCE_DIR ${3RD_DIR}/Lib CACHE PATH "" FORCE) +set(3RD_BINARY_DIR ${CMAKE_BINARY_DIR}/ThirdPartyBuild CACHE PATH "" FORCE) +set(3RD_INSTALL_DIR ${CMAKE_BINARY_DIR}/ThirdPartyInstall CACHE PATH "" FORCE) + +function(download_and_setup_3rd_package) + cmake_parse_arguments(PARAMS "" "NAME" "PLATFORM;VERSION;HASH" ${ARGN}) + + exp_get_3rd_platform_value( + OUTPUT VERSION_VALUE + INPUT ${PARAMS_VERSION} + ) + + set(CUR_PLATFORM All ${CMAKE_SYSTEM_NAME}) + foreach (PLATFORM ${CUR_PLATFORM}) + if (${PLATFORM} IN_LIST PARAMS_PLATFORM) + set(FULL_NAME "${PARAMS_NAME}-${PLATFORM}-${VERSION_VALUE}") + endif () + endforeach () + + if (NOT DEFINED FULL_NAME) + set(${PARAMS_NAME}_READY FALSE PARENT_SCOPE) + return() + endif () + + set(SOURCE_DIR ${3RD_SOURCE_DIR}/${FULL_NAME}) + exp_download_and_extract_3rd_package( + URL ${3RD_REPO}/${FULL_NAME}.7z + SAVE_AS ${3RD_ZIP_DIR}/${FULL_NAME}.7z + EXTRACT_TO ${SOURCE_DIR} + HASH ${PARAMS_HASH} + ) + set(${PARAMS_NAME}_READY TRUE PARENT_SCOPE) + set(${PARAMS_NAME}_SOURCE_DIR ${SOURCE_DIR} PARENT_SCOPE) + set(${PARAMS_NAME}_BINARY_DIR ${3RD_BINARY_DIR}/${PARAMS_NAME} PARENT_SCOPE) + set(${PARAMS_NAME}_INSTALL_DIR ${3RD_INSTALL_DIR}/${PARAMS_NAME}/$ PARENT_SCOPE) +endfunction() + +function(should_setup_3rd_package) + cmake_parse_arguments(PARAMS "" "NAME" "PLATFORM" ${ARGN}) + + set(CUR_PLATFORM All ${CMAKE_SYSTEM_NAME}) + foreach (PLATFORM ${CUR_PLATFORM}) + if (${PLATFORM} IN_LIST PARAMS_PLATFORM) + set(${PARAMS_NAME}_READY TRUE PARENT_SCOPE) + return() + endif () + endforeach () + + set(${PARAMS_NAME}_READY FALSE PARENT_SCOPE) +endfunction() + # DirectX 12 Headers -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME DirectXHeaders PLATFORM Windows VERSION 1.4.9 HASH 0313c5145214dda2a183af97212878482aafbb2433d4f0ec0a2efeec7cc9ef2a - INCLUDE $/include ) +if (${DirectXHeaders_READY}) + exp_add_3rd_header_only_package( + NAME DirectXHeaders + SOURCE_DIR ${DirectXHeaders_SOURCE_DIR} + INCLUDE $/include + ) +endif () # VulkanSDK set(VULKAN_SDK_VERSION 1.3.296.0) -exp_add_3rd_binary_package( +download_and_setup_3rd_package( NAME VulkanSDK + PLATFORM Windows Darwin VERSION ${VULKAN_SDK_VERSION} HASH Windows 27b8344a5b1333222d55c9c107914dba1cc9beb788b207e087c27dc7b8762816 Darwin a792aaad3937a694a4cb853d2fbb3fa7025ba3754bedd52799e687a4c254129c - INCLUDE - Windows $/Include - Darwin $/macOS/include - LINK - Windows $/Lib - Darwin $/macOS/lib - LIB - Windows vulkan-1 - Darwin vulkan.1 ) -if (NOT ${CI}) - #see https://github.com/KhronosGroup/Vulkan-Loader/blob/main/docs/LoaderLayerInterface.md - if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - execute_process(COMMAND reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers" OUTPUT_VARIABLE LAYERS) - string(REGEX MATCH "VkLayer_khronos_validation\.json" MATCH_RESULT ${LAYERS}) - list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) - - if (${MATCH_RESULT_LENGTH} GREATER 0) - message("Used registered validation layer in HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers") - else () - set(VALIDATION_LAYER_JSON ${3RD_SOURCE_DIR}/VulkanSDK-Windows-${VULKAN_SDK_VERSION}/Bin/VkLayer_khronos_validation.json) - message("Found no registered validation layer, will register ${VALIDATION_LAYER_JSON} to reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers") - string(REPLACE "/" "\\" VALIDATION_LAYER_JSON ${VALIDATION_LAYER_JSON}) - execute_process(COMMAND PowerShell -Command "Start-Process reg -ArgumentList 'add HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers /v ${VALIDATION_LAYER_JSON} /t REG_DWORD /d 0' -Verb RunAs") - endif () - else (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - # new version of vulkaninfo application use volk to perform dynamic loading, which need libvulkan.dylib in working directory or system, - # so if vulkaninfo print initialized failed, we need copy vulkan dynamic lib to working directory - set(PLATFORM_VULKAN_SDK_DIR ${CMAKE_SOURCE_DIR}/ThirdParty/Lib/VulkanSDK-Darwin-${VULKAN_SDK_VERSION}/macOS) - execute_process(COMMAND ${PLATFORM_VULKAN_SDK_DIR}/bin/vulkaninfo WORKING_DIRECTORY ${PLATFORM_VULKAN_SDK_DIR}/bin OUTPUT_VARIABLE VULKAN_INFO ERROR_VARIABLE VULKAN_INFO) - string(REGEX MATCH "Failed to initialize" MATCH_RESULT ${VULKAN_INFO}) - list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) - if (${MATCH_RESULT_LENGTH} GREATER 0) - set(SRC_FILE ${PLATFORM_VULKAN_SDK_DIR}/lib/libvulkan.dylib) - set(DST_FILE ${PLATFORM_VULKAN_SDK_DIR}/bin/libvulkan.dylib) - message("vulkaninfo initialized failed, perform vulkan dynamic library copy: ${SRC_FILE} -> ${DST_FILE}") - file(COPY_FILE ${SRC_FILE} ${DST_FILE} ONLY_IF_DIFFERENT) - else () - message("vulkaninfo test success") - endif () +if (${VulkanSDK_READY}) + exp_add_3rd_binary_package( + NAME VulkanSDK + SOURCE_DIR ${VulkanSDK_SOURCE_DIR} + INCLUDE + Windows $/Include + Darwin $/macOS/include + LINK + Windows $/Lib + Darwin $/macOS/lib + LIB + Windows vulkan-1 + Darwin vulkan.1 + ) + if (NOT ${CI}) + #see https://github.com/KhronosGroup/Vulkan-Loader/blob/main/docs/LoaderLayerInterface.md + if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + execute_process(COMMAND reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers" OUTPUT_VARIABLE LAYERS) + string(REGEX MATCH "VkLayer_khronos_validation\.json" MATCH_RESULT ${LAYERS}) + list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) - # check drivers - execute_process(COMMAND ${PLATFORM_VULKAN_SDK_DIR}/bin/vulkaninfo WORKING_DIRECTORY ${PLATFORM_VULKAN_SDK_DIR}/bin OUTPUT_VARIABLE VULKAN_INFO ERROR_VARIABLE VULKAN_INFO) - string(REGEX MATCH "ERROR_INCOMPATIBLE_DRIVER" MATCH_RESULT ${VULKAN_INFO}) - list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) - if (${MATCH_RESULT_LENGTH} GREATER 0) - message("there is no drivers found for vulkan, copy and rewrite driver files to ~/.config/vulkan/icd.d") - get_filename_component(DRIVERS_DIR_ABSOLUTE ~/.config/vulkan/icd.d ABSOLUTE) - if (NOT EXISTS ${DRIVERS_DIR_ABSOLUTE}) - file(MAKE_DIRECTORY ${DRIVERS_DIR_ABSOLUTE}) + if (${MATCH_RESULT_LENGTH} GREATER 0) + message("Used registered validation layer in HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers") + else () + set(VALIDATION_LAYER_JSON ${3RD_SOURCE_DIR}/VulkanSDK-Windows-${VULKAN_SDK_VERSION}/Bin/VkLayer_khronos_validation.json) + message("Found no registered validation layer, will register ${VALIDATION_LAYER_JSON} to reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers") + string(REPLACE "/" "\\" VALIDATION_LAYER_JSON ${VALIDATION_LAYER_JSON}) + execute_process(COMMAND PowerShell -Command "Start-Process reg -ArgumentList 'add HKEY_LOCAL_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers /v ${VALIDATION_LAYER_JSON} /t REG_DWORD /d 0' -Verb RunAs") + endif () + else (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + # new version of vulkaninfo application use volk to perform dynamic loading, which need libvulkan.dylib in working directory or system, + # so if vulkaninfo print initialized failed, we need copy vulkan dynamic lib to working directory + set(PLATFORM_VULKAN_SDK_DIR ${CMAKE_SOURCE_DIR}/ThirdParty/Lib/VulkanSDK-Darwin-${VULKAN_SDK_VERSION}/macOS) + execute_process(COMMAND ${PLATFORM_VULKAN_SDK_DIR}/bin/vulkaninfo WORKING_DIRECTORY ${PLATFORM_VULKAN_SDK_DIR}/bin OUTPUT_VARIABLE VULKAN_INFO ERROR_VARIABLE VULKAN_INFO) + string(REGEX MATCH "Failed to initialize" MATCH_RESULT ${VULKAN_INFO}) + list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) + if (${MATCH_RESULT_LENGTH} GREATER 0) + set(SRC_FILE ${PLATFORM_VULKAN_SDK_DIR}/lib/libvulkan.dylib) + set(DST_FILE ${PLATFORM_VULKAN_SDK_DIR}/bin/libvulkan.dylib) + message("vulkaninfo initialized failed, perform vulkan dynamic library copy: ${SRC_FILE} -> ${DST_FILE}") + file(COPY_FILE ${SRC_FILE} ${DST_FILE} ONLY_IF_DIFFERENT) + else () + message("vulkaninfo test success") endif () - file(GLOB DRIVER_FILES ${PLATFORM_VULKAN_SDK_DIR}/share/vulkan/icd.d/*.json) - foreach (DRIVER_FILE ${DRIVER_FILES}) - file(READ ${DRIVER_FILE} FILE_CONTENT) - string(REPLACE "../../../lib" "${PLATFORM_VULKAN_SDK_DIR}/lib" FILE_CONTENT ${FILE_CONTENT}) - get_filename_component(FILE_NAME ${DRIVER_FILE} NAME) - file(WRITE ${DRIVERS_DIR_ABSOLUTE}/${FILE_NAME} ${FILE_CONTENT}) - endforeach () - else () - message("found vulkan drivers installed in system, will use it") - endif () + # check drivers + execute_process(COMMAND ${PLATFORM_VULKAN_SDK_DIR}/bin/vulkaninfo WORKING_DIRECTORY ${PLATFORM_VULKAN_SDK_DIR}/bin OUTPUT_VARIABLE VULKAN_INFO ERROR_VARIABLE VULKAN_INFO) + string(REGEX MATCH "ERROR_INCOMPATIBLE_DRIVER" MATCH_RESULT ${VULKAN_INFO}) + list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) + if (${MATCH_RESULT_LENGTH} GREATER 0) + message("there is no drivers found for vulkan, copy and rewrite driver files to ~/.config/vulkan/icd.d") + get_filename_component(DRIVERS_DIR_ABSOLUTE ~/.config/vulkan/icd.d ABSOLUTE) + if (NOT EXISTS ${DRIVERS_DIR_ABSOLUTE}) + file(MAKE_DIRECTORY ${DRIVERS_DIR_ABSOLUTE}) + endif () - # check layers - execute_process(COMMAND ${PLATFORM_VULKAN_SDK_DIR}/bin/vulkaninfo WORKING_DIRECTORY ${PLATFORM_VULKAN_SDK_DIR}/bin OUTPUT_VARIABLE VULKAN_INFO ERROR_VARIABLE VULKAN_INFO) - string(REGEX MATCH "Layers:\n=======" MATCH_RESULT ${VULKAN_INFO}) - list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) - if (${MATCH_RESULT_LENGTH} GREATER 0) - message("there is no layers found for vulkan, copy and rewrite layer files to ~/.config/vulkan/explicit_layer.d") - get_filename_component(LAYERS_DIR_ABSOLUTE ~/.config/vulkan/explicit_layer.d ABSOLUTE) - if (NOT EXISTS ${LAYERS_DIR_ABSOLUTE}) - file(MAKE_DIRECTORY ${LAYERS_DIR_ABSOLUTE}) + file(GLOB DRIVER_FILES ${PLATFORM_VULKAN_SDK_DIR}/share/vulkan/icd.d/*.json) + foreach (DRIVER_FILE ${DRIVER_FILES}) + file(READ ${DRIVER_FILE} FILE_CONTENT) + string(REPLACE "../../../lib" "${PLATFORM_VULKAN_SDK_DIR}/lib" FILE_CONTENT ${FILE_CONTENT}) + get_filename_component(FILE_NAME ${DRIVER_FILE} NAME) + file(WRITE ${DRIVERS_DIR_ABSOLUTE}/${FILE_NAME} ${FILE_CONTENT}) + endforeach () + else () + message("found vulkan drivers installed in system, will use it") endif () - file(GLOB LAYER_FILES ${PLATFORM_VULKAN_SDK_DIR}/share/vulkan/explicit_layer.d/*.json) - foreach (LAYER_FILE ${LAYER_FILES}) - file(READ ${LAYER_FILE} FILE_CONTENT) - string(REPLACE "../../../lib" "${PLATFORM_VULKAN_SDK_DIR}/lib" FILE_CONTENT ${FILE_CONTENT}) - get_filename_component(FILE_NAME ${LAYER_FILE} NAME) - file(WRITE ${LAYERS_DIR_ABSOLUTE}/${FILE_NAME} ${FILE_CONTENT}) - endforeach () - else () - message("found vulkan layers installed in system, will use it") + # check layers + execute_process(COMMAND ${PLATFORM_VULKAN_SDK_DIR}/bin/vulkaninfo WORKING_DIRECTORY ${PLATFORM_VULKAN_SDK_DIR}/bin OUTPUT_VARIABLE VULKAN_INFO ERROR_VARIABLE VULKAN_INFO) + string(REGEX MATCH "Layers:\n=======" MATCH_RESULT ${VULKAN_INFO}) + list(LENGTH MATCH_RESULT MATCH_RESULT_LENGTH) + if (${MATCH_RESULT_LENGTH} GREATER 0) + message("there is no layers found for vulkan, copy and rewrite layer files to ~/.config/vulkan/explicit_layer.d") + get_filename_component(LAYERS_DIR_ABSOLUTE ~/.config/vulkan/explicit_layer.d ABSOLUTE) + if (NOT EXISTS ${LAYERS_DIR_ABSOLUTE}) + file(MAKE_DIRECTORY ${LAYERS_DIR_ABSOLUTE}) + endif () + + file(GLOB LAYER_FILES ${PLATFORM_VULKAN_SDK_DIR}/share/vulkan/explicit_layer.d/*.json) + foreach (LAYER_FILE ${LAYER_FILES}) + file(READ ${LAYER_FILE} FILE_CONTENT) + string(REPLACE "../../../lib" "${PLATFORM_VULKAN_SDK_DIR}/lib" FILE_CONTENT ${FILE_CONTENT}) + get_filename_component(FILE_NAME ${LAYER_FILE} NAME) + file(WRITE ${LAYERS_DIR_ABSOLUTE}/${FILE_NAME} ${FILE_CONTENT}) + endforeach () + else () + message("found vulkan layers installed in system, will use it") + endif () endif () endif () endif () # DXC # Windows uses standalone package, macOS uses lib in VulkanSDK -exp_add_3rd_binary_package( - NAME dxc - PLATFORM Windows - VERSION 1.6.2112 - HASH b8d8e5cd03234e477bc3fe5d4258652a7fb61916141660408ee4c54a4f1eb939 - INCLUDE $/inc - LINK $/lib/x64 - LIB dxcompiler - RUNTIME_DEP - Windows $/bin/x64/dxcompiler.dll $/bin/x64/dxil.dll -) -exp_add_3rd_alias_package( - NAME dxc - PLATFORM Darwin - LIB dxcompiler -) +if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + download_and_setup_3rd_package( + NAME dxc + PLATFORM Windows + VERSION 1.6.2112 + HASH b8d8e5cd03234e477bc3fe5d4258652a7fb61916141660408ee4c54a4f1eb939 + ) + if (${dxc_READY}) + exp_add_3rd_binary_package( + NAME dxc + SOURCE_DIR ${dxc_SOURCE_DIR} + INCLUDE $/inc + LINK $/lib/x64 + LIB dxcompiler + RUNTIME_DEP + Windows $/bin/x64/dxcompiler.dll $/bin/x64/dxil.dll + ) + endif () +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + should_setup_3rd_package( + NAME dxc + PLATFORM Darwin + ) + if (${dxc_READY}) + exp_add_3rd_alias_package( + NAME dxc + LIB dxcompiler + ) + endif () +endif () # GLFW -exp_add_3rd_cmake_package( +download_and_setup_3rd_package( NAME glfw PLATFORM All VERSION 4.0 HASH 2483836f085d616acaa48f6dc8efec5239f6a538c3a25d13fdc6a7afb2cce1d4 - CMAKE_ARG -DUSE_MSVC_RUNTIME_LIBRARY_DLL=OFF -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF - INCLUDE $/include - LINK $/lib - LIB glfw3 ) +if (${glfw_READY}) + exp_add_3rd_cmake_package( + NAME glfw + SOURCE_DIR ${glfw_SOURCE_DIR} + BINARY_DIR ${glfw_BINARY_DIR} + INSTALL_DIR ${glfw_INSTALL_DIR} + CMAKE_ARG -DUSE_MSVC_RUNTIME_LIBRARY_DLL=OFF -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF + INCLUDE $/include + LINK $/lib + LIB glfw3 + ) +endif () # clipp -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME clipp PLATFORM All VERSION forked-f7cffbd61a7b64189d6573e8c3848d094c35168a HASH 59db8b8586381652b5e0ae629a9d32e0e443428bc4d94af091b9525a62d167fb - INCLUDE $/include ) +if (${clipp_READY}) + exp_add_3rd_header_only_package( + NAME clipp + SOURCE_DIR ${clipp_SOURCE_DIR} + INCLUDE $/include + ) +endif () # DebugBreak -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME debugbreak PLATFORM All VERSION 1.0 HASH 16e35a330a9927181ed2e03a92efe6d39670b33c1bdf61ab88d29673ef3a89d4 - INCLUDE $ ) +if (${debugbreak_READY}) + exp_add_3rd_header_only_package( + NAME debugbreak + SOURCE_DIR ${debugbreak_SOURCE_DIR} + INCLUDE $ + ) +endif () # LLVM-Clang -exp_add_3rd_binary_package( +download_and_setup_3rd_package( NAME llvm-clang + PLATFORM Windows Darwin VERSION 19.1.6 HASH Windows f68b922c87a99b22c0b53a5cbd55db86bd3870c16c4e9060efaecfb9ce49e726 Darwin 08fdf1b6208823acadc23027fda1f12e5171101ec05fa526b545088be31fe19d - INCLUDE $/include - LINK $/lib - LIB - Windows libclang - Darwin clang - RUNTIME_DEP - Windows $/bin/libclang.dll - Darwin $/lib/libclang.dylib ) +if (${llvm-clang_READY}) + exp_add_3rd_binary_package( + NAME llvm-clang + SOURCE_DIR ${llvm-clang_SOURCE_DIR} + INCLUDE $/include + LINK $/lib + LIB + Windows libclang + Darwin clang + RUNTIME_DEP + Windows $/bin/libclang.dll + Darwin $/lib/libclang.dylib + ) +endif () # Google Test -exp_add_3rd_cmake_package( +download_and_setup_3rd_package( NAME googletest PLATFORM All VERSION 1.11.0 HASH bb1146f051868868b96fa83069d4d05f0e05216b5c3f697859c591fd73b93a86 - CMAKE_ARG -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -Dgtest_force_shared_crt=ON - INCLUDE $/include - LINK $/lib - LIB gtest$,d,> gmock$,d,> ) +if (${googletest_READY}) + exp_add_3rd_cmake_package( + NAME googletest + SOURCE_DIR ${googletest_SOURCE_DIR} + BINARY_DIR ${googletest_BINARY_DIR} + INSTALL_DIR ${googletest_INSTALL_DIR} + CMAKE_ARG -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -Dgtest_force_shared_crt=ON + INCLUDE $/include + LINK $/lib + LIB gtest$,d,> gmock$,d,> + ) +endif () # TaskFlow -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME taskflow PLATFORM All VERSION 3.4.0 HASH 774e23d5b6be17a5482d70ffd76ba4ccfd8821c86b7c3f0bcdcd5d96bc264041 - INCLUDE $ ) +if (${taskflow_READY}) + exp_add_3rd_header_only_package( + NAME taskflow + SOURCE_DIR ${taskflow_SOURCE_DIR} + INCLUDE $ + ) +endif () # CityHash -exp_add_3rd_cmake_package( +download_and_setup_3rd_package( NAME cityhash PLATFORM All VERSION forked-2f248cfbf88d0895d069258e4971b5f2fc3a9f19 HASH 5acf325794585578915dfa7fbac9eb2ca436ffe4831b05c40d1f286b68d7ac20 - INCLUDE $/include - LINK $/lib - LIB city ) +if (${cityhash_READY}) + exp_add_3rd_cmake_package( + NAME cityhash + SOURCE_DIR ${cityhash_SOURCE_DIR} + BINARY_DIR ${cityhash_BINARY_DIR} + INSTALL_DIR ${cityhash_INSTALL_DIR} + INCLUDE $/include + LINK $/lib + LIB city + ) +endif () # stb-image -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME stb PLATFORM All VERSION master-8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55 HASH 32e28f89a85b3bb6749e8caed9eb5226f7f5956769005d2b5a41d48d9481d90c - INCLUDE $ ) +if (${stb_READY}) + exp_add_3rd_header_only_package( + NAME stb + SOURCE_DIR ${stb_SOURCE_DIR} + INCLUDE $ + ) +endif () # spirv-cross -exp_add_3rd_cmake_package( +download_and_setup_3rd_package( NAME spirv-cross PLATFORM All VERSION 1.3.243.0 HASH 2b09e3cf9357156e8a4f1bd7cde3771184f652ec3b632993495748112a7f4665 - CMAKE_ARG -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DSPIRV_CROSS_CLI=OFF -DSPIRV_CROSS_ENABLE_C_API=OFF -DSPIRV_CROSS_ENABLE_TESTS=OFF - INCLUDE $/include - LINK $/lib - LIB spirv-cross-core$,$>,d,> - spirv-cross-msl$,$>,d,> - spirv-cross-glsl$,$>,d,> ) +if (${spirv-cross_READY}) + exp_add_3rd_cmake_package( + NAME spirv-cross + SOURCE_DIR ${spirv-cross_SOURCE_DIR} + BINARY_DIR ${spirv-cross_BINARY_DIR} + INSTALL_DIR ${spirv-cross_INSTALL_DIR} + CMAKE_ARG -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DSPIRV_CROSS_CLI=OFF -DSPIRV_CROSS_ENABLE_C_API=OFF -DSPIRV_CROSS_ENABLE_TESTS=OFF + INCLUDE $/include + LINK $/lib + LIB spirv-cross-core$,$>,d,> + spirv-cross-msl$,$>,d,> + spirv-cross-glsl$,$>,d,> + ) +endif () # assimp -exp_add_3rd_cmake_package( +download_and_setup_3rd_package( NAME assimp-lib PLATFORM All VERSION 5.2.5 HASH ae55d305a607ad8cc598c306663796dbf6e50a3cb0b952fe1ea3175f0f342ad9 - CMAKE_ARG -DASSIMP_BUILD_TESTS=OFF -DASSIMP_WARNINGS_AS_ERRORS=OFF -DASSIMP_INSTALL_PDB=OFF - INCLUDE $/include - LINK $/lib - LIB - Windows "assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>" - Darwin "assimp$,d,>" - RUNTIME_DEP - Windows "$/bin/assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>.dll" ) +if (${assimp-lib_READY}) + exp_add_3rd_cmake_package( + NAME assimp-lib + SOURCE_DIR ${assimp-lib_SOURCE_DIR} + BINARY_DIR ${assimp-lib_BINARY_DIR} + INSTALL_DIR ${assimp-lib_INSTALL_DIR} + CMAKE_ARG -DASSIMP_BUILD_TESTS=OFF -DASSIMP_WARNINGS_AS_ERRORS=OFF -DASSIMP_INSTALL_PDB=OFF + INCLUDE $/include + LINK $/lib + LIB + Windows "assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>" + Darwin "assimp$,d,>" + RUNTIME_DEP + Windows "$/bin/assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>.dll" + ) +endif () # vma -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME VulkanMemoryAllocator PLATFORM All VERSION 3.0.1 HASH a63a5e32c21fa9e839580d0c8727c6dead9da01730a8f0d10717cd784bc632de - INCLUDE $/include ) +if (${VulkanMemoryAllocator_READY}) + exp_add_3rd_header_only_package( + NAME VulkanMemoryAllocator + SOURCE_DIR ${VulkanMemoryAllocator_SOURCE_DIR} + INCLUDE $/include + ) +endif () # Qt6 set(QT_VERSION "6.9.1" CACHE STRING "" FORCE) -exp_setup_3rd_package( +download_and_setup_3rd_package( NAME Qt + PLATFORM Windows Darwin VERSION ${QT_VERSION} HASH Windows 9cd849f79784fda5436b0da3b7625b4530a77b93c5e80ea9a2d8a95060c174b6 Darwin 3938c6156228fcf63c33029067bd4b6dd333ed284e069198b85d92de3d9b3e13 - PREFIX - Windows $/6.9.1/msvc2019_64 - Darwin $/6.9.1/macos ) if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") set(QT_LIB_PREFIX ${Qt_SOURCE_DIR}/${QT_VERSION}/msvc2022_64 CACHE PATH "" FORCE) @@ -272,18 +428,25 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") endif () # rapidjson -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME rapidjson PLATFORM All VERSION d621dc9 HASH 696f6ca1ecca9d13170c0a47eda66a3015bcf02a7b4bdd23f574ea302eb4bf3e - INCLUDE $/include ) +if (${rapidjson_READY}) + exp_add_3rd_header_only_package( + NAME rapidjson + SOURCE_DIR ${rapidjson_SOURCE_DIR} + INCLUDE $/include + ) +endif () # Node.js set(NODEJS_VERSION "22.18.0" CACHE STRING "" FORCE) -exp_add_3rd_binary_package( +download_and_setup_3rd_package( NAME Nodejs + PLATFORM Windows Darwin VERSION ${NODEJS_VERSION} HASH Windows 6c5fc993dacd58f2e3b145b06599e8a3aa1b0d0c2dea48b0a09af31c5c6ebe23 @@ -291,11 +454,16 @@ exp_add_3rd_binary_package( ) # cpp-httplib -set(CPP_HTTP_LIB_VERSION "0.24.0") -exp_add_3rd_header_only_package( +download_and_setup_3rd_package( NAME cpp-httplib PLATFORM All VERSION 0.24.0 HASH a0320b106f4a8f945ec2556e62fffab05b068f2ddfff99c6a367b2e16c14bde1 - INCLUDE $ ) +if (${cpp-httplib_READY}) + exp_add_3rd_header_only_package( + NAME cpp-httplib + SOURCE_DIR ${cpp-httplib_SOURCE_DIR} + INCLUDE $ + ) +endif () From eba6cc43fee105abd8c6e7800d39110d958edba1 Mon Sep 17 00:00:00 2001 From: kindem Date: Tue, 4 Nov 2025 20:37:59 +0800 Subject: [PATCH 09/23] refactor: misc update --- CMake/Target.cmake | 29 +------------ CMake/ThirdParty.cmake | 18 -------- Editor/CMakeLists.txt | 39 ++--------------- README.md | 12 ++++-- Script/start_editor_web_dev_server.py | 61 --------------------------- ThirdParty/CMakeLists.txt | 11 ----- 6 files changed, 12 insertions(+), 158 deletions(-) delete mode 100644 Script/start_editor_web_dev_server.py diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 51c9d7502..574759671 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -11,7 +11,7 @@ else() endif() function(exp_gather_target_runtime_dependencies_recurse) - cmake_parse_arguments(PARAMS "" "NAME;OUT_RUNTIME_DEP;OUT_INSTALL_RUNTIME_DEP_DIR" "" ${ARGN}) + cmake_parse_arguments(PARAMS "" "NAME;OUT_RUNTIME_DEP" "" ${ARGN}) get_target_property(IMPORTED ${PARAMS_NAME} IMPORTED) @@ -22,15 +22,6 @@ function(exp_gather_target_runtime_dependencies_recurse) endforeach() endif() - if (${IMPORTED}) - get_target_property(INSTALL_RUNTIME_DEP_DIR ${PARAMS_NAME} INSTALL_RUNTIME_DEP_DIR) - if (NOT ("${INSTALL_RUNTIME_DEP_DIR}" STREQUAL "INSTALL_RUNTIME_DEP_DIR-NOTFOUND")) - foreach (R ${INSTALL_RUNTIME_DEP_DIR}) - list(APPEND RESULT_INSTALL_RUNTIME_DEP_DIR ${R}) - endforeach() - endif() - endif () - get_target_property(LINK_LIBRARIES ${PARAMS_NAME} LINK_LIBRARIES) if (NOT ("${LINK_LIBRARIES}" STREQUAL "LINK_LIBRARIES-NOTFOUND")) foreach(L ${LINK_LIBRARIES}) @@ -41,21 +32,15 @@ function(exp_gather_target_runtime_dependencies_recurse) exp_gather_target_runtime_dependencies_recurse( NAME ${L} OUT_RUNTIME_DEP TEMP_RUNTIME_DEP - OUT_INSTALL_RUNTIME_DEP_DIR TEMP_INSTALL_RUNTIME_DEP_DIR ) foreach(T ${TEMP_RUNTIME_DEP}) list(APPEND RESULT_RUNTIME_DEP ${T}) endforeach() - foreach (T ${TEMP_INSTALL_RUNTIME_DEP_DIR}) - list(APPEND RESULT_INSTALL_RUNTIME_DEP_DIR ${T}) - endforeach() endforeach() endif() list(REMOVE_DUPLICATES RESULT_RUNTIME_DEP) - list(REMOVE_DUPLICATES RESULT_INSTALL_RUNTIME_DEP_DIR) set(${PARAMS_OUT_RUNTIME_DEP} ${RESULT_RUNTIME_DEP} PARENT_SCOPE) - set(${PARAMS_OUT_INSTALL_RUNTIME_DEP_DIR} ${RESULT_INSTALL_RUNTIME_DEP_DIR} PARENT_SCOPE) endfunction() function(exp_process_runtime_dependencies) @@ -64,7 +49,6 @@ function(exp_process_runtime_dependencies) exp_gather_target_runtime_dependencies_recurse( NAME ${PARAMS_NAME} OUT_RUNTIME_DEP RUNTIME_DEPS - OUT_INSTALL_RUNTIME_DEP_DIR INSTALL_RUNTIME_DEP_DIRS ) foreach(R ${RUNTIME_DEPS}) add_custom_command( @@ -77,17 +61,6 @@ function(exp_process_runtime_dependencies) ) endif () endforeach() - foreach (R ${INSTALL_RUNTIME_DEP_DIRS}) - add_custom_command( - TARGET ${PARAMS_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${R}/ $ - ) - if (NOT ${PARAMS_NOT_INSTALL}) - install( - DIRECTORY ${R}/ DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries - ) - endif () - endforeach () endfunction() function(exp_expand_resource_path_expression) diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index cb434ca0c..19dbf77c4 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -212,11 +212,6 @@ function(exp_add_3rd_binary_package) endif() if (NOT ${PARAMS_NOT_INSTALL}) - set_target_properties( - ${PARAMS_NAME} PROPERTIES - EXPORT_PROPERTIES INSTALL_RUNTIME_DEP_DIR - ) - if (DEFINED P_INCLUDE) foreach (INC ${P_INCLUDE}) list(APPEND INSTALL_INC ${INC}/) @@ -240,10 +235,6 @@ function(exp_add_3rd_binary_package) endif () if (DEFINED P_RUNTIME_DEP) - set_target_properties( - ${PARAMS_NAME} PROPERTIES - INSTALL_RUNTIME_DEP_DIR "\$\{_IMPORT_PREFIX\}/${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries" - ) install( FILES ${P_RUNTIME_DEP} DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries @@ -348,11 +339,6 @@ function(exp_add_3rd_cmake_package) endif() if (NOT ${PARAMS_NOT_INSTALL}) - set_target_properties( - ${PARAMS_NAME} PROPERTIES - EXPORT_PROPERTIES INSTALL_RUNTIME_DEP_DIR - ) - if (DEFINED P_INCLUDE) foreach (INC ${P_INCLUDE}) list(APPEND INSTALL_INC ${INC}/) @@ -374,10 +360,6 @@ function(exp_add_3rd_cmake_package) endif () if (DEFINED P_RUNTIME_DEP) - set_target_properties( - ${PARAMS_NAME} PROPERTIES - INSTALL_RUNTIME_DEP_DIR "\$\{_IMPORT_PREFIX\}/${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries" - ) install( FILES ${P_RUNTIME_DEP} DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index 2e20ae16a..4d80565ff 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -123,43 +123,10 @@ exp_add_resources_copy_command( # ---- end shaders ----------------------------------------------------------------------------------- # ---- begin web project ----------------------------------------------------------------------------- -set(NODEJS_HOME ${3RD_SOURCE_DIR}/Nodejs-${CMAKE_SYSTEM_NAME}-${NODEJS_VERSION}) -if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - set(NODEJS_PATH ${NODEJS_HOME}) - set(NPM_EXECUTABLE npm.cmd) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - set(NODEJS_BIN_PATH ${NODEJS_HOME}/bin) - set(NODEJS_MODULES_PATH ${NODEJS_HOME}/lib/node_modules) - file(REMOVE ${NODEJS_BIN_PATH}/corepack) - file(REMOVE ${NODEJS_BIN_PATH}/npm) - file(REMOVE ${NODEJS_BIN_PATH}/npx) - execute_process( - COMMAND ln -s ${NODEJS_MODULES_PATH} ${NODEJS_BIN_PATH}/node_modules - RESULT_VARIABLE LINK_RESULT - OUTPUT_VARIABLE LINK_OUTPUT - ERROR_VARIABLE LINK_ERROR - ) - execute_process( - COMMAND ln -s ${NODEJS_MODULES_PATH}/npm/bin/npm ${NODEJS_BIN_PATH}/npm - RESULT_VARIABLE LINK_RESULT - OUTPUT_VARIABLE LINK_OUTPUT - ERROR_VARIABLE LINK_ERROR - ) - execute_process( - COMMAND ln -s ${NODEJS_MODULES_PATH}/npm/bin/npx ${NODEJS_BIN_PATH}/npx - RESULT_VARIABLE LINK_RESULT - OUTPUT_VARIABLE LINK_OUTPUT - ERROR_VARIABLE LINK_ERROR - ) - set(NODEJS_PATH "$ENV{PATH}:${NODEJS_BIN_PATH}") - set(NPM_EXECUTABLE npm) -else () - message(FATAL_ERROR "Unsupported OS") -endif () - +find_program(NPM_EXECUTABLE NAMES npm.cmd npm REQUIRED NO_CACHE) message("Perform web project npm install......") execute_process( - COMMAND ${CMAKE_COMMAND} -E env PATH=${NODEJS_PATH} ${NPM_EXECUTABLE} install --no-fund --registry=https://registry.npmmirror.com + COMMAND ${CMAKE_COMMAND} -E env ${NPM_EXECUTABLE} install --no-fund --registry=https://registry.npmmirror.com WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Web RESULT_VARIABLE NPM_INSTALL_RESULT OUTPUT_VARIABLE NPM_INSTALL_OUTPUT @@ -173,7 +140,7 @@ endif () add_custom_target( Editor.Web - COMMAND ${CMAKE_COMMAND} -E env PATH=${NODEJS_PATH} ${NPM_EXECUTABLE} run build + COMMAND ${CMAKE_COMMAND} -E env ${NPM_EXECUTABLE} run build WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Web VERBATIM ) diff --git a/README.md b/README.md index b79c9a765..1e1760d9d 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,16 @@ Explosion is a cross-platform C++ game engine, based on modern graphics api (aka Vulkan, DirectX 12, Metal), powered by ECS gameplay framework. +# Requirements + +You need install those tools to system by youself: + +* [CMake](https://cmake.org/download/) +* [Node.js](https://nodejs.org/en/download) + # Build -We use cmake as build tool, the following table contains supported platform, toolchain and generator: +The following table contains supported platform, toolchain and generator: @@ -100,8 +107,6 @@ sudo xcode-select -s /Library/Developer/CommandLineTools Thanks all those following projects: -* [EnTT](https://github.com/skypjack/entt) -* [GLM](https://github.com/g-truc/glm) * [DirectX-Headers](https://github.com/microsoft/DirectX-Headers) * [Vulkan](https://www.vulkan.org/) * [DirectXShaderCompiler](https://github.com/microsoft/DirectXShaderCompiler) @@ -120,7 +125,6 @@ Thanks all those following projects: * [Qt6](https://www.qt.io/product/qt6) * [rapidjson](https://github.com/Tencent/rapidjson) * [cpp-httplib](https://github.com/yhirose/cpp-httplib) -* [Node.js](https://nodejs.org/zh-cn) * [React](https://react.dev) * [Vite](https://vite.dev) * [HeroUI](https://www.heroui.com) diff --git a/Script/start_editor_web_dev_server.py b/Script/start_editor_web_dev_server.py deleted file mode 100644 index a9e3958ee..000000000 --- a/Script/start_editor_web_dev_server.py +++ /dev/null @@ -1,61 +0,0 @@ -import os -import re -import platform -import subprocess -from sys import argv -from pathlib import Path - -def get_nodejs_version(py_path): - third_party_cmake = Path(py_path).parent.parent / 'ThirdParty' / 'CMakeLists.txt' - if not third_party_cmake.exists(): - raise RuntimeError('Third-party CMakeLists.txt not found') - - nodejs_version_line = None - with open(third_party_cmake) as cmake_file: - for line in cmake_file.readlines(): - if 'NODEJS_VERSION' in line: - nodejs_version_line = line - break - - if nodejs_version_line is None: - raise RuntimeError('NODEJS_VERSION define in third_party CMakeLists.txt not found') - - found = re.findall(r'.*NODEJS_VERSION \"(.+?)\".*', nodejs_version_line) - return found[0] - - -def get_nodejs_root(py_path, nodejs_version): - nodejs_root = Path(py_path).parent.parent / 'ThirdParty' / 'Lib' / '{}-{}-{}'.format('Nodejs', platform.system(), nodejs_version) - if not nodejs_root.exists(): - raise RuntimeError('Root of node.js not found') - return nodejs_root - - -def get_web_project_root(py_path): - web_project_root = Path(py_path).parent.parent / 'Editor' / 'Web' - return web_project_root - - -def start_dev_server(nodejs_root, web_project_root): - env = os.environ.copy() - if platform.system() == 'Windows': - env['PATH'] = '{};{}'.format(env['PATH'], os.path.normpath(nodejs_root)) - subprocess.run(['npm', 'run', 'dev'], shell=True, encoding='utf-8', env=env, cwd=web_project_root) - elif platform.system() == 'Darwin': - nodejs_bin = Path(nodejs_root) / 'bin' - env['PATH'] = '{}:{}'.format(env['PATH'], nodejs_bin) - subprocess.run(['npm', 'run', 'dev'], encoding='utf-8', env=env, cwd=web_project_root) - else: - raise RuntimeError('Unsupported OS') - - -if __name__ == '__main__': - py_path = os.path.realpath(__file__) - print('Python File Path:', py_path) - nodejs_version = get_nodejs_version(py_path) - print('Node.js version:', nodejs_version) - nodejs_root = get_nodejs_root(py_path, nodejs_version) - print('Node.js root:', nodejs_root) - web_project_root = get_web_project_root(py_path) - print('Web project root:', web_project_root) - start_dev_server(nodejs_root, web_project_root) diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index 066110d38..9069acbfb 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -442,17 +442,6 @@ if (${rapidjson_READY}) ) endif () -# Node.js -set(NODEJS_VERSION "22.18.0" CACHE STRING "" FORCE) -download_and_setup_3rd_package( - NAME Nodejs - PLATFORM Windows Darwin - VERSION ${NODEJS_VERSION} - HASH - Windows 6c5fc993dacd58f2e3b145b06599e8a3aa1b0d0c2dea48b0a09af31c5c6ebe23 - Darwin 0f6e16a5564c29aa45d2354ac66ea5f66232a7c45baa45fec372edb00e491c16 -) - # cpp-httplib download_and_setup_3rd_package( NAME cpp-httplib From 348729270434f5c649ca26c0d4eaf4bb97054c8c Mon Sep 17 00:00:00 2001 From: kindem Date: Tue, 4 Nov 2025 20:38:44 +0800 Subject: [PATCH 10/23] feat: add vcpkg manifest --- .gitignore | 3 +++ vcpkg-configuration.json | 14 +++++++++++ vcpkg.json | 52 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 vcpkg-configuration.json create mode 100644 vcpkg.json diff --git a/.gitignore b/.gitignore index 806a67742..27b7b88d4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ build* # 3rd ThirdParty/Zip ThirdParty/Lib + +# vcpkg +vcpkg_installed diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 000000000..c2fdf30d1 --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,14 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "e3ed41868d5034bc608eaaa58383cd6ecdbb5ffb", + "repository": "https://github.com/microsoft/vcpkg" + }, + "registries": [ + { + "kind": "artifact", + "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", + "name": "microsoft" + } + ] +} diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 000000000..8bf001180 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,52 @@ +{ + "name" : "explosion", + "dependencies" : [ { + "name" : "directx-dxc", + "version>=" : "2025-10-10" + }, { + "name" : "vulkan-sdk-components", + "version>=" : "1.4.309.0" + }, { + "name" : "directx-headers", + "version>=" : "1.618.2" + }, { + "name" : "glfw3", + "version>=" : "3.4#1" + }, { + "name" : "clipp", + "version>=" : "2019-04-30#2" + }, { + "name" : "scottt-debugbreak", + "version>=" : "1.0" + }, { + "name" : "llvm", + "version>=" : "18.1.6#5" + }, { + "name" : "gtest", + "version>=" : "1.17.0#2" + }, { + "name" : "taskflow", + "version>=" : "3.10.0" + }, { + "name" : "cityhash", + "version>=" : "2013-01-08#3" + }, { + "name" : "stb", + "version>=" : "2024-07-29#1" + }, { + "name" : "spirv-cross", + "version>=" : "1.4.309.0" + }, { + "name" : "assimp", + "version>=" : "6.0.2#1" + }, { + "name" : "qt", + "version>=" : "6.9.1" + }, { + "name" : "rapidjson", + "version>=" : "2025-02-26" + }, { + "name" : "cpp-httplib", + "version>=" : "0.27.0" + } ] +} \ No newline at end of file From 020ba74ee9ab22c6d6de3b8f3d13b8acd2dff6ff Mon Sep 17 00:00:00 2001 From: kindem Date: Wed, 5 Nov 2025 22:29:39 +0800 Subject: [PATCH 11/23] del: fuck vcpkg --- .gitignore | 3 --- README.md | 5 +++- vcpkg-configuration.json | 14 ----------- vcpkg.json | 52 ---------------------------------------- 4 files changed, 4 insertions(+), 70 deletions(-) delete mode 100644 vcpkg-configuration.json delete mode 100644 vcpkg.json diff --git a/.gitignore b/.gitignore index 27b7b88d4..806a67742 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,3 @@ build* # 3rd ThirdParty/Zip ThirdParty/Lib - -# vcpkg -vcpkg_installed diff --git a/README.md b/README.md index 1e1760d9d..ec3ab662b 100644 --- a/README.md +++ b/README.md @@ -18,11 +18,14 @@ Explosion is a cross-platform C++ game engine, based on modern graphics api (aka # Requirements -You need install those tools to system by youself: +You need install those tools to system by yourself and add them to path: +* [Python3](https://www.python.org/downloads/) * [CMake](https://cmake.org/download/) * [Node.js](https://nodejs.org/en/download) +build steps of engine may use them. + # Build The following table contains supported platform, toolchain and generator: diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json deleted file mode 100644 index c2fdf30d1..000000000 --- a/vcpkg-configuration.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "default-registry": { - "kind": "git", - "baseline": "e3ed41868d5034bc608eaaa58383cd6ecdbb5ffb", - "repository": "https://github.com/microsoft/vcpkg" - }, - "registries": [ - { - "kind": "artifact", - "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", - "name": "microsoft" - } - ] -} diff --git a/vcpkg.json b/vcpkg.json deleted file mode 100644 index 8bf001180..000000000 --- a/vcpkg.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name" : "explosion", - "dependencies" : [ { - "name" : "directx-dxc", - "version>=" : "2025-10-10" - }, { - "name" : "vulkan-sdk-components", - "version>=" : "1.4.309.0" - }, { - "name" : "directx-headers", - "version>=" : "1.618.2" - }, { - "name" : "glfw3", - "version>=" : "3.4#1" - }, { - "name" : "clipp", - "version>=" : "2019-04-30#2" - }, { - "name" : "scottt-debugbreak", - "version>=" : "1.0" - }, { - "name" : "llvm", - "version>=" : "18.1.6#5" - }, { - "name" : "gtest", - "version>=" : "1.17.0#2" - }, { - "name" : "taskflow", - "version>=" : "3.10.0" - }, { - "name" : "cityhash", - "version>=" : "2013-01-08#3" - }, { - "name" : "stb", - "version>=" : "2024-07-29#1" - }, { - "name" : "spirv-cross", - "version>=" : "1.4.309.0" - }, { - "name" : "assimp", - "version>=" : "6.0.2#1" - }, { - "name" : "qt", - "version>=" : "6.9.1" - }, { - "name" : "rapidjson", - "version>=" : "2025-02-26" - }, { - "name" : "cpp-httplib", - "version>=" : "0.27.0" - } ] -} \ No newline at end of file From c47d62548be1eaa858afd2d682c01854a8298cd7 Mon Sep 17 00:00:00 2001 From: kindem Date: Sat, 8 Nov 2025 01:10:55 +0800 Subject: [PATCH 12/23] refactor: not export 3rd packages in cmake --- CMake/ThirdParty.cmake | 98 ++---------------------------------------- 1 file changed, 3 insertions(+), 95 deletions(-) diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 19dbf77c4..c8d0a2120 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -106,7 +106,7 @@ function(exp_get_3rd_platform_value) endfunction() function(exp_add_3rd_header_only_package) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;SOURCE_DIR" "INCLUDE" ${ARGN}) + cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR" "INCLUDE" ${ARGN}) add_library(${PARAMS_NAME} INTERFACE) @@ -125,25 +125,10 @@ function(exp_add_3rd_header_only_package) INTERFACE $ $ ) endif() - - if (NOT ${PARAMS_NOT_INSTALL} AND DEFINED P_INCLUDE) - foreach (INC ${P_INCLUDE}) - list(APPEND INSTALL_INC ${INC}/) - endforeach () - install( - DIRECTORY ${INSTALL_INC} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Include - ) - - install( - TARGETS ${PARAMS_NAME} - EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets - ) - endif () endfunction() function(exp_add_3rd_binary_package) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;SOURCE_DIR" "INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) + cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR" "INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) add_library(${PARAMS_NAME} INTERFACE) @@ -210,46 +195,10 @@ function(exp_add_3rd_binary_package) RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() - - if (NOT ${PARAMS_NOT_INSTALL}) - if (DEFINED P_INCLUDE) - foreach (INC ${P_INCLUDE}) - list(APPEND INSTALL_INC ${INC}/) - endforeach () - install( - DIRECTORY ${INSTALL_INC} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Include - ) - endif () - - if (DEFINED P_LINK) - foreach (LINK ${P_LINK}) - file(GLOB_RECURSE LIBS ${LINK}/*.lib ${LINK}/*.a) - list(APPEND INSTALL_LIBS ${LIBS}) - endforeach () - - install( - FILES ${LIBS} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Lib - ) - endif () - - if (DEFINED P_RUNTIME_DEP) - install( - FILES ${P_RUNTIME_DEP} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries - ) - endif () - - install( - TARGETS ${PARAMS_NAME} - EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets - ) - endif () endfunction() function(exp_add_3rd_cmake_package) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) + cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) if (NOT ${GENERATOR_IS_MULTI_CONFIG}) set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=$) @@ -337,40 +286,6 @@ function(exp_add_3rd_cmake_package) RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() - - if (NOT ${PARAMS_NOT_INSTALL}) - if (DEFINED P_INCLUDE) - foreach (INC ${P_INCLUDE}) - list(APPEND INSTALL_INC ${INC}/) - endforeach () - install( - DIRECTORY ${INSTALL_INC} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Include - ) - endif () - - if (DEFINED P_LINK) - foreach (LINK ${P_LINK}) - list(APPEND INSTALL_LINK ${LINK}/) - endforeach () - install( - DIRECTORY ${INSTALL_LINK} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Lib - ) - endif () - - if (DEFINED P_RUNTIME_DEP) - install( - FILES ${P_RUNTIME_DEP} - DESTINATION ${SUB_PROJECT_NAME}/ThirdParty/${PARAMS_NAME}/Binaries - ) - endif () - - install( - TARGETS ${PARAMS_NAME} - EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets - ) - endif () endfunction() function(exp_add_3rd_alias_package) @@ -382,10 +297,3 @@ function(exp_add_3rd_alias_package) INTERFACE "${PARAMS_LIB}" ) endfunction() - -install( - EXPORT ${SUB_PROJECT_NAME}ThirdPartyTargets - FILE ${SUB_PROJECT_NAME}ThirdPartyTargets.cmake - NAMESPACE ${SUB_PROJECT_NAME}ThirdParty:: - DESTINATION ${SUB_PROJECT_NAME}/CMake -) From 2253e27421777030393c19adf51650ae55e61df4 Mon Sep 17 00:00:00 2001 From: kindem Date: Sat, 8 Nov 2025 01:17:38 +0800 Subject: [PATCH 13/23] refactor: support private lib linkages and merged lib linkages --- CMake/Target.cmake | 36 ++++++++++++++++++---- CMake/ThirdParty.cmake | 10 +++--- Engine/Source/Common/CMakeLists.txt | 3 +- Engine/Source/Core/CMakeLists.txt | 3 +- Engine/Source/Launch/CMakeLists.txt | 5 +-- Engine/Source/Mirror/CMakeLists.txt | 2 +- Engine/Source/RHI-DirectX12/CMakeLists.txt | 3 +- Engine/Source/RHI-Dummy/CMakeLists.txt | 2 +- Engine/Source/RHI-Vulkan/CMakeLists.txt | 3 +- Engine/Source/RHI/CMakeLists.txt | 2 +- Engine/Source/Render/CMakeLists.txt | 6 ++-- Engine/Source/Runtime/CMakeLists.txt | 3 +- Engine/Source/Test/CMakeLists.txt | 3 +- Sample/CMakeLists.txt | 3 +- Tool/MirrorTool/CMakeLists.txt | 3 +- 15 files changed, 61 insertions(+), 26 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 574759671..35bcbca45 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -286,7 +286,7 @@ function(exp_add_executable) endfunction() function(exp_add_library) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;TYPE" "SRC;PRIVATE_INC;PUBLIC_INC;PRIVATE_LINK;LIB;REFLECT" ${ARGN}) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;TYPE" "SRC;PRIVATE_INC;PUBLIC_INC;PRIVATE_LINK;PUBLIC_LINK;PRIVATE_LIB;PUBLIC_LIB;PRIVATE_MERGE_LIB;PUBLIC_MERGE_LIB;REFLECT" ${ARGN}) if ("${PARAMS_TYPE}" STREQUAL "SHARED") list(APPEND PARAMS_PUBLIC_INC ${API_HEADER_DIR}/${PARAMS_NAME}) @@ -304,7 +304,7 @@ function(exp_add_library) SEARCH_DIR ${PARAMS_REFLECT} PUBLIC_INC ${PARAMS_PUBLIC_INC} PRIVATE_INC ${PARAMS_PRIVATE_INC} - LIB ${PARAMS_LIB} + LIB ${PARAMS_PRIVATE_LIB} ${PARAMS_PUBLIC_LIB} ${EXTRA_PARAMS} ) endif() @@ -317,23 +317,47 @@ function(exp_add_library) ${PARAMS_NAME} PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} ) + foreach (INC ${PARAMS_PUBLIC_INC}) + list(APPEND PUBLIC_INC ${INC}) + endforeach () + foreach (LIB ${PARAMS_PUBLIC_MERGE_LIB}) + if (TARGET ${LIB}) + get_target_property(TARGET_INCS ${LIB} INTERFACE_INCLUDE_DIRECTORIES) + if (NOT ("${TARGET_INCS}" STREQUAL "TARGET_INCS-NOTFOUND")) + foreach(TARGET_INC ${TARGET_INCS}) + list(APPEND PUBLIC_INC ${TARGET_INC}) + endforeach() + endif() + endif () + endforeach () + + foreach (INC ${PUBLIC_INC}) get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) - list(APPEND PUBLIC_INC $) + list(APPEND PUBLIC_BUILD_INC $) endforeach () target_include_directories( ${PARAMS_NAME} PRIVATE ${PARAMS_PRIVATE_INC} - PUBLIC ${PUBLIC_INC} $ + PUBLIC ${PUBLIC_BUILD_INC} $ ) + target_link_directories( ${PARAMS_NAME} PRIVATE ${PARAMS_PRIVATE_LINK} PUBLIC ${PARAMS_PUBLIC_LINK} ) + + foreach (LIB ${PARAMS_PRIVATE_MERGE_LIB}) + list(APPEND BUILD_MERGE_LIB $) + endforeach () + foreach (LIB ${PARAMS_PUBLIC_MERGE_LIB}) + list(APPEND BUILD_MERGE_LIB $) + endforeach () target_link_libraries( ${PARAMS_NAME} - PUBLIC ${PARAMS_LIB} + PRIVATE ${PRIVATE_PRIVATE_LIB} ${BUILD_MERGE_LIB} + PUBLIC ${PARAMS_PUBLIC_LIB} ) if (${MSVC}) @@ -359,7 +383,7 @@ function(exp_add_library) endif() if (NOT ${PARAMS_NOT_INSTALL}) - foreach (INC ${PARAMS_PUBLIC_INC}) + foreach (INC ${PUBLIC_INC}) list(APPEND INSTALL_INC ${INC}/) endforeach () install( diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index c8d0a2120..64fcace53 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -122,7 +122,7 @@ function(exp_add_3rd_header_only_package) ) target_include_directories( ${PARAMS_NAME} - INTERFACE $ $ + INTERFACE ${P_INCLUDE} ) endif() endfunction() @@ -144,7 +144,7 @@ function(exp_add_3rd_binary_package) ) target_include_directories( ${PARAMS_NAME} - INTERFACE $ $ + INTERFACE ${P_INCLUDE} ) endif() @@ -160,7 +160,7 @@ function(exp_add_3rd_binary_package) ) target_link_directories( ${PARAMS_NAME} - INTERFACE $ $ + INTERFACE ${P_LINK} ) endif() @@ -229,7 +229,7 @@ function(exp_add_3rd_cmake_package) ) target_include_directories( ${PARAMS_NAME} - INTERFACE $ $ + INTERFACE ${P_INCLUDE} ) endif() @@ -247,7 +247,7 @@ function(exp_add_3rd_cmake_package) ) target_link_directories( ${PARAMS_NAME} - INTERFACE $ $ + INTERFACE ${P_LINK} ) endif() diff --git a/Engine/Source/Common/CMakeLists.txt b/Engine/Source/Common/CMakeLists.txt index 994ebea7d..674e6a9e1 100644 --- a/Engine/Source/Common/CMakeLists.txt +++ b/Engine/Source/Common/CMakeLists.txt @@ -4,7 +4,7 @@ exp_add_library( TYPE STATIC SRC ${SOURCES} PUBLIC_INC Include - LIB debugbreak cityhash taskflow rapidjson + PUBLIC_MERGE_LIB rapidjson debugbreak cityhash taskflow ) file(GLOB TEST_SOURCES Test/*.cpp) @@ -12,4 +12,5 @@ exp_add_test( NAME Common.Test INC Test SRC ${TEST_SOURCES} + LIB Common ) diff --git a/Engine/Source/Core/CMakeLists.txt b/Engine/Source/Core/CMakeLists.txt index 7e4e472cd..cc02b9105 100644 --- a/Engine/Source/Core/CMakeLists.txt +++ b/Engine/Source/Core/CMakeLists.txt @@ -4,7 +4,8 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} PUBLIC_INC Include - LIB Common clipp + PUBLIC_LIB Common + PUBLIC_MERGE_LIB clipp ) file(GLOB TEST_SOURCES Test/*.cpp) diff --git a/Engine/Source/Launch/CMakeLists.txt b/Engine/Source/Launch/CMakeLists.txt index f7e94cf6d..857208f4e 100644 --- a/Engine/Source/Launch/CMakeLists.txt +++ b/Engine/Source/Launch/CMakeLists.txt @@ -3,6 +3,7 @@ exp_add_library( NAME Launch TYPE STATIC SRC ${SOURCES} - PRIVATE_INC Include - LIB glfw Runtime + PUBLIC_INC Include + PUBLIC_LIB Runtime + PUBLIC_MERGE_LIB glfw ) \ No newline at end of file diff --git a/Engine/Source/Mirror/CMakeLists.txt b/Engine/Source/Mirror/CMakeLists.txt index a7576f1b9..240bfb2fd 100644 --- a/Engine/Source/Mirror/CMakeLists.txt +++ b/Engine/Source/Mirror/CMakeLists.txt @@ -4,7 +4,7 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} PUBLIC_INC Include - LIB Common + PUBLIC_LIB Common ) file(GLOB TEST_SOURCES Test/*.cpp) diff --git a/Engine/Source/RHI-DirectX12/CMakeLists.txt b/Engine/Source/RHI-DirectX12/CMakeLists.txt index 5278e2c3b..9b5c29b2d 100644 --- a/Engine/Source/RHI-DirectX12/CMakeLists.txt +++ b/Engine/Source/RHI-DirectX12/CMakeLists.txt @@ -4,5 +4,6 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} PUBLIC_INC Include - LIB RHI DirectXHeaders d3d12 dxgi d3dcompiler + PUBLIC_LIB RHI d3d12 + PUBLIC_MERGE_LIB DirectXHeaders dxgi d3dcompiler ) diff --git a/Engine/Source/RHI-Dummy/CMakeLists.txt b/Engine/Source/RHI-Dummy/CMakeLists.txt index 4527131b9..23b290d65 100644 --- a/Engine/Source/RHI-Dummy/CMakeLists.txt +++ b/Engine/Source/RHI-Dummy/CMakeLists.txt @@ -4,5 +4,5 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} PUBLIC_INC Include - LIB RHI + PUBLIC_LIB RHI ) diff --git a/Engine/Source/RHI-Vulkan/CMakeLists.txt b/Engine/Source/RHI-Vulkan/CMakeLists.txt index a76ac464f..3dedd5fc8 100644 --- a/Engine/Source/RHI-Vulkan/CMakeLists.txt +++ b/Engine/Source/RHI-Vulkan/CMakeLists.txt @@ -15,7 +15,8 @@ exp_add_library( TYPE SHARED SRC ${SOURCES} ${PLATFORM_SOURCES} PUBLIC_INC Include - LIB RHI VulkanSDK spirv-cross VulkanMemoryAllocator ${PLATFORM_EXT_LIBS} + PUBLIC_LIB RHI ${PLATFORM_EXT_LIBS} + PUBLIC_MERGE_LIB VulkanSDK spirv-cross VulkanMemoryAllocator ) # .mm files can not perform unity build with .cpp files diff --git a/Engine/Source/RHI/CMakeLists.txt b/Engine/Source/RHI/CMakeLists.txt index 77c3b61db..55dc88ffc 100644 --- a/Engine/Source/RHI/CMakeLists.txt +++ b/Engine/Source/RHI/CMakeLists.txt @@ -4,5 +4,5 @@ exp_add_library( TYPE STATIC SRC ${SOURCES} PUBLIC_INC Include - LIB Core + PUBLIC_LIB Core ) diff --git a/Engine/Source/Render/CMakeLists.txt b/Engine/Source/Render/CMakeLists.txt index b0689bc19..f5d771526 100644 --- a/Engine/Source/Render/CMakeLists.txt +++ b/Engine/Source/Render/CMakeLists.txt @@ -8,7 +8,9 @@ exp_add_library( TYPE STATIC SRC ${SOURCES} PUBLIC_INC Include - LIB Core RHI ${PLATFORM_LIBS} dxc spirv-cross + PRIVATE_LIB ${PLATFORM_LIBS} + PUBLIC_LIB Core RHI + PUBLIC_MERGE_LIB dxc spirv-cross ) file(GLOB SHARED_SOURCES SharedSrc/*.cpp) @@ -16,7 +18,7 @@ exp_add_library( NAME Render TYPE SHARED SRC ${SHARED_SOURCES} - LIB Render.Static + PUBLIC_LIB Render.Static ) file(GLOB TEST_SOURCES Test/*.cpp) diff --git a/Engine/Source/Runtime/CMakeLists.txt b/Engine/Source/Runtime/CMakeLists.txt index 5133a8bc6..1da745a05 100644 --- a/Engine/Source/Runtime/CMakeLists.txt +++ b/Engine/Source/Runtime/CMakeLists.txt @@ -5,7 +5,8 @@ exp_add_library( SRC ${SOURCES} PUBLIC_INC Include REFLECT Include - LIB Core Mirror assimp-lib Render + PUBLIC_LIB Core Mirror Render + PUBLIC_MERGE_LIB assimp-lib ) file(GLOB TEST_SOURCES Test/*.cpp) diff --git a/Engine/Source/Test/CMakeLists.txt b/Engine/Source/Test/CMakeLists.txt index 64d146284..1cf82677d 100644 --- a/Engine/Source/Test/CMakeLists.txt +++ b/Engine/Source/Test/CMakeLists.txt @@ -3,5 +3,6 @@ exp_add_library( TYPE STATIC SRC Src/Main.cpp PUBLIC_INC Include - LIB googletest Core + PUBLIC_LIB Core + PUBLIC_MERGE_LIB googletest ) \ No newline at end of file diff --git a/Sample/CMakeLists.txt b/Sample/CMakeLists.txt index 1041e0ffa..b161eee91 100644 --- a/Sample/CMakeLists.txt +++ b/Sample/CMakeLists.txt @@ -48,7 +48,8 @@ exp_add_library( NAME Sample-Base SRC ${SOURCES} PUBLIC_INC Base - LIB RHI glfw clipp ${PLATFORM_EXT_LIBS} Render.Static stb assimp-lib + PUBLIC_LIB RHI ${PLATFORM_EXT_LIBS} Render.Static + PUBLIC_MERGE_LIB glfw clipp stb assimp-lib NOT_INSTALL ) diff --git a/Tool/MirrorTool/CMakeLists.txt b/Tool/MirrorTool/CMakeLists.txt index 8e8034794..af9a5f688 100644 --- a/Tool/MirrorTool/CMakeLists.txt +++ b/Tool/MirrorTool/CMakeLists.txt @@ -3,7 +3,8 @@ exp_add_library( NAME MirrorTool.Static SRC ${SOURCES} PUBLIC_INC Include - LIB clipp llvm-clang Mirror + PUBLIC_LIB Mirror + PUBLIC_MERGE_LIB llvm-clang clipp NOT_INSTALL ) From 32ba46095e446f3a383635d8182d1be65b17a870 Mon Sep 17 00:00:00 2001 From: kindem Date: Sat, 8 Nov 2025 12:33:36 +0800 Subject: [PATCH 14/23] refactor: support install header only packages manually for includes tidy --- CMake/Target.cmake | 6 +++++- CMake/ThirdParty.cmake | 21 +++++++++++++++++++-- ThirdParty/CMakeLists.txt | 8 ++++++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 35bcbca45..59788057e 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -349,9 +349,13 @@ function(exp_add_library) ) foreach (LIB ${PARAMS_PRIVATE_MERGE_LIB}) - list(APPEND BUILD_MERGE_LIB $) + list(APPEND MERGE_LIB ${LIB}) endforeach () foreach (LIB ${PARAMS_PUBLIC_MERGE_LIB}) + list(APPEND MERGE_LIB ${LIB}) + endforeach () + + foreach (LIB ${MERGE_LIB}) list(APPEND BUILD_MERGE_LIB $) endforeach () target_link_libraries( diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 64fcace53..3c8d0e634 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -106,15 +106,32 @@ function(exp_get_3rd_platform_value) endfunction() function(exp_add_3rd_header_only_package) - cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR" "INCLUDE" ${ARGN}) + cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR;INSTALL_DIR" "INSTALL_FILES;INCLUDE" ${ARGN}) add_library(${PARAMS_NAME} INTERFACE) + if (DEFINED PARAMS_INSTALL_DIR AND DEFINED PARAMS_INSTALL_FILES) + foreach (INSTALL_FILE ${PARAMS_INSTALL_FILES}) + if (IS_DIRECTORY ${PARAMS_SOURCE_DIR}/${INSTALL_FILE}) + list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${PARAMS_SOURCE_DIR}/${INSTALL_FILE} ${PARAMS_INSTALL_DIR}/${INSTALL_FILE}) + else () + list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PARAMS_SOURCE_DIR}/${INSTALL_FILE} ${PARAMS_INSTALL_DIR}/${INSTALL_FILE}) + endif () + endforeach () + + add_custom_target( + ${PARAMS_NAME}.Install + COMMAND ${COMMANDS} + ) + add_dependencies(${PARAMS_NAME} ${PARAMS_NAME}.Install) + endif () + if (DEFINED PARAMS_INCLUDE) exp_expand_3rd_path_expression( INPUT ${PARAMS_INCLUDE} OUTPUT R_INCLUDE SOURCE_DIR ${PARAMS_SOURCE_DIR} + INSTALL_DIR ${PARAMS_INSTALL_DIR} ) exp_get_3rd_platform_value( OUTPUT P_INCLUDE @@ -124,7 +141,7 @@ function(exp_add_3rd_header_only_package) ${PARAMS_NAME} INTERFACE ${P_INCLUDE} ) - endif() + endif () endfunction() function(exp_add_3rd_binary_package) diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index 9069acbfb..f1ebdd6e2 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -248,7 +248,9 @@ if (${debugbreak_READY}) exp_add_3rd_header_only_package( NAME debugbreak SOURCE_DIR ${debugbreak_SOURCE_DIR} - INCLUDE $ + INSTALL_DIR ${debugbreak_INSTALL_DIR} + INSTALL_FILES debugbreak.h + INCLUDE $ ) endif () @@ -307,7 +309,9 @@ if (${taskflow_READY}) exp_add_3rd_header_only_package( NAME taskflow SOURCE_DIR ${taskflow_SOURCE_DIR} - INCLUDE $ + INSTALL_DIR ${taskflow_INSTALL_DIR} + INSTALL_FILES taskflow + INCLUDE $ ) endif () From 185f6af120d269c0f8b4bea64f9afa8be34a75fd Mon Sep 17 00:00:00 2001 From: kindem Date: Sat, 8 Nov 2025 13:09:29 +0800 Subject: [PATCH 15/23] refactor: process 3rd runtime dependencies --- CMake/Target.cmake | 48 ++++++++++++++++++++++++++++++++++----- CMake/ThirdParty.cmake | 10 ++++---- ThirdParty/CMakeLists.txt | 4 ++-- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 59788057e..c9c8a4fd7 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -13,11 +13,16 @@ endif() function(exp_gather_target_runtime_dependencies_recurse) cmake_parse_arguments(PARAMS "" "NAME;OUT_RUNTIME_DEP" "" ${ARGN}) + if (NOT TARGET ${PARAMS_NAME}) + set(${PARAMS_OUT_RUNTIME_DEP} "" PARENT_SCOPE) + return() + endif () + get_target_property(IMPORTED ${PARAMS_NAME} IMPORTED) - get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) - if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) - foreach(R ${RUNTIME_DEP}) + get_target_property(BUILD_RUNTIME_DEP ${PARAMS_NAME} BUILD_RUNTIME_DEP) + if (NOT ("${BUILD_RUNTIME_DEP}" STREQUAL "BUILD_RUNTIME_DEP-NOTFOUND")) + foreach(R ${BUILD_RUNTIME_DEP}) list(APPEND RESULT_RUNTIME_DEP ${R}) endforeach() endif() @@ -357,6 +362,12 @@ function(exp_add_library) foreach (LIB ${MERGE_LIB}) list(APPEND BUILD_MERGE_LIB $) + + exp_gather_target_runtime_dependencies_recurse( + NAME ${LIB} + OUT_RUNTIME_DEP TEMP_RUNTIME_DEP + ) + list(APPEND RUNTIME_DEP ${TEMP_RUNTIME_DEP}) endforeach () target_link_libraries( ${PARAMS_NAME} @@ -364,6 +375,19 @@ function(exp_add_library) PUBLIC ${PARAMS_PUBLIC_LIB} ) + if (DEFINED RUNTIME_DEP) + foreach (R ${RUNTIME_DEP}) + get_filename_component(FILE_NAME ${R} NAME) + list(APPEND INSTALL_RUNTIME_DEP ${FILE_NAME}) + endforeach () + set_target_properties( + ${PARAMS_NAME} PROPERTIES + EXPORT_PROPERTIES "INSTALL_RUNTIME_DEP" + BUILD_RUNTIME_DEP "${RUNTIME_DEP}" + INSTALL_RUNTIME_DEP "${INSTALL_RUNTIME_DEP}" + ) + endif () + if (${MSVC}) target_compile_options( ${PARAMS_NAME} @@ -395,6 +419,13 @@ function(exp_add_library) DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Include ) + if (DEFINED RUNTIME_DEP) + install( + FILES ${RUNTIME_DEP} + DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Binaries + ) + endif () + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${PARAMS_TYPE}" STREQUAL "STATIC") install( TARGETS ${PARAMS_NAME} @@ -404,12 +435,17 @@ function(exp_add_library) RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries ) endif () - - # TODO merge with upper, use install(TARGETS xxx FRAMEWORK DESTINATION xxx) if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND "${PARAMS_TYPE}" STREQUAL "SHARED") install( FILES $ - DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries + DESTINATION ${SUB_PROJECT_NAME}/Binaries + ) + endif () + + if ("${PARAMS_TYPE}" STREQUAL "SHARED") + install( + FILES $ + DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Binaries ) endif () endif () diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 3c8d0e634..f56c56714 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -209,7 +209,7 @@ function(exp_add_3rd_binary_package) ) set_target_properties( ${PARAMS_NAME} PROPERTIES - RUNTIME_DEP "${P_RUNTIME_DEP}" + BUILD_RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() endfunction() @@ -218,7 +218,7 @@ function(exp_add_3rd_cmake_package) cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) if (NOT ${GENERATOR_IS_MULTI_CONFIG}) - set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=$) + set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=Release) endif () ExternalProject_Add( @@ -226,8 +226,8 @@ function(exp_add_3rd_cmake_package) SOURCE_DIR ${PARAMS_SOURCE_DIR} BINARY_DIR ${PARAMS_BINARY_DIR} CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${PARAMS_INSTALL_DIR} ${PARAMS_CMAKE_ARG} - BUILD_COMMAND ${CMAKE_COMMAND} --build --config $ -j 16 - INSTALL_COMMAND ${CMAKE_COMMAND} --install --config $ + BUILD_COMMAND ${CMAKE_COMMAND} --build --config Release -j 16 + INSTALL_COMMAND ${CMAKE_COMMAND} --install --config Release ) add_library(${PARAMS_NAME} INTERFACE) add_dependencies(${PARAMS_NAME} ${PARAMS_NAME}.External) @@ -300,7 +300,7 @@ function(exp_add_3rd_cmake_package) ) set_target_properties( ${PARAMS_NAME} PROPERTIES - RUNTIME_DEP "${P_RUNTIME_DEP}" + BUILD_RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() endfunction() diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index f1ebdd6e2..2d21d34d3 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -388,10 +388,10 @@ if (${assimp-lib_READY}) INCLUDE $/include LINK $/lib LIB - Windows "assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>" + Windows "assimp-vc${MSVC_TOOLSET_VERSION}-mt" Darwin "assimp$,d,>" RUNTIME_DEP - Windows "$/bin/assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>.dll" + Windows "$/bin/assimp-vc${MSVC_TOOLSET_VERSION}-mt.dll" ) endif () From f1405f57dba87564ff051ec5f37eaedb3021c1f3 Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 9 Nov 2025 01:23:26 +0800 Subject: [PATCH 16/23] refactor: targets output --- CMake/Common.cmake | 10 ------- CMake/Target.cmake | 63 +++++++++++++++++++++++++++++++++--------- CMake/ThirdParty.cmake | 4 +-- Editor/CMakeLists.txt | 14 ++++++++++ 4 files changed, 66 insertions(+), 25 deletions(-) diff --git a/CMake/Common.cmake b/CMake/Common.cmake index 713834274..d6838fa0d 100644 --- a/CMake/Common.cmake +++ b/CMake/Common.cmake @@ -9,16 +9,6 @@ set(CMAKE_UNITY_BUILD ${USE_UNITY_BUILD}) set(CMAKE_EXPORT_COMPILE_COMMANDS ${EXPORT_COMPILE_COMMANDS}) get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) -if (${GENERATOR_IS_MULTI_CONFIG}) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) -else () - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) -endif () - if (${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT}) if (${GENERATOR_IS_MULTI_CONFIG}) set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install/$ CACHE PATH "" FORCE) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index c9c8a4fd7..9d86b735a 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -18,11 +18,9 @@ function(exp_gather_target_runtime_dependencies_recurse) return() endif () - get_target_property(IMPORTED ${PARAMS_NAME} IMPORTED) - - get_target_property(BUILD_RUNTIME_DEP ${PARAMS_NAME} BUILD_RUNTIME_DEP) - if (NOT ("${BUILD_RUNTIME_DEP}" STREQUAL "BUILD_RUNTIME_DEP-NOTFOUND")) - foreach(R ${BUILD_RUNTIME_DEP}) + get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) + if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) + foreach(R ${RUNTIME_DEP}) list(APPEND RESULT_RUNTIME_DEP ${R}) endforeach() endif() @@ -34,6 +32,11 @@ function(exp_gather_target_runtime_dependencies_recurse) continue() endif() + get_target_property(TYPE ${L} TYPE) + if (${TYPE} STREQUAL SHARED_LIBRARY) + list(APPEND RESULT_RUNTIME_DEP $) + endif () + exp_gather_target_runtime_dependencies_recurse( NAME ${L} OUT_RUNTIME_DEP TEMP_RUNTIME_DEP @@ -245,6 +248,17 @@ function(exp_add_executable) ${PARAMS_NAME} PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} ) + get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) + if (${GENERATOR_IS_MULTI_CONFIG}) + set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) + else () + set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) + endif () + set_target_properties( + ${PARAMS_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY} + ) + target_include_directories( ${PARAMS_NAME} PRIVATE ${PARAMS_INC} @@ -274,7 +288,7 @@ function(exp_add_executable) endif() if (${MSVC}) - set_target_properties(${PARAMS_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + set_target_properties(${PARAMS_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY}) endif() if (NOT ${PARAMS_NOT_INSTALL}) @@ -322,6 +336,22 @@ function(exp_add_library) ${PARAMS_NAME} PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} ) + get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) + if (${GENERATOR_IS_MULTI_CONFIG}) + set_target_properties( + ${PARAMS_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Lib + ) + else () + set_target_properties( + ${PARAMS_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Lib + ) + endif () foreach (INC ${PARAMS_PUBLIC_INC}) list(APPEND PUBLIC_INC ${INC}) @@ -376,15 +406,9 @@ function(exp_add_library) ) if (DEFINED RUNTIME_DEP) - foreach (R ${RUNTIME_DEP}) - get_filename_component(FILE_NAME ${R} NAME) - list(APPEND INSTALL_RUNTIME_DEP ${FILE_NAME}) - endforeach () set_target_properties( ${PARAMS_NAME} PROPERTIES - EXPORT_PROPERTIES "INSTALL_RUNTIME_DEP" - BUILD_RUNTIME_DEP "${RUNTIME_DEP}" - INSTALL_RUNTIME_DEP "${INSTALL_RUNTIME_DEP}" + RUNTIME_DEP "${RUNTIME_DEP}" ) endif () @@ -474,6 +498,19 @@ function(exp_add_test) ${PARAMS_NAME} PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} ) + get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) + if (${GENERATOR_IS_MULTI_CONFIG}) + set_target_properties( + ${PARAMS_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries + ) + else () + set_target_properties( + ${PARAMS_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries + ) + endif () + target_include_directories( ${PARAMS_NAME} PRIVATE ${PARAMS_INC} diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index f56c56714..b85452383 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -209,7 +209,7 @@ function(exp_add_3rd_binary_package) ) set_target_properties( ${PARAMS_NAME} PROPERTIES - BUILD_RUNTIME_DEP "${P_RUNTIME_DEP}" + RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() endfunction() @@ -300,7 +300,7 @@ function(exp_add_3rd_cmake_package) ) set_target_properties( ${PARAMS_NAME} PROPERTIES - BUILD_RUNTIME_DEP "${P_RUNTIME_DEP}" + RUNTIME_DEP "${P_RUNTIME_DEP}" ) endif() endfunction() diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index 4d80565ff..3098f418c 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -34,6 +34,20 @@ exp_add_mirror_info_source_generation_target( file(GLOB_RECURSE SOURCES Src/*.cpp) qt_add_executable(Editor ${PLATFORM_EXECUTABLE_HINT} ${SOURCES} ${EDITOR_MIRROR_GENERATED_SRC}) + +get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) +if (${GENERATOR_IS_MULTI_CONFIG}) + set_target_properties( + Editor PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries + ) +else () + set_target_properties( + Editor PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries + ) +endif () + target_include_directories(Editor PRIVATE ${EDITOR_INCLUDES}) target_link_libraries(Editor PRIVATE ${EDITOR_LIBS}) From 68baeea97e9581e43f8de3c944f883d85116a538 Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 9 Nov 2025 02:13:38 +0800 Subject: [PATCH 17/23] refactor: runtime dependencies copy --- CMake/Target.cmake | 52 ++++++++++++++++++++-------- Engine/Source/Render/CMakeLists.txt | 1 + Engine/Source/Runtime/CMakeLists.txt | 1 + 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 9d86b735a..0a7208802 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -21,7 +21,14 @@ function(exp_gather_target_runtime_dependencies_recurse) get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) foreach(R ${RUNTIME_DEP}) - list(APPEND RESULT_RUNTIME_DEP ${R}) + get_target_property(TYPE ${PARAMS_NAME} TYPE) + if (${TYPE} STREQUAL "SHARED_LIBRARY") + set(TARGET_BIN_DIR $) + else () + set(TARGET_BIN_DIR $/../Binaries) + endif () + string(REPLACE "" ${TARGET_BIN_DIR} TEMP_R ${R}) + list(APPEND RESULT_RUNTIME_DEP ${TEMP_R}) endforeach() endif() @@ -52,12 +59,15 @@ function(exp_gather_target_runtime_dependencies_recurse) endfunction() function(exp_process_runtime_dependencies) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME" "" ${ARGN}) + cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME" "DEP_TARGET" ${ARGN}) exp_gather_target_runtime_dependencies_recurse( NAME ${PARAMS_NAME} OUT_RUNTIME_DEP RUNTIME_DEPS ) + foreach (D ${PARAMS_DEP_TARGET}) + list(APPEND RUNTIME_DEPS $) + endforeach () foreach(R ${RUNTIME_DEPS}) add_custom_command( TARGET ${PARAMS_NAME} POST_BUILD @@ -273,6 +283,7 @@ function(exp_add_executable) ) exp_process_runtime_dependencies( NAME ${PARAMS_NAME} + DEP_TARGET ${PARAMS_DEP_TARGET} ${NOT_INSTALL_FLAG} ) exp_add_resources_copy_command( @@ -338,20 +349,20 @@ function(exp_add_library) ) get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) if (${GENERATOR_IS_MULTI_CONFIG}) - set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Lib - ) + set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries) + set(LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries) + set(ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Lib) else () - set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Lib - ) + set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries) + set(LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries) + set(ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Lib) endif () + set_target_properties( + ${PARAMS_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${ARCHIVE_OUTPUT_DIRECTORY} + ) foreach (INC ${PARAMS_PUBLIC_INC}) list(APPEND PUBLIC_INC ${INC}) @@ -406,9 +417,19 @@ function(exp_add_library) ) if (DEFINED RUNTIME_DEP) + foreach (R ${RUNTIME_DEP}) + get_filename_component(FILE_NAME ${R} NAME) + list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${R} ${RUNTIME_OUTPUT_DIRECTORY}/${FILE_NAME}) + list(APPEND RUNTIME_DEP_FILES /${FILE_NAME}) + endforeach () + add_custom_command( + TARGET ${PARAMS_NAME} POST_BUILD + ${COMMANDS} + ) set_target_properties( ${PARAMS_NAME} PROPERTIES - RUNTIME_DEP "${RUNTIME_DEP}" + EXPORT_PROPERTIES "RUNTIME_DEP" + RUNTIME_DEP "${RUNTIME_DEP_FILES}" ) endif () @@ -525,6 +546,7 @@ function(exp_add_test) ) exp_process_runtime_dependencies( NAME ${PARAMS_NAME} + DEP_TARGET ${PARAMS_DEP_TARGET} NOT_INSTALL ) exp_add_resources_copy_command( diff --git a/Engine/Source/Render/CMakeLists.txt b/Engine/Source/Render/CMakeLists.txt index f5d771526..0e14bcb4e 100644 --- a/Engine/Source/Render/CMakeLists.txt +++ b/Engine/Source/Render/CMakeLists.txt @@ -26,4 +26,5 @@ exp_add_test( NAME Render.Test SRC ${TEST_SOURCES} LIB RHI Render.Static + DEP_TARGET RHI-Dummy ) diff --git a/Engine/Source/Runtime/CMakeLists.txt b/Engine/Source/Runtime/CMakeLists.txt index 1da745a05..8c102a2f1 100644 --- a/Engine/Source/Runtime/CMakeLists.txt +++ b/Engine/Source/Runtime/CMakeLists.txt @@ -16,4 +16,5 @@ exp_add_test( LIB Runtime INC Test REFLECT Test + DEP_TARGET RHI-Dummy ) From b9362c8c695e56e5769824e5bbc8d0253717525b Mon Sep 17 00:00:00 2001 From: kindem Date: Sat, 15 Nov 2025 11:58:35 +0800 Subject: [PATCH 18/23] fix: debug build --- CMake/Target.cmake | 12 ++++++++++-- CMake/ThirdParty.cmake | 6 +++--- ThirdParty/CMakeLists.txt | 4 ++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 0a7208802..69c4d04ac 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -21,13 +21,17 @@ function(exp_gather_target_runtime_dependencies_recurse) get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) foreach(R ${RUNTIME_DEP}) + # workaround to make EXPORT_PROPERTIES support generator expression + string(REPLACE "[" "$<" R "${R}") + string(REPLACE "]" ">" R "${R}") + get_target_property(TYPE ${PARAMS_NAME} TYPE) if (${TYPE} STREQUAL "SHARED_LIBRARY") set(TARGET_BIN_DIR $) else () set(TARGET_BIN_DIR $/../Binaries) endif () - string(REPLACE "" ${TARGET_BIN_DIR} TEMP_R ${R}) + string(REPLACE "$" ${TARGET_BIN_DIR} TEMP_R ${R}) list(APPEND RESULT_RUNTIME_DEP ${TEMP_R}) endforeach() endif() @@ -420,12 +424,16 @@ function(exp_add_library) foreach (R ${RUNTIME_DEP}) get_filename_component(FILE_NAME ${R} NAME) list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${R} ${RUNTIME_OUTPUT_DIRECTORY}/${FILE_NAME}) - list(APPEND RUNTIME_DEP_FILES /${FILE_NAME}) + list(APPEND RUNTIME_DEP_FILES $/${FILE_NAME}) endforeach () add_custom_command( TARGET ${PARAMS_NAME} POST_BUILD ${COMMANDS} ) + + # workaround to make EXPORT_PROPERTIES support generator expression + string(REPLACE "$<" "[" RUNTIME_DEP_FILES "${RUNTIME_DEP_FILES}") + string(REPLACE ">" "]" RUNTIME_DEP_FILES "${RUNTIME_DEP_FILES}") set_target_properties( ${PARAMS_NAME} PROPERTIES EXPORT_PROPERTIES "RUNTIME_DEP" diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index b85452383..3c8d0e634 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -218,7 +218,7 @@ function(exp_add_3rd_cmake_package) cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) if (NOT ${GENERATOR_IS_MULTI_CONFIG}) - set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=Release) + set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=$) endif () ExternalProject_Add( @@ -226,8 +226,8 @@ function(exp_add_3rd_cmake_package) SOURCE_DIR ${PARAMS_SOURCE_DIR} BINARY_DIR ${PARAMS_BINARY_DIR} CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${PARAMS_INSTALL_DIR} ${PARAMS_CMAKE_ARG} - BUILD_COMMAND ${CMAKE_COMMAND} --build --config Release -j 16 - INSTALL_COMMAND ${CMAKE_COMMAND} --install --config Release + BUILD_COMMAND ${CMAKE_COMMAND} --build --config $ -j 16 + INSTALL_COMMAND ${CMAKE_COMMAND} --install --config $ ) add_library(${PARAMS_NAME} INTERFACE) add_dependencies(${PARAMS_NAME} ${PARAMS_NAME}.External) diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index 2d21d34d3..f1ebdd6e2 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -388,10 +388,10 @@ if (${assimp-lib_READY}) INCLUDE $/include LINK $/lib LIB - Windows "assimp-vc${MSVC_TOOLSET_VERSION}-mt" + Windows "assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>" Darwin "assimp$,d,>" RUNTIME_DEP - Windows "$/bin/assimp-vc${MSVC_TOOLSET_VERSION}-mt.dll" + Windows "$/bin/assimp-vc${MSVC_TOOLSET_VERSION}-mt$,d,>.dll" ) endif () From 91fc8c17ee46deb432034918ff15b0e127df192e Mon Sep 17 00:00:00 2001 From: kindem Date: Sat, 15 Nov 2025 12:23:19 +0800 Subject: [PATCH 19/23] refactor: make msvc compile options private --- CMake/Target.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 69c4d04ac..8c70d9d1e 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -444,7 +444,7 @@ function(exp_add_library) if (${MSVC}) target_compile_options( ${PARAMS_NAME} - PUBLIC /MD$<$:d> + PRIVATE /MD$<$:d> ) endif() From 9552347f696861f198cf165c249b7161b0a31556 Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 23 Nov 2025 13:42:09 +0800 Subject: [PATCH 20/23] refactor: cmake code style --- CMake/Common.cmake | 4 +- CMake/Target.cmake | 608 ++++++++++++++++++++------------------ CMake/ThirdParty.cmake | 333 +++++++++++---------- Editor/CMakeLists.txt | 5 +- Engine/CMakeLists.txt | 17 +- Sample/CMakeLists.txt | 39 +-- ThirdParty/CMakeLists.txt | 54 ++-- 7 files changed, 560 insertions(+), 500 deletions(-) diff --git a/CMake/Common.cmake b/CMake/Common.cmake index d6838fa0d..8b2206482 100644 --- a/CMake/Common.cmake +++ b/CMake/Common.cmake @@ -8,9 +8,9 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_UNITY_BUILD ${USE_UNITY_BUILD}) set(CMAKE_EXPORT_COMPILE_COMMANDS ${EXPORT_COMPILE_COMMANDS}) -get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) +get_cmake_property(generator_is_multi_config GENERATOR_IS_MULTI_CONFIG) if (${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT}) - if (${GENERATOR_IS_MULTI_CONFIG}) + if (${generator_is_multi_config}) set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install/$ CACHE PATH "" FORCE) else () set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install CACHE PATH "" FORCE) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 8c70d9d1e..ddec6dcd8 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -11,494 +11,521 @@ else() endif() function(exp_gather_target_runtime_dependencies_recurse) - cmake_parse_arguments(PARAMS "" "NAME;OUT_RUNTIME_DEP" "" ${ARGN}) + set(options "") + set(singleValueArgs NAME OUT_RUNTIME_DEP) + set(multiValueArgs "") + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT TARGET ${PARAMS_NAME}) - set(${PARAMS_OUT_RUNTIME_DEP} "" PARENT_SCOPE) + if (NOT TARGET ${arg_NAME}) + set(${arg_OUT_RUNTIME_DEP} "" PARENT_SCOPE) return() endif () - get_target_property(RUNTIME_DEP ${PARAMS_NAME} RUNTIME_DEP) - if (NOT ("${RUNTIME_DEP}" STREQUAL "RUNTIME_DEP-NOTFOUND")) - foreach(R ${RUNTIME_DEP}) + get_target_property(runtime_dep ${arg_NAME} RUNTIME_DEP) + if (NOT ("${runtime_dep}" STREQUAL "runtime_dep-NOTFOUND")) + foreach(r ${runtime_dep}) # workaround to make EXPORT_PROPERTIES support generator expression - string(REPLACE "[" "$<" R "${R}") - string(REPLACE "]" ">" R "${R}") + string(REPLACE "[" "$<" r "${r}") + string(REPLACE "]" ">" r "${r}") - get_target_property(TYPE ${PARAMS_NAME} TYPE) - if (${TYPE} STREQUAL "SHARED_LIBRARY") - set(TARGET_BIN_DIR $) + get_target_property(type ${arg_NAME} TYPE) + if (${type} STREQUAL "SHARED_LIBRARY") + set(target_bin_dir $) else () - set(TARGET_BIN_DIR $/../Binaries) + set(target_bin_dir $/../Binaries) endif () - string(REPLACE "$" ${TARGET_BIN_DIR} TEMP_R ${R}) - list(APPEND RESULT_RUNTIME_DEP ${TEMP_R}) + string(REPLACE "$" ${target_bin_dir} temp_r ${r}) + list(APPEND result_runtime_dep ${temp_r}) endforeach() endif() - get_target_property(LINK_LIBRARIES ${PARAMS_NAME} LINK_LIBRARIES) - if (NOT ("${LINK_LIBRARIES}" STREQUAL "LINK_LIBRARIES-NOTFOUND")) - foreach(L ${LINK_LIBRARIES}) - if (NOT TARGET ${L}) + get_target_property(libs ${arg_NAME} LINK_LIBRARIES) + if (NOT ("${libs}" STREQUAL "libs-NOTFOUND")) + foreach(l ${libs}) + if (NOT TARGET ${l}) continue() endif() - get_target_property(TYPE ${L} TYPE) - if (${TYPE} STREQUAL SHARED_LIBRARY) - list(APPEND RESULT_RUNTIME_DEP $) + get_target_property(type ${l} TYPE) + if (${type} STREQUAL SHARED_LIBRARY) + list(APPEND result_runtime_dep $) endif () exp_gather_target_runtime_dependencies_recurse( - NAME ${L} - OUT_RUNTIME_DEP TEMP_RUNTIME_DEP + NAME ${l} + OUT_RUNTIME_DEP temp_runtime_dep ) - foreach(T ${TEMP_RUNTIME_DEP}) - list(APPEND RESULT_RUNTIME_DEP ${T}) + foreach(t ${temp_runtime_dep}) + list(APPEND result_runtime_dep ${t}) endforeach() endforeach() endif() - list(REMOVE_DUPLICATES RESULT_RUNTIME_DEP) - set(${PARAMS_OUT_RUNTIME_DEP} ${RESULT_RUNTIME_DEP} PARENT_SCOPE) + list(REMOVE_DUPLICATES result_runtime_dep) + set(${arg_OUT_RUNTIME_DEP} ${result_runtime_dep} PARENT_SCOPE) endfunction() function(exp_process_runtime_dependencies) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME" "DEP_TARGET" ${ARGN}) + set(options NOT_INSTALL) + set(singleValueArgs NAME) + set(multiValueArgs DEP_TARGET) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) exp_gather_target_runtime_dependencies_recurse( - NAME ${PARAMS_NAME} - OUT_RUNTIME_DEP RUNTIME_DEPS + NAME ${arg_NAME} + OUT_RUNTIME_DEP runtime_deps ) - foreach (D ${PARAMS_DEP_TARGET}) - list(APPEND RUNTIME_DEPS $) + foreach (d ${arg_DEP_TARGET}) + list(APPEND runtime_deps $) endforeach () - foreach(R ${RUNTIME_DEPS}) + foreach(r ${runtime_deps}) add_custom_command( - TARGET ${PARAMS_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${R} $ + TARGET ${arg_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${r} $ ) - if (NOT ${PARAMS_NOT_INSTALL}) + if (NOT ${arg_NOT_INSTALL}) install( - FILES ${R} DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries + FILES ${r} DESTINATION ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries ) endif () endforeach() endfunction() function(exp_expand_resource_path_expression) - cmake_parse_arguments(PARAMS "" "INPUT;OUTPUT_SRC;OUTPUT_DST" "" ${ARGN}) + set(options "") + set(singleValueArgs INPUT OUTPUT_SRC OUTPUT_DST) + set(multiValueArgs "") + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - string(REPLACE "->" ";" TEMP ${PARAMS_INPUT}) - list(GET TEMP 0 SRC) - list(GET TEMP 1 DST) + string(REPLACE "->" ";" temp ${arg_INPUT}) + list(GET temp 0 src) + list(GET temp 1 dst) - set(${PARAMS_OUTPUT_SRC} ${SRC} PARENT_SCOPE) - set(${PARAMS_OUTPUT_DST} ${DST} PARENT_SCOPE) + set(${arg_OUTPUT_SRC} ${src} PARENT_SCOPE) + set(${arg_OUTPUT_DST} ${dst} PARENT_SCOPE) endfunction() function(exp_add_resources_copy_command) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME" "RES" ${ARGN}) + set(options NOT_INSTALL) + set(singleValueArgs NAME) + set(multiValueArgs RES) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - foreach(R ${PARAMS_RES}) + foreach(r ${arg_RES}) exp_expand_resource_path_expression( - INPUT ${R} - OUTPUT_SRC SRC - OUTPUT_DST DST + INPUT ${r} + OUTPUT_SRC src + OUTPUT_DST dst ) - list(APPEND COPY_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} $/${DST}) + list(APPEND copy_commands COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} $/${dst}) - get_filename_component(ABSOLUTE_DST ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/${DST} ABSOLUTE) - get_filename_component(DST_DIR ${ABSOLUTE_DST} DIRECTORY) - if (NOT ${PARAMS_NOT_INSTALL}) - install(FILES ${SRC} DESTINATION ${DST_DIR}) + get_filename_component(absolute_dst ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/${dst} ABSOLUTE) + get_filename_component(dst_dir ${absolute_dst} DIRECTORY) + if (NOT ${arg_NOT_INSTALL}) + install(FILES ${src} DESTINATION ${dst_dir}) endif () endforeach() - set(COPY_RES_TARGET_NAME ${PARAMS_NAME}.CopyRes) + set(copy_res_target_name ${arg_NAME}.CopyRes) add_custom_target( - ${COPY_RES_TARGET_NAME} - ${COPY_COMMANDS} + ${copy_res_target_name} + ${copy_commands} ) - add_dependencies(${PARAMS_NAME} ${COPY_RES_TARGET_NAME}) + add_dependencies(${arg_NAME} ${copy_res_target_name}) endfunction() function(exp_gather_target_include_dirs) - cmake_parse_arguments(PARAMS "" "NAME;OUTPUT" "" ${ARGN}) + set(options "") + set(singleValueArgs NAME OUTPUT) + set(multiValueArgs "") + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT (TARGET ${PARAMS_NAME})) + if (NOT (TARGET ${arg_NAME})) return() endif() - get_target_property(TARGET_INCS ${PARAMS_NAME} INTERFACE_INCLUDE_DIRECTORIES) - if (NOT ("${TARGET_INCS}" STREQUAL "TARGET_INCS-NOTFOUND")) - foreach(TARGET_INC ${TARGET_INCS}) - list(APPEND RESULT ${TARGET_INC}) + get_target_property(target_incs ${arg_NAME} INTERFACE_INCLUDE_DIRECTORIES) + if (NOT ("${target_incs}" STREQUAL "target_incs-NOTFOUND")) + foreach(target_inc ${target_incs}) + list(APPEND result ${target_inc}) endforeach() endif() - get_target_property(TARGET_LIBS ${PARAMS_NAME} LINK_LIBRARIES) - if (NOT ("${TARGET_LIBS}" STREQUAL "TARGET_LIBS-NOTFOUND")) - foreach(TARGET_LIB ${TARGET_LIBS}) + get_target_property(target_libs ${arg_NAME} LINK_LIBRARIES) + if (NOT ("${target_libs}" STREQUAL "target_libs-NOTFOUND")) + foreach(target_lib ${target_libs}) exp_gather_target_include_dirs( - NAME ${TARGET_LIB} - OUTPUT LIB_INCS + NAME ${target_lib} + OUTPUT lib_incs ) - foreach(LIB_INC ${LIB_INCS}) - list(APPEND RESULT ${LIB_INC}) + foreach(lib_inc ${lib_incs}) + list(APPEND result ${lib_inc}) endforeach() endforeach() endif() - list(REMOVE_DUPLICATES RESULT) - set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) + list(REMOVE_DUPLICATES result) + set(${arg_OUTPUT} ${result} PARENT_SCOPE) endfunction() function(exp_add_mirror_info_source_generation_target) - cmake_parse_arguments(PARAMS "DYNAMIC" "NAME;OUTPUT_SRC;OUTPUT_TARGET_NAME" "SEARCH_DIR;PUBLIC_INC;PRIVATE_INC;LIB;FRAMEWORK_DIR" ${ARGN}) - - if (DEFINED PARAMS_PUBLIC_INC) - foreach (I ${PARAMS_PUBLIC_INC}) - get_filename_component(ABSOLUTE_I ${I} ABSOLUTE) - list(APPEND INC ${ABSOLUTE_I}) + set(options DYNAMIC) + set(singleValueArgs NAME OUTPUT_SRC OUTPUT_TARGET_NAME) + set(multiValueArgs SEARCH_DIR PUBLIC_INC PRIVATE_INC LIB FRAMEWORK_DIR) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (DEFINED arg_PUBLIC_INC) + foreach (i ${arg_PUBLIC_INC}) + get_filename_component(absolute_i ${i} ABSOLUTE) + list(APPEND inc ${absolute_i}) endforeach () endif() - if (DEFINED PARAMS_PRIVATE_INC) - foreach (I ${PARAMS_PRIVATE_INC}) - get_filename_component(ABSOLUTE_I ${I} ABSOLUTE) - list(APPEND INC ${ABSOLUTE_I}) + if (DEFINED arg_PRIVATE_INC) + foreach (i ${arg_PRIVATE_INC}) + get_filename_component(absolute_i ${i} ABSOLUTE) + list(APPEND inc ${absolute_i}) endforeach () endif() - if (DEFINED PARAMS_LIB) - foreach (L ${PARAMS_LIB}) + if (DEFINED arg_LIB) + foreach (l ${arg_LIB}) exp_gather_target_include_dirs( - NAME ${L} - OUTPUT TARGET_INCS + NAME ${l} + OUTPUT target_incs ) - foreach (I ${TARGET_INCS}) - list(APPEND INC ${I}) + foreach (i ${target_incs}) + list(APPEND inc ${i}) endforeach () endforeach() endif() - list(REMOVE_DUPLICATES INC) + list(REMOVE_DUPLICATES inc) - list(APPEND INC_ARGS "-I") - foreach (I ${INC}) - list(APPEND INC_ARGS ${I}) + list(APPEND inc_args "-I") + foreach (i ${inc}) + list(APPEND inc_args ${i}) endforeach() - if (DEFINED PARAMS_FRAMEWORK_DIR) - list(APPEND FWK_DIR ${PARAMS_FRAMEWORK_DIR}) - list(APPEND FWK_DIR_ARGS "-F") + if (DEFINED arg_FRAMEWORK_DIR) + list(APPEND fwk_dir ${arg_FRAMEWORK_DIR}) + list(APPEND fwk_dir_args "-F") endif () - list(REMOVE_DUPLICATES FWK_DIR) + list(REMOVE_DUPLICATES fwk_dir) - foreach (F ${FWK_DIR}) - get_filename_component(ABSOLUTE_F ${F} ABSOLUTE) - list(APPEND FWK_DIR_ARGS ${ABSOLUTE_F}) + foreach (f ${fwk_dir}) + get_filename_component(absolute_f ${f} ABSOLUTE) + list(APPEND fwk_dir_args ${absolute_f}) endforeach () - if (${PARAMS_DYNAMIC}) - list(APPEND DYNAMIC_ARG "-d") + if (${arg_DYNAMIC}) + list(APPEND dynamic_arg "-d") endif () - foreach (SEARCH_DIR ${PARAMS_SEARCH_DIR}) - file(GLOB_RECURSE INPUT_HEADER_FILES "${SEARCH_DIR}/*.h") - foreach (INPUT_HEADER_FILE ${INPUT_HEADER_FILES}) - string(REPLACE "${CMAKE_SOURCE_DIR}/" "" TEMP ${INPUT_HEADER_FILE}) - get_filename_component(DIR ${TEMP} DIRECTORY) - get_filename_component(FILENAME ${TEMP} NAME_WE) + foreach (search_dir ${arg_SEARCH_DIR}) + file(GLOB_RECURSE input_header_files "${search_dir}/*.h") + foreach (input_header_file ${input_header_files}) + string(REPLACE "${CMAKE_SOURCE_DIR}/" "" temp ${input_header_file}) + get_filename_component(dir ${temp} DIRECTORY) + get_filename_component(filename ${temp} NAME_WE) - set(OUTPUT_SOURCE "${CMAKE_BINARY_DIR}/Generated/MirrorInfoSource/${DIR}/${FILENAME}.generated.cpp") - list(APPEND OUTPUT_SOURCES ${OUTPUT_SOURCE}) + set(output_source "${CMAKE_BINARY_DIR}/Generated/MirrorInfoSource/${dir}/${filename}.generated.cpp") + list(APPEND output_sources ${output_source}) add_custom_command( - OUTPUT ${OUTPUT_SOURCE} - COMMAND "$" ${DYNAMIC_ARG} "-i" ${INPUT_HEADER_FILE} "-o" ${OUTPUT_SOURCE} ${INC_ARGS} ${FWK_DIR_ARGS} - DEPENDS MirrorTool ${INPUT_HEADER_FILE} + OUTPUT ${output_source} + COMMAND "$" ${dynamic_arg} "-i" ${input_header_file} "-o" ${output_source} ${inc_args} ${fwk_dir_args} + DEPENDS MirrorTool ${input_header_file} ) endforeach() endforeach () - set(CUSTOM_TARGET_NAME "${PARAMS_NAME}.Generated") + set(custom_target_name "${arg_NAME}.Generated") add_custom_target( - ${CUSTOM_TARGET_NAME} - DEPENDS MirrorTool ${OUTPUT_SOURCES} + ${custom_target_name} + DEPENDS MirrorTool ${output_sources} ) - set(${PARAMS_OUTPUT_SRC} ${OUTPUT_SOURCES} PARENT_SCOPE) - set(${PARAMS_OUTPUT_TARGET_NAME} ${CUSTOM_TARGET_NAME} PARENT_SCOPE) + set(${arg_OUTPUT_SRC} ${output_sources} PARENT_SCOPE) + set(${arg_OUTPUT_TARGET_NAME} ${custom_target_name} PARENT_SCOPE) - if (DEFINED PARAMS_LIB) - add_dependencies(${CUSTOM_TARGET_NAME} ${PARAMS_LIB}) + if (DEFINED arg_LIB) + add_dependencies(${custom_target_name} ${arg_LIB}) endif() endfunction() function(exp_add_executable) - cmake_parse_arguments(PARAMS "SAMPLE;NOT_INSTALL" "NAME" "SRC;INC;LINK;LIB;DEP_TARGET;RES;REFLECT" ${ARGN}) + set(options SAMPLE NOT_INSTALL) + set(singleValueArgs NAME) + set(multiValueArgs SRC INC LINK LIB DEP_TARGET RES REFLECT) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if (${PARAMS_SAMPLE} AND (NOT ${BUILD_SAMPLE})) + if (${arg_SAMPLE} AND (NOT ${BUILD_SAMPLE})) return() endif() - if (${PARAMS_NOT_INSTALL}) - set(NOT_INSTALL_FLAG NOT_INSTALL) + if (${arg_NOT_INSTALL}) + set(not_install_flag NOT_INSTALL) else () - set(NOT_INSTALL_FLAG "") + set(not_install_flag "") endif () - if (DEFINED PARAMS_REFLECT) + if (DEFINED arg_REFLECT) exp_add_mirror_info_source_generation_target( - NAME ${PARAMS_NAME} - OUTPUT_SRC GENERATED_SRC - OUTPUT_TARGET_NAME GENERATED_TARGET - SEARCH_DIR ${PARAMS_REFLECT} - PRIVATE_INC ${PARAMS_INC} - LIB ${PARAMS_LIB} + NAME ${arg_NAME} + OUTPUT_SRC generated_src + OUTPUT_TARGET_NAME generated_target + SEARCH_DIR ${arg_REFLECT} + PRIVATE_INC ${arg_INC} + LIB ${arg_LIB} ) endif() - add_executable(${PARAMS_NAME}) + add_executable(${arg_NAME}) target_sources( - ${PARAMS_NAME} - PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} + ${arg_NAME} + PRIVATE ${arg_SRC} ${generated_src} ) - get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) - if (${GENERATOR_IS_MULTI_CONFIG}) - set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) + get_cmake_property(generated_is_multi_config GENERATOR_IS_MULTI_CONFIG) + if (${generated_is_multi_config}) + set(runtime_output_dir ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries) else () - set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) + set(runtime_output_dir ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries) endif () set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY} + ${arg_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${runtime_output_dir} ) target_include_directories( - ${PARAMS_NAME} - PRIVATE ${PARAMS_INC} + ${arg_NAME} + PRIVATE ${arg_INC} ) target_link_directories( - ${PARAMS_NAME} - PRIVATE ${PARAMS_LINK} + ${arg_NAME} + PRIVATE ${arg_LINK} ) target_link_libraries( - ${PARAMS_NAME} - PUBLIC ${PARAMS_LIB} + ${arg_NAME} + PUBLIC ${arg_LIB} ) exp_process_runtime_dependencies( - NAME ${PARAMS_NAME} - DEP_TARGET ${PARAMS_DEP_TARGET} - ${NOT_INSTALL_FLAG} + NAME ${arg_NAME} + DEP_TARGET ${arg_DEP_TARGET} + ${not_install_flag} ) exp_add_resources_copy_command( - NAME ${PARAMS_NAME} - RES ${PARAMS_RES} - ${NOT_INSTALL_FLAG} + NAME ${arg_NAME} + RES ${arg_RES} + ${not_install_flag} ) - if (DEFINED PARAMS_DEP_TARGET) - add_dependencies(${PARAMS_NAME} ${PARAMS_DEP_TARGET}) + if (DEFINED arg_DEP_TARGET) + add_dependencies(${arg_NAME} ${arg_DEP_TARGET}) endif() - if (DEFINED PARAMS_REFLECT) - add_dependencies(${PARAMS_NAME} ${GENERATED_TARGET}) + if (DEFINED arg_REFLECT) + add_dependencies(${arg_NAME} ${generated_target}) endif() if (${MSVC}) - set_target_properties(${PARAMS_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY}) + set_target_properties( + ${arg_NAME} PROPERTIES + VS_DEBUGGER_WORKING_DIRECTORY ${runtime_output_dir} + ) endif() - if (NOT ${PARAMS_NOT_INSTALL}) + if (NOT ${arg_NOT_INSTALL}) install( - TARGETS ${PARAMS_NAME} + TARGETS ${arg_NAME} EXPORT ${SUB_PROJECT_NAME}Targets RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries ) if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - install(CODE "execute_process(COMMAND install_name_tool -add_rpath @executable_path ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/$)") + install(CODE "execute_process(COMMAND install_name_tool -add_rpath @executable_path ${CMAKE_INSTALL_PREFIX}/${SUB_PROJECT_NAME}/Binaries/$)") endif () endif () endfunction() function(exp_add_library) - cmake_parse_arguments(PARAMS "NOT_INSTALL" "NAME;TYPE" "SRC;PRIVATE_INC;PUBLIC_INC;PRIVATE_LINK;PUBLIC_LINK;PRIVATE_LIB;PUBLIC_LIB;PRIVATE_MERGE_LIB;PUBLIC_MERGE_LIB;REFLECT" ${ARGN}) + set(options NOT_INSTALL) + set(singleValueArgs NAME TYPE) + set(multiValueArgs SRC PRIVATE_INC PUBLIC_INC PRIVATE_LINK PUBLIC_LINK PRIVATE_LIB PUBLIC_LIB PRIVATE_MERGE_LIB PUBLIC_MERGE_LIB REFLECT) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if ("${PARAMS_TYPE}" STREQUAL "SHARED") - list(APPEND PARAMS_PUBLIC_INC ${API_HEADER_DIR}/${PARAMS_NAME}) + if ("${arg_TYPE}" STREQUAL "SHARED") + list(APPEND arg_PUBLIC_INC ${API_HEADER_DIR}/${arg_NAME}) endif () - if (DEFINED PARAMS_REFLECT) - if ("${PARAMS_TYPE}" STREQUAL "SHARED") - list(APPEND EXTRA_PARAMS DYNAMIC) + if (DEFINED arg_REFLECT) + if ("${arg_TYPE}" STREQUAL "SHARED") + list(APPEND extra_params DYNAMIC) endif () exp_add_mirror_info_source_generation_target( - NAME ${PARAMS_NAME} - OUTPUT_SRC GENERATED_SRC - OUTPUT_TARGET_NAME GENERATED_TARGET - SEARCH_DIR ${PARAMS_REFLECT} - PUBLIC_INC ${PARAMS_PUBLIC_INC} - PRIVATE_INC ${PARAMS_PRIVATE_INC} - LIB ${PARAMS_PRIVATE_LIB} ${PARAMS_PUBLIC_LIB} - ${EXTRA_PARAMS} + NAME ${arg_NAME} + OUTPUT_SRC generated_src + OUTPUT_TARGET_NAME generated_target + SEARCH_DIR ${arg_REFLECT} + PUBLIC_INC ${arg_PUBLIC_INC} + PRIVATE_INC ${arg_PRIVATE_INC} + LIB ${arg_PRIVATE_LIB} ${arg_PUBLIC_LIB} + ${extra_params} ) endif() add_library( - ${PARAMS_NAME} - ${PARAMS_TYPE} + ${arg_NAME} + ${arg_TYPE} ) target_sources( - ${PARAMS_NAME} - PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} + ${arg_NAME} + PRIVATE ${arg_SRC} ${generated_src} ) - get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) - if (${GENERATOR_IS_MULTI_CONFIG}) - set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries) - set(LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Binaries) - set(ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/$/Lib) + get_cmake_property(generator_is_multi_config GENERATOR_IS_MULTI_CONFIG) + if (${generator_is_multi_config}) + set(runtime_output_dir ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${arg_NAME}/$/Binaries) + set(library_output_dir ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${arg_NAME}/$/Binaries) + set(archive_output_directory ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${arg_NAME}/$/Lib) else () - set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries) - set(LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Binaries) - set(ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${PARAMS_NAME}/Lib) + set(runtime_output_dir ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${arg_NAME}/Binaries) + set(library_output_dir ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${arg_NAME}/Binaries) + set(archive_output_directory ${CMAKE_BINARY_DIR}/Targets/${SUB_PROJECT_NAME}/${arg_NAME}/Lib) endif () set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY} - LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_DIRECTORY} - ARCHIVE_OUTPUT_DIRECTORY ${ARCHIVE_OUTPUT_DIRECTORY} + ${arg_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${runtime_output_dir} + LIBRARY_OUTPUT_DIRECTORY ${library_output_dir} + ARCHIVE_OUTPUT_DIRECTORY ${archive_output_directory} ) - foreach (INC ${PARAMS_PUBLIC_INC}) - list(APPEND PUBLIC_INC ${INC}) + foreach (inc ${arg_PUBLIC_INC}) + list(APPEND public_inc ${inc}) endforeach () - foreach (LIB ${PARAMS_PUBLIC_MERGE_LIB}) - if (TARGET ${LIB}) - get_target_property(TARGET_INCS ${LIB} INTERFACE_INCLUDE_DIRECTORIES) - if (NOT ("${TARGET_INCS}" STREQUAL "TARGET_INCS-NOTFOUND")) - foreach(TARGET_INC ${TARGET_INCS}) - list(APPEND PUBLIC_INC ${TARGET_INC}) + foreach (lib ${arg_PUBLIC_MERGE_LIB}) + if (TARGET ${lib}) + get_target_property(target_incs ${lib} INTERFACE_INCLUDE_DIRECTORIES) + if (NOT ("${target_incs}" STREQUAL "target_incs-NOTFOUND")) + foreach(target_inc ${target_incs}) + list(APPEND public_inc ${target_inc}) endforeach() endif() endif () endforeach () - foreach (INC ${PUBLIC_INC}) - get_filename_component(ABSOLUTE_INC ${INC} ABSOLUTE) - list(APPEND PUBLIC_BUILD_INC $) + foreach (inc ${public_inc}) + get_filename_component(absolute_inc ${inc} ABSOLUTE) + list(APPEND public_build_inc $) endforeach () target_include_directories( - ${PARAMS_NAME} - PRIVATE ${PARAMS_PRIVATE_INC} - PUBLIC ${PUBLIC_BUILD_INC} $ + ${arg_NAME} + PRIVATE ${arg_PRIVATE_INC} + PUBLIC ${public_build_inc} $ ) target_link_directories( - ${PARAMS_NAME} - PRIVATE ${PARAMS_PRIVATE_LINK} - PUBLIC ${PARAMS_PUBLIC_LINK} + ${arg_NAME} + PRIVATE ${arg_PRIVATE_LINK} + PUBLIC ${arg_PUBLIC_LINK} ) - foreach (LIB ${PARAMS_PRIVATE_MERGE_LIB}) - list(APPEND MERGE_LIB ${LIB}) + foreach (lib ${arg_PRIVATE_MERGE_LIB}) + list(APPEND merge_lib ${lib}) endforeach () - foreach (LIB ${PARAMS_PUBLIC_MERGE_LIB}) - list(APPEND MERGE_LIB ${LIB}) + foreach (lib ${arg_PUBLIC_MERGE_LIB}) + list(APPEND merge_lib ${lib}) endforeach () - foreach (LIB ${MERGE_LIB}) - list(APPEND BUILD_MERGE_LIB $) + foreach (lib ${merge_lib}) + list(APPEND build_merge_lib $) exp_gather_target_runtime_dependencies_recurse( - NAME ${LIB} - OUT_RUNTIME_DEP TEMP_RUNTIME_DEP + NAME ${lib} + OUT_RUNTIME_DEP temp_runtime_dep ) - list(APPEND RUNTIME_DEP ${TEMP_RUNTIME_DEP}) + list(APPEND runtime_dep ${temp_runtime_dep}) endforeach () target_link_libraries( - ${PARAMS_NAME} - PRIVATE ${PRIVATE_PRIVATE_LIB} ${BUILD_MERGE_LIB} - PUBLIC ${PARAMS_PUBLIC_LIB} + ${arg_NAME} + PRIVATE ${build_merge_lib} + PUBLIC ${arg_PUBLIC_LIB} ) - if (DEFINED RUNTIME_DEP) - foreach (R ${RUNTIME_DEP}) - get_filename_component(FILE_NAME ${R} NAME) - list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${R} ${RUNTIME_OUTPUT_DIRECTORY}/${FILE_NAME}) - list(APPEND RUNTIME_DEP_FILES $/${FILE_NAME}) + if (DEFINED runtime_dep) + foreach (r ${runtime_dep}) + get_filename_component(FILE_NAME ${r} NAME) + list(APPEND commands COMMAND ${CMAKE_COMMAND} -E copy_if_different ${r} ${runtime_output_dir}/${FILE_NAME}) + list(APPEND runtime_dep_files $/${FILE_NAME}) endforeach () add_custom_command( - TARGET ${PARAMS_NAME} POST_BUILD - ${COMMANDS} + TARGET ${arg_NAME} POST_BUILD + ${commands} ) # workaround to make EXPORT_PROPERTIES support generator expression - string(REPLACE "$<" "[" RUNTIME_DEP_FILES "${RUNTIME_DEP_FILES}") - string(REPLACE ">" "]" RUNTIME_DEP_FILES "${RUNTIME_DEP_FILES}") + string(REPLACE "$<" "[" runtime_dep_files "${runtime_dep_files}") + string(REPLACE ">" "]" runtime_dep_files "${runtime_dep_files}") set_target_properties( - ${PARAMS_NAME} PROPERTIES - EXPORT_PROPERTIES "RUNTIME_DEP" - RUNTIME_DEP "${RUNTIME_DEP_FILES}" + ${arg_NAME} PROPERTIES + EXPORT_PROPERTIES "runtime_dep" + RUNTIME_DEP "${runtime_dep_files}" ) endif () if (${MSVC}) target_compile_options( - ${PARAMS_NAME} + ${arg_NAME} PRIVATE /MD$<$:d> ) endif() - if ("${PARAMS_TYPE}" STREQUAL "SHARED") - string(TOUPPER ${PARAMS_NAME}_API API_NAME) - string(REPLACE "-" "/" API_DIR ${PARAMS_NAME}) + if ("${arg_TYPE}" STREQUAL "SHARED") + string(TOUPPER ${arg_NAME}_API api_name) + string(REPLACE "-" "/" api_dir ${arg_NAME}) generate_export_header( - ${PARAMS_NAME} - EXPORT_MACRO_NAME ${API_NAME} - EXPORT_FILE_NAME ${API_HEADER_DIR}/${PARAMS_NAME}/${API_DIR}/Api.h + ${arg_NAME} + EXPORT_MACRO_NAME ${api_name} + EXPORT_FILE_NAME ${API_HEADER_DIR}/${arg_NAME}/${api_dir}/Api.h ) endif() - if (DEFINED PARAMS_REFLECT) - add_dependencies(${PARAMS_NAME} ${GENERATED_TARGET}) + if (DEFINED arg_REFLECT) + add_dependencies(${arg_NAME} ${generated_target}) endif() - if (NOT ${PARAMS_NOT_INSTALL}) - foreach (INC ${PUBLIC_INC}) - list(APPEND INSTALL_INC ${INC}/) + if (NOT ${arg_NOT_INSTALL}) + foreach (inc ${public_inc}) + list(APPEND install_inc ${inc}/) endforeach () install( - DIRECTORY ${INSTALL_INC} - DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Include + DIRECTORY ${install_inc} + DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Include ) - if (DEFINED RUNTIME_DEP) + if (DEFINED runtime_dep) install( - FILES ${RUNTIME_DEP} - DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Binaries + FILES ${runtime_dep} + DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries ) endif () - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${PARAMS_TYPE}" STREQUAL "STATIC") + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${arg_TYPE}" STREQUAL "STATIC") install( - TARGETS ${PARAMS_NAME} + TARGETS ${arg_NAME} EXPORT ${SUB_PROJECT_NAME}Targets - ARCHIVE DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib - LIBRARY DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Lib + ARCHIVE DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib + LIBRARY DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries ) endif () - if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND "${PARAMS_TYPE}" STREQUAL "SHARED") + if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND "${arg_TYPE}" STREQUAL "SHARED") install( - FILES $ + FILES $ DESTINATION ${SUB_PROJECT_NAME}/Binaries ) endif () - if ("${PARAMS_TYPE}" STREQUAL "SHARED") + if ("${arg_TYPE}" STREQUAL "SHARED") install( - FILES $ - DESTINATION ${SUB_PROJECT_NAME}/Target/${PARAMS_NAME}/Binaries + FILES $ + DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries ) endif () endif () @@ -509,70 +536,73 @@ function(exp_add_test) return() endif() - cmake_parse_arguments(PARAMS "META" "NAME" "SRC;INC;LINK;LIB;DEP_TARGET;RES;REFLECT" ${ARGN}) + set(options META) + set(singleValueArgs NAME) + set(multiValueArgs SRC INC LINK LIB DEP_TARGET RES REFLECT) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if (DEFINED PARAMS_REFLECT) + if (DEFINED arg_REFLECT) exp_add_mirror_info_source_generation_target( - NAME ${PARAMS_NAME} - OUTPUT_SRC GENERATED_SRC - OUTPUT_TARGET_NAME GENERATED_TARGET - SEARCH_DIR ${PARAMS_REFLECT} - PRIVATE_INC ${PARAMS_INC} - LIB ${PARAMS_LIB} + NAME ${arg_NAME} + OUTPUT_SRC generated_src + OUTPUT_TARGET_NAME generated_target + SEARCH_DIR ${arg_REFLECT} + PRIVATE_INC ${arg_INC} + LIB ${arg_LIB} ) endif() - add_executable(${PARAMS_NAME}) + add_executable(${arg_NAME}) target_sources( - ${PARAMS_NAME} - PRIVATE ${PARAMS_SRC} ${GENERATED_SRC} + ${arg_NAME} + PRIVATE ${arg_SRC} ${generated_src} ) - get_cmake_property(GENERATOR_IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) - if (${GENERATOR_IS_MULTI_CONFIG}) + get_cmake_property(generator_is_multi_config GENERATOR_IS_MULTI_CONFIG) + if (${generator_is_multi_config}) set_target_properties( - ${PARAMS_NAME} PROPERTIES + ${arg_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/$/${SUB_PROJECT_NAME}/Binaries ) else () set_target_properties( - ${PARAMS_NAME} PROPERTIES + ${arg_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Dist/${SUB_PROJECT_NAME}/Binaries ) endif () target_include_directories( - ${PARAMS_NAME} - PRIVATE ${PARAMS_INC} + ${arg_NAME} + PRIVATE ${arg_INC} ) target_link_directories( - ${PARAMS_NAME} - PRIVATE ${PARAMS_LINK} + ${arg_NAME} + PRIVATE ${arg_LINK} ) target_link_libraries( - ${PARAMS_NAME} - PRIVATE Test ${PARAMS_LIB} + ${arg_NAME} + PRIVATE Test ${arg_LIB} ) exp_process_runtime_dependencies( - NAME ${PARAMS_NAME} - DEP_TARGET ${PARAMS_DEP_TARGET} + NAME ${arg_NAME} + DEP_TARGET ${arg_DEP_TARGET} NOT_INSTALL ) exp_add_resources_copy_command( - NAME ${PARAMS_NAME} - RES ${PARAMS_RES} + NAME ${arg_NAME} + RES ${arg_RES} NOT_INSTALL ) - if (DEFINED PARAMS_DEP_TARGET) - add_dependencies(${PARAMS_NAME} ${PARAMS_DEP_TARGET}) + if (DEFINED arg_DEP_TARGET) + add_dependencies(${arg_NAME} ${arg_DEP_TARGET}) endif() - if (DEFINED PARAMS_REFLECT) - add_dependencies(${PARAMS_NAME} ${GENERATED_TARGET}) + if (DEFINED arg_REFLECT) + add_dependencies(${arg_NAME} ${generated_target}) endif() add_test( - NAME ${PARAMS_NAME} - COMMAND ${PARAMS_NAME} - WORKING_DIRECTORY $ + NAME ${arg_NAME} + COMMAND ${arg_NAME} + WORKING_DIRECTORY $ ) endfunction() diff --git a/CMake/ThirdParty.cmake b/CMake/ThirdParty.cmake index 3c8d0e634..1d3716b78 100644 --- a/CMake/ThirdParty.cmake +++ b/CMake/ThirdParty.cmake @@ -1,316 +1,337 @@ function(exp_download_and_extract_3rd_package) - cmake_parse_arguments(PARAMS "" "URL;SAVE_AS;EXTRACT_TO" "ARG;HASH" ${ARGN}) + set(options "") + set(singleValueArgs URL SAVE_AS EXTRACT_TO) + set(multiValueArgs HASH) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if (EXISTS ${PARAMS_SAVE_AS}) - message("found downloaded file for ${PARAMS_URL} -> ${PARAMS_SAVE_AS}") + if (EXISTS ${arg_SAVE_AS}) + message("found downloaded file for ${arg_URL} -> ${arg_SAVE_AS}") else() - message("starting download package ${PARAMS_URL}") + message("starting download package ${arg_URL}") file( DOWNLOAD - ${PARAMS_URL} ${PARAMS_SAVE_AS} + ${arg_URL} ${arg_SAVE_AS} SHOW_PROGRESS ) endif() - if (DEFINED PARAMS_HASH) + if (DEFINED arg_HASH) exp_get_3rd_platform_value( - OUTPUT PLATFORM_HASH - INPUT ${PARAMS_HASH} + OUTPUT platform_hash + INPUT ${arg_HASH} ) - file(SHA256 ${PARAMS_SAVE_AS} HASH_VALUE) - if (NOT (${PLATFORM_HASH} STREQUAL ${HASH_VALUE})) - message(FATAL_ERROR "check hash value failed for file ${PARAMS_SAVE_AS}, given ${PLATFORM_HASH} actual ${HASH_VALUE}") + file(SHA256 ${arg_SAVE_AS} hash_value) + if (NOT (${platform_hash} STREQUAL ${hash_value})) + message(FATAL_ERROR "check hash value failed for file ${arg_SAVE_AS}, given ${platform_hash} actual ${hash_value}") endif () endif() - if (NOT EXISTS ${PARAMS_EXTRACT_TO}) + if (NOT EXISTS ${arg_EXTRACT_TO}) file( ARCHIVE_EXTRACT - INPUT ${PARAMS_SAVE_AS} - DESTINATION ${PARAMS_EXTRACT_TO} + INPUT ${arg_SAVE_AS} + DESTINATION ${arg_EXTRACT_TO} ) endif() endfunction() function(exp_expand_3rd_path_expression) - cmake_parse_arguments(PARAMS "" "OUTPUT;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "INPUT" ${ARGN}) - - foreach(I ${PARAMS_INPUT}) - set(TEMP "${I}") - if (DEFINED PARAMS_SOURCE_DIR) - string(REPLACE "$" ${PARAMS_SOURCE_DIR} TEMP ${TEMP}) + set(options "") + set(singleValueArgs OUTPUT SOURCE_DIR BINARY_DIR INSTALL_DIR) + set(multiValueArgs INPUT) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) + + foreach(i ${arg_INPUT}) + set(temp "${i}") + if (DEFINED arg_SOURCE_DIR) + string(REPLACE "$" ${arg_SOURCE_DIR} temp ${temp}) endif() - if (DEFINED PARAMS_BINARY_DIR) - string(REPLACE "$" ${PARAMS_BINARY_DIR} TEMP ${TEMP}) + if (DEFINED arg_BINARY_DIR) + string(REPLACE "$" ${arg_BINARY_DIR} temp ${temp}) endif() - if (DEFINED PARAMS_INSTALL_DIR) - string(REPLACE "$" ${PARAMS_INSTALL_DIR} TEMP ${TEMP}) + if (DEFINED arg_INSTALL_DIR) + string(REPLACE "$" ${arg_INSTALL_DIR} temp ${temp}) endif() - list(APPEND RESULT ${TEMP}) + list(APPEND result ${temp}) endforeach() - set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) + set(${arg_OUTPUT} ${result} PARENT_SCOPE) endfunction() function(exp_get_3rd_platform_value) - cmake_parse_arguments(PARAMS "" "OUTPUT" "INPUT" ${ARGN}) - - set(PLATFORM_KEYWORDS "Windows;Darwin;Linux") - - set(HAS_KEYWORDS FALSE) - foreach (I ${PARAMS_INPUT}) - foreach (K ${PLATFORM_KEYWORDS}) - if (${I} STREQUAL ${K}) - set(HAS_KEYWORDS TRUE) + set(options "") + set(singleValueArgs OUTPUT) + set(multiValueArgs INPUT) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(platform_keywords "Windows;Darwin;Linux") + + set(has_keywords FALSE) + foreach (i ${arg_INPUT}) + foreach (k ${platform_keywords}) + if (${i} STREQUAL ${k}) + set(has_keywords TRUE) break() endif() endforeach() - if (${HAS_KEYWORDS}) + if (${has_keywords}) break() endif() endforeach() - set(START_LOG FALSE) - foreach (I ${PARAMS_INPUT}) - if ((NOT ${START_LOG}) AND (${I} STREQUAL ${CMAKE_SYSTEM_NAME})) - set(START_LOG TRUE) + set(start_log FALSE) + foreach (i ${arg_INPUT}) + if ((NOT ${start_log}) AND (${i} STREQUAL ${CMAKE_SYSTEM_NAME})) + set(start_log TRUE) continue() endif() - if (NOT ${START_LOG}) + if (NOT ${start_log}) continue() endif() - set(END_LOG FALSE) - foreach (K ${PLATFORM_KEYWORDS}) - if (${K} STREQUAL ${I}) - set(END_LOG TRUE) + set(end_log FALSE) + foreach (k ${platform_keywords}) + if (${k} STREQUAL ${i}) + set(end_log TRUE) break() endif() endforeach() - if (${END_LOG}) + if (${end_log}) break() endif() - list(APPEND RESULT ${I}) + list(APPEND result ${i}) endforeach () - if (${HAS_KEYWORDS}) - set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) + if (${has_keywords}) + set(${arg_OUTPUT} ${result} PARENT_SCOPE) else() - set(${PARAMS_OUTPUT} ${PARAMS_INPUT} PARENT_SCOPE) + set(${arg_OUTPUT} ${arg_INPUT} PARENT_SCOPE) endif() endfunction() function(exp_add_3rd_header_only_package) - cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR;INSTALL_DIR" "INSTALL_FILES;INCLUDE" ${ARGN}) + set(options "") + set(singleValueArgs NAME SOURCE_DIR INSTALL_DIR) + set(multiValueArgs INSTALL_FILES INCLUDE) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - add_library(${PARAMS_NAME} INTERFACE) + add_library(${arg_NAME} INTERFACE) - if (DEFINED PARAMS_INSTALL_DIR AND DEFINED PARAMS_INSTALL_FILES) - foreach (INSTALL_FILE ${PARAMS_INSTALL_FILES}) - if (IS_DIRECTORY ${PARAMS_SOURCE_DIR}/${INSTALL_FILE}) - list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${PARAMS_SOURCE_DIR}/${INSTALL_FILE} ${PARAMS_INSTALL_DIR}/${INSTALL_FILE}) + if (DEFINED arg_INSTALL_DIR AND DEFINED arg_INSTALL_FILES) + foreach (install_file ${arg_INSTALL_FILES}) + if (IS_DIRECTORY ${arg_SOURCE_DIR}/${install_file}) + list(APPEND commands COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${arg_SOURCE_DIR}/${install_file} ${arg_INSTALL_DIR}/${install_file}) else () - list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PARAMS_SOURCE_DIR}/${INSTALL_FILE} ${PARAMS_INSTALL_DIR}/${INSTALL_FILE}) + list(APPEND commands COMMAND ${CMAKE_COMMAND} -E copy_if_different ${arg_SOURCE_DIR}/${install_file} ${arg_INSTALL_DIR}/${install_file}) endif () endforeach () add_custom_target( - ${PARAMS_NAME}.Install - COMMAND ${COMMANDS} + ${arg_NAME}.Install + COMMAND ${commands} ) - add_dependencies(${PARAMS_NAME} ${PARAMS_NAME}.Install) + add_dependencies(${arg_NAME} ${arg_NAME}.Install) endif () - if (DEFINED PARAMS_INCLUDE) + if (DEFINED arg_INCLUDE) exp_expand_3rd_path_expression( - INPUT ${PARAMS_INCLUDE} - OUTPUT R_INCLUDE - SOURCE_DIR ${PARAMS_SOURCE_DIR} - INSTALL_DIR ${PARAMS_INSTALL_DIR} + INPUT ${arg_INCLUDE} + OUTPUT r_include + SOURCE_DIR ${arg_SOURCE_DIR} + INSTALL_DIR ${arg_INSTALL_DIR} ) exp_get_3rd_platform_value( - OUTPUT P_INCLUDE - INPUT ${R_INCLUDE} + OUTPUT p_include + INPUT ${r_include} ) target_include_directories( - ${PARAMS_NAME} - INTERFACE ${P_INCLUDE} + ${arg_NAME} + INTERFACE ${p_include} ) endif () endfunction() function(exp_add_3rd_binary_package) - cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR" "INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) + set(options "") + set(singleValueArgs NAME SOURCE_DIR) + set(multiValueArgs INCLUDE LINK LIB RUNTIME_DEP) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - add_library(${PARAMS_NAME} INTERFACE) + add_library(${arg_NAME} INTERFACE) - if (DEFINED PARAMS_INCLUDE) + if (DEFINED arg_INCLUDE) exp_expand_3rd_path_expression( - INPUT ${PARAMS_INCLUDE} - OUTPUT R_INCLUDE - SOURCE_DIR ${PARAMS_SOURCE_DIR} + INPUT ${arg_INCLUDE} + OUTPUT r_include + SOURCE_DIR ${arg_SOURCE_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_INCLUDE} - OUTPUT P_INCLUDE + INPUT ${r_include} + OUTPUT p_include ) target_include_directories( - ${PARAMS_NAME} - INTERFACE ${P_INCLUDE} + ${arg_NAME} + INTERFACE ${p_include} ) endif() - if (DEFINED PARAMS_LINK) + if (DEFINED arg_LINK) exp_expand_3rd_path_expression( - INPUT ${PARAMS_LINK} - OUTPUT R_LINK - SOURCE_DIR ${PARAMS_SOURCE_DIR} + INPUT ${arg_LINK} + OUTPUT r_link + SOURCE_DIR ${arg_SOURCE_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_LINK} - OUTPUT P_LINK + INPUT ${r_link} + OUTPUT p_link ) target_link_directories( - ${PARAMS_NAME} - INTERFACE ${P_LINK} + ${arg_NAME} + INTERFACE ${p_link} ) endif() - if (DEFINED PARAMS_LIB) + if (DEFINED arg_LIB) exp_expand_3rd_path_expression( - INPUT ${PARAMS_LIB} - OUTPUT R_LIB - SOURCE_DIR ${PARAMS_SOURCE_DIR} + INPUT ${arg_LIB} + OUTPUT r_lib + SOURCE_DIR ${arg_SOURCE_DIR} ) exp_get_3rd_platform_value( - OUTPUT P_LIB - INPUT ${R_LIB} + OUTPUT p_lib + INPUT ${r_lib} ) target_link_libraries( - ${PARAMS_NAME} - INTERFACE "${P_LIB}" + ${arg_NAME} + INTERFACE "${p_lib}" ) endif() - if (DEFINED PARAMS_RUNTIME_DEP) + if (DEFINED arg_RUNTIME_DEP) exp_expand_3rd_path_expression( - INPUT ${PARAMS_RUNTIME_DEP} - OUTPUT R_RUNTIME_DEP - SOURCE_DIR ${PARAMS_SOURCE_DIR} + INPUT ${arg_RUNTIME_DEP} + OUTPUT r_runtime_dep + SOURCE_DIR ${arg_SOURCE_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_RUNTIME_DEP} - OUTPUT P_RUNTIME_DEP + INPUT ${r_runtime_dep} + OUTPUT p_runtime_dep ) set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_DEP "${P_RUNTIME_DEP}" + ${arg_NAME} PROPERTIES + RUNTIME_DEP "${p_runtime_dep}" ) endif() endfunction() function(exp_add_3rd_cmake_package) - cmake_parse_arguments(PARAMS "" "NAME;SOURCE_DIR;BINARY_DIR;INSTALL_DIR" "CMAKE_ARG;INCLUDE;LINK;LIB;RUNTIME_DEP" ${ARGN}) + set(options "") + set(singleValueArgs NAME SOURCE_DIR BINARY_DIR INSTALL_DIR) + set(multiValueArgs CMAKE_ARG INCLUDE LINK LIB RUNTIME_DEP) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT ${GENERATOR_IS_MULTI_CONFIG}) - set(CMAKE_BUILD_TYPE_ARGS -DCMAKE_BUILD_TYPE=$) + if (NOT ${generator_is_multi_config}) + set(build_type_args -DCMAKE_BUILD_TYPE=$) endif () ExternalProject_Add( - ${PARAMS_NAME}.External - SOURCE_DIR ${PARAMS_SOURCE_DIR} - BINARY_DIR ${PARAMS_BINARY_DIR} - CMAKE_ARGS ${CMAKE_BUILD_TYPE_ARGS} -DCMAKE_INSTALL_PREFIX=${PARAMS_INSTALL_DIR} ${PARAMS_CMAKE_ARG} + ${arg_NAME}.External + SOURCE_DIR ${arg_SOURCE_DIR} + BINARY_DIR ${arg_BINARY_DIR} + CMAKE_ARGS ${build_type_args} -DCMAKE_INSTALL_PREFIX=${arg_INSTALL_DIR} ${arg_CMAKE_ARG} BUILD_COMMAND ${CMAKE_COMMAND} --build --config $ -j 16 INSTALL_COMMAND ${CMAKE_COMMAND} --install --config $ ) - add_library(${PARAMS_NAME} INTERFACE) - add_dependencies(${PARAMS_NAME} ${PARAMS_NAME}.External) + add_library(${arg_NAME} INTERFACE) + add_dependencies(${arg_NAME} ${arg_NAME}.External) - if (DEFINED PARAMS_INCLUDE) + if (DEFINED arg_INCLUDE) exp_expand_3rd_path_expression( - INPUT ${PARAMS_INCLUDE} - OUTPUT R_INCLUDE - SOURCE_DIR ${PARAMS_SOURCE_DIR} - BINARY_DIR ${PARAMS_BINARY_DIR} - INSTALL_DIR ${PARAMS_INSTALL_DIR} + INPUT ${arg_INCLUDE} + OUTPUT r_include + SOURCE_DIR ${arg_SOURCE_DIR} + BINARY_DIR ${arg_BINARY_DIR} + INSTALL_DIR ${arg_INSTALL_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_INCLUDE} - OUTPUT P_INCLUDE + INPUT ${r_include} + OUTPUT p_include ) target_include_directories( - ${PARAMS_NAME} - INTERFACE ${P_INCLUDE} + ${arg_NAME} + INTERFACE ${p_include} ) endif() - if (DEFINED PARAMS_LINK) + if (DEFINED arg_LINK) exp_expand_3rd_path_expression( - INPUT ${PARAMS_LINK} - OUTPUT R_LINK - SOURCE_DIR ${PARAMS_SOURCE_DIR} - BINARY_DIR ${PARAMS_BINARY_DIR} - INSTALL_DIR ${PARAMS_INSTALL_DIR} + INPUT ${arg_LINK} + OUTPUT r_link + SOURCE_DIR ${arg_SOURCE_DIR} + BINARY_DIR ${arg_BINARY_DIR} + INSTALL_DIR ${arg_INSTALL_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_LINK} - OUTPUT P_LINK + INPUT ${r_link} + OUTPUT p_link ) target_link_directories( - ${PARAMS_NAME} - INTERFACE ${P_LINK} + ${arg_NAME} + INTERFACE ${p_link} ) endif() - if (DEFINED PARAMS_LIB) + if (DEFINED arg_LIB) exp_expand_3rd_path_expression( - INPUT ${PARAMS_LIB} - OUTPUT R_LIB - SOURCE_DIR ${PARAMS_SOURCE_DIR} - BINARY_DIR ${PARAMS_BINARY_DIR} - INSTALL_DIR ${PARAMS_INSTALL_DIR} + INPUT ${arg_LIB} + OUTPUT r_lib + SOURCE_DIR ${arg_SOURCE_DIR} + BINARY_DIR ${arg_BINARY_DIR} + INSTALL_DIR ${arg_INSTALL_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_LIB} - OUTPUT P_LIB + INPUT ${r_lib} + OUTPUT p_lib ) target_link_libraries( - ${PARAMS_NAME} - INTERFACE "${P_LIB}" + ${arg_NAME} + INTERFACE "${p_lib}" ) endif() - if (DEFINED PARAMS_RUNTIME_DEP) + if (DEFINED arg_RUNTIME_DEP) exp_expand_3rd_path_expression( - INPUT ${PARAMS_RUNTIME_DEP} - OUTPUT R_RUNTIME_DEP - SOURCE_DIR ${PARAMS_SOURCE_DIR} - BINARY_DIR ${PARAMS_BINARY_DIR} - INSTALL_DIR ${PARAMS_INSTALL_DIR} + INPUT ${arg_RUNTIME_DEP} + OUTPUT r_runtime_dep + SOURCE_DIR ${arg_SOURCE_DIR} + BINARY_DIR ${arg_BINARY_DIR} + INSTALL_DIR ${arg_INSTALL_DIR} ) exp_get_3rd_platform_value( - INPUT ${R_RUNTIME_DEP} - OUTPUT P_RUNTIME_DEP + INPUT ${r_runtime_dep} + OUTPUT p_runtime_dep ) set_target_properties( - ${PARAMS_NAME} PROPERTIES - RUNTIME_DEP "${P_RUNTIME_DEP}" + ${arg_NAME} PROPERTIES + RUNTIME_DEP "${p_runtime_dep}" ) endif() endfunction() function(exp_add_3rd_alias_package) - cmake_parse_arguments(PARAMS "" "NAME" "LIB" ${ARGN}) + set(options "") + set(singleValueArgs NAME) + set(multiValueArgs LIB) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - add_library(${PARAMS_NAME} INTERFACE) + add_library(${arg_NAME} INTERFACE) target_link_libraries( - ${PARAMS_NAME} - INTERFACE "${PARAMS_LIB}" + ${arg_NAME} + INTERFACE "${arg_LIB}" ) endfunction() diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index 3098f418c..fc6074434 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -111,10 +111,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") endif () # ---- begin shaders --------------------------------------------------------------------------------- -get_engine_shader_resources( - NAME Editor - OUTPUT EDITOR_RESOURCES -) +get_engine_shader_resources(OUTPUT EDITOR_RESOURCES) file(GLOB_RECURSE SHADERS Shader/*.es*) foreach (SHADER ${SHADERS}) diff --git a/Engine/CMakeLists.txt b/Engine/CMakeLists.txt index de4c581ff..cbb69742a 100644 --- a/Engine/CMakeLists.txt +++ b/Engine/CMakeLists.txt @@ -1,14 +1,17 @@ add_subdirectory(Source) function(get_engine_shader_resources) - cmake_parse_arguments(PARAMS "" "NAME" "OUTPUT" ${ARGN}) + set(options "") + set(singleValueArgs OUTPUT) + set(multiValueArgs "") + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - file(GLOB_RECURSE ENGINE_SHADERS ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader/*.es*) - foreach (SHADER ${ENGINE_SHADERS}) - get_filename_component(SHADER_ABSOLUTE ${SHADER} ABSOLUTE) - string(REPLACE ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader ../Shader/${ENGINE_SUB_PROJECT_NAME} COPY_DST ${SHADER_ABSOLUTE}) - list(APPEND RESULT ${SHADER}->${COPY_DST}) + file(GLOB_RECURSE engine_shaders ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader/*.es*) + foreach (shader ${engine_shaders}) + get_filename_component(shader_absolute ${shader} ABSOLUTE) + string(REPLACE ${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader ../Shader/${ENGINE_SUB_PROJECT_NAME} copy_dst ${shader_absolute}) + list(APPEND result ${shader}->${copy_dst}) endforeach () - set(${PARAMS_OUTPUT} ${RESULT} PARENT_SCOPE) + set(${arg_OUTPUT} ${result} PARENT_SCOPE) endfunction() diff --git a/Sample/CMakeLists.txt b/Sample/CMakeLists.txt index b161eee91..71d6c2f74 100644 --- a/Sample/CMakeLists.txt +++ b/Sample/CMakeLists.txt @@ -1,37 +1,40 @@ function(add_sample) - cmake_parse_arguments(PARAMS "" "NAME" "SRC;INC;SHADER;IMAGE;MODEL" ${ARGN}) + set(options "") + set(singleValueArgs NAME) + set(multiValueArgs SRC INC SHADER IMAGE MODEL) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - set(PLATFORM_DEP_TARGET RHI-DirectX12 RHI-Vulkan) + set(platform_dep_target RHI-DirectX12 RHI-Vulkan) else() - set(PLATFORM_DEP_TARGET RHI-Vulkan) + set(platform_dep_target RHI-Vulkan) endif() - foreach(S ${PARAMS_SHADER}) - set(path "${CMAKE_CURRENT_SOURCE_DIR}/${S}->../Test/Sample/${S}") - list(APPEND PATHS ${path}) + foreach(s ${arg_SHADER}) + set(path "${CMAKE_CURRENT_SOURCE_DIR}/${s}->../Test/Sample/${s}") + list(APPEND paths ${path}) endforeach() - foreach(I ${PARAMS_IMAGE}) - set(path "${CMAKE_CURRENT_SOURCE_DIR}/${I}->../Test/Sample/${I}") - list(APPEND PATHS ${path}) + foreach(i ${arg_IMAGE}) + set(path "${CMAKE_CURRENT_SOURCE_DIR}/${i}->../Test/Sample/${i}") + list(APPEND paths ${path}) endforeach() - foreach(M ${PARAMS_MODEL}) - set(path "${CMAKE_CURRENT_SOURCE_DIR}/${M}->../Test/Sample/${M}") - list(APPEND PATHS ${path}) + foreach(m ${arg_MODEL}) + set(path "${CMAKE_CURRENT_SOURCE_DIR}/${m}->../Test/Sample/${m}") + list(APPEND paths ${path}) endforeach() - list(APPEND PATHS "${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader/Platform.esh->../Test/Sample/ShaderInclude/Platform.esh") + list(APPEND paths "${CMAKE_SOURCE_DIR}/${ENGINE_SUB_PROJECT_NAME}/Shader/Platform.esh->../Test/Sample/ShaderInclude/Platform.esh") exp_add_executable( SAMPLE - NAME ${PARAMS_NAME} - SRC ${PARAMS_SRC} - INC ${PARAMS_INC} + NAME ${arg_NAME} + SRC ${arg_SRC} + INC ${arg_INC} LIB Sample-Base - DEP_TARGET ${PLATFORM_DEP_TARGET} - RES ${PATHS} + DEP_TARGET ${platform_dep_target} + RES ${paths} NOT_INSTALL ) endfunction() diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index f1ebdd6e2..f06dc4cc8 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -6,50 +6,56 @@ set(3RD_BINARY_DIR ${CMAKE_BINARY_DIR}/ThirdPartyBuild CACHE PATH "" FORCE) set(3RD_INSTALL_DIR ${CMAKE_BINARY_DIR}/ThirdPartyInstall CACHE PATH "" FORCE) function(download_and_setup_3rd_package) - cmake_parse_arguments(PARAMS "" "NAME" "PLATFORM;VERSION;HASH" ${ARGN}) + set(options "") + set(singleValueArgs NAME) + set(multiValueArgs PLATFORM VERSION HASH) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) exp_get_3rd_platform_value( - OUTPUT VERSION_VALUE - INPUT ${PARAMS_VERSION} + OUTPUT version_value + INPUT ${arg_VERSION} ) - set(CUR_PLATFORM All ${CMAKE_SYSTEM_NAME}) - foreach (PLATFORM ${CUR_PLATFORM}) - if (${PLATFORM} IN_LIST PARAMS_PLATFORM) - set(FULL_NAME "${PARAMS_NAME}-${PLATFORM}-${VERSION_VALUE}") + set(cur_platform All ${CMAKE_SYSTEM_NAME}) + foreach (platform ${cur_platform}) + if (${platform} IN_LIST arg_PLATFORM) + set(full_name "${arg_NAME}-${platform}-${version_value}") endif () endforeach () - if (NOT DEFINED FULL_NAME) - set(${PARAMS_NAME}_READY FALSE PARENT_SCOPE) + if (NOT DEFINED full_name) + set(${arg_NAME}_READY FALSE PARENT_SCOPE) return() endif () - set(SOURCE_DIR ${3RD_SOURCE_DIR}/${FULL_NAME}) + set(source_dir ${3RD_SOURCE_DIR}/${full_name}) exp_download_and_extract_3rd_package( - URL ${3RD_REPO}/${FULL_NAME}.7z - SAVE_AS ${3RD_ZIP_DIR}/${FULL_NAME}.7z - EXTRACT_TO ${SOURCE_DIR} - HASH ${PARAMS_HASH} + URL ${3RD_REPO}/${full_name}.7z + SAVE_AS ${3RD_ZIP_DIR}/${full_name}.7z + EXTRACT_TO ${source_dir} + HASH ${arg_HASH} ) - set(${PARAMS_NAME}_READY TRUE PARENT_SCOPE) - set(${PARAMS_NAME}_SOURCE_DIR ${SOURCE_DIR} PARENT_SCOPE) - set(${PARAMS_NAME}_BINARY_DIR ${3RD_BINARY_DIR}/${PARAMS_NAME} PARENT_SCOPE) - set(${PARAMS_NAME}_INSTALL_DIR ${3RD_INSTALL_DIR}/${PARAMS_NAME}/$ PARENT_SCOPE) + set(${arg_NAME}_READY TRUE PARENT_SCOPE) + set(${arg_NAME}_SOURCE_DIR ${source_dir} PARENT_SCOPE) + set(${arg_NAME}_BINARY_DIR ${3RD_BINARY_DIR}/${arg_NAME} PARENT_SCOPE) + set(${arg_NAME}_INSTALL_DIR ${3RD_INSTALL_DIR}/${arg_NAME}/$ PARENT_SCOPE) endfunction() function(should_setup_3rd_package) - cmake_parse_arguments(PARAMS "" "NAME" "PLATFORM" ${ARGN}) + set(options "") + set(singleValueArgs NAME) + set(multiValueArgs PLATFORM) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) - set(CUR_PLATFORM All ${CMAKE_SYSTEM_NAME}) - foreach (PLATFORM ${CUR_PLATFORM}) - if (${PLATFORM} IN_LIST PARAMS_PLATFORM) - set(${PARAMS_NAME}_READY TRUE PARENT_SCOPE) + set(cur_platform All ${CMAKE_SYSTEM_NAME}) + foreach (platform ${cur_platform}) + if (${platform} IN_LIST arg_PLATFORM) + set(${arg_NAME}_READY TRUE PARENT_SCOPE) return() endif () endforeach () - set(${PARAMS_NAME}_READY FALSE PARENT_SCOPE) + set(${arg_NAME}_READY FALSE PARENT_SCOPE) endfunction() # DirectX 12 Headers From 4871b28aa243bb1d30f8ddfe1aee91440e0308a9 Mon Sep 17 00:00:00 2001 From: FlyAntNotDown <461425614@qq.com> Date: Sun, 23 Nov 2025 17:39:40 +0800 Subject: [PATCH 21/23] fix: macos build --- CMake/Target.cmake | 23 +++++++---------------- Editor/CMakeLists.txt | 10 +++++----- Engine/Source/Render/CMakeLists.txt | 5 ++--- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/CMake/Target.cmake b/CMake/Target.cmake index ddec6dcd8..97e9dc4dd 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -506,22 +506,13 @@ function(exp_add_library) ) endif () - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR "${arg_TYPE}" STREQUAL "STATIC") - install( - TARGETS ${arg_NAME} - EXPORT ${SUB_PROJECT_NAME}Targets - ARCHIVE DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib - LIBRARY DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib - RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries - ) - endif () - if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND "${arg_TYPE}" STREQUAL "SHARED") - install( - FILES $ - DESTINATION ${SUB_PROJECT_NAME}/Binaries - ) - endif () - + install( + TARGETS ${arg_NAME} + EXPORT ${SUB_PROJECT_NAME}Targets + ARCHIVE DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib + LIBRARY DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib + RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries + ) if ("${arg_TYPE}" STREQUAL "SHARED") install( FILES $ diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index fc6074434..0b51913ce 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -78,10 +78,10 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources.pak ${QT_LIB_PREFIX}/resources/qtwebengine_resources.debug.pak COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources_100p.pak ${QT_LIB_PREFIX}/resources/qtwebengine_resources_100p.debug.pak COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources_200p.pak ${QT_LIB_PREFIX}/resources/qtwebengine_resources_200p.debug.pak - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_devtools_resources.pak ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/qtwebengine_devtools_resources.pak - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources.pak ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/qtwebengine_resources.pak - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources_100p.pak ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/qtwebengine_resources_100p.pak - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources_200p.pak ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/qtwebengine_resources_200p.pak + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_devtools_resources.pak $/resources/qtwebengine_devtools_resources.pak + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources.pak $/resources/qtwebengine_resources.pak + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources_100p.pak $/resources/qtwebengine_resources_100p.pak + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_LIB_PREFIX}/resources/qtwebengine_resources_200p.pak $/resources/qtwebengine_resources_200p.pak # -- QT 6.9.1 Temporal Fix End COMMAND ${QT_WIN_DEPLOY_EXECUTABLE} $ ) @@ -92,7 +92,7 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") set(QT_MAC_DEPLOY_EXECUTABLE ${QT_LIB_PREFIX}/bin/macdeployqt) add_custom_command( TARGET Editor POST_BUILD - COMMAND ${QT_MAC_DEPLOY_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Editor.app -no-strip + COMMAND ${QT_MAC_DEPLOY_EXECUTABLE} $/Editor.app -no-strip ) install( CODE "execute_process(COMMAND ${QT_MAC_DEPLOY_EXECUTABLE} ${CMAKE_INSTALL_PREFIX}/${ENGINE_SUB_PROJECT_NAME}/Binaries/Editor.app -no-strip)" diff --git a/Engine/Source/Render/CMakeLists.txt b/Engine/Source/Render/CMakeLists.txt index 0e14bcb4e..fbd8cd6e7 100644 --- a/Engine/Source/Render/CMakeLists.txt +++ b/Engine/Source/Render/CMakeLists.txt @@ -1,5 +1,5 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - set(PLATFORM_LIBS VulkanSDK) + set(platform_libs VulkanSDK) endif() file(GLOB SOURCES Src/*.cpp) @@ -8,9 +8,8 @@ exp_add_library( TYPE STATIC SRC ${SOURCES} PUBLIC_INC Include - PRIVATE_LIB ${PLATFORM_LIBS} PUBLIC_LIB Core RHI - PUBLIC_MERGE_LIB dxc spirv-cross + PUBLIC_MERGE_LIB dxc spirv-cross ${platform_libs} ) file(GLOB SHARED_SOURCES SharedSrc/*.cpp) From 1b68289f91565e784d6cb65307fb969e4f8a2a50 Mon Sep 17 00:00:00 2001 From: FlyAntNotDown <461425614@qq.com> Date: Sun, 23 Nov 2025 18:08:50 +0800 Subject: [PATCH 22/23] ci: setup node.js --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fd6d60113..78c145247 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,6 +37,11 @@ jobs: - name: Checkout Repo uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: 24 + - name: Setup cmake uses: jwlawson/actions-setup-cmake@v2 with: From 42a711afb3a8d9b0ff58efaa71001cf48a41db22 Mon Sep 17 00:00:00 2001 From: kindem Date: Sun, 23 Nov 2025 18:56:50 +0800 Subject: [PATCH 23/23] fix: msvc install --- CMake/Common.cmake | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/CMake/Common.cmake b/CMake/Common.cmake index 8b2206482..70614f2fa 100644 --- a/CMake/Common.cmake +++ b/CMake/Common.cmake @@ -10,11 +10,8 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ${EXPORT_COMPILE_COMMANDS}) get_cmake_property(generator_is_multi_config GENERATOR_IS_MULTI_CONFIG) if (${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT}) - if (${generator_is_multi_config}) - set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install/$ CACHE PATH "" FORCE) - else () - set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install CACHE PATH "" FORCE) - endif () + # TODO support multi config generator for CMAKE_INSTALL_PREFIX + set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install CACHE PATH "" FORCE) endif() add_definitions(-DBUILD_CONFIG_DEBUG=$,$>,1,0>)