diff --git a/plugins/overlook/overlook.cmake b/plugins/overlook/overlook.cmake index 7d3688b..fd15ada 100644 --- a/plugins/overlook/overlook.cmake +++ b/plugins/overlook/overlook.cmake @@ -47,7 +47,7 @@ endif() # rule0: don't ignore all that warnings # If `-w` specified for GCC/Clang, report an error -if((CMAKE_C_COMPILER_ID MATCHES "GNU") OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) +if((CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) get_directory_property(overlook_detected_global_compile_options COMPILE_OPTIONS) message("Detected Global Compile Options: ${overlook_detected_global_compile_options}") string(REGEX MATCH "-w" ignore_all_warnings "${overlook_detected_global_compile_options}" ) @@ -65,7 +65,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4013) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4013) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=implicit-function-declaration) if(CMAKE_CXX_COMPILER_VERSION LESS 9.1) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=implicit-function-declaration) @@ -82,7 +82,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4431) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4431) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=implicit-int) if(CMAKE_CXX_COMPILER_VERSION LESS 9.1) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=implicit-int) @@ -116,7 +116,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4172) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4172) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=return-local-addr) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=return-local-addr) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -141,7 +141,7 @@ endif() # rule14: 避免 void* 类型的指针参参与算术运算 # MSVC C/C++ 默认会报错, Linux gcc 不报 warning 和 error, Linux g++ 只报 warning # Linux 下 Clang 开 -Wpedentric 才报 warning, Clang++ 报 error -if(CMAKE_C_COMPILER_ID MATCHES "GNU") +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=pointer-arith) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=pointer-arith) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -153,7 +153,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4133) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4133) -elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION GREATER 4.8) # gcc/g++ 4.8.3 not ok list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=incompatible-pointer-types) if(CMAKE_CXX_COMPILER_VERSION LESS 9.1) @@ -169,7 +169,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4047) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4047) -elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION GREATER 4.8) list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=int-conversion) if(CMAKE_CXX_COMPILER_VERSION LESS 9.1) @@ -200,7 +200,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4312) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4312) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=int-to-pointer-cast) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=int-to-pointer-cast) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -248,14 +248,14 @@ endif() # rule16: 释放非堆内存 # TODO: 检查 MSVC # Linux Clang8.0 无法检测到 -if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=free-nonheap-object) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=free-nonheap-object) endif() # rule32: 用 memset 等 C 函数设置 非 POD class 对象 # Linux下, GCC9.3 能发现此问题, 但clang10 不能发现 -if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION GREATER 7.5) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=class-memaccess) endif() @@ -263,7 +263,7 @@ endif() # rule15: 避免符号重复定义(变量对应的强弱符号)。只在 C 中出现。 # 暂时没找到 MSVC 的对应编译选项 -if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") +if((CMAKE_C_COMPILER_ID STREQUAL "GNU") OR CMAKE_C_COMPILER_ID MATCHES "Clang") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -fno-common) endif() @@ -304,7 +304,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4552 /we4555) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4552 /we4555) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=unused-value) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=unused-value) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -326,7 +326,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4006) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4006) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=comment) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=comment) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -351,7 +351,7 @@ endif() # rule29: C++中,禁止把字符串常量赋值给 char* 变量 # VS2019 开启 /Wall 后也查不到 -if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=write-strings) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Linux Clang 和 AppleClang 不太一样 @@ -364,7 +364,7 @@ endif() # rule31: multi-char constant # MSVC 没有对应的选项 -if(CMAKE_C_COMPILER_ID MATCHES "GNU") +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=multichar) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=multichar) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -380,7 +380,7 @@ endif() if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") list(APPEND OVERLOOK_C_COMPILE_OPTIONS /we4018) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS /we4018) -elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=sign-compare) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=sign-compare) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") @@ -403,7 +403,7 @@ if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") endif() ## rule37: float 转换隐式转换为 int,可能改变变量的值 -if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=float-conversion) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=float-conversion) @@ -428,14 +428,14 @@ endif() # Warn when a class has virtual functions and an accessible non-virtual destructor itself or in an accessible polymorphic base # class, in which case it is possible but unsafe to delete an instance of a derived class through a pointer to the class # itself or base class. This warning is automatically enabled if -Weffc++ is specified. -if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=non-virtual-dtor) elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=non-virtual-dtor) endif() ## rule36: switch case 忘记写 break, 会 fallthrough 执行, 可能导致数组越界(具体取决于你的代码). 不写break我们视为错误。 -if((CMAKE_C_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU")) +if((CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")) list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Werror=implicit-fallthrough) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Werror=implicit-fallthrough) elseif((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) @@ -444,7 +444,7 @@ elseif((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES " endif() ## rule37: 遇到第一个报错就停止编译 -if((CMAKE_C_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU")) +if((CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")) list(APPEND OVERLOOK_C_COMPILE_OPTIONS -Wfatal-errors) list(APPEND OVERLOOK_CXX_COMPILE_OPTIONS -Wfatal-errors) elseif((CMAKE_C_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) @@ -496,7 +496,7 @@ function(overlook_add_whole_archive_flag lib output_var) overlook_warn("MSVC version is ${MSVC_VERSION}, /WHOLEARCHIVE flag cannot be set") set(${output_var} ${lib} PARENT_SCOPE) endif() - elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(${output_var} -Wl,--whole-archive ${lib} -Wl,--no-whole-archive PARENT_SCOPE) elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND CMAKE_SYSTEM_NAME MATCHES "Linux") # set(${output_var} -Wl,--whole-archive ${lib} -Wl,--no-whole-archive PARENT_SCOPE) diff --git a/plugins/overlook/tests/CMakeLists.txt b/plugins/overlook/tests/CMakeLists.txt index 1e6e25d..4b69265 100644 --- a/plugins/overlook/tests/CMakeLists.txt +++ b/plugins/overlook/tests/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.10) project(test_overlook) +message("CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}") +message("CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}") include(../overlook.cmake) add_executable(test1 test1.c) @@ -39,4 +41,4 @@ add_executable(test33 test33.cpp) add_executable(test34 test34.cpp) add_executable(test35 test35.cpp) add_executable(test36 test36.cpp) -add_executable(test37 test37.cpp) \ No newline at end of file +add_executable(test37 test37.cpp)