Skip to content

Commit cd0df1a

Browse files
authored
[CMake] Add way to parametrize globally where to relocate plugins, projects and applications (#5562)
* Enable the use of global variable to specify relocatable directory and allow to specify custom one * Remove debug message
1 parent c0f989a commit cd0df1a

2 files changed

Lines changed: 72 additions & 18 deletions

File tree

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${ARCHIVE_OUTPUT_DIRECTOR
4141
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${RUNTIME_OUTPUT_DIRECTORY})
4242
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBRARY_OUTPUT_DIRECTORY})
4343

44+
set(SOFA_APPLICATIONS_RELOCATABLE_PATH "applications" CACHE STRING "Relocatable path that will be used ot install applications")
45+
set(SOFA_PLUGINS_RELOCATABLE_PATH "plugins" CACHE STRING "Relocatable path that will be used ot install plugins")
46+
set(SOFA_PROJECTS_RELOCATABLE_PATH "projects" CACHE STRING "Relocatable path that will be used ot install projects")
47+
48+
49+
4450
# Option for packaging
4551
option(SOFA_BUILD_RELEASE_PACKAGE "Run package specific configure" OFF)
4652

Sofa/framework/Config/cmake/SofaMacrosInstall.cmake

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ include(CMakeParseLibraryList)
2929
# instead of being dispatched in SOFA install directory (between bin, libs, share, ...).
3030
# If not building through SOFA, RELOCATABLE has no effect.
3131
macro(sofa_create_package_with_targets)
32-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
32+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
3333
set(multiValueArgs TARGETS)
3434
set(optionalArgs AUTO_SET_TARGET_PROPERTIES NO_AUTO_RESOURCES_INSTALL)
3535
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -46,6 +46,26 @@ macro(sofa_create_package_with_targets)
4646
list(APPEND child_args INCLUDE_INSTALL_DIR "${ARG_PACKAGE_NAME}")
4747
endif()
4848

49+
if(ARG_RELOCATABLE)
50+
string(TOUPPER "${CMAKE_PROJECT_NAME}_${ARG_RELOCATABLE}_RELOCATABLE_PATH" global_relocatable_path)
51+
if(${global_relocatable_path})
52+
set(plugin_relocatable_path "${${global_relocatable_path}}" )
53+
else()
54+
message(WARNING "sofa_create_package_with_targets(${ARG_PACKAGE_NAME}) Relocatable type ${ARG_RELOCATABLE} is unknown. Either specify one of the following {applications, plugins, projects} or specify a custom RELOCATABLE_PATH")
55+
endif()
56+
57+
if(ARG_RELOCATABLE_PATH)
58+
list(FIND child_args "RELOCATABLE_PATH" relPathNameId)
59+
list(REMOVE_AT child_args ${relPathNameId})
60+
list(INSERT child_args ${relPathNameId} "${plugin_relocatable_path}")
61+
else ()
62+
list(APPEND child_args RELOCATABLE_PATH)
63+
list(APPEND child_args "${plugin_relocatable_path}")
64+
endif ()
65+
endif()
66+
67+
68+
4969
sofa_create_package(${child_args})
5070
sofa_add_targets_to_package(${child_args})
5171
endmacro()
@@ -79,7 +99,7 @@ endmacro()
7999
# instead of being dispatched in SOFA install directory (between bin, libs, share, ...).
80100
# If not building through SOFA, RELOCATABLE has no effect.
81101
macro(sofa_create_component_in_package_with_targets)
82-
set(oneValueArgs COMPONENT_NAME COMPONENT_VERSION PACKAGE_NAME INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR RELOCATABLE)
102+
set(oneValueArgs COMPONENT_NAME COMPONENT_VERSION PACKAGE_NAME INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR RELOCATABLE RELOCATABLE_PATH)
83103
set(multiValueArgs TARGETS)
84104
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
85105
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -96,6 +116,24 @@ macro(sofa_create_component_in_package_with_targets)
96116
list(APPEND child_args INCLUDE_INSTALL_DIR "${ARG_PACKAGE_NAME}")
97117
endif()
98118

