Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,5 @@ jobs:

- name: Install
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target install -j ${{env.MAKE_THREAD_NUM}}

# TODO build test project
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,18 @@
cmake-build*
build*

# Installed
Installed

# 3rd
ThirdParty/Zip
ThirdParty/Lib
ThirdParty/ConanRecipes/**/src
ThirdParty/ConanRecipes/**/build
ThirdParty/ConanRecipes/**/CMakeUserPresets.json

# Test Project
TestProject/.idea
TestProject/.vscode
TestProject/cmake-build*
TestProject/build*
6 changes: 1 addition & 5 deletions CMake/Common.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
include(ExternalProject)
include(GenerateExportHeader)

option(USE_UNITY_BUILD "Use unity build" ON)
option(EXPORT_COMPILE_COMMANDS "Whether to export all compile commands" OFF)

Expand All @@ -10,8 +7,7 @@ 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})
# TODO support multi config generator for CMAKE_INSTALL_PREFIX
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install CACHE PATH "" FORCE)
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/Installed CACHE PATH "" FORCE)
endif()

add_definitions(-DBUILD_CONFIG_DEBUG=$<IF:$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>,1,0>)
Expand Down
10 changes: 10 additions & 0 deletions CMake/Config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
@PACKAGE_INIT@

file(GLOB_RECURSE cmake_libs ${CMAKE_CURRENT_LIST_DIR}/CMake/*.cmake)
foreach (cmake_lib ${cmake_libs})
include(${cmake_lib})
endforeach ()

include(${CMAKE_CURRENT_LIST_DIR}/@SUB_PROJECT_NAME@Targets.cmake)

check_required_components(@SUB_PROJECT_NAME@)
176 changes: 80 additions & 96 deletions CMake/Target.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
include(GenerateExportHeader)
include(CMakePackageConfigHelpers)

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(BASE_TARGETS_FOLDER "${ENGINE_SUB_PROJECT_NAME}" CACHE STRING "" FORCE)
set(SAMPLE_TARGETS_FOLDER "${BASE_TARGETS_FOLDER}/Sample" CACHE STRING "" FORCE)
set(GENERATED_DIR ${CMAKE_BINARY_DIR}/Generated CACHE PATH "" FORCE)
set(GENERATED_API_HEADER_DIR ${GENERATED_DIR}/Api CACHE PATH "" FORCE)
set(GENERATED_MIRROR_INFO_SRC_DIR ${GENERATED_DIR}/MirrorInfoSrc CACHE PATH "" FORCE)
set(BASE_TARGETS_FOLDER "${SUB_PROJECT_NAME}" CACHE STRING "" FORCE)
set(AUX_TARGETS_FOLDER "${BASE_TARGETS_FOLDER}/Aux" CACHE STRING "" FORCE)

if (${BUILD_TEST})
Expand All @@ -13,6 +16,10 @@ else()
add_definitions(-DBUILD_TEST=0)
endif()

if ("${SUB_PROJECT_NAME}" STREQUAL "")
message(FATAL_ERROR "SUB_PROJECT_NAME not defined, please set it in your project cmake")
endif ()

function(exp_gather_target_runtime_dependencies_recurse)
set(options "")
set(singleValueArgs NAME OUT_RUNTIME_DEP OUT_DEP_TARGET)
Expand All @@ -26,20 +33,7 @@ function(exp_gather_target_runtime_dependencies_recurse)

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}")

get_target_property(type ${arg_NAME} TYPE)
if (${type} STREQUAL "SHARED_LIBRARY")
set(target_bin_dir $<TARGET_FILE_DIR:${arg_NAME}>)
else ()
set(target_bin_dir $<TARGET_FILE_DIR:${arg_NAME}>/../Binaries)
endif ()
string(REPLACE "$<TARGET_BIN_DIR>" ${target_bin_dir} temp_r ${r})
list(APPEND result_runtime_dep ${temp_r})
endforeach()
list(APPEND result_runtime_dep ${runtime_dep})
endif()

get_target_property(libs ${arg_NAME} LINK_LIBRARIES)
Expand Down Expand Up @@ -93,6 +87,7 @@ function(exp_process_runtime_dependencies)
list(APPEND dep_targets ${dep_dep_targets})
endforeach ()

set(copy_commands COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:${arg_NAME}>)
foreach(r ${runtime_deps})
list(APPEND copy_commands COMMAND ${CMAKE_COMMAND} -E copy_if_different ${r} $<TARGET_FILE_DIR:${arg_NAME}>)
endforeach()
Expand Down Expand Up @@ -255,7 +250,7 @@ function(exp_add_mirror_info_source_generation_target)
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")
set(output_source "${GENERATED_MIRROR_INFO_SRC_DIR}/${dir}/${filename}.generated.cpp")
list(APPEND output_sources ${output_source})

add_custom_command(
Expand All @@ -281,15 +276,11 @@ function(exp_add_mirror_info_source_generation_target)
endfunction()

function(exp_add_executable)
set(options SAMPLE NOT_INSTALL)
set(singleValueArgs NAME)
set(options NOT_INSTALL)
set(singleValueArgs NAME FOLDER)
set(multiValueArgs SRC INC LINK LIB DEP_TARGET RES REFLECT)
cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN})

if (${arg_SAMPLE} AND (NOT ${BUILD_SAMPLE}))
return()
endif()

if (${arg_NOT_INSTALL})
set(not_install_flag NOT_INSTALL)
else ()
Expand All @@ -312,8 +303,8 @@ function(exp_add_executable)
${arg_NAME}
PRIVATE ${arg_SRC} ${generated_src}
)
if (${arg_SAMPLE})
set_target_properties(${arg_NAME} PROPERTIES FOLDER ${SAMPLE_TARGETS_FOLDER})
if (DEFINED arg_FOLDER)
set_target_properties(${arg_NAME} PROPERTIES FOLDER ${BASE_TARGETS_FOLDER}/${arg_FOLDER})
else ()
set_target_properties(${arg_NAME} PROPERTIES FOLDER ${BASE_TARGETS_FOLDER})
endif ()
Expand Down Expand Up @@ -386,11 +377,11 @@ endfunction()
function(exp_add_library)
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)
set(multiValueArgs SRC PRIVATE_INC PUBLIC_INC PRIVATE_LINK PUBLIC_LINK PRIVATE_LIB PUBLIC_LIB REFLECT)
cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN})

if ("${arg_TYPE}" STREQUAL "SHARED")
list(APPEND arg_PUBLIC_INC ${API_HEADER_DIR}/${arg_NAME})
list(APPEND arg_PUBLIC_INC ${GENERATED_API_HEADER_DIR}/${arg_NAME})
endif ()

if (DEFINED arg_REFLECT)
Expand Down Expand Up @@ -438,86 +429,33 @@ function(exp_add_library)
)

foreach (inc ${arg_PUBLIC_INC})
list(APPEND public_inc ${inc})
endforeach ()
foreach (lib ${arg_PUBLIC_MERGE_LIB})
if (TARGET ${lib})
list(APPEND public_inc $<TARGET_PROPERTY:${lib},INTERFACE_INCLUDE_DIRECTORIES>)
endif ()
endforeach ()

foreach (inc ${public_inc})
string(REGEX MATCH "\\$\\<.+\\>" match ${inc})
if (match)
list(APPEND public_build_inc $<BUILD_INTERFACE:${inc}>)
else ()
get_filename_component(absolute_inc ${inc} ABSOLUTE)
list(APPEND public_build_inc $<BUILD_INTERFACE:${absolute_inc}>)
endif ()
get_filename_component(absolute_inc ${inc} ABSOLUTE)
list(APPEND public_build_inc $<BUILD_INTERFACE:${absolute_inc}>)
endforeach ()
target_include_directories(
${arg_NAME}
PRIVATE ${arg_PRIVATE_INC}
PUBLIC ${public_build_inc} $<INSTALL_INTERFACE:${SUB_PROJECT_NAME}/Target/${arg_NAME}/Include>
)

target_link_directories(
${arg_NAME}
PRIVATE ${arg_PRIVATE_LINK}
PUBLIC ${arg_PUBLIC_LINK}
)

foreach (lib ${arg_PRIVATE_MERGE_LIB})
list(APPEND merge_lib ${lib})
endforeach ()
foreach (lib ${arg_PUBLIC_MERGE_LIB})
list(APPEND merge_lib ${lib})
endforeach ()

foreach (lib ${merge_lib})
list(APPEND build_merge_lib $<BUILD_INTERFACE:${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(
${arg_NAME}
PRIVATE ${build_merge_lib}
PRIVATE ${arg_PRIVATE_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_dir}/${FILE_NAME})
list(APPEND runtime_dep_files $<TARGET_BIN_DIR>/${FILE_NAME})
endforeach ()
add_custom_command(
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}")
set_target_properties(
${arg_NAME} PROPERTIES
EXPORT_PROPERTIES "RUNTIME_DEP"
RUNTIME_DEP "${runtime_dep_files}"
)
endif ()

if ("${arg_TYPE}" STREQUAL "SHARED")
string(TOUPPER ${arg_NAME}_API api_name)
string(REPLACE "-" "/" api_dir ${arg_NAME})

generate_export_header(
${arg_NAME}
EXPORT_MACRO_NAME ${api_name}
EXPORT_FILE_NAME ${API_HEADER_DIR}/${arg_NAME}/${api_dir}/Api.h
EXPORT_FILE_NAME ${GENERATED_API_HEADER_DIR}/${arg_NAME}/${api_dir}/Api.h
)
endif()

Expand All @@ -526,37 +464,31 @@ function(exp_add_library)
endif()

if (NOT ${arg_NOT_INSTALL})
foreach (inc ${public_inc})
foreach (inc ${arg_PUBLIC_INC})
list(APPEND install_inc ${inc}/)
endforeach ()
install(
DIRECTORY ${install_inc}
DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Include
)

if (DEFINED runtime_dep)
install(
FILES ${runtime_dep}
DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_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
RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries
)
export(
TARGETS ${arg_NAME}
NAMESPACE ${SUB_PROJECT_NAME}::
APPEND FILE ${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}Targets.cmake
)

if ("${arg_TYPE}" STREQUAL "SHARED")
install(
FILES $<TARGET_FILE:${arg_NAME}>
DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries
DESTINATION ${SUB_PROJECT_NAME}/Binaries
)
endif ()
endif ()
Expand Down Expand Up @@ -643,5 +575,57 @@ install(
EXPORT ${SUB_PROJECT_NAME}Targets
FILE ${SUB_PROJECT_NAME}Targets.cmake
NAMESPACE ${SUB_PROJECT_NAME}::
DESTINATION ${SUB_PROJECT_NAME}
)

configure_package_config_file(
${CMAKE_CURRENT_LIST_DIR}/Config.cmake.in
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}Config.cmake
INSTALL_DESTINATION ${SUB_PROJECT_NAME}/CMake
)

write_basic_package_version_file(
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}ConfigVersion.cmake
VERSION ${SUB_PROJECT_VERSION_MAJOR}.${SUB_PROJECT_VERSION_MINOR}.${SUB_PROJECT_VERSION_PATCH}
COMPATIBILITY SameMajorVersion
)

install(
FILES
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}Config.cmake
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}ConfigVersion.cmake
DESTINATION ${SUB_PROJECT_NAME}
)

file(GLOB_RECURSE preset_cmake_libs ${CMAKE_CURRENT_LIST_DIR}/*)
foreach (cmake_lib ${preset_cmake_libs})
file(
COPY ${cmake_lib}
DESTINATION ${CMAKE_BINARY_DIR}/CMake
)
endforeach ()
install(
FILES ${preset_cmake_libs}
DESTINATION ${SUB_PROJECT_NAME}/CMake
)

if (DEFINED SUB_PROJECT_CMAKE_LIBS)
foreach (cmake_lib ${SUB_PROJECT_CMAKE_LIBS})
if (IS_ABSOLUTE ${cmake_lib})
message(FATAL_ERROR "project cmake libs defined in SUB_PROJECT_CMAKE_LIBS should be relative path from project root")
endif ()

set(src_file ${CMAKE_SOURCE_DIR}/${cmake_lib})
get_filename_component(binary_tree_dst_dir ${CMAKE_BINARY_DIR}/CMake/${cmake_lib} DIRECTORY)
get_filename_component(install_tree_dst_dir ${SUB_PROJECT_NAME}/CMake/${cmake_lib} DIRECTORY)

file(
COPY ${src_file}
DESTINATION ${binary_tree_dst_dir}
)
install(
FILES ${src_file}
DESTINATION ${install_tree_dst_dir}
)
endforeach ()
endif ()
17 changes: 8 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@ set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES ${CMAKE_SOURCE_DIR}/conan_provider.cmake CA
project(Explosion)

option(BUILD_EDITOR "Build Explosion editor" ON)
option(BUILD_SAMPLE "Build samples" ON)

set(SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE)
set(ENGINE_SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE)
set(SUB_PROJECT_NAME "Explosion" CACHE STRING "" FORCE)
set(SUB_PROJECT_VERSION_MAJOR 0 CACHE STRING "" FORCE)
set(SUB_PROJECT_VERSION_MINOR 0 CACHE STRING "" FORCE)
set(SUB_PROJECT_VERSION_PATCH 1 CACHE STRING "" FORCE)
set(SUB_PROJECT_CMAKE_LIBS "ThirdParty/Registry.cmake" CACHE STRING "" FORCE)
set(USE_CONAN ON CACHE BOOL "" FORCE)

set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG "Release" CACHE STRING "" FORCE)
set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO "Release" CACHE STRING "" FORCE)
Expand All @@ -18,18 +23,12 @@ add_definitions(-DBUILD_EDITOR=$<BOOL:BUILD_EDITOR>)

include(CMake/Common.cmake)
include(CMake/Target.cmake)
include(ThirdParty/Registry.cmake)

add_subdirectory(ThirdParty)
add_subdirectory(Engine)
add_subdirectory(Tool)
add_subdirectory(Sample)

if (${BUILD_EDITOR})
add_subdirectory(Editor)
endif()

file(GLOB engine_cmake_libs CMake/*.cmake)
install(
FILES ${engine_cmake_libs}
DESTINATION ${SUB_PROJECT_NAME}/CMake
)
Loading