From f60d07bb55a762a6d46445ee5b46b51d7b4530e0 Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Wed, 10 Sep 2025 14:41:52 +0100 Subject: [PATCH] Fold install(...) calls into set_output_dirs --- CMakeLists.txt | 4 +++- cmake/basegame.cmake | 3 --- cmake/client.cmake | 8 ++++---- cmake/installer.cmake | 17 +++++++++++++++++ cmake/missionpack.cmake | 3 --- cmake/renderer_gl1.cmake | 1 - cmake/renderer_gl2.cmake | 1 - cmake/server.cmake | 2 -- cmake/utils/set_output_dirs.cmake | 3 +++ 9 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 cmake/installer.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a1056df7..7576dc00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.25) +cmake_minimum_required(VERSION 3.31) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) include(identity) @@ -79,3 +79,5 @@ include(renderer_gl2) include(client) include(basegame) include(missionpack) + +include(installer) diff --git a/cmake/basegame.cmake b/cmake/basegame.cmake index 55ab9a45..8a45bfca 100644 --- a/cmake/basegame.cmake +++ b/cmake/basegame.cmake @@ -141,21 +141,18 @@ if(BUILD_GAME_LIBRARIES) target_link_libraries( ${CGAME_MODULE_BINARY_BASEGAME} PRIVATE ${COMMON_LIBRARIES}) set_target_properties( ${CGAME_MODULE_BINARY_BASEGAME} PROPERTIES OUTPUT_NAME ${CGAME_MODULE_BINARY}) set_output_dirs( ${CGAME_MODULE_BINARY_BASEGAME} SUBDIRECTORY ${BASEGAME}) - install(TARGETS ${CGAME_MODULE_BINARY_BASEGAME} LIBRARY DESTINATION ${BASEGAME}) add_library( ${GAME_MODULE_BINARY_BASEGAME} SHARED ${GAME_SOURCES_BASEGAME} ${GAME_BINARY_SOURCES}) target_compile_definitions( ${GAME_MODULE_BINARY_BASEGAME} PRIVATE QAGAME) target_link_libraries( ${GAME_MODULE_BINARY_BASEGAME} PRIVATE ${COMMON_LIBRARIES}) set_target_properties( ${GAME_MODULE_BINARY_BASEGAME} PROPERTIES OUTPUT_NAME ${GAME_MODULE_BINARY}) set_output_dirs( ${GAME_MODULE_BINARY_BASEGAME} SUBDIRECTORY ${BASEGAME}) - install(TARGETS ${GAME_MODULE_BINARY_BASEGAME} LIBRARY DESTINATION ${BASEGAME}) add_library( ${UI_MODULE_BINARY_BASEGAME} SHARED ${UI_SOURCES_BASEGAME} ${UI_BINARY_SOURCES}) target_compile_definitions( ${UI_MODULE_BINARY_BASEGAME} PRIVATE UI) target_link_libraries( ${UI_MODULE_BINARY_BASEGAME} PRIVATE ${COMMON_LIBRARIES}) set_target_properties( ${UI_MODULE_BINARY_BASEGAME} PROPERTIES OUTPUT_NAME ${UI_MODULE_BINARY}) set_output_dirs( ${UI_MODULE_BINARY_BASEGAME} SUBDIRECTORY ${BASEGAME}) - install(TARGETS ${UI_MODULE_BINARY_BASEGAME} LIBRARY DESTINATION ${BASEGAME}) endif() if(BUILD_GAME_QVMS) diff --git a/cmake/client.cmake b/cmake/client.cmake index 83d6ea55..67256dfd 100644 --- a/cmake/client.cmake +++ b/cmake/client.cmake @@ -103,12 +103,12 @@ foreach(LIBRARY IN LISTS CLIENT_DEPLOY_LIBRARIES) COMMAND ${CMAKE_COMMAND} -E copy ${LIBRARY} $) + + install(FILES ${LIBRARY} DESTINATION + # install() requires a relative path hence: + $,${CMAKE_BINARY_DIR}/$>) endforeach() if(POST_CLIENT_CONFIGURE_FUNCTION) cmake_language(CALL ${POST_CLIENT_CONFIGURE_FUNCTION}) endif() - -install(TARGETS ${CLIENT_BINARY} - RUNTIME DESTINATION . - BUNDLE DESTINATION .) diff --git a/cmake/installer.cmake b/cmake/installer.cmake new file mode 100644 index 00000000..ea48744e --- /dev/null +++ b/cmake/installer.cmake @@ -0,0 +1,17 @@ +get_directory_property(INSTALL_TARGETS DIRECTORY + ${CMAKE_SOURCE_DIR} BUILDSYSTEM_TARGETS) + +# Iterate over all the targets that have an INSTALL_DESTINATION +# property (set by set_output_dirs) and call install() on them +foreach(TARGET IN LISTS INSTALL_TARGETS) + get_target_property(DESTINATION ${TARGET} INSTALL_DESTINATION) + if(NOT DESTINATION) + continue() + endif() + + install(TARGETS ${TARGET} + RUNTIME DESTINATION ${DESTINATION} + LIBRARY DESTINATION ${DESTINATION} + BUNDLE DESTINATION ${DESTINATION} + ARCHIVE EXCLUDE_FROM_ALL) +endforeach() diff --git a/cmake/missionpack.cmake b/cmake/missionpack.cmake index 8320700e..0c1388e3 100644 --- a/cmake/missionpack.cmake +++ b/cmake/missionpack.cmake @@ -36,21 +36,18 @@ if(BUILD_GAME_LIBRARIES) target_link_libraries( ${CGAME_MODULE_BINARY_MISSIONPACK} PRIVATE ${COMMON_LIBRARIES}) set_target_properties( ${CGAME_MODULE_BINARY_MISSIONPACK} PROPERTIES OUTPUT_NAME ${CGAME_MODULE_BINARY}) set_output_dirs( ${CGAME_MODULE_BINARY_MISSIONPACK} SUBDIRECTORY ${MISSIONPACK}) - install(TARGETS ${CGAME_MODULE_BINARY_MISSIONPACK} LIBRARY DESTINATION ${MISSIONPACK}) add_library( ${GAME_MODULE_BINARY_MISSIONPACK} SHARED ${GAME_SOURCES_MISSIONPACK} ${GAME_BINARY_SOURCES}) target_compile_definitions( ${GAME_MODULE_BINARY_MISSIONPACK} PRIVATE QAGAME MISSIONPACK) target_link_libraries( ${GAME_MODULE_BINARY_MISSIONPACK} PRIVATE ${COMMON_LIBRARIES}) set_target_properties( ${GAME_MODULE_BINARY_MISSIONPACK} PROPERTIES OUTPUT_NAME ${GAME_MODULE_BINARY}) set_output_dirs( ${GAME_MODULE_BINARY_MISSIONPACK} SUBDIRECTORY ${MISSIONPACK}) - install(TARGETS ${GAME_MODULE_BINARY_MISSIONPACK} LIBRARY DESTINATION ${MISSIONPACK}) add_library( ${UI_MODULE_BINARY_MISSIONPACK} SHARED ${UI_SOURCES_MISSIONPACK} ${UI_BINARY_SOURCES}) target_compile_definitions( ${UI_MODULE_BINARY_MISSIONPACK} PRIVATE UI MISSIONPACK) target_link_libraries( ${UI_MODULE_BINARY_MISSIONPACK} PRIVATE ${COMMON_LIBRARIES}) set_target_properties( ${UI_MODULE_BINARY_MISSIONPACK} PROPERTIES OUTPUT_NAME ${UI_MODULE_BINARY}) set_output_dirs( ${UI_MODULE_BINARY_MISSIONPACK} SUBDIRECTORY ${MISSIONPACK}) - install(TARGETS ${UI_MODULE_BINARY_MISSIONPACK} LIBRARY DESTINATION ${MISSIONPACK}) endif() if(BUILD_GAME_QVMS) diff --git a/cmake/renderer_gl1.cmake b/cmake/renderer_gl1.cmake index db8aa414..311cfd88 100644 --- a/cmake/renderer_gl1.cmake +++ b/cmake/renderer_gl1.cmake @@ -52,6 +52,5 @@ if(USE_RENDERER_DLOPEN) target_link_options( ${RENDERER_GL1_BINARY} PRIVATE ${RENDERER_LINK_OPTIONS}) set_output_dirs(${RENDERER_GL1_BINARY}) - install(TARGETS ${RENDERER_GL1_BINARY} LIBRARY DESTINATION .) endif() diff --git a/cmake/renderer_gl2.cmake b/cmake/renderer_gl2.cmake index bb2fc25b..4ef69be3 100644 --- a/cmake/renderer_gl2.cmake +++ b/cmake/renderer_gl2.cmake @@ -84,6 +84,5 @@ if(USE_RENDERER_DLOPEN) target_link_options( ${RENDERER_GL2_BINARY} PRIVATE ${RENDERER_LINK_OPTIONS}) set_output_dirs(${RENDERER_GL2_BINARY}) - install(TARGETS ${RENDERER_GL2_BINARY} LIBRARY DESTINATION .) endif() diff --git a/cmake/server.cmake b/cmake/server.cmake index a2355c2c..acf69ce7 100644 --- a/cmake/server.cmake +++ b/cmake/server.cmake @@ -47,5 +47,3 @@ set_output_dirs(${SERVER_BINARY}) if(POST_SERVER_CONFIGURE_FUNCTION) cmake_language(CALL ${POST_SERVER_CONFIGURE_FUNCTION}) endif() - -install(TARGETS ${SERVER_BINARY} RUNTIME DESTINATION .) diff --git a/cmake/utils/set_output_dirs.cmake b/cmake/utils/set_output_dirs.cmake index a38ecc03..9e64c1ba 100644 --- a/cmake/utils/set_output_dirs.cmake +++ b/cmake/utils/set_output_dirs.cmake @@ -24,4 +24,7 @@ function(set_output_dirs TARGET) RUNTIME_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${OUT_DIR} ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${OUT_DIR}) endforeach() + + set_target_properties(${TARGET} PROPERTIES + INSTALL_DESTINATION ./${ARG_SUBDIRECTORY}) endfunction()