123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- # Functions to simplify handling of extra compiler flags.
- #
- # Copyright (c) 2024 Netdata Inc.
- # SPDX-License-Identifier: GPL-3.0-or-later
- include(CheckCCompilerFlag)
- include(CheckCXXCompilerFlag)
- # Construct a pre-processor safe name
- #
- # This takes a specified value, and assigns the generated name to the
- # specified target.
- function(make_cpp_safe_name value target)
- string(REPLACE "-" "_" tmp "${value}")
- string(REPLACE "=" "_" tmp "${tmp}")
- set(${target} "${tmp}" PARENT_SCOPE)
- endfunction()
- # Conditionally add an extra compiler flag to C and C++ flags.
- #
- # If the language flags already match the `match` argument, skip this flag.
- # Otherwise, check for support for `flag` and if support is found, add it to
- # the language-specific `target` flag group.
- function(add_simple_extra_compiler_flag match flag target)
- set(CMAKE_REQUIRED_FLAGS "-Werror")
- make_cpp_safe_name("${flag}" flag_name)
- if(NOT ${CMAKE_C_FLAGS} MATCHES ${match})
- check_c_compiler_flag("${flag}" HAVE_C_${flag_name})
- if(HAVE_C_${flag_name})
- set(${target}_C_FLAGS "${${target}_C_FLAGS} ${flag}" PARENT_SCOPE)
- endif()
- endif()
- if(NOT ${CMAKE_CXX_FLAGS} MATCHES ${match})
- check_cxx_compiler_flag("${flag}" HAVE_CXX_${flag_name})
- if(HAVE_CXX_${flag_name})
- set(${target}_CXX_FLAGS "${${target}_CXX_FLAGS} ${flag}" PARENT_SCOPE)
- endif()
- endif()
- endfunction()
- # Same as add_simple_extra_compiler_flag, but check for a second flag if the
- # first one is unsupported.
- function(add_double_extra_compiler_flag match flag1 flag2 target)
- set(CMAKE_REQUIRED_FLAGS "-Werror")
- make_cpp_safe_name("${flag1}" flag1_name)
- make_cpp_safe_name("${flag2}" flag2_name)
- if(NOT ${CMAKE_C_FLAGS} MATCHES ${match})
- check_c_compiler_flag("${flag1}" HAVE_C_${flag1_name})
- if(HAVE_C_${flag1_name})
- set(${target}_C_FLAGS "${${target}_C_FLAGS} ${flag1}" PARENT_SCOPE)
- else()
- check_c_compiler_flag("${flag2}" HAVE_C_${flag2_name})
- if(HAVE_C_${flag2_name})
- set(${target}_C_FLAGS "${${target}_C_FLAGS} ${flag2}" PARENT_SCOPE)
- endif()
- endif()
- endif()
- if(NOT ${CMAKE_CXX_FLAGS} MATCHES ${match})
- check_cxx_compiler_flag("${flag1}" HAVE_CXX_${flag1_name})
- if(HAVE_CXX_${flag1_name})
- set(${target}_CXX_FLAGS "${${target}_CXX_FLAGS} ${flag1}" PARENT_SCOPE)
- else()
- check_cxx_compiler_flag("${flag2}" HAVE_CXX_${flag2_name})
- if(HAVE_CXX_${flag2_name})
- set(${target}_CXX_FLAGS "${${target}_CXX_FLAGS} ${flag2}" PARENT_SCOPE)
- endif()
- endif()
- endif()
- endfunction()
|