@@ -12,10 +12,13 @@ define_property(TARGET PROPERTY NBL_CONFIGURATION_MAP
12
12
BRIEF_DOCS "Stores configuration map for a target, it will evaluate to the configuration it's mapped to"
13
13
)
14
14
15
- # Usage: NBL_REQUEST_COMPILE_OPTION_SUPPORT(LANG <LANG;...> CONFIG <CONFIG;...> OPTIONS <OPTIONS;...> )
16
- # LANG, CONFIG - optional, OPTIONS - required
15
+ # https://github.com/Kitware/CMake/blob/05e77b8a27033e6fd086456bd6cef28338ff1474/Modules/Internal/CheckCompilerFlag.cmake#L26C7-L26C42
16
+ # must be cached because parse utility clears locals in the CheckCompilerFlag module
17
+ set (CHECK_COMPILER_FLAG_OUTPUT_VARIABLE NBL_COMPILER_FLAG_OUTPUT CACHE INTERNAL "" )
18
+
19
+ # Usage: NBL_REQUEST_COMPILE_OPTION_SUPPORT(LANG <LANG;...> CONFIG <CONFIG;...> COMPILE_OPTIONS <OPTIONS;...> LINK_OPTIONS <OPTIONS;...>)
17
20
function (NBL_REQUEST_COMPILE_OPTION_SUPPORT)
18
- cmake_parse_arguments (IMPL "REQUIRED" "REQUEST_VAR" "LANG;CONFIG;OPTIONS " ${ARGN} )
21
+ cmake_parse_arguments (IMPL "REQUIRED" "REQUEST_VAR" "LANG;CONFIG;COMPILE_OPTIONS;LINK_OPTIONS " ${ARGN} )
19
22
20
23
set (DEFAULT_COMPILERS c cxx)
21
24
set (REQUEST_ALL_OPTIONS_PRESENT True )
@@ -24,63 +27,39 @@ function(NBL_REQUEST_COMPILE_OPTION_SUPPORT)
24
27
list (APPEND IMPL_LANG ${DEFAULT_COMPILERS} )
25
28
endif ()
26
29
27
- if (NOT IMPL_OPTIONS)
28
- message (FATAL_ERROR "NBL_REQUEST_COMPILE_OPTION_SUPPORT's OPTIONS empty!" )
29
- endif ()
30
-
31
30
foreach (COMPILER IN ITEMS ${IMPL_LANG} )
32
31
string (TOUPPER "${COMPILER} " COMPILER_UPPER)
33
32
34
- if (COMPILER_UPPER STREQUAL C)
35
- macro (VALIDATE_FLAG)
36
- check_c_compiler_flag(${ARGV} )
37
- endmacro ()
38
- elseif (COMPILER_UPPER STREQUAL CXX)
39
- macro (VALIDATE_FLAG)
40
- check_cxx_compiler_flag(${ARGV} )
41
- endmacro ()
42
- endif ()
43
-
44
- foreach (COMPILE_OPTION ${IMPL_OPTIONS} )
45
- string (REGEX REPLACE "[-=:;/.]" "_" FLAG_SIGNATURE "${COMPILE_OPTION} " )
46
-
47
- set (TEST_NAME "NBL_${COMPILER_UPPER} _COMPILER_HAS_${FLAG_SIGNATURE} _FLAG" )
48
- set (FLAG_VAR ${TEST_NAME} )
33
+ foreach (WHAT_OPTIONS IN ITEMS IMPL_COMPILE_OPTIONS IMPL_LINK_OPTIONS)
34
+ if (NOT ${WHAT_OPTIONS} )
35
+ continue ()
36
+ endif ()
49
37
50
- VALIDATE_FLAG("${COMPILE_OPTION} " "${FLAG_VAR} " )
38
+ set (IMPL_OPTIONS ${${WHAT_OPTIONS} })
39
+ string (REPLACE IMPL_ "" WHAT_OPTIONS "${WHAT_OPTIONS} " )
51
40
52
- if ( ${FLAG_VAR } )
41
+ foreach (COMPILE_OPTION ${IMPL_OPTIONS } )
53
42
if (IMPL_CONFIG)
54
43
foreach (CONFIG ${IMPL_CONFIG} )
55
44
# TODO: validate (${CONFIG} \in ${CMAKE_CONFIGURATION_TYPES})
56
45
string (TOUPPER "${CONFIG} " CONFIG_UPPER)
57
- set (NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _COMPILE_OPTIONS "${NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _COMPILE_OPTIONS };${COMPILE_OPTION} " )
46
+ set (NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _ ${WHAT_OPTIONS} "${NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _ ${WHAT_OPTIONS} };${COMPILE_OPTION} " )
58
47
endforeach ()
59
48
else ()
60
- set (NBL_${COMPILER_UPPER} _COMPILE_OPTIONS "${NBL_${COMPILER_UPPER} _COMPILE_OPTIONS};${COMPILE_OPTION} " )
61
- endif ()
62
- else ()
63
- if (IMPL_REQUIRED)
64
- message (FATAL_ERROR "${TEST_NAME} (a.k.a \" ${COMPILE_OPTION} \" ) failed because its marked as REQUIRED!" )
49
+ set (NBL_${COMPILER_UPPER} _${WHAT_OPTIONS} "${NBL_${COMPILER_UPPER} _${WHAT_OPTIONS} };${COMPILE_OPTION} " )
65
50
endif ()
51
+ endforeach ()
66
52
67
- set (REQUEST_ALL_OPTIONS_PRESENT False )
53
+ if (IMPL_CONFIG)
54
+ foreach (CONFIG ${IMPL_CONFIG} )
55
+ string (TOUPPER "${CONFIG} " CONFIG_UPPER)
56
+ set (NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _${WHAT_OPTIONS} ${NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _${WHAT_OPTIONS} } PARENT_SCOPE)
57
+ endforeach ()
58
+ else ()
59
+ set (NBL_${COMPILER_UPPER} _${WHAT_OPTIONS} ${NBL_${COMPILER_UPPER} _${WHAT_OPTIONS} } PARENT_SCOPE)
68
60
endif ()
69
61
endforeach ()
70
-
71
- if (IMPL_CONFIG)
72
- foreach (CONFIG ${IMPL_CONFIG} )
73
- string (TOUPPER "${CONFIG} " CONFIG_UPPER)
74
- set (NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _COMPILE_OPTIONS ${NBL_${COMPILER_UPPER} _${CONFIG_UPPER} _COMPILE_OPTIONS} PARENT_SCOPE)
75
- endforeach ()
76
- else ()
77
- set (NBL_${COMPILER_UPPER} _COMPILE_OPTIONS ${NBL_${COMPILER_UPPER} _COMPILE_OPTIONS} PARENT_SCOPE)
78
- endif ()
79
62
endforeach ()
80
-
81
- if (IMPL_REQUEST_VAR)
82
- set (${IMPL_REQUEST_VAR} ${REQUEST_ALL_OPTIONS_PRESENT} PARENT_SCOPE)
83
- endif ()
84
63
endfunction ()
85
64
86
65
option (NBL_REQUEST_SSE_4_2 "Request compilation with SSE 4.2 instruction set enabled for Nabla projects" ON )
@@ -101,42 +80,104 @@ foreach(NBL_COMPILER_LANGUAGE IN ITEMS C CXX)
101
80
continue ()
102
81
endif ()
103
82
104
- # a profile MUST define
105
- # - "NBL_${NBL_COMPILER_LANGUAGE}_${CONFIGURATION}_COMPILE_OPTIONS" (configuration dependent)
106
- # - "NBL_${NBL_COMPILER_LANGUAGE}_COMPILE_OPTIONS" (global)
83
+ # a profile MUST define
107
84
108
- # a profile MUST NOT define
109
- # - NBL_COMPILE_OPTIONS
85
+ # - "NBL_${NBL_COMPILER_LANGUAGE}_${CONFIGURATION}_${WHAT}_OPTIONS" (configuration dependent)
86
+ # - "NBL_${NBL_COMPILER_LANGUAGE}_${WHAT}_OPTIONS" (global)
110
87
111
- set (NBL_COMPILE_OPTIONS_VAR_NAME NBL_${NBL_COMPILER_LANGUAGE} _COMPILE_OPTIONS)
112
- set (NBL_COMPILE_OPTIONS_VAR_VALUE ${${NBL_COMPILE_OPTIONS_VAR_NAME} })
88
+ # a profile MUST NOT define
89
+ # - NBL_${WHAT}_OPTIONS
90
+
91
+ # note:
92
+ # - use NBL_REQUEST_COMPILE_OPTION_SUPPORT in profile to creates those vars
93
+ # - include reset utility in profiles to init vars with empty lists
113
94
114
- if (NOT DEFINED ${NBL_COMPILE_OPTIONS_VAR_NAME} )
115
- message (FATAL_ERROR "\" ${NBL_PROFILE_PATH} \" did not define \" ${NBL_COMPILE_OPTIONS_VAR_NAME} \" !" )
116
- endif ()
95
+ # TODO: DEFINITIONS for WHAT to unify the API
117
96
118
- # update map with configuration dependent compile options
119
- foreach (CONFIGURATION IN ITEMS RELEASE RELWITHDEBINFO DEBUG)
120
- set (NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_NAME NBL_${NBL_COMPILER_LANGUAGE} _${CONFIGURATION} _COMPILE_OPTIONS)
121
- set (NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_VALUE ${${NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_NAME} })
97
+ foreach (WHAT COMPILE LINK)
98
+ set (NBL_OPTIONS_VAR_NAME NBL_${NBL_COMPILER_LANGUAGE} _${WHAT} _OPTIONS)
99
+ set (NBL_OPTIONS_VAR_VALUE ${${NBL_OPTIONS_VAR_NAME} })
122
100
123
- if (NOT DEFINED ${NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_NAME } )
124
- message (FATAL_ERROR "\" ${NBL_PROFILE_PATH} \" did not define \" ${NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_NAME } \" !" )
125
- endif ()
101
+ if (NOT DEFINED ${NBL_OPTIONS_VAR_NAME } )
102
+ message (FATAL_ERROR "\" ${NBL_PROFILE_PATH} \" did not define \" ${NBL_OPTIONS_VAR_NAME } \" !" )
103
+ endif ()
126
104
127
- list (APPEND NBL_${CONFIGURATION} _COMPILE_OPTIONS
128
- # note that "${NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_VALUE}" MUST NOT contain ANY
129
- # $<$<CONFIG:<>> generator expression in order to support our configuration mapping features
130
- $<$<COMPILE_LANGUAGE:${NBL_COMPILER_LANGUAGE} >:${NBL_CONFIGURATION_COMPILE_OPTIONS_VAR_VALUE} >
131
- )
105
+ # update map with configuration dependent compile options
106
+ foreach (CONFIGURATION IN ITEMS RELEASE RELWITHDEBINFO DEBUG)
107
+ set (NBL_CONFIGURATION_OPTIONS_VAR_NAME NBL_${NBL_COMPILER_LANGUAGE} _${CONFIGURATION} _${WHAT} _OPTIONS)
108
+ set (NBL_CONFIGURATION_OPTIONS_VAR_VALUE ${${NBL_CONFIGURATION_OPTIONS_VAR_NAME} })
132
109
133
- set (NBL_${CONFIGURATION} _COMPILE_OPTIONS ${NBL_${CONFIGURATION} _COMPILE_OPTIONS})
134
- endforeach ()
110
+ if (NOT DEFINED ${NBL_CONFIGURATION_OPTIONS_VAR_NAME} )
111
+ message (FATAL_ERROR "\" ${NBL_PROFILE_PATH} \" did not define \" ${NBL_CONFIGURATION_OPTIONS_VAR_NAME} \" !" )
112
+ endif ()
113
+
114
+ set (NBL_${CONFIGURATION} _${WHAT} _OPTIONS ${NBL_${CONFIGURATION} _${WHAT} _OPTIONS}
115
+ # note that "${NBL_CONFIGURATION_OPTIONS_VAR_VALUE}" MUST NOT contain ANY
116
+ # $<$<CONFIG:<>> generator expression in order to support our configuration mapping features
117
+ $<$<${WHAT} _LANGUAGE:${NBL_COMPILER_LANGUAGE} >:${NBL_CONFIGURATION_OPTIONS_VAR_VALUE} >
118
+ )
119
+ endforeach ()
120
+
121
+ # update map with global compile options
122
+ set (NBL_${WHAT} _OPTIONS ${NBL_${WHAT} _OPTIONS}
123
+ $<$<${WHAT} _LANGUAGE:${NBL_COMPILER_LANGUAGE} >:${NBL_${NBL_COMPILER_LANGUAGE} _${WHAT} _OPTIONS}>
124
+ )
125
+ endforeach ()
126
+
127
+ block()
128
+ # validate build with a vendor profile, any warning diagnostic = error
129
+ # if you hit error it means the profile generates diagnostics due to:
130
+ # - an option (compile or link) which doesn't exist (typo? check vendor docs)
131
+ # - a set of options which invalidates an option (eg. MSVC's /INCREMENTAL with /LTCG:incremental is invalid, however linker will emit a warning by default + do a fall-back)
132
+ # https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html#variable:CMAKE_%3CLANG%3E_FLAGS
133
+ # https://cmake.org/cmake/help/latest/module/CheckCompilerFlag.html#command:check_compiler_flag
134
+
135
+ set (CMAKE_${NBL_COMPILER_LANGUAGE} _FLAGS)
136
+
137
+ foreach (CONFIGURATION IN ITEMS Release RelWithDebInfo Debug)
138
+ set (CMAKE_TRY_COMPILE_CONFIGURATION ${CONFIGURATION} )
139
+ string (TOUPPER "${CONFIGURATION} " CONFIGURATION )
140
+
141
+ set (TEST_NAME "NBL_${NBL_COMPILER_LANGUAGE} _LANG_${CONFIGURATION} _BUILD_OPTIONS_SUPPORT" )
142
+ set (CMAKE_${NBL_COMPILER_LANGUAGE} _FLAGS_${CONFIGURATION} )
143
+
144
+ set (COMPILE_OPTIONS ${NBL_${NBL_COMPILER_LANGUAGE} _COMPILE_OPTIONS} ${NBL_${NBL_COMPILER_LANGUAGE} _${CONFIGURATION} _COMPILE_OPTIONS})
145
+ set (LINK_OPTIONS ${NBL_${NBL_COMPILER_LANGUAGE} _${CONFIGURATION} _LINK_OPTIONS})
146
+ set (COMBINED ${COMPILE_OPTIONS} ${LINK_OPTIONS} )
147
+
148
+ set (NBL_OUTPUT_FILE "${CMAKE_BINARY_DIR} /.nbl/try-compile/${TEST_NAME} .output" ) # no hash in output diagnostic file, desired
149
+
150
+ string (SHA1 OPTIONS_HASH "${COMBINED} " )
151
+ string (APPEND TEST_NAME "_HASH_${OPTIONS_HASH} " )
152
+
153
+ set (FLAG_VAR ${TEST_NAME} )
154
+ set (CMAKE_REQUIRED_LINK_OPTIONS ${LINK_OPTIONS} )
155
+ string (REPLACE ";" " " CLI_COMPILE_OPTIONS "${COMPILE_OPTIONS} " )
156
+
157
+ if (NBL_COMPILER_LANGUAGE STREQUAL C)
158
+ check_c_compiler_flag("${CLI_COMPILE_OPTIONS} " "${FLAG_VAR} " )
159
+ elseif (NBL_COMPILER_LANGUAGE STREQUAL CXX)
160
+ check_cxx_compiler_flag("${CLI_COMPILE_OPTIONS} " "${FLAG_VAR} " )
161
+ endif ()
162
+
163
+ if (NOT ${FLAG_VAR} )
164
+ if (NOT "${NBL_COMPILER_FLAG_OUTPUT} " STREQUAL "" )
165
+ file (WRITE "${NBL_OUTPUT_FILE} " "${NBL_COMPILER_FLAG_OUTPUT} " ) # lock into file, do not cache, must read from the file because of NBL_COMPILER_FLAG_OUTPUT availability (CMake module writes an output only once before a signature flag status is created)
166
+ endif ()
135
167
136
- # update map with global compile options
137
- list (APPEND NBL_COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:${NBL_COMPILER_LANGUAGE} >:${NBL_${NBL_COMPILER_LANGUAGE} _COMPILE_OPTIONS}>)
168
+ if (EXISTS "${NBL_OUTPUT_FILE} " )
169
+ file (READ "${NBL_OUTPUT_FILE} " NBL_DIAGNOSTICS)
170
+ set (NBL_DIAGNOSTICS "Diagnostics:\n ${NBL_DIAGNOSTICS} " )
171
+ else ()
172
+ set (NBL_DIAGNOSTICS)
173
+ endif ()
138
174
139
- set (NBL_COMPILE_OPTIONS ${NBL_COMPILE_OPTIONS} )
175
+ if (NOT DEFINED NBL_SKIP_BUILD_OPTIONS_VALIDATION)
176
+ message (FATAL_ERROR "${TEST_NAME} failed! To skip the validation define \" NBL_SKIP_BUILD_OPTIONS_VALIDATION\" . ${NBL_DIAGNOSTICS} " )
177
+ endif ()
178
+ endif ()
179
+ endforeach ()
180
+ endblock()
140
181
endforeach ()
141
182
142
183
function (NBL_EXT_P_APPEND_COMPILE_OPTIONS NBL_LIST_NAME MAP_RELEASE MAP_RELWITHDEBINFO MAP_DEBUG)
@@ -240,23 +281,27 @@ function(nbl_adjust_flags)
240
281
241
282
# global compile options
242
283
list (APPEND _D_NBL_COMPILE_OPTIONS_ ${NBL_COMPILE_OPTIONS} )
243
-
244
- # per configuration compile options with mapping
245
- list (APPEND _D_NBL_COMPILE_OPTIONS_ $<$<CONFIG:Debug>:${NBL_${NBL_MAP_DEBUG_ITEM_U} _COMPILE_OPTIONS}>)
246
- list (APPEND _D_NBL_COMPILE_OPTIONS_ $<$<CONFIG:Release>:${NBL_${NBL_MAP_RELEASE_ITEM_U} _COMPILE_OPTIONS}>)
247
- list (APPEND _D_NBL_COMPILE_OPTIONS_ $<$<CONFIG:RelWithDebInfo>:${NBL_${NBL_MAP_RELWITHDEBINFO_ITEM_U} _COMPILE_OPTIONS}>)
248
-
249
- # configuration mapping properties
250
- string (APPEND _D_NBL_CONFIGURATION_MAP_ $<$<CONFIG:Debug>:${NBL_MAP_DEBUG_ITEM_U} >)
251
- string (APPEND _D_NBL_CONFIGURATION_MAP_ $<$<CONFIG:Release>:${NBL_MAP_RELEASE_ITEM_U} >)
252
- string (APPEND _D_NBL_CONFIGURATION_MAP_ $<$<CONFIG:RelWithDebInfo>:${NBL_MAP_RELWITHDEBINFO_ITEM_U} >)
284
+
285
+ foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES} )
286
+ string (TOUPPER "${CONFIG} " CONFIG_U)
287
+
288
+ # per configuration options with mapping
289
+ foreach (WHAT COMPILE LINK)
290
+ list (APPEND _D_NBL_${WHAT} _OPTIONS_ $<$<CONFIG:${CONFIG} >:${NBL_${NBL_MAP_${CONFIG_U} _ITEM_U}_${WHAT} _OPTIONS}>)
291
+ endforeach ()
292
+
293
+ # configuration mapping properties
294
+ string (APPEND _D_NBL_CONFIGURATION_MAP_ $<$<CONFIG:${CONFIG} >:${NBL_MAP_${CONFIG_U} _ITEM_U}>)
295
+ endforeach ()
253
296
254
297
set_target_properties (${NBL_TARGET_ITEM} PROPERTIES
255
298
NBL_CONFIGURATION_MAP "${_D_NBL_CONFIGURATION_MAP_} "
256
299
COMPILE_OPTIONS "${_D_NBL_COMPILE_OPTIONS_} "
300
+ LINK_OPTIONS "${_D_NBL_LINK_OPTIONS_} "
257
301
)
258
302
unset (_D_NBL_CONFIGURATION_MAP_)
259
303
unset (_D_NBL_COMPILE_OPTIONS_)
304
+ unset (_D_NBL_LINK_OPTIONS_)
260
305
261
306
set (MAPPED_CONFIG $<TARGET_GENEX_EVAL:${NBL_TARGET_ITEM} ,$<TARGET_PROPERTY:${NBL_TARGET_ITEM} ,NBL_CONFIGURATION_MAP>>)
262
307
0 commit comments