Skip to content

Commit 6c23014

Browse files
committed
Use cmake parse arguments for runtime module destinations
1 parent edd1bec commit 6c23014

2 files changed

Lines changed: 57 additions & 76 deletions

File tree

cmake/NablaConfig.cmake.in

Lines changed: 52 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ check_required_components(Nabla)
1919
# nabla_sync_runtime_modules(
2020
# [TARGETS <t1;t2;...>]
2121
# [DESTINATION <path>]
22-
# [DESTINATION_<CONFIG> <path>]...
22+
# [DESTINATION_DEBUG <path>]
23+
# [DESTINATION_RELEASE <path>]
24+
# [DESTINATION_RELWITHDEBINFO <path>]
2325
# [MODE <CONFIGURE_TIME|BUILD_TIME|BOTH>]
2426
# [RUNTIME_MODULES_SUBDIR <relative-subdir>]
2527
# [BUILD_TRIGGER_TARGETS <t1;t2;...>]
@@ -37,7 +39,9 @@ check_required_components(Nabla)
3739
# nabla_setup_runtime_modules(
3840
# [TARGETS <t1;t2;...>]
3941
# [DESTINATION <path>]
40-
# [DESTINATION_<CONFIG> <path>]...
42+
# [DESTINATION_DEBUG <path>]
43+
# [DESTINATION_RELEASE <path>]
44+
# [DESTINATION_RELWITHDEBINFO <path>]
4145
# [APPLY_LOOKUP_TO_TARGETS <t1;t2;...>]
4246
# [RUNTIME_MODULES_SUBDIR <relative-subdir>]
4347
# [MODE <CONFIGURE_TIME|BUILD_TIME|BOTH>]
@@ -106,64 +110,24 @@ function(_nbl_runtime_modules_collect_consumer_configs _OUT_CONFIGS)
106110
set(${_OUT_CONFIGS} ${_consumer_configs} PARENT_SCOPE)
107111
endfunction()
108112

109-
function(_nbl_runtime_modules_extract_destination_overrides _OUT_OVERRIDES _OUT_UNKNOWN)
110-
set(_tokens ${ARGN})
111-
set(_overrides "")
112-
set(_unknown "")
113-
114-
list(LENGTH _tokens _tokens_len)
115-
math(EXPR _tokens_mod2 "${_tokens_len} % 2")
116-
if(_tokens_mod2)
117-
set(${_OUT_OVERRIDES} "" PARENT_SCOPE)
118-
set(${_OUT_UNKNOWN} "${_tokens}" PARENT_SCOPE)
119-
return()
120-
endif()
121-
122-
while(TRUE)
123-
list(LENGTH _tokens _tokens_len)
124-
if(_tokens_len EQUAL 0)
125-
break()
126-
endif()
127-
128-
list(POP_FRONT _tokens _key)
129-
list(POP_FRONT _tokens _value)
130-
string(TOUPPER "${_key}" _key_upper)
131-
132-
if(_key_upper MATCHES "^DESTINATION_[A-Z0-9_]+$")
133-
string(REGEX REPLACE "^DESTINATION_" "" _cfg_upper "${_key_upper}")
134-
list(APPEND _overrides "${_cfg_upper}::${_value}")
135-
else()
136-
list(APPEND _unknown "${_key}" "${_value}")
137-
endif()
138-
endwhile()
139-
140-
set(${_OUT_OVERRIDES} ${_overrides} PARENT_SCOPE)
141-
set(${_OUT_UNKNOWN} ${_unknown} PARENT_SCOPE)
142-
endfunction()
143-
144-
function(_nbl_runtime_modules_expand_destination_pairs _DESTINATION_DEFAULT _DESTINATION_OVERRIDES _OUT_CFG_DST_PAIRS)
113+
function(_nbl_runtime_modules_expand_destination_pairs _DESTINATION_DEFAULT _DESTINATION_DEBUG _DESTINATION_RELEASE _DESTINATION_RELWITHDEBINFO _OUT_CFG_DST_PAIRS)
145114
_nbl_runtime_modules_collect_consumer_configs(_consumer_configs)
146115
set(_cfg_dst_pairs "")
147116