119+
if(ARG_RELOCATABLE)
120+
string(TOUPPER "${CMAKE_PROJECT_NAME}_${ARG_RELOCATABLE}_RELOCATABLE_PATH" global_relocatable_path)
121+
if(${global_relocatable_path})
122+
set(plugin_relocatable_path "${${global_relocatable_path}}" )
123+
else()
124+
message(WARNING "sofa_create_component_in_package_with_targets(${ARG_PACKAGE_NAME}) Relocatable type ${ARG_RELOCATABLE} is unknown. Either specify one of the following {applications, plugins, projects} or specify a custom RELOCATABLE_PATH")
125+
endif()
126+
127+
if(ARG_RELOCATABLE_PATH)
128+
list(FIND child_args "RELOCATABLE_PATH" relPathNameId)
129+
list(REMOVE_AT child_args ${relPathNameId})
130+
list(INSERT child_args ${relPathNameId} "${plugin_relocatable_path}")
131+
else ()
132+
list(APPEND child_args RELOCATABLE_PATH)
133+
list(APPEND child_args "${plugin_relocatable_path}")
134+
endif ()
135+
endif()
136+
99137
# Calling sofa_create_package like sofa_create_package_with_targets does
100138
# but with different values for PACKAGE_NAME and PACKAGE_VERSION
101139
# and a new PACKAGE_PARENT argument.
@@ -146,7 +184,7 @@ endmacro()
146184
#
147185
# check_required_components(Foo Qux)
148186
macro(sofa_create_package)
149-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION PACKAGE_PARENT INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
187+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION PACKAGE_PARENT INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
150188
set(multiValueArgs TARGETS)
151189
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
152190
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -158,6 +196,15 @@ macro(sofa_create_package)
158196
endif()
159197
endforeach()
160198

199+
if(ARG_RELOCATABLE AND NOT ARG_RELOCATABLE_PATH)
200+
string(TOUPPER "${CMAKE_PROJECT_NAME}_${ARG_RELOCATABLE}_RELOCATABLE_PATH" global_relocatable_path)
201+
if(${global_relocatable_path})
202+
set(ARG_RELOCATABLE_PATH "${${global_relocatable_path}}" )
203+
else()
204+
message(WARNING "sofa_create_component_in_package_with_targets(${ARG_PACKAGE_NAME}) Relocatable type ${ARG_RELOCATABLE} is unknown. Either specify one of the following {applications, plugins, projects} or specify a custom RELOCATABLE_PATH")
205+
endif()
206+
endif()
207+
161208
# Optional subpackage/namespace
162209
set(package_install_dir ${ARG_PACKAGE_NAME})
163210
set(package_namespace "")
@@ -184,7 +231,7 @@ macro(sofa_create_package)
184231
"### Expanded from \@PACKAGE_GUARD\@ by SofaMacrosInstall.cmake ###" "\n"
185232
"include_guard()" "\n"
186233
)
187-
if(ARG_RELOCATABLE)
234+
if(ARG_RELOCATABLE_PATH)
188235
string(CONCAT PACKAGE_GUARD ${PACKAGE_GUARD}
189236
"list(APPEND CMAKE_LIBRARY_PATH \"\${CMAKE_CURRENT_LIST_DIR}/../../../bin\")" "\n"
190237
"list(APPEND CMAKE_LIBRARY_PATH \"\${CMAKE_CURRENT_LIST_DIR}/../../../lib\")" "\n"
@@ -204,8 +251,8 @@ macro(sofa_create_package)
204251
)
205252
install(FILES "${CMAKE_BINARY_DIR}/lib/cmake/${ARG_PACKAGE_NAME}Config.cmake" DESTINATION "lib/cmake/${package_install_dir}" COMPONENT headers)
206253

207-
if(ARG_RELOCATABLE)
208-
sofa_set_project_install_relocatable(${package_install_dir} ${CMAKE_CURRENT_BINARY_DIR} ${ARG_RELOCATABLE})
254+
if(ARG_RELOCATABLE_PATH)
255+
sofa_set_project_install_relocatable(${package_install_dir} ${CMAKE_CURRENT_BINARY_DIR} ${ARG_RELOCATABLE_PATH})
209256
endif()
210257

211258
sofa_install_git_infos(${ARG_PACKAGE_NAME} ${CMAKE_CURRENT_SOURCE_DIR})
@@ -224,7 +271,7 @@ endmacro()
224271
# Use AUTO_SET_TARGET_PROPERTIES to enable default properties setting
225272
# on all targets (see sofa_auto_set_target_properties).
226273
macro(sofa_add_targets_to_package)
227-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE OPTIMIZE_BUILD_DIR)
274+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE_PATH RELOCATABLE OPTIMIZE_BUILD_DIR)
228275
set(multiValueArgs TARGETS)
229276
set(optionalArgs AUTO_SET_TARGET_PROPERTIES NO_AUTO_RESOURCES_INSTALL)
230277
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -304,7 +351,7 @@ endfunction()
304351
# - INCLUDE_DIRECTORIES: if not already set, add as PUBLIC include dirs
305352
# 2 BUILD_INTERFACE (source dir and build dir) and 1 INSTALL_INTERFACE (install dir)
306353
macro(sofa_auto_set_target_properties)
307-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
354+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
308355
set(multiValueArgs TARGETS)
309356
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
310357
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -327,7 +374,7 @@ endmacro()
327374

