forked from shacl/cmake
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDependentDelegatingCacheVariable.cmake
More file actions
117 lines (100 loc) · 3.61 KB
/
DependentDelegatingCacheVariable.cmake
File metadata and controls
117 lines (100 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
cmake_minimum_required(VERSION 3.12.1)
include_guard(DIRECTORY)
include("${CMAKE_CURRENT_LIST_DIR}/config.cmake")
if(shacl.cmake.installation)
get_property(
shacl.cmake.installed_modules GLOBAL PROPERTY shacl.cmake.installed_modules)
if(NOT "DependentDelegatingCacheVariable" IN_LIST shacl.cmake.installed_modules)
set_property(GLOBAL APPEND PROPERTY
shacl.cmake.installed_modules "DependentDelegatingCacheVariable")
install(
FILES "${CMAKE_CURRENT_LIST_FILE}"
DESTINATION share/cmake/shacl/.cmake)
endif()
unset(shacl.cmake.installed_modules)
endif()
include_guard(GLOBAL)
function(dependent_delegating_cache_variable variable)
set(OPTIONS)
set(UNARY_ARGUMENTS DEFAULT TYPE DOCSTRING)
set(VARIADIC_ARGUMENTS CONDITION FALLBACK)
set(arguments)
foreach(argument IN LISTS ARGN)
if(argument STREQUAL "" # argument empty string
OR argument MATCHES ".*[ ].*" # argument with embedded whitespace
OR argument MATCHES ".*[;].*" # argument list
OR argument MATCHES ".*\".*") # argument with embedded quotation
list(APPEND arguments "\"${argument}\"")
else()
list(APPEND arguments "${argument}")
endif()
endforeach()
cmake_parse_arguments(ddcv
"${OPTIONS}"
"${UNARY_ARGUMENTS}"
"${VARIADIC_ARGUMENTS}" ${arguments})
if(NOT DEFINED ddcv_DEFAULT)
message(FATAL_ERROR
"dependent_delegating_cache_variable invoked without 'DEFAULT' argument")
endif()
if(NOT DEFINED ddcv_TYPE)
message(FATAL_ERROR
"dependent_delegating_cache_variable invoked without 'TYPE' argument")
endif()
set(valid_types FILEPATH PATH STRING BOOL INTERNAL)
if(NOT ddcv_TYPE IN_LIST valid_types)
message("dependent_delegating_cache_variable error")
message("TYPE argument value: ${ddcv_TYPE}")
message(FATAL_ERROR
"TYPE argument must be one of FILEPATH, PATH, STRING, BOOL, or INTERNAL")
endif()
if(ddcv_DOCSTRING)
string(CONCAT docstring
"${ddcv_DOCSTRING}\n"
"When set to 'default', ${variable} assumes the value of ${ddcv_DEFAULT}")
else()
string(CONCAT docstring
"When set to 'default', ${variable} assumes the value of ${ddcv_DEFAULT}")
endif()
if(NOT DEFINED ddcv_CONDITION)
message(FATAL_ERROR
"dependent_delegating_cache_variable invoked without 'CONDITION' argument")
endif()
if(NOT DEFINED ddcv_FALLBACK)
message(FATAL_ERROR
"dependent_delegating_cache_variable invoked without 'FALLBACK' argument")
endif()
if(DEFINED ddcv_UNPARSED_ARGUMENTS)
message(FATAL_ERROR
"dependent_delegating_cache_variable invoked with unrecognized arguments: ${dcv_UNPARSED_ARGUMENTS}")
endif()
set(available TRUE)
foreach(condition IN LISTS ddcv_CONDITION)
if(condition MATCHES "\"(.*)\"")
set(condition "${CMAKE_MATCH_1}")
endif()
string(REGEX REPLACE " +" ";" condition "${condition}")
if(${condition})
else()
set(available FALSE)
break()
endif()
endforeach()
get_property(variable.set GLOBAL PROPERTY "${variable}.set" SET)
if(${available})
if(NOT variable.set)
set(${variable} "default" CACHE "${ddcv_TYPE}" "${docstring}")
set(${variable} "${${variable}}" CACHE "${ddcv_TYPE}" "${docstring}" FORCE)
endif()
if(${variable} STREQUAL "default")
set(${variable} "${${ddcv_DEFAULT}}" PARENT_SCOPE)
endif()
else()
if(DEFINED ${variable})
set(${variable} "${${variable}}" CACHE INTERNAL "${docstring}")
else(NOT variable.set)
set(${variable} "default" CACHE INTERNAL "${docstring}")
endif()
set(${variable} "${ddcv_FALLBACK}" PARENT_SCOPE)
endif()
endfunction()