11macro (add_compile_option_ext flag name )
2- cmake_parse_arguments (ARG "" "" "" ${ARGN} )
2+ cmake_parse_arguments (ARG "" "" "" ${ARGN} )
33 set (CHECK_STRING "${flag} " )
4- if (MSVC )
4+ if (MSVC )
55 set (CHECK_STRING "/WX ${CHECK_STRING} " )
66 else ()
77 set (CHECK_STRING "-Werror ${CHECK_STRING} " )
88 endif ()
99
1010 check_c_compiler_flag("${CHECK_STRING} " "C_SUPPORTS_${name} " )
1111 check_cxx_compiler_flag("${CHECK_STRING} " "CXX_SUPPORTS_${name} " )
12- if (C_SUPPORTS_${name} AND CXX_SUPPORTS_${name} )
12+ if (C_SUPPORTS_${name} AND CXX_SUPPORTS_${name} )
1313 message (STATUS "Building with ${flag} " )
1414 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag} " )
1515 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag} " )
@@ -31,73 +31,207 @@ macro(add_link_option_ext flag name)
3131 endif ()
3232endmacro ()
3333
34+ set (is_gcc FALSE )
35+ set (is_clang FALSE )
36+ set (is_msvc FALSE )
37+ set (is_icpx FALSE )
38+
39+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
40+ set (is_clang TRUE )
41+ endif ()
42+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
43+ set (is_gcc TRUE )
44+ endif ()
45+ if (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM" )
46+ set (is_icpx TRUE )
47+ endif ()
48+ if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
49+ set (is_msvc TRUE )
50+ endif ()
51+
3452macro (append_common_extra_security_flags)
35- if ( LLVM_ON_UNIX )
53+ # Compiler Warnings and Error Detection
54+ # Note: in intel/llvm we build both linux and win with --ci-defaults.
55+ # This flag also enables -Werror or /WX.
56+ if (is_gcc
57+ OR is_clang
58+ OR (is_icpx AND MSVC ))
59+ add_compile_option_ext("-Wall" WALL)
60+ add_compile_option_ext("-Wextra" WEXTRA)
61+ elseif (is_icpx)
62+ add_compile_option_ext("/Wall" WALL)
63+ elseif (is_msvc)
64+ add_compile_option_ext("/W4" WALL)
65+ endif ()
66+
67+ if (CMAKE_BUILD_TYPE MATCHES "Release" )
68+ if (is_gcc
69+ OR is_clang
70+ OR (is_icpx AND MSVC ))
71+ add_compile_option_ext("-Wconversion" WCONVERSION)
72+ add_compile_option_ext("-Wimplicit-fallthrough" WIMPLICITFALLTHROUGH)
73+ endif ()
74+ endif ()
75+
76+ # Control Flow Integrity
77+ if (is_gcc
78+ OR is_clang
79+ OR (is_icpx AND MSVC ))
80+ add_compile_option_ext("-fcf-protection=full" FCFPROTECTION)
81+ elseif (is_icpx)
82+ add_compile_option_ext("/Qcf-protection:full" FCFPROTECTION)
83+ elseif (is_msvc)
84+ add_link_option_ext("/LTCG" LTCG CMAKE_EXE_LINKER_FLAGS
85+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
86+ add_compile_option_ext("/sdl" SDL)
87+ add_compile_option_ext("/guard:cf" GUARDCF)
88+ add_link_option_ext("/CETCOMPAT" CETCOMPAT CMAKE_EXE_LINKER_FLAGS
89+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
90+ endif ()
91+
92+ # Format String Defense
93+ if (is_gcc
94+ OR is_clang
95+ OR (is_icpx AND MSVC ))
96+ add_compile_option_ext("-Wformat" WFORMAT)
97+ add_compile_option_ext("-Wformat-security" WFORMATSECURITY)
98+ elseif (is_icpx)
99+ add_compile_option_ext("/Wformat" WFORMAT)
100+ add_compile_option_ext("/Wformat-security" WFORMATSECURITY)
101+ elseif (is_msvc)
102+ add_compile_option_ext("/analyze" ANALYZE)
103+ endif ()
104+
105+ if (CMAKE_BUILD_TYPE MATCHES "Release" )
106+ if (is_gcc
107+ OR is_clang
108+ OR (is_icpx AND MSVC ))
109+ add_compile_option_ext("-Werror=format-security" WERRORFORMATSECURITY)
110+ endif ()
111+ endif ()
112+
113+ # Inexecutable Stack
114+ if (CMAKE_BUILD_TYPE MATCHES "Release" )
115+ if (is_gcc
116+ OR is_clang
117+ OR (is_icpx AND MSVC ))
118+ add_link_option_ext(
119+ "-Wl,-z,noexecstack" NOEXECSTACK CMAKE_EXE_LINKER_FLAGS
120+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
121+ endif ()
122+ endif ()
123+
124+ # Position Independent Code
125+ if (is_gcc
126+ OR is_clang
127+ OR (is_icpx AND MSVC ))
128+ add_compile_option_ext("-fPIC" FPIC)
129+ elseif (is_msvc)
130+ add_compile_option_ext("/Gy" GY)
131+ endif ()
132+
133+ # Position Independent Execution
134+ if (is_gcc
135+ OR is_clang
136+ OR (is_icpx AND MSVC ))
137+ # The project should be configured with -DCMAKE_POSITION_INDEPENDENT_CODE=ON
138+ add_compile_option_ext("-fPIE" FPIE)
139+ add_link_option_ext("-pie" PIE CMAKE_EXE_LINKER_FLAGS
140+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
141+ elseif (is_msvc)
142+ add_link_option_ext("/DYNAMICBASE" DYNAMICBASE CMAKE_EXE_LINKER_FLAGS
143+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
144+ endif ()
145+
146+ if (CMAKE_BUILD_TYPE MATCHES "Release" )
147+ if (is_msvc)
148+ add_link_option_ext("/NXCOMPAT" NXCOMPAT CMAKE_EXE_LINKER_FLAGS
149+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
150+ endif ()
151+ endif ()
152+
153+ # Stack Protection
154+ if (is_msvc)
155+ add_compile_option_ext("/GS" GS)
156+ elseif (
157+ is_gcc
158+ OR is_clang
159+ OR (is_icpx AND MSVC ))
160+ if (CMAKE_BUILD_TYPE STREQUAL "Debug" )
161+ add_compile_option_ext("-fstack-protector" FSTACKPROTECTOR)
162+ elseif (CMAKE_BUILD_TYPE MATCHES "Release" )
163+ add_compile_option_ext("-fstack-protector-strong" FSTACKPROTECTORSTRONG)
164+ add_compile_option_ext("-fstack-clash-protection" FSTACKCLASHPROTECTION)
165+ endif ()
166+ endif ()
167+
168+ if (LLVM_ON_UNIX)
36169 # Fortify Source (strongly recommended):
37- if (CMAKE_BUILD_TYPE STREQUAL "Debug" )
38- message (WARNING
39- "-D_FORTIFY_SOURCE=2 can only be used with optimization." )
40- message (WARNING "-D_FORTIFY_SOURCE=2 is not supported." )
170+ if (CMAKE_BUILD_TYPE STREQUAL "Debug" )
171+ message (WARNING "-D_FORTIFY_SOURCE=3 can only be used with optimization." )
172+ message (WARNING "-D_FORTIFY_SOURCE=3 is not supported." )
41173 else ()
42- # Sanitizers do not work with checked memory functions,
43- # such as __memset_chk. We do not build release packages
44- # with sanitizers, so just avoid -D_FORTIFY_SOURCE=2
45- # under LLVM_USE_SANITIZER.
46- if (NOT LLVM_USE_SANITIZER)
47- message (STATUS "Building with -D_FORTIFY_SOURCE=2" )
48- add_definitions (-D_FORTIFY_SOURCE=2)
174+ # Sanitizers do not work with checked memory functions, such as
175+ # __memset_chk. We do not build release packages with sanitizers, so just
176+ # avoid -D_FORTIFY_SOURCE=3 under LLVM_USE_SANITIZER.
177+ if (NOT LLVM_USE_SANITIZER)
178+ message (STATUS "Building with -D_FORTIFY_SOURCE=3" )
179+ add_definitions (-D_FORTIFY_SOURCE=3)
49180 else ()
50- message (WARNING
51- "-D_FORTIFY_SOURCE=2 dropped due to LLVM_USE_SANITIZER." )
181+ message (
182+ WARNING "-D_FORTIFY_SOURCE=3 dropped due to LLVM_USE_SANITIZER." )
52183 endif ()
53184 endif ()
54185
55- # Format String Defense
56- add_compile_option_ext("-Wformat" WFORMAT)
57- add_compile_option_ext("-Wformat-security" WFORMATSECURITY)
58- add_compile_option_ext("-Werror=format-security" WERRORFORMATSECURITY)
59-
60- # Stack Protection
61- add_compile_option_ext("-fstack-protector-strong" FSTACKPROTECTORSTRONG)
186+ if (LLVM_ENABLE_ASSERTIONS)
187+ add_definitions (-D_GLIBCXX_ASSERTIONS)
188+ endif ()
62189
63190 # Full Relocation Read Only
64- add_link_option_ext("-Wl,-z,relro" ZRELRO
65- CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
66- CMAKE_SHARED_LINKER_FLAGS)
191+ if (CMAKE_BUILD_TYPE MATCHES "Release" )
192+ add_link_option_ext("-Wl,-z,relro" ZRELRO CMAKE_EXE_LINKER_FLAGS
193+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
194+ endif ()
67195
68196 # Immediate Binding (Bindnow)
69- add_link_option_ext("-Wl,-z,now" ZNOW
70- CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
71- CMAKE_SHARED_LINKER_FLAGS)
197+ if (CMAKE_BUILD_TYPE MATCHES "Release" )
198+ add_link_option_ext("-Wl,-z,now" ZNOW CMAKE_EXE_LINKER_FLAGS
199+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
200+ add_link_option_ext("-Wl,-z,nodlopen" ZDLOPEN CMAKE_EXE_LINKER_FLAGS
201+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
202+ endif ()
72203 endif ()
73204endmacro ()
74205
75- if ( EXTRA_SECURITY_FLAGS )
76- if (EXTRA_SECURITY_FLAGS STREQUAL "none" )
206+ if ( EXTRA_SECURITY_FLAGS)
207+ if (EXTRA_SECURITY_FLAGS STREQUAL "none" )
77208 # No actions.
78- elseif (EXTRA_SECURITY_FLAGS STREQUAL "default" )
79- append_common_extra_security_flags()
80- elseif (EXTRA_SECURITY_FLAGS STREQUAL "sanitize" )
81- append_common_extra_security_flags()
82- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
83- add_compile_option_ext("-fsanitize=cfi" FSANITIZE_CFI)
84- add_link_option_ext("-fsanitize=cfi" FSANITIZE_CFI_LINK
85- CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
86- CMAKE_SHARED_LINKER_FLAGS)
87- # Recommended option although linking a DSO with SafeStack is not currently supported by compiler.
88- #add_compile_option_ext("-fsanitize=safe-stack" FSANITIZE_SAFESTACK)
89- #add_link_option_ext("-fsanitize=safe-stack" FSANITIZE_SAFESTACK_LINK
90- # CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
91- # CMAKE_SHARED_LINKER_FLAGS)
92- else ()
93- add_compile_option_ext("-fcf-protection=full -mcet" FCF_PROTECTION)
94- # need to align compile and link option set, link now is set unconditionally
95- add_link_option_ext("-fcf-protection=full -mcet" FCF_PROTECTION_LINK
96- CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
97- CMAKE_SHARED_LINKER_FLAGS)
98- endif ()
209+ elseif (EXTRA_SECURITY_FLAGS STREQUAL "default" )
210+ append_common_extra_security_flags()
211+ elseif (EXTRA_SECURITY_FLAGS STREQUAL "sanitize" )
212+ append_common_extra_security_flags()
213+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
214+ add_compile_option_ext("-fsanitize=cfi" FSANITIZE_CFI)
215+ add_link_option_ext(
216+ "-fsanitize=cfi" FSANITIZE_CFI_LINK CMAKE_EXE_LINKER_FLAGS
217+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
218+ # Recommended option although linking a DSO with SafeStack is not
219+ # currently supported by compiler.
220+ # add_compile_option_ext("-fsanitize=safe-stack" FSANITIZE_SAFESTACK)
221+ # add_link_option_ext("-fsanitize=safe-stack" FSANITIZE_SAFESTACK_LINK
222+ # CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
223+ # CMAKE_SHARED_LINKER_FLAGS)
99224 else ()
100- message (FATAL_ERROR "Unsupported value of EXTRA_SECURITY_FLAGS: ${EXTRA_SECURITY_FLAGS} " )
225+ add_compile_option_ext("-fcf-protection=full -mcet" FCF_PROTECTION)
226+ # need to align compile and link option set, link now is set
227+ # unconditionally
228+ add_link_option_ext(
229+ "-fcf-protection=full -mcet" FCF_PROTECTION_LINK CMAKE_EXE_LINKER_FLAGS
230+ CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
101231 endif ()
232+ else ()
233+ message (
234+ FATAL_ERROR
235+ "Unsupported value of EXTRA_SECURITY_FLAGS: ${EXTRA_SECURITY_FLAGS} " )
236+ endif ()
102237endif ()
103-
0 commit comments