1+ include (GenerateExportHeader )
2+ include (CMakePackageConfigHelpers )
3+
14option (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 )
710set (AUX_TARGETS_FOLDER "${BASE_TARGETS_FOLDER} /Aux" CACHE STRING "" FORCE )
811
912if (${BUILD_TEST} )
@@ -13,6 +16,10 @@ else()
1316 add_definitions (-DBUILD_TEST=0 )
1417endif ()
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+
1623function (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)
281276endfunction()
282277
283278function(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()
386377function(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 ()
0 commit comments