Skip to content

Commit ce6c104

Browse files
committed
feat(cmake): add ixm_fallback function
This brings a new function, `ixm_fallback`, which replaces an internal command `🈯::ixm::default`, and is now available for consumers. This command is used to assign values to variables that have not yet been defined. This is most useful when `cmake_parse_arguments` has been called and an optional value was not passed in to the user. Behavior regarding it's interaction with CMP0174 has been documented as well. Signed-off-by: Izzy Muerte <63051+bruxisma@users.noreply.github.com>
1 parent d9e6d32 commit ce6c104

File tree

5 files changed

+50
-24
lines changed

5 files changed

+50
-24
lines changed

β€Ždocs/commands/common.md

+19
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ order: 1
88
IXM's common commands handle several operations users might require as part of
99
their day to day routines when writing CMake commands.
1010

11+
## `ixm_fallback`
12+
13+
Sets a default fallback value for a variable if it is not defined. The value
14+
set is whatever is passed after the `variable` argument (i.e., [`ARGN`][argn]).
15+
16+
> [!IMPORTANT]
17+
> This function's behavior is directly affected by [CMP0174][policy-174], as it
18+
> checks if te given `variable` is `DEFINED` or not (i.e., if the variable is
19+
> "unset", the values provided are assigned).
20+
21+
### Required Parameters {#fallback/required}
22+
23+
`variable`
24+
: Name of the variable to store values in.
25+
: *Type*: `identifier`
26+
1127
## `ixm::unimplemented`
1228

1329
This is a small helper function that simply prints a `FATAL_ERROR` with the
@@ -57,3 +73,6 @@ as `MATCH{<N>}` and `MATCH{COUNT}`. This also replaces instances of
5773
This command is a holdover from early implementations of IXM. While it may not
5874
currently be used by IXM, there is some value in rebinding the results of
5975
`string(REGEX MATCH)` or the condition syntax usage of `MATCHES`.
76+
77+
[policy-174]: https://cmake.org/cmake/help/latest/policy/CMP0174.html
78+
[argn]: https://cmake.org/cmake/help/latest/command/function.html#arguments

β€Žmodules/FindCoverage.cmake

