Files
projectm/cmake/EnableCFlagsIfSupported.cmake
Kai Blaschke 02c6e2df68 Fixed CMake compiler/linker flag detection on Windows.
Replacing the / with _ in the variable name, as CMake doesn't support this character in variable names.
2022-09-15 16:22:05 +02:00

65 lines
2.6 KiB
CMake

include(CheckCXXCompilerFlag)
include(CheckCXXSourceCompiles)
# Replaces the slash character in flags to enable use of MSVC compiler arguments in variable names
macro(cflag_name_to_var_name outvar prefix flag)
string(REPLACE "/" "_" _flag_clean "${flag}")
set(${outvar} "${prefix}_${_flag_clean}_SUPPORTED")
unset(_flag_clean)
endmacro()
macro(enable_cflags_if_supported)
foreach(flag ${ARGN})
cflag_name_to_var_name(_supported_var CXXFLAG ${flag})
check_cxx_compiler_flag("${flag}" ${_supported_var})
if(${_supported_var})
add_compile_options("${flag}")
endif()
unset(_supported_var)
endforeach()
endmacro()
macro(enable_linker_flags_if_supported)
set(_old_CMAKE_REQUIRED_LINK_OPTIONS "${CMAKE_REQUIRED_LINK_OPTIONS}")
foreach(flag ${ARGN})
set(CMAKE_REQUIRED_LINK_OPTIONS "${flag}")
cflag_name_to_var_name(_supported_var LDCFLAG ${flag})
check_cxx_source_compiles("int main(){return 0;}" ${_supported_var})
if(${_supported_var})
add_link_options(${flag})
else()
set(CMAKE_REQUIRED_LINK_OPTIONS "LINKER:${flag}")
cflag_name_to_var_name(_supported_linker_var LDCFLAG_LINKER ${flag})
check_cxx_source_compiles("int main(){return 0;}" ${_supported_linker_var})
if(${_supported_linker_var})
add_link_options(LINKER:${flag})
endif()
unset(_supported_linker_var)
endif()
unset(_supported_var)
endforeach()
set(CMAKE_REQUIRED_LINK_OPTIONS "${_old_CMAKE_REQUIRED_LINK_OPTIONS}")
endmacro()
macro(enable_target_linker_flags_if_supported target access)
set(_old_CMAKE_REQUIRED_LINK_OPTIONS "${CMAKE_REQUIRED_LINK_OPTIONS}")
foreach(flag ${ARGN})
set(CMAKE_REQUIRED_LINK_OPTIONS "${flag}")
cflag_name_to_var_name(_supported_var LDCFLAG ${flag})
check_cxx_source_compiles("int main(){return 0;}" ${_supported_var})
if(${_supported_var})
target_link_options(${target} ${access} ${flag})
else()
set(CMAKE_REQUIRED_LINK_OPTIONS "LINKER:${flag}")
cflag_name_to_var_name(_supported_linker_var LDCFLAG_LINKER ${flag})
check_cxx_source_compiles("int main(){return 0;}" ${_supported_linker_var})
if(${_supported_linker_var})
target_link_options(${target} ${access} LINKER:${flag})
endif()
unset(_supported_linker_var)
endif()
unset(_supported_var)
endforeach()
set(CMAKE_REQUIRED_LINK_OPTIONS "${_old_CMAKE_REQUIRED_LINK_OPTIONS}")
endmacro()