get_cmake_property(ENABLED_LANGUAGES ENABLED_LANGUAGES) include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) function(list_append var) foreach(arg ${ARGN}) list(FIND ${var} ${arg} found) if(${found} EQUAL -1) list(APPEND ${var} ${arg}) endif() endforeach() set(${var} ${${var}} PARENT_SCOPE) endfunction() macro(analyzer_flag) foreach(arg ${ARGN}) string(REPLACE "+" "x" var ${arg}) string(REGEX REPLACE "[^A-Za-z0-9_-]+" "-" var ${var}) list(FIND ENABLED_LANGUAGES C found) if(${found} GREATER -1) check_c_compiler_flag(${arg} cx${var}) if(cx${var}) list_append(ANALYZER_CX ${arg}) endif() endif() list(FIND ENABLED_LANGUAGES CXX found) if(${found} GREATER -1) check_cxx_compiler_flag(${arg} cx${var}) if(cx${var}) list_append(ANALYZER_CX ${arg}) endif() endif() endforeach() endmacro() if(CMAKE_C_COMPILER_ID MATCHES "MSVC" OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC") # https://learn.microsoft.com/en-us/cpp/build/reference/analyze-code-analysis analyzer_flag(/analyze) elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") # https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Static-Analyzer-Options.html analyzer_flag(-fanalyzer) # 10.1+ endif() function(target_compile_analyzer) foreach(target ${ARGN}) target_compile_options(${target} PRIVATE ${ANALYZER_CX}) endforeach() endfunction()