Skip to content

Commit 84a76e4

Browse files
Merge pull request #413 from FlyAndNotDown/master
2 parents bd9b363 + 7927320 commit 84a76e4

File tree

25 files changed

+189
-154
lines changed

25 files changed

+189
-154
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,5 @@ jobs:
6969

7070
- name: Install
7171
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target install -j ${{env.MAKE_THREAD_NUM}}
72+
73+
# TODO build test project

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,18 @@
88
cmake-build*
99
build*
1010

11+
# Installed
12+
Installed
13+
1114
# 3rd
1215
ThirdParty/Zip
1316
ThirdParty/Lib
1417
ThirdParty/ConanRecipes/**/src
1518
ThirdParty/ConanRecipes/**/build
1619
ThirdParty/ConanRecipes/**/CMakeUserPresets.json
20+
21+
# Test Project
22+
TestProject/.idea
23+
TestProject/.vscode
24+
TestProject/cmake-build*
25+
TestProject/build*

CMake/Common.cmake

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
include(ExternalProject)
2-
include(GenerateExportHeader)
3-
41
option(USE_UNITY_BUILD "Use unity build" ON)
52
option(EXPORT_COMPILE_COMMANDS "Whether to export all compile commands" OFF)
63

@@ -10,8 +7,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ${EXPORT_COMPILE_COMMANDS})
107

118
get_cmake_property(generator_is_multi_config GENERATOR_IS_MULTI_CONFIG)
129
if (${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT})
13-
# TODO support multi config generator for CMAKE_INSTALL_PREFIX
14-
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/Install CACHE PATH "" FORCE)
10+
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/Installed CACHE PATH "" FORCE)
1511
endif()
1612

1713
add_definitions(-DBUILD_CONFIG_DEBUG=$<IF:$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>,1,0>)