148117
foreach(_consumer_config IN LISTS _consumer_configs)
149118
string(TOUPPER "${_consumer_config}" _cfg_upper)
150-
set(_resolved_destination "")
151-
152-
foreach(_override IN LISTS _DESTINATION_OVERRIDES)
153-
string(REPLACE "::" ";" _override_parts "${_override}")
154-
list(GET _override_parts 0 _override_cfg_upper)
155-
if(_override_cfg_upper STREQUAL _cfg_upper)
156-
list(GET _override_parts 1 _resolved_destination)
157-
break()
158-
endif()
159-
endforeach()
160-
161-
if(_resolved_destination STREQUAL "")
119+
if(_cfg_upper STREQUAL "DEBUG" AND NOT _DESTINATION_DEBUG STREQUAL "")
120+
set(_resolved_destination "${_DESTINATION_DEBUG}")
121+
elseif(_cfg_upper STREQUAL "RELEASE" AND NOT _DESTINATION_RELEASE STREQUAL "")
122+
set(_resolved_destination "${_DESTINATION_RELEASE}")
123+
elseif(_cfg_upper STREQUAL "RELWITHDEBINFO" AND NOT _DESTINATION_RELWITHDEBINFO STREQUAL "")
124+
set(_resolved_destination "${_DESTINATION_RELWITHDEBINFO}")
125+
else()
162126
set(_resolved_destination "${_DESTINATION_DEFAULT}")
163127
endif()
164128

165129
if(_resolved_destination STREQUAL "")
166-
message(FATAL_ERROR "Nabla: missing destination for consumer config \"${_consumer_config}\". Provide DESTINATION or DESTINATION_${_cfg_upper}.")
130+
message(FATAL_ERROR "Nabla: missing destination for consumer config \"${_consumer_config}\". Provide DESTINATION or one of DESTINATION_DEBUG/DESTINATION_RELEASE/DESTINATION_RELWITHDEBINFO.")
167131
endif()
168132

169133
if(_resolved_destination MATCHES "\\$<")
@@ -525,7 +489,9 @@ endfunction()
525489
# nabla_sync_runtime_modules(
526490
# [TARGETS <t1;t2;...>]
527491
# [DESTINATION <path>]
528-
# [DESTINATION_<CONFIG> <path> ...]
492+
# [DESTINATION_DEBUG <path>]
493+
# [DESTINATION_RELEASE <path>]
494+
# [DESTINATION_RELWITHDEBINFO <path>]
529495
# [MODE BUILD_TIME|CONFIGURE_TIME|BOTH]
530496
# [RUNTIME_MODULES_SUBDIR <relative_subdir>]
531497
# [BUILD_TRIGGER_TARGETS <t1;t2;...>]
@@ -537,7 +503,7 @@ endfunction()
537503
# - TARGETS mode
538504
# Copies beside each target runtime dir under RUNTIME_MODULES_SUBDIR.
539505
# - DESTINATION mode
540-
# Copies to explicit DESTINATION or DESTINATION_<CONFIG> paths.
506+
# Copies to explicit DESTINATION or DESTINATION_DEBUG/RELEASE/RELWITHDEBINFO paths.
541507
#
542508
# MODE:
543509
# - BUILD_TIME
@@ -555,11 +521,10 @@ function(nabla_sync_runtime_modules)
555521
set(_nbl_runtime_modules_subdir "Libraries")
556522
set(_nbl_mode BUILD_TIME)
557523

558-
cmake_parse_arguments(_NBL_CUSTOM "" "MODE;DESTINATION;RUNTIME_MODULES_SUBDIR" "TARGETS;BUILD_TRIGGER_TARGETS" ${ARGV})
559-
_nbl_runtime_modules_extract_destination_overrides(_destination_overrides _unknown_tokens ${_NBL_CUSTOM_UNPARSED_ARGUMENTS})
524+
cmake_parse_arguments(_NBL_CUSTOM "" "MODE;DESTINATION;DESTINATION_DEBUG;DESTINATION_RELEASE;DESTINATION_RELWITHDEBINFO;RUNTIME_MODULES_SUBDIR" "TARGETS;BUILD_TRIGGER_TARGETS" ${ARGV})
560525

561-
if(_unknown_tokens)
562-
message(FATAL_ERROR "Nabla: unexpected arguments for nabla_sync_runtime_modules: ${_unknown_tokens}")
526+
if(_NBL_CUSTOM_UNPARSED_ARGUMENTS)
527+
message(FATAL_ERROR "Nabla: unexpected arguments for nabla_sync_runtime_modules: ${_NBL_CUSTOM_UNPARSED_ARGUMENTS}")
563528
endif()
564529

