# # # # sol2 # The MIT License (MIT) # # Copyright (c) 2013-2021 Rapptz, ThePhD, and contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of # the Software, and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # # sol2 - cmake - compiler diagnostic checking include_guard(GLOBAL) include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) #[[ Given a diagnostic name and flag, like check_cxx_compiler_diagnostic(pig MSVC 1312) or check_cxx_compiler_diagnostic(pig GCC acab) we check if the given flag works C++ compiler. If it does, we then generate a --warn, --allow, --deny, and --forbid prefixed set of variables. Users are then free to simply apply them to targets at will. ]] function (check_compiler_diagnostic diagnostic) cmake_parse_arguments(diagnostic "" "GCC;MSVC;CLANG" "" ${ARGN}) if (NOT diagnostic_GCC) set(diagnostic_GCC ${diagnostic}) endif() if (NOT diagnostic_MSVC) set(diagnostic_MSVC ${diagnostic}) endif() if (NOT diagnostic_CLANG) set(diagnostic_CLANG ${diagnostic_GCC}) endif() string(MAKE_C_IDENTIFIER "${diagnostic}" suffix) string(TOUPPER "${suffix}" suffix) get_property(enabled-languages GLOBAL PROPERTY ENABLED_LANGUAGES) if (CXX IN_LIST enabled-languages) if (MSVC) check_cxx_compiler_flag(-wo${diagnostic_MSVC} CXX_DIAGNOSTIC_${suffix}) elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang) check_cxx_compiler_flag(-W${diagnostic_CLANG} CXX_DIAGNOSTIC_${suffix}) else() check_cxx_compiler_flag(-W${diagnostic_GCC} CXX_DIAGNOSTIC_${suffix}) endif() endif() if (C IN_LIST enabled-languages) if (MSVC) check_c_compiler_flag(-wo${diagnostic_MSVC} C_DIAGNOSTIC_${suffix}) elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang) check_c_compiler_flag(-W${diagnostic_CLANG} C_DIAGNOSTIC_${suffix}) else() check_c_compiler_flag(-W${diagnostic_GCC} C_DIAGNOSTIC_${suffix}) endif() endif() string(CONCAT when $,$>, $,$> >) string(CONCAT diagnostic_flag $<$:${diagnostic_MSVC}> $<$:${diagnostic_MSVC}> $<$:${diagnostic_GCC}> $<$:${diagnostic_GCC}> $<$:${diagnostic_CLANG}> $<$:${diagnostic_CLANG}> ) set(forbid_prefix $,-we,-Werror=>) set(allow_prefix $,-wd,-Wno->) set(warn_prefix $,-w1,-W>) set(--forbid-${diagnostic} $<${when}:${forbid_prefix}${diagnostic_flag}> PARENT_SCOPE) set(--allow-${diagnostic} $<${when}:${allow_prefix}${diagnostic_flag}> PARENT_SCOPE) # Set these warnings to level 1 warnings, so they appear by default set(--warn-${diagnostic} $<${when}:${warn_prefix}${diagnostic_flag}> PARENT_SCOPE) set(--deny-${diagnostic} ${--forbid-${diagnostic_flag}} PARENT_SCOPE) endfunction()