MetaFusion/scripts/dnacalib/CMakeModulesExtra/utilities/SupportedCompileOptions.cmake
2025-02-09 21:35:41 +08:00

44 lines
1.8 KiB
CMake

# From the list of passed in compiler flags, add only those to the target
# which are supported by the selected compiler
#
# Usage:
# include(SupportedCompileOptions)
# set(CXX_FLAGS -Wall -Wextra -Wpedantic -Wduplicated-branches -Wunused)
# target_supported_compile_options(target_name PUBLIC "${CXX_FLAGS}")
#
# Module dependencies:
# CheckCXXCompilerFlag
include(CheckCXXCompilerFlag)
function(target_add_cxx_flag_if_supported target_name visibility flag_name)
# Check if flag was already checked whether it's supported or not
if(${flag_name} IN_LIST SUPPORTED_FLAGS_CACHE)
set(has_flag_${flag_name} TRUE)
elseif(${flag_name} IN_LIST UNSUPPORTED_FLAGS_CACHE)
set(has_flag_${flag_name} FALSE)
endif()
# If not found in cache, perform the check now and cache the result
if(NOT DEFINED has_flag_${flag_name})
check_cxx_compiler_flag("${flag_name}" has_flag_${flag_name})
# It's safe to rely on cache variables as the only parameter that may affect the validity
# of their content is the chosen compiler itself, and changing a compiler forces CMake to
# automatically purge the cache anyway.
if(has_flag_${flag_name})
set(SUPPORTED_FLAGS_CACHE "${SUPPORTED_FLAGS_CACHE};${flag_name}" CACHE INTERNAL "")
else()
set(UNSUPPORTED_FLAGS_CACHE "${UNSUPPORTED_FLAGS_CACHE};${flag_name}" CACHE INTERNAL "")
endif()
endif()
# Enable flag is supported
if(has_flag_${flag_name})
target_compile_options(${target_name} ${visibility} ${flag_name})
endif()
endfunction()
function(target_supported_compile_options target_name visibility flags)
foreach(flag_name IN LISTS flags)
target_add_cxx_flag_if_supported(${target_name} ${visibility} ${flag_name})
endforeach()
endfunction()