@@ -8,24 +8,28 @@ include(CheckCXXSourceCompiles)
8
8
#[=[
9
9
Usage examples:
10
10
11
- try_append_cxx_flags(warn_cxx_flags "-Wformat -Wformat-security")
11
+ try_append_cxx_flags("-Wformat -Wformat-security" VAR warn_cxx_flags )
12
12
13
13
14
- try_append_cxx_flags(warn_cxx_flags "-Wsuggest-override"
14
+ try_append_cxx_flags("-Wsuggest-override" VAR warn_cxx_flags
15
15
SOURCE "struct A { virtual void f(); }; struct B : A { void f() final; };"
16
16
)
17
17
18
18
19
- try_append_cxx_flags(sanitizers_cxx_flags "-fsanitize=${SANITIZERS}" RESULT_VAR cxx_supports_sanitizers)
19
+ try_append_cxx_flags("-fsanitize=${SANITIZERS}" TARGET core
20
+ RESULT_VAR cxx_supports_sanitizers
21
+ )
20
22
if(NOT cxx_supports_sanitizers)
21
23
message(FATAL_ERROR "Compiler did not accept requested flags.")
22
24
endif()
23
25
24
26
25
- try_append_cxx_flags(warn_cxx_flags "-Wunused-parameter" IF_CHECK_PASSED "-Wno-unused-parameter")
27
+ try_append_cxx_flags("-Wunused-parameter" TARGET core
28
+ IF_CHECK_PASSED "-Wno-unused-parameter"
29
+ )
26
30
27
31
28
- try_append_cxx_flags(error_cxx_flags "-Werror=return-type"
32
+ try_append_cxx_flags("-Werror=return-type" TARGET core
29
33
IF_CHECK_FAILED "-Wno-error=return-type"
30
34
SOURCE "#include <cassert>\nint f(){ assert(false); }"
31
35
)
@@ -37,49 +41,67 @@ In configuration output, this function prints a string by the following pattern:
37
41
-- Performing Test CXX_SUPPORTS_[flags] - Success
38
42
39
43
]=]
40
- function (try_append_cxx_flags flags_var flags )
41
- cmake_parse_arguments (PARSE_ARGV 2
44
+ function (try_append_cxx_flags flags )
45
+ cmake_parse_arguments (PARSE_ARGV 1
42
46
TACXXF # prefix
43
47
"" # options
44
- "SOURCE;RESULT_VAR" # one_value_keywords
48
+ "TARGET;VAR; SOURCE;RESULT_VAR" # one_value_keywords
45
49
"IF_CHECK_PASSED;IF_CHECK_FAILED" # multi_value_keywords
46
50
)
47
51
48
52
string (MAKE_C_IDENTIFIER "${flags} " result )
49
53
string (TOUPPER "${result} " result )
50
- set (result "CXX_SUPPORTS_${result} " )
51
-
52
- # Every subsequent check_cxx_source_compiles((<code> <resultVar>) run will re-use
53
- # the cached result rather than performing the check again, even if the <code> changes.
54
- # Removing the cached result in order to force the check to be re-evaluated.
55
- unset (${result} CACHE )
56
-
57
- if (NOT DEFINED TACXXF_SOURCE )
58
- set (TACXXF_SOURCE "int main() { return 0; }" )
54
+ string (PREPEND result CXX_SUPPORTS_ )
55
+
56
+ set (source "int main() { return 0; }" )
57
+ if (DEFINED TACXXF_SOURCE AND NOT TACXXF_SOURCE STREQUAL source )
58
+ set (source "${TACXXF_SOURCE} " )
59
+ string (SHA256 source_hash "${source} " )
60
+ string (SUBSTRING ${source_hash} 0 4 source_hash_head )
61
+ string (APPEND result _${source_hash_head} )
59
62
endif ()
60
63
61
64
# This avoids running a linker.
62
65
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY )
63
66
set (CMAKE_REQUIRED_FLAGS "${flags} ${working_compiler_werror_flag} " )
64
- check_cxx_source_compiles ("${TACXXF_SOURCE } " ${result} )
67
+ check_cxx_source_compiles ("${source } " ${result} )
65
68
66
69
if (${result} )
67
70
if (DEFINED TACXXF_IF_CHECK_PASSED )
68
- string (STRIP "${${flags_var} } ${TACXXF_IF_CHECK_PASSED} " ${flags_var} )
71
+ if (DEFINED TACXXF_TARGET )
72
+ target_compile_options (${TACXXF_TARGET} INTERFACE ${TACXXF_IF_CHECK_PASSED} )
73
+ endif ()
74
+ if (DEFINED TACXXF_VAR )
75
+ string (STRIP "${${TACXXF_VAR} } ${TACXXF_IF_CHECK_PASSED} " ${TACXXF_VAR} )
76
+ endif ()
69
77
else ()
70
- string (STRIP "${${flags_var} } ${flags} " ${flags_var} )
78
+ if (DEFINED TACXXF_TARGET )
79
+ target_compile_options (${TACXXF_TARGET} INTERFACE ${flags} )
80
+ endif ()
81
+ if (DEFINED TACXXF_VAR )
82
+ string (STRIP "${${TACXXF_VAR} } ${flags} " ${TACXXF_VAR} )
83
+ endif ()
71
84
endif ()
72
85
elseif (DEFINED TACXXF_IF_CHECK_FAILED )
73
- string (STRIP "${${flags_var} } ${TACXXF_IF_CHECK_FAILED} " ${flags_var} )
86
+ if (DEFINED TACXXF_TARGET )
87
+ target_compile_options (${TACXXF_TARGET} INTERFACE ${TACXXF_IF_CHECK_FAILED} )
88
+ endif ()
89
+ if (DEFINED TACXXF_VAR )
90
+ string (STRIP "${${TACXXF_VAR} } ${TACXXF_IF_CHECK_FAILED} " ${TACXXF_VAR} )
91
+ endif ()
92
+ endif ()
93
+
94
+ if (DEFINED TACXXF_VAR )
95
+ set (${TACXXF_VAR} "${${TACXXF_VAR} }" PARENT_SCOPE )
96
+ endif ()
97
+
98
+ if (DEFINED TACXXF_RESULT_VAR )
99
+ set (${TACXXF_RESULT_VAR} "${${result} }" PARENT_SCOPE )
74
100
endif ()
75
- set (${flags_var} "${${flags_var} }" PARENT_SCOPE )
76
- set (${TACXXF_RESULT_VAR} "${${result} }" PARENT_SCOPE )
77
101
endfunction ()
78
102
79
103
if (MSVC )
80
- set ( warning_as_error_flag /WX )
104
+ try_append_cxx_flags ( " /WX /options:strict" VAR working_compiler_werror_flag )
81
105
else ()
82
- set ( warning_as_error_flag -Werror )
106
+ try_append_cxx_flags ( " -Werror" VAR working_compiler_werror_flag )
83
107
endif ()
84
- try_append_cxx_flags (working_compiler_werror_flag ${warning_as_error_flag} )
85
- unset (warning_as_error_flag )
0 commit comments