CMake/Config.cmake.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@PACKAGE_INIT@
2+
3+
file(GLOB_RECURSE cmake_libs ${CMAKE_CURRENT_LIST_DIR}/CMake/*.cmake)
4+
foreach (cmake_lib ${cmake_libs})
5+
include(${cmake_lib})
6+
endforeach ()
7+
8+
include(${CMAKE_CURRENT_LIST_DIR}/@SUB_PROJECT_NAME@Targets.cmake)
9+
10+
check_required_components(@SUB_PROJECT_NAME@)

CMake/Target.cmake

Lines changed: 80 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
include(GenerateExportHeader)
2+
include(CMakePackageConfigHelpers)
3+
14
option(BUILD_TEST "Build unit tests" ON)
2-
option(BUILD_SAMPLE "Build sample" ON)
35

4-
set(API_HEADER_DIR ${CMAKE_BINARY_DIR}/Generated/Api CACHE PATH "" FORCE)
5-
set(BASE_TARGETS_FOLDER "${ENGINE_SUB_PROJECT_NAME}" CACHE STRING "" FORCE)
6-
set(SAMPLE_TARGETS_FOLDER "${BASE_TARGETS_FOLDER}/Sample" CACHE STRING "" FORCE)
6+
set(GENERATED_DIR ${CMAKE_BINARY_DIR}/Generated CACHE PATH "" FORCE)
7+
set(GENERATED_API_HEADER_DIR ${GENERATED_DIR}/Api CACHE PATH "" FORCE)
8+
set(GENERATED_MIRROR_INFO_SRC_DIR ${GENERATED_DIR}/MirrorInfoSrc CACHE PATH "" FORCE)
9+
set(BASE_TARGETS_FOLDER "${SUB_PROJECT_NAME}" CACHE STRING "" FORCE)
710
set(AUX_TARGETS_FOLDER "${BASE_TARGETS_FOLDER}/Aux" CACHE STRING "" FORCE)
811

912
if (${BUILD_TEST})
@@ -13,6 +16,10 @@ else()
1316
add_definitions(-DBUILD_TEST=0)
1417
endif()
1518

19+
if ("${SUB_PROJECT_NAME}" STREQUAL "")
20+
message(FATAL_ERROR "SUB_PROJECT_NAME not defined, please set it in your project cmake")
21+
endif ()
22+
1623
function(exp_gather_target_runtime_dependencies_recurse)
1724
set(options "")
1825
set(singleValueArgs NAME OUT_RUNTIME_DEP OUT_DEP_TARGET)
@@ -26,20 +33,7 @@ function(exp_gather_target_runtime_dependencies_recurse)
2633

2734
get_target_property(runtime_dep ${arg_NAME} RUNTIME_DEP)
2835
if (NOT ("${runtime_dep}" STREQUAL "runtime_dep-NOTFOUND"))
29-
foreach(r ${runtime_dep})
30-
# workaround to make EXPORT_PROPERTIES support generator expression
31-
string(REPLACE "[" "$<" r "${r}")
32-
string(REPLACE "]" ">" r "${r}")
33-
34-
get_target_property(type ${arg_NAME} TYPE)
35-
if (${type} STREQUAL "SHARED_LIBRARY")
36-
set(target_bin_dir $<TARGET_FILE_DIR:${arg_NAME}>)
37-
else ()
38-
set(target_bin_dir $<TARGET_FILE_DIR:${arg_NAME}>/../Binaries)
39-
endif ()
40-
string(REPLACE "$<TARGET_BIN_DIR>" ${target_bin_dir} temp_r ${r})
41-
list(APPEND result_runtime_dep ${temp_r})
42-
endforeach()
36+
list(APPEND result_runtime_dep ${runtime_dep})
4337
endif()
4438

4539
get_target_property(libs ${arg_NAME} LINK_LIBRARIES)
@@ -93,6 +87,7 @@ function(exp_process_runtime_dependencies)
9387
list(APPEND dep_targets ${dep_dep_targets})
9488
endforeach ()
9589

90+
set(copy_commands COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:${arg_NAME}>)
9691
foreach(r ${runtime_deps})
9792
list(APPEND copy_commands COMMAND ${CMAKE_COMMAND} -E copy_if_different ${r} $<TARGET_FILE_DIR:${arg_NAME}>)
9893
endforeach()
@@ -255,7 +250,7 @@ function(exp_add_mirror_info_source_generation_target)
255250
get_filename_component(dir ${temp} DIRECTORY)
256251
get_filename_component(filename ${temp} NAME_WE)
257252
258-
set(output_source "${CMAKE_BINARY_DIR}/Generated/MirrorInfoSource/${dir}/${filename}.generated.cpp")
253+
set(output_source "${GENERATED_MIRROR_INFO_SRC_DIR}/${dir}/${filename}.generated.cpp")
259254
list(APPEND output_sources ${output_source})
260255
261256
add_custom_command(
@@ -281,15 +276,11 @@ function(exp_add_mirror_info_source_generation_target)
281276
endfunction()
282277
283278
function(exp_add_executable)
284-
set(options SAMPLE NOT_INSTALL)
285-
set(singleValueArgs NAME)
279+
set(options NOT_INSTALL)
280+
set(singleValueArgs NAME FOLDER)
286281
set(multiValueArgs SRC INC LINK LIB DEP_TARGET RES REFLECT)
287282
cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN})
288283
289-
if (${arg_SAMPLE} AND (NOT ${BUILD_SAMPLE}))
290-
return()
291-
endif()
292-
293284
if (${arg_NOT_INSTALL})
294285
set(not_install_flag NOT_INSTALL)
295286
else ()
@@ -312,8 +303,8 @@ function(exp_add_executable)
312303
${arg_NAME}
313304
PRIVATE ${arg_SRC} ${generated_src}
314305
)
315-
if (${arg_SAMPLE})
316-
set_target_properties(${arg_NAME} PROPERTIES FOLDER ${SAMPLE_TARGETS_FOLDER})
306+
if (DEFINED arg_FOLDER)
307+
set_target_properties(${arg_NAME} PROPERTIES FOLDER ${BASE_TARGETS_FOLDER}/${arg_FOLDER})
317308
else ()
318309
set_target_properties(${arg_NAME} PROPERTIES FOLDER ${BASE_TARGETS_FOLDER})
319310
endif ()
@@ -386,11 +377,11 @@ endfunction()
386377
function(exp_add_library)
387378
set(options NOT_INSTALL)
388379
set(singleValueArgs NAME TYPE)
389-
set(multiValueArgs SRC PRIVATE_INC PUBLIC_INC PRIVATE_LINK PUBLIC_LINK PRIVATE_LIB PUBLIC_LIB PRIVATE_MERGE_LIB PUBLIC_MERGE_LIB REFLECT)
380+
set(multiValueArgs SRC PRIVATE_INC PUBLIC_INC PRIVATE_LINK PUBLIC_LINK PRIVATE_LIB PUBLIC_LIB REFLECT)
390381
cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN})
391382
392383
if ("${arg_TYPE}" STREQUAL "SHARED")
393-
list(APPEND arg_PUBLIC_INC ${API_HEADER_DIR}/${arg_NAME})
384+
list(APPEND arg_PUBLIC_INC ${GENERATED_API_HEADER_DIR}/${arg_NAME})
394385
endif ()
395386
396387
if (DEFINED arg_REFLECT)
@@ -438,86 +429,33 @@ function(exp_add_library)
438429
)
439430
440431
foreach (inc ${arg_PUBLIC_INC})
441-
list(APPEND public_inc ${inc})
442-
endforeach ()
443-
foreach (lib ${arg_PUBLIC_MERGE_LIB})
444-
if (TARGET ${lib})
445-
list(APPEND public_inc $<TARGET_PROPERTY:${lib},INTERFACE_INCLUDE_DIRECTORIES>)
446-
endif ()
447-
endforeach ()
448-
449-
foreach (inc ${public_inc})
450-
string(REGEX MATCH "\\$\\<.+\\>" match ${inc})
451-
if (match)
452-
list(APPEND public_build_inc $<BUILD_INTERFACE:${inc}>)
453-
else ()
454-
get_filename_component(absolute_inc ${inc} ABSOLUTE)
455-
list(APPEND public_build_inc $<BUILD_INTERFACE:${absolute_inc}>)
456-
endif ()
432+
get_filename_component(absolute_inc ${inc} ABSOLUTE)
433+
list(APPEND public_build_inc $<BUILD_INTERFACE:${absolute_inc}>)
457434
endforeach ()
458435
target_include_directories(
459436
${arg_NAME}
460437
PRIVATE ${arg_PRIVATE_INC}
461438
PUBLIC ${public_build_inc} $<INSTALL_INTERFACE:${SUB_PROJECT_NAME}/Target/${arg_NAME}/Include>
462439
)
463-
464440
target_link_directories(
465441
${arg_NAME}
466442
PRIVATE ${arg_PRIVATE_LINK}
467443
PUBLIC ${arg_PUBLIC_LINK}
468444
)
469-
470-
foreach (lib ${arg_PRIVATE_MERGE_LIB})
471-
list(APPEND merge_lib ${lib})
472-
endforeach ()
473-
foreach (lib ${arg_PUBLIC_MERGE_LIB})
474-
list(APPEND merge_lib ${lib})
475-
endforeach ()
476-
477-
foreach (lib ${merge_lib})
478-
list(APPEND build_merge_lib $<BUILD_INTERFACE:${lib}>)
479-
480-
exp_gather_target_runtime_dependencies_recurse(
481-
NAME ${lib}
482-
OUT_RUNTIME_DEP temp_runtime_dep
483-
)
484-
list(APPEND runtime_dep ${temp_runtime_dep})
485-
endforeach ()
486445
target_link_libraries(
487446
${arg_NAME}
488-
PRIVATE ${build_merge_lib}
447+
PRIVATE ${arg_PRIVATE_LIB}
489448
PUBLIC ${arg_PUBLIC_LIB}
490449
)
491450
492-
if (DEFINED runtime_dep)
493-
foreach (r ${runtime_dep})
494-
get_filename_component(FILE_NAME ${r} NAME)
495-
list(APPEND commands COMMAND ${CMAKE_COMMAND} -E copy_if_different ${r} ${runtime_output_dir}/${FILE_NAME})
496-
list(APPEND runtime_dep_files $<TARGET_BIN_DIR>/${FILE_NAME})
497-
endforeach ()
498-
add_custom_command(
499-
TARGET ${arg_NAME} POST_BUILD
500-
${commands}
501-
)
502-
503-
# workaround to make EXPORT_PROPERTIES support generator expression
504-
string(REPLACE "$<" "[" runtime_dep_files "${runtime_dep_files}")
505-
string(REPLACE ">" "]" runtime_dep_files "${runtime_dep_files}")
506-
set_target_properties(
507-
${arg_NAME} PROPERTIES
508-
EXPORT_PROPERTIES "RUNTIME_DEP"
509-
RUNTIME_DEP "${runtime_dep_files}"
510-
)
511-
endif ()
512-
513451
if ("${arg_TYPE}" STREQUAL "SHARED")
514452
string(TOUPPER ${arg_NAME}_API api_name)
515453
string(REPLACE "-" "/" api_dir ${arg_NAME})
516454
517455
generate_export_header(
518456
${arg_NAME}
519457
EXPORT_MACRO_NAME ${api_name}
520-
EXPORT_FILE_NAME ${API_HEADER_DIR}/${arg_NAME}/${api_dir}/Api.h
458+
EXPORT_FILE_NAME ${GENERATED_API_HEADER_DIR}/${arg_NAME}/${api_dir}/Api.h
521459
)
522460
endif()
523461
@@ -526,37 +464,31 @@ function(exp_add_library)
526464
endif()
527465
528466
if (NOT ${arg_NOT_INSTALL})
529-
foreach (inc ${public_inc})
467+
foreach (inc ${arg_PUBLIC_INC})
530468
list(APPEND install_inc ${inc}/)
531469
endforeach ()
532470
install(
533471
DIRECTORY ${install_inc}
534472
DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Include
535473
)
536474
537-
if (DEFINED runtime_dep)
538-
install(
539-
FILES ${runtime_dep}
540-
DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries
541-
)
542-
endif ()
543-
544475
install(
545476
TARGETS ${arg_NAME}
546477
EXPORT ${SUB_PROJECT_NAME}Targets
547478
ARCHIVE DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib
548479
LIBRARY DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Lib
549-
RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Binaries
480+
RUNTIME DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries
550481
)
551482
export(
552483
TARGETS ${arg_NAME}
553484
NAMESPACE ${SUB_PROJECT_NAME}::
554485
APPEND FILE ${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}Targets.cmake
555486
)
487+
556488
if ("${arg_TYPE}" STREQUAL "SHARED")
557489
install(
558490
FILES $<TARGET_FILE:${arg_NAME}>
559-
DESTINATION ${SUB_PROJECT_NAME}/Target/${arg_NAME}/Binaries
491+
DESTINATION ${SUB_PROJECT_NAME}/Binaries
560492
)
561493
endif ()
562494
endif ()
@@ -643,5 +575,57 @@ install(
643575
EXPORT ${SUB_PROJECT_NAME}Targets
644576
FILE ${SUB_PROJECT_NAME}Targets.cmake
645577
NAMESPACE ${SUB_PROJECT_NAME}::
578+
DESTINATION ${SUB_PROJECT_NAME}
579+
)
580+
581+
configure_package_config_file(
582+
${CMAKE_CURRENT_LIST_DIR}/Config.cmake.in
583+
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}Config.cmake
584+
INSTALL_DESTINATION ${SUB_PROJECT_NAME}/CMake
585+
)
586+
587+
write_basic_package_version_file(
588+
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}ConfigVersion.cmake
589+
VERSION ${SUB_PROJECT_VERSION_MAJOR}.${SUB_PROJECT_VERSION_MINOR}.${SUB_PROJECT_VERSION_PATCH}
590+
COMPATIBILITY SameMajorVersion
591+
)
592+
593+
install(
594+
FILES
595+
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}Config.cmake
596+
${CMAKE_BINARY_DIR}/${SUB_PROJECT_NAME}ConfigVersion.cmake
597+
DESTINATION ${SUB_PROJECT_NAME}
598+
)
599+
600+
file(GLOB_RECURSE preset_cmake_libs ${CMAKE_CURRENT_LIST_DIR}/*)
601+
foreach (cmake_lib ${preset_cmake_libs})
602+
file(
603+
COPY ${cmake_lib}
604+
DESTINATION ${CMAKE_BINARY_DIR}/CMake
605+
)
606+
endforeach ()
607+
install(
608+
FILES ${preset_cmake_libs}
646609
DESTINATION ${SUB_PROJECT_NAME}/CMake
647610
)
611+
612+
if (DEFINED SUB_PROJECT_CMAKE_LIBS)
613+
foreach (cmake_lib ${SUB_PROJECT_CMAKE_LIBS})
614+
if (IS_ABSOLUTE ${cmake_lib})
615+
message(FATAL_ERROR "project cmake libs defined in SUB_PROJECT_CMAKE_LIBS should be relative path from project root")
616+
endif ()
617+
618+
set(src_file ${CMAKE_SOURCE_DIR}/${cmake_lib})
619+
get_filename_component(binary_tree_dst_dir ${CMAKE_BINARY_DIR}/CMake/${cmake_lib} DIRECTORY)
620+
get_filename_component(install_tree_dst_dir ${SUB_PROJECT_NAME}/CMake/${cmake_lib} DIRECTORY)
621+
622+
file(
623+
COPY ${src_file}
624+
DESTINATION ${binary_tree_dst_dir}
625+
)
626+
install(
627+
FILES ${src_file}
628+
DESTINATION ${install_tree_dst_dir}
629+
)
630+
endforeach ()
631+
endif ()

CMakeLists.txt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@ set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES ${CMAKE_SOURCE_DIR}/conan_provider.cmake CA
66
project(Explosion)
77

88
option(BUILD_EDITOR "Build Explosion editor" ON)
9+
option(BUILD_SAMPLE "Build samples" ON)
910

10-
set(SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE)
11-
set(ENGINE_SUB_PROJECT_NAME "Engine" CACHE STRING "" FORCE)
11+
set(SUB_PROJECT_NAME "Explosion" CACHE STRING "" FORCE)
12+
set(SUB_PROJECT_VERSION_MAJOR 0 CACHE STRING "" FORCE)
13+
set(SUB_PROJECT_VERSION_MINOR 0 CACHE STRING "" FORCE)
14+
set(SUB_PROJECT_VERSION_PATCH 1 CACHE STRING "" FORCE)
15+
set(SUB_PROJECT_CMAKE_LIBS "ThirdParty/Registry.cmake" CACHE STRING "" FORCE)
16+
set(USE_CONAN ON CACHE BOOL "" FORCE)
1217

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

1924
include(CMake/Common.cmake)
2025
include(CMake/Target.cmake)
26+
include(ThirdParty/Registry.cmake)
2127

22-
add_subdirectory(ThirdParty)
2328
add_subdirectory(Engine)
2429
add_subdirectory(Tool)
2530
add_subdirectory(Sample)
2631

2732
if (${BUILD_EDITOR})
2833
add_subdirectory(Editor)
2934
endif()
30-
31-
file(GLOB engine_cmake_libs CMake/*.cmake)
32-
install(
33-
FILES ${engine_cmake_libs}
34-
DESTINATION ${SUB_PROJECT_NAME}/CMake
35-
)

0 commit comments

Comments
 (0)