565530
if(_NBL_CUSTOM_RUNTIME_MODULES_SUBDIR)
@@ -583,7 +548,13 @@ function(nabla_sync_runtime_modules)
583548
if(DEFINED _NBL_CUSTOM_DESTINATION AND NOT _NBL_CUSTOM_DESTINATION STREQUAL "")
584549
set(_has_destination ON)
585550
endif()
586-
if(_destination_overrides)
551+
if(DEFINED _NBL_CUSTOM_DESTINATION_DEBUG AND NOT _NBL_CUSTOM_DESTINATION_DEBUG STREQUAL "")
552+
set(_has_destination ON)
553+
endif()
554+
if(DEFINED _NBL_CUSTOM_DESTINATION_RELEASE AND NOT _NBL_CUSTOM_DESTINATION_RELEASE STREQUAL "")
555+
set(_has_destination ON)
556+
endif()
557+
if(DEFINED _NBL_CUSTOM_DESTINATION_RELWITHDEBINFO AND NOT _NBL_CUSTOM_DESTINATION_RELWITHDEBINFO STREQUAL "")
587558
set(_has_destination ON)
588559
endif()
589560

@@ -592,7 +563,7 @@ function(nabla_sync_runtime_modules)
592563
endif()
593564

594565
if(NOT _has_targets AND NOT _has_destination)
595-
message(FATAL_ERROR "Nabla: nabla_sync_runtime_modules requires TARGETS or DESTINATION/DESTINATION_<CONFIG>")
566+
message(FATAL_ERROR "Nabla: nabla_sync_runtime_modules requires TARGETS or DESTINATION/DESTINATION_DEBUG/DESTINATION_RELEASE/DESTINATION_RELWITHDEBINFO")
596567
endif()
597568

598569
if(_has_targets)
@@ -615,7 +586,13 @@ function(nabla_sync_runtime_modules)
615586
return()
616587
endif()
617588

618-
_nbl_runtime_modules_expand_destination_pairs("${_NBL_CUSTOM_DESTINATION}" "${_destination_overrides}" _cfg_dst_pairs)
589+
_nbl_runtime_modules_expand_destination_pairs(
590+
"${_NBL_CUSTOM_DESTINATION}"
591+
"${_NBL_CUSTOM_DESTINATION_DEBUG}"
592+
"${_NBL_CUSTOM_DESTINATION_RELEASE}"
593+
"${_NBL_CUSTOM_DESTINATION_RELWITHDEBINFO}"
594+
_cfg_dst_pairs
595+
)
619596

620597
if(_nbl_mode STREQUAL "CONFIGURE_TIME" OR _nbl_mode STREQUAL "BOTH")
621598
set(_enable_configure_depends OFF)
@@ -639,7 +616,9 @@ endfunction()
639616
# nabla_setup_runtime_modules(
640617
# [TARGETS <t1;t2;...>]
641618
# [DESTINATION <path>]
642-
# [DESTINATION_<CONFIG> <path> ...]
619+
# [DESTINATION_DEBUG <path>]
620+
# [DESTINATION_RELEASE <path>]
621+
# [DESTINATION_RELWITHDEBINFO <path>]
643622
# [MODE BUILD_TIME|CONFIGURE_TIME|BOTH]
644623
# [RUNTIME_MODULES_SUBDIR <relative_subdir>]
645624
# [INSTALL_RULES ON|OFF]
@@ -662,11 +641,10 @@ function(nabla_setup_runtime_modules)
662641
set(_nbl_install_rules OFF)
663642
set(_nbl_mode BUILD_TIME)
664643

665-
cmake_parse_arguments(_NBL_CUSTOM "" "RUNTIME_MODULES_SUBDIR;INSTALL_RULES;MODE;DESTINATION" "TARGETS;APPLY_LOOKUP_TO_TARGETS;BUILD_TRIGGER_TARGETS" ${ARGV})
666-
_nbl_runtime_modules_extract_destination_overrides(_destination_overrides _unknown_tokens ${_NBL_CUSTOM_UNPARSED_ARGUMENTS})
644+
cmake_parse_arguments(_NBL_CUSTOM "" "RUNTIME_MODULES_SUBDIR;INSTALL_RULES;MODE;DESTINATION;DESTINATION_DEBUG;DESTINATION_RELEASE;DESTINATION_RELWITHDEBINFO" "TARGETS;APPLY_LOOKUP_TO_TARGETS;BUILD_TRIGGER_TARGETS" ${ARGV})
667645