328375

329376
macro(sofa_auto_set_target_version)
330-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
377+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
331378
set(multiValueArgs TARGETS)
332379
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
333380
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -383,7 +430,7 @@ endmacro()
383430

384431

385432
macro(sofa_auto_set_target_compile_definitions)
386-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
433+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
387434
set(multiValueArgs TARGETS)
388435
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
389436
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -422,7 +469,7 @@ endmacro()
422469

423470

424471
macro(sofa_auto_set_target_include_directories)
425-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
472+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
426473
set(multiValueArgs TARGETS)
427474
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
428475
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -481,7 +528,7 @@ macro(sofa_auto_set_target_include_directories)
481528
target_include_directories(${target} ${TARGET_VISIBILITY} "$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include/${ARG_PACKAGE_NAME}>")
482529
endif()
483530

484-
if(ARG_RELOCATABLE)
531+
if(ARG_RELOCATABLE_PATH)
485532
if(NOT "\$<INSTALL_INTERFACE:include>" IN_LIST target_include_dirs)
486533
target_include_directories(${target} ${TARGET_VISIBILITY} "$<INSTALL_INTERFACE:include>")
487534
endif()
@@ -501,10 +548,11 @@ endmacro()
501548

502549

503550
macro(sofa_auto_set_target_rpath)
504-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE)
551+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH)
505552
set(multiValueArgs TARGETS)
506553
set(optionalArgs AUTO_SET_TARGET_PROPERTIES)
507554
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
555+
508556
# Required arguments
509557
foreach(arg ARG_TARGETS)
510558
if("${${arg}}" STREQUAL "")
@@ -539,7 +587,7 @@ macro(sofa_auto_set_target_rpath)
539587
get_target_property(dep_reloc_install_dir ${dep} "RELOCATABLE_INSTALL_DIR")
540588
if(dep_reloc_install_dir)
541589
# the dependency is relocatable
542-
if(ARG_RELOCATABLE)
590+
if(ARG_RELOCATABLE_PATH)
543591
# current target is relocatable
544592
list(APPEND target_rpath
545593
"$ORIGIN/../../../${dep_reloc_install_dir}/lib"
@@ -558,7 +606,7 @@ macro(sofa_auto_set_target_rpath)
558606
endif()
559607
else()
560608
# the dependency is NOT relocatable
561-
if(ARG_RELOCATABLE)
609+
if(ARG_RELOCATABLE_PATH)
562610
# current target is relocatable
563611
list(APPEND target_rpath
564612
"$ORIGIN/../../../lib"
@@ -587,7 +635,7 @@ endmacro()
587635
# INCLUDE_INSTALL_DIR <include_install_dir>
588636
# Directory in which headers will be copied into <CMAKE_INSTALL_PREFIX>/include/<include_install_dir>
589637
macro(sofa_install_targets_in_package)
590-
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE OPTIMIZE_BUILD_DIR)
638+
set(oneValueArgs PACKAGE_NAME PACKAGE_VERSION INCLUDE_ROOT_DIR INCLUDE_INSTALL_DIR INCLUDE_SOURCE_DIR EXAMPLE_INSTALL_DIR RELOCATABLE RELOCATABLE_PATH OPTIMIZE_BUILD_DIR)
591639
set(multiValueArgs TARGETS)
592640
set(optionalArgs AUTO_SET_TARGET_PROPERTIES NO_AUTO_RESOURCES_INSTALL)
593641
cmake_parse_arguments("ARG" "${optionalArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@@ -663,7 +711,7 @@ macro(sofa_install_targets_in_package)
663711
endif()
664712

665713
# Finalize dirs
666-
if(ARG_RELOCATABLE)
714+
if(ARG_RELOCATABLE_PATH)
667715
set(header_install_dir "include/${header_relative_dir_for_build}")
668716
else()
669717
# headers install-dir tree = headers build-dir tree
@@ -707,7 +755,7 @@ macro(sofa_install_targets_in_package)
707755
file(GLOB txt_files "*.txt" RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} LIST_DIRECTORIES false)
708756
list(FILTER txt_files EXCLUDE REGEX "CMakeLists.txt")
709757
file(GLOB md_files "*.md" RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} LIST_DIRECTORIES false)
710-
if(ARG_RELOCATABLE)
758+
if(ARG_RELOCATABLE_PATH)
711759
set(info_install_dir ".")
712760
else()
713761
set(info_install_dir "include/${ARG_INCLUDE_INSTALL_DIR}")

0 commit comments

Comments
 (0)