@@ -82,26 +82,40 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
8282
8383#Define a path for custom commands to work around MSVC
8484set (CUSTOM_COMMAND_BINARY_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} )
85+
86+ macro (mangle_name str output )
87+ string (STRIP "${str} " strippedStr)
88+ string (REGEX REPLACE "^/" "" strippedStr "${strippedStr} " )
89+ string (REGEX REPLACE "^-+" "" strippedStr "${strippedStr} " )
90+ string (REGEX REPLACE "-+$" "" strippedStr "${strippedStr} " )
91+ string (REPLACE "-" "_" strippedStr "${strippedStr} " )
92+ string (REPLACE "=" "_EQ_" strippedStr "${strippedStr} " )
93+ string (REPLACE "+" "X" strippedStr "${strippedStr} " )
94+ string (TOUPPER "${strippedStr} " ${output} )
95+ endmacro ()
96+
97+ function (add_cxx_flag_if_supported flag )
98+ mangle_name ("${flag} " flagname )
99+ check_cxx_compiler_flag ("${flag} " "CXX_SUPPORTS_${flagname} _FLAG" )
100+ if (CXX_SUPPORTS_${flagname} _FLAG)
101+ append ("${flag} " CMAKE_CXX_FLAGS )
102+ append ("${flag} " CMAKE_C_FLAGS )
103+ endif ()
104+ endfunction ()
105+
85106if (MSVC )
86107 #MSVC implicitly adds $<CONFIG> to the output path
87108 set (CUSTOM_COMMAND_BINARY_DIR ${CUSTOM_COMMAND_BINARY_DIR} /$<CONFIG >)
88109 #enabling Control Flow Guard
89- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /guard:cf" )
90- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /guard:cf" )
110+ add_cxx_flag_if_supported (/guard:cf )
91111 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DYNAMICBASE" )
92112 set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /DYNAMICBASE" )
93- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL" )
94- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /GL" )
113+ add_cxx_flag_if_supported (/GL )
95114 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG} /DYNAMICBASE" )
96115 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG} /guard:cf" )
97116 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG} /LTCG /INCREMENTAL:NO" )
98117 # enable Spectre Mitigation, not supported by clang-cl
99- if ((NOT CMAKE_CXX_COMPILER_ID STREQUAL Clang) AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL IntelLLVM))
100- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qspectre" )
101- endif ()
102- if ((NOT CMAKE_C_COMPILER_ID STREQUAL Clang) AND NOT (CMAKE_C_COMPILER_ID STREQUAL IntelLLVM))
103- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre" )
104- endif ()
118+ add_cxx_flag_if_supported (/Qspectre )
105119endif ()
106120
107121#CXX compiler support
0 commit comments