668-
if(_unknown_tokens)
669-
message(FATAL_ERROR "Nabla: unexpected arguments for nabla_setup_runtime_modules: ${_unknown_tokens}")
646+
if(_NBL_CUSTOM_UNPARSED_ARGUMENTS)
647+
message(FATAL_ERROR "Nabla: unexpected arguments for nabla_setup_runtime_modules: ${_NBL_CUSTOM_UNPARSED_ARGUMENTS}")
670648
endif()
671649

672650
if(_NBL_CUSTOM_RUNTIME_MODULES_SUBDIR)
@@ -690,12 +668,15 @@ function(nabla_setup_runtime_modules)
690668
if(DEFINED _NBL_CUSTOM_DESTINATION AND NOT _NBL_CUSTOM_DESTINATION STREQUAL "")
691669
list(APPEND _sync_args DESTINATION "${_NBL_CUSTOM_DESTINATION}")
692670
endif()
693-
foreach(_override IN LISTS _destination_overrides)
694-
string(REPLACE "::" ";" _override_parts "${_override}")
695-
list(GET _override_parts 0 _cfg_upper)
696-
list(GET _override_parts 1 _cfg_destination)
697-
list(APPEND _sync_args "DESTINATION_${_cfg_upper}" "${_cfg_destination}")
698-
endforeach()
671+
if(DEFINED _NBL_CUSTOM_DESTINATION_DEBUG AND NOT _NBL_CUSTOM_DESTINATION_DEBUG STREQUAL "")
672+
list(APPEND _sync_args DESTINATION_DEBUG "${_NBL_CUSTOM_DESTINATION_DEBUG}")
673+
endif()
674+
if(DEFINED _NBL_CUSTOM_DESTINATION_RELEASE AND NOT _NBL_CUSTOM_DESTINATION_RELEASE STREQUAL "")
675+
list(APPEND _sync_args DESTINATION_RELEASE "${_NBL_CUSTOM_DESTINATION_RELEASE}")
676+
endif()
677+
if(DEFINED _NBL_CUSTOM_DESTINATION_RELWITHDEBINFO AND NOT _NBL_CUSTOM_DESTINATION_RELWITHDEBINFO STREQUAL "")
678+
list(APPEND _sync_args DESTINATION_RELWITHDEBINFO "${_NBL_CUSTOM_DESTINATION_RELWITHDEBINFO}")
679+
endif()
699680
if(_NBL_CUSTOM_BUILD_TRIGGER_TARGETS)
700681
list(APPEND _sync_args BUILD_TRIGGER_TARGETS ${_NBL_CUSTOM_BUILD_TRIGGER_TARGETS})
701682
endif()

docs/consume/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ nabla_sync_runtime_modules(
6666

6767
Rules:
6868

69-
- use either `TARGETS` mode or `DESTINATION` / `DESTINATION_<CONFIG>` mode
69+
- use either `TARGETS` mode or `DESTINATION` / `DESTINATION_DEBUG` / `DESTINATION_RELEASE` / `DESTINATION_RELWITHDEBINFO` mode
7070
- `MODE CONFIGURE_TIME` does copy during configure/generate
7171
- `MODE BUILD_TIME` and `MODE BOTH` in destination mode require `BUILD_TRIGGER_TARGETS`
7272

@@ -178,7 +178,7 @@ For relocatable consumers:
178178

179179
Note:
180180

181-
Current Nabla build interface still compiles some runtime lookup data with absolute paths.
182-
This is a known issue on Nabla side and will be refactored.
183-
Do not propagate that pattern to package consumers.
184-
Consumer-facing package helpers are designed to avoid exposing absolute paths in consumer compile definitions.
181+
- current Nabla build interface still compiles some runtime lookup data with absolute paths
182+
- this is a known issue on Nabla side and will be refactored
183+
- do not propagate that pattern to package consumers
184+
- consumer-facing package helpers are designed to avoid exposing absolute paths in consumer compile definitions

0 commit comments

Comments
 (0)