+4-4
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,12 @@ file
139139
]============================================================================]
140140
function (add_llvm_coverage name)
141141
cmake_parse_arguments(ARG "ALL" "EXPORT;OUTPUT;FORMAT;GITHUB" "TARGETS;IGNORE_FILENAME_REGEX" ${ARGN})
142-
cmake_language(CALL 🈯::ixm::default ARG_EXPORT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${name}.lcov.info")
143-
cmake_language(CALL 🈯::ixm::default ARG_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${name}.profdata")
144-
cmake_language(CALL 🈯::ixm::default ARG_FORMAT lcov)
142+
ixm_fallback(ARG_EXPORT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${name}.lcov.info")
143+
ixm_fallback(ARG_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${name}.profdata")
144+
ixm_fallback(ARG_FORMAT lcov)
145145
# Can't really remember why there's a ARG_GITHUB. Probably for
146146
# uploading/writing to a step summary automatically?
147-
cmake_language(CALL 🈯::ixm::default ARG_GITHUB "${name}")
147+
ixm_fallback(ARG_GITHUB "${name}")
148148
set(ignore.filename.regex $<GENEX_EVAL:$<TARGET_PROPERTY:${name},LLVM_IGNORE_FILENAME_REGEX>>)
149149
set(test.executables $<GENEX_EVAL:$<TARGET_PROPERTY:${name},LLVM_TEST_EXECUTABLES>>)
150150
set(profraw.sources $<GENEX_EVAL:$<TARGET_PROPERTY:${name},LLVM_PROFRAW_SOURCES>>)

β€Žruntime/common.cmake

+14-7
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,22 @@ function (🈯::ixm::experiment name uuid)
5858
endif()
5959
endfunction()
6060

61-
#[[Used to set missing arguments to a well known default]]
62-
macro(🈯::ixm::default var default)
63-
if (NOT ${var})
64-
set(${var} ${default})
65-
endif()
66-
endmacro()
67-
6861
macro(🈯::ixm::requires name)
6962
if (NOT ARG_${name})
7063
message(FATAL_ERROR "function '${CMAKE_CURRENT_FUNCTION}' requires a '${name}' argument")
7164
endif()
7265
endmacro()
66+
67+
#[============================================================================[
68+
# @summary Sets a default fallback value for a variable if it is not defined.
69+
# @description This is intended to be used inside of `function()`s after a call
70+
# to `cmake_parse_arguments`. While there is technically nothing stopping its
71+
# use in a general scope, users will most likely not receive this functions
72+
# benefits.
73+
# @param {identifier} variable - name of variable to set a fallback value for.
74+
#]============================================================================]
75+
function (ixm_fallback variable)
76+
if (NOT DEFINED ${variable})
77+
set(${variable} ${ARGN} PARENT_SCOPE)
78+
endif()
79+
endfunction()

β€Žruntime/features.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function (ixm::feature)
2828
cmake_language(CALL 🈯::ixm::requires NAME)
2929
cmake_language(CALL 🈯::ixm::feature::requirements)
3030

31-
cmake_language(CALL 🈯::ixm::default ARG_DEFAULT NO)
31+
ixm_fallback(ARG_DEFAULT NO)
3232

3333
if (ARG_PROJECT_ONLY)
3434
list(APPEND requirements PROJECT_IS_TOP_LEVEL)

β€Žruntime/find.cmake

+12-12
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ include_guard(GLOBAL)
2525
#]============================================================================]
2626
function (ixm::find::program)
2727
cmake_language(CALL 🈯::ixm::find::prologue "" "" "VERSION" ${ARGN})
28-
cmake_language(CALL 🈯::ixm::default ARG_OUTPUT_VARIABLE ${name}_EXECUTABLE)
28+
ixm_fallback(ARG_OUTPUT_VARIABLE ${name}_EXECUTABLE)
2929

3030
find_program(${ARG_OUTPUT_VARIABLE} NAMES ${ARG_NAMES} ${ARG_UNPARSED_ARGUMENTS})
3131
cmake_language(CALL 🈯::ixm::find::log)
3232
cmake_language(CALL 🈯::ixm::find::properties ${prefix}::{${target}}::program)
3333

3434
if (ARG_VERSION AND ARG_OUTPUT_VARIABLE)
3535
cmake_parse_arguments(VERSION "" "OPTION;REGEX;VARIABLE;DESCRIPTION" "" ${ARG_VERSION})
36-
cmake_language(CALL 🈯::ixm::default VERSION_VARIABLE ${name}_VERSION)
36+
ixm_fallback(VERSION_VARIABLE ${name}_VERSION)
3737
cmake_language(CALL 🈯::ixm::find::version
3838
OUTPUT_VARIABLE ${VERSION_VARIABLE}
3939
DESCRIPTION "${VERSION_DESCRIPTION}"
@@ -64,11 +64,11 @@ endfunction()
6464
#]============================================================================]
6565
function (ixm::find::library)
6666
cmake_language(CALL 🈯::ixm::find::prologue "" "" "HEADER" ${ARGN})
67-
cmake_language(CALL 🈯::ixm::default ARG_OUTPUT_VARIABLE ${name}_LIBRARY)
67+
ixm_fallback(ARG_OUTPUT_VARIABLE ${name}_LIBRARY)
6868

6969
if (DEFINED ARG_HEADER)
7070
cmake_parse_arguments(HEADER "" "VARIABLE" "" ${ARG_HEADER})
71-
cmake_language(CALL 🈯::ixm::default HEADER_VARIABLE ${name}_INCLUDE_DIR)
71+
ixm_fallback(HEADER_VARIABLE ${name}_INCLUDE_DIR)
7272
endif()
7373

7474
find_library(${ARG_OUTPUT_VARIABLE} NAMES ${ARG_NAMES} ${ARG_UNPARSED_ARGUMENTS})
@@ -101,7 +101,7 @@ endfunction()
101101
#]============================================================================]
102102
function (ixm::find::header)
103103
cmake_language(CALL 🈯::ixm::find::prologue "" "" "" ${ARGN})
104-
cmake_language(CALL 🈯::ixm::default ARG_OUTPUT_VARIABLE ${name}_INCLUDE_DIR)
104+
ixm_fallback(ARG_OUTPUT_VARIABLE ${name}_INCLUDE_DIR)
105105

106106
find_path(${ARG_OUTPUT_VARIABLE} NAMES ${ARG_NAMES} ${ARG_UNPARSED_ARGUMENTS})
107107
cmake_language(CALL 🈯::ixm::log)
@@ -121,10 +121,10 @@ function (ixm::find::framework)
121121
cmake_language(CALL 🈯::ixm::find::prologue "" "" "" ${ARGN})
122122
if (DEFINED ARG_HEADER)
123123
cmake_parse_arguments(HEADER "" "VARIABLE" "NAMES" ${ARG_HEADER})
124-
cmake_language(CALL 🈯::ixm::default HEADER_VARIABLE ${name}_INCLUDE_DIR)
124+
ixm_fallback(HEADER_VARIABLE ${name}_INCLUDE_DIR)
125125
126126
# check what name is
127-
cmake_language(CALL 🈯::ixm::default HEADER_NAMES "${name}/${name}.h")
127+
ixm_fallback(HEADER_NAMES "${name}/${name}.h")
128128
endif()
129129
find_library(${ARG_OUTPUT_VARIABLE} NAMES ${ARG_NAMES} ${ARG_UNPARSED_ARGUMENTS})
130130
find_path(${HEADER_VARIABLE} NAMES ${HEADER_NAMES} ${ARG_UNPARSED_ARGUMENTS})
@@ -139,9 +139,9 @@ endfunction()
139139
function (🈯::ixm::find::version)
140140
cmake_parse_arguments(ARG "" "QUIET;OUTPUT_VARIABLE;DESCRIPTION;COMMAND;OPTION;REGEX" "" ${ARGN})
141141
cmake_language(CALL 🈯::ixm::requires OUTPUT_VARIABLE)
142-
cmake_language(CALL 🈯::ixm::default ARG_DESCRIPTION "${ARG_COMMAND} version")
143-
cmake_language(CALL 🈯::ixm::default ARG_OPTION "--version")
144-
cmake_language(CALL 🈯::ixm::default ARG_REGEX
142+
ixm_fallback(ARG_DESCRIPTION "${ARG_COMMAND} version")
143+
ixm_fallback(ARG_OPTION "--version")
144+
ixm_fallback(ARG_REGEX
145145
# This is a magic regex. It works in 95% of all cases.
146146
"[^0-9]*([0-9]+)[.]([0-9]+)?[.]?([0-9]+)?[.]?([0-9]+)?.*")
147147
if (NOT IS_EXECUTABLE "${ARG_COMMAND}")
@@ -206,11 +206,11 @@ macro (🈯::ixm::find::prologue options monadic variadic)
206206
${ARGN})
207207

208208
if (CMAKE_FIND_PACKAGE_NAME)
209-
cmake_language(CALL 🈯::ixm::default ARG_NAMES ${CMAKE_FIND_PACKAGE_NAME})
209+
ixm_fallback(ARG_NAMES ${CMAKE_FIND_PACKAGE_NAME})
210210
block (SCOPE_FOR VARIABLES PROPAGATE ARG_DESCRIPTION)
211211
list(LENGTH ARG_NAMES length)
212212
if (length EQUAL 1)
213-
cmake_language(CALL 🈯::ixm::default ARG_DESCRIPTION "Path to ${ARG_NAMES}")
213+
ixm_fallback(ARG_DESCRIPTION "Path to ${ARG_NAMES}")
214214
endif()
215215
endblock()
216216

0 commit comments

Comments
Β (0)