@@ -96,65 +96,76 @@ if(NOT USE_HARDENING)
9696 message (STATUS "Hardening disabled by USE_HARDENING evaluates to false" )
9797endif ()
9898
99- # Create a custom target to hold the hardening flags
99+ string (SHA256 _hardening_flags_hash
100+ "${USE_HARDENING_FLAGS} #${USE_HARDENING_LINKS} " )
101+ if (NOT DEFINED CACHE{__HARDENING_FLAGS_HASH} OR NOT __HARDENING_FLAGS_HASH
102+ STREQUAL _hardening_flags_hash)
103+ set (__HARDENING_FLAGS_HASH
104+ "${_hardening_flags_hash} "
105+ CACHE INTERNAL "Hash of hardening flags options" )
106+ set (__HARDENING_FLAGS "" )
107+ set (__HARDENING_LINKS "" )
100108
101- message ( VERBOSE "Check Hardening flags: ${USE_HARDENING_FLAGS} " )
109+ # Create a custom target to hold the hardening flags
102110
103- foreach (_harden ${USE_HARDENING_FLAGS} )
104- check_and_append_flag (FLAGS ${_harden} TARGETS hardening_flags )
105- endforeach ()
111+ message (VERBOSE "Check Hardening flags: ${USE_HARDENING_FLAGS} " )
106112
107- flags_to_list (hardening_flags "${hardening_flags} " )
113+ foreach (_harden ${USE_HARDENING_FLAGS} )
114+ check_and_append_flag (FLAGS ${_harden} TARGETS __HARDENING_FLAGS )
115+ endforeach ()
108116
109- message ( VERBOSE "Check Hardening links: ${USE_HARDENING_LINKS } " )
117+ flags_to_list ( __HARDENING_FLAGS " ${__HARDENING_FLAGS } " )
110118
111- foreach (_harden ${USE_HARDENING_LINKS} )
112- flags_to_list (_harden_list "${_harden} " )
119+ message (VERBOSE "Check Hardening links: ${USE_HARDENING_LINKS} " )
113120
114- if (hardening_flags MATCHES "${_harden_list} " )
115- list (APPEND hardening_links ${_harden} )
116- endif ()
117- endforeach ()
118-
119- # Enable minimal runtime undefined but not not propagete globally, see
120- # https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#minimal-runtime
121- if (hardening_flags MATCHES "-fsanitize=undefined;-fsanitize-minimal-runtime" )
122- message (VERBOSE
123- "Try to enabling minimal runtime undefined behavior sanitizer" )
124- check_and_append_flag (FLAGS "-fno-sanitize-recover=undefined" TARGETS
125- no_sanitize_recover_ub )
126- flags_to_list (no_sanitize_recover_ub "${no_sanitize_recover_ub} " )
127- list (APPEND hardening_flags ${no_sanitize_recover_ub} )
128- list (APPEND hardening_links ${no_sanitize_recover_ub} )
129- endif ()
121+ foreach (_harden ${USE_HARDENING_LINKS} )
122+ flags_to_list (_harden_list "${_harden} " )
130123
131- flags_to_list (hardening_links "${hardening_links} " )
124+ if (__HARDENING_FLAGS MATCHES "${_harden_list} " )
125+ list (APPEND __HARDENING_LINKS ${_harden} )
126+ endif ()
127+ endforeach ()
132128
133- # Handle the conflics between hardening ubsan and asan
134- if (TARGET sanitizer_flags)
135- get_target_property (_san sanitizer_flags _san )
129+ # Enable minimal runtime undefined but not not propagete globally, see
130+ # https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#minimal-runtime
131+ if (__HARDENING_FLAGS MATCHES
132+ "-fsanitize=undefined;-fsanitize-minimal-runtime" )
133+ message (VERBOSE
134+ "Try to enabling minimal runtime undefined behavior sanitizer" )
135+ check_and_append_flag (FLAGS "-fno-sanitize-recover=undefined" TARGETS
136+ no_sanitize_recover_ub )
137+ flags_to_list (no_sanitize_recover_ub "${no_sanitize_recover_ub} " )
138+ list (APPEND __HARDENING_FLAGS ${no_sanitize_recover_ub} )
139+ list (APPEND __HARDENING_LINKS ${no_sanitize_recover_ub} )
140+ endif ()
136141
137- if (_san
138- AND _san MATCHES "-fsanitize=address"
139- AND hardening_flags MATCHES "-fsanitize-minimal-runtime" )
140- message (
141- WARNING "Try to disable usan minimal runtime due to conflict with asan" )
142- list (REMOVE_ITEM hardening_flags "-fsanitize=undefined"
143- "-fsanitize-minimal-runtime" "-fno-sanitize-recover=undefined" )
144- list (REMOVE_ITEM hardening_links "-fsanitize=undefined"
145- "-fsanitize-minimal-runtime" "-fno-sanitize-recover=undefined" )
142+ flags_to_list (__HARDENING_LINKS "${__HARDENING_LINKS} " )
143+
144+ # Handle the conflics between hardening ubsan and asan
145+ if (TARGET sanitizer_flags)
146+ get_target_property (_san sanitizer_flags _san )
147+
148+ if (_san
149+ AND _san MATCHES "-fsanitize=address"
150+ AND __HARDENING_FLAGS MATCHES "-fsanitize-minimal-runtime" )
151+ message (
152+ WARNING "Try to disable usan minimal runtime due to conflict with asan" )
153+ list (REMOVE_ITEM __HARDENING_FLAGS "-fsanitize=undefined"
154+ "-fsanitize-minimal-runtime" "-fno-sanitize-recover=undefined" )
155+ list (REMOVE_ITEM __HARDENING_LINKS "-fsanitize=undefined"
156+ "-fsanitize-minimal-runtime" "-fno-sanitize-recover=undefined" )
157+ endif ()
146158 endif ()
159+ set (__HARDENING_FLAGS
160+ "${__HARDENING_FLAGS} "
161+ CACHE INTERNAL "Hardening flags" )
162+ set (__HARDENING_LINKS
163+ "${__HARDENING_LINKS} "
164+ CACHE INTERNAL "Hardening links" )
147165endif ()
148166
149- message (STATUS "Hardening final flags: ${hardening_flags} " )
150- message (STATUS "Hardening final links: ${hardening_links} " )
151-
152- add_custom_target (hardening_flags )
153- set_target_properties (hardening_flags PROPERTIES _flags "${hardening_flags} " )
154- set_target_properties (hardening_flags PROPERTIES _links "${hardening_links} " )
155-
156- unset (hardening_flags)
157- unset (hardening_links)
167+ message (STATUS "Hardening final flags: $CACHE{__HARDENING_FLAGS} " )
168+ message (STATUS "Hardening final links: $CACHE{__HARDENING_LINKS} " )
158169
159170function (harden_target target )
160171 set (_opts)
@@ -196,8 +207,13 @@ function(harden_target target)
196207 endif ()
197208 endif ()
198209
199- get_target_property (_flags hardening_flags _flags )
200- get_target_property (_links hardening_flags _links )
210+ if (NOT DEFINED CACHE{__HARDENING_FLAGS} OR NOT DEFINED
211+ CACHE{__HARDENING_LINKS})
212+ message (FATAL_ERROR "Hardening flags not defined" )
213+ endif ()
214+
215+ set (_flags $CACHE{__HARDENING_FLAGS} )
216+ set (_links $CACHE{__HARDENING_LINKS} )
201217
202218 set (FLAGS ${_flags} ${target_flags} )
203219 set (LINKS ${_links} ${target_flags} )
0 commit comments