diff options
Diffstat (limited to 'src/third_party/wiredtiger/cmake/strict/strict_flags_helpers.cmake')
-rw-r--r-- | src/third_party/wiredtiger/cmake/strict/strict_flags_helpers.cmake | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/cmake/strict/strict_flags_helpers.cmake b/src/third_party/wiredtiger/cmake/strict/strict_flags_helpers.cmake new file mode 100644 index 00000000000..8abfe950416 --- /dev/null +++ b/src/third_party/wiredtiger/cmake/strict/strict_flags_helpers.cmake @@ -0,0 +1,236 @@ +# +# Public Domain 2014-present MongoDB, Inc. +# Public Domain 2008-2014 WiredTiger, Inc. +# All rights reserved. +# +# See the file LICENSE for redistribution information +# + +# get_gnu_base_flags(flags) +# Helper function that generates a set of common GNU flags for a given language. +# flags - list of flags. +function(get_gnu_base_flags flags) + cmake_parse_arguments( + PARSE_ARGV + 1 + "GNU_FLAGS" + "CXX;C" + "" + "" + ) + + if (NOT "${GNU_FLAGS_UNPARSED_ARGUMENTS}" STREQUAL "") + message(FATAL_ERROR "Unknown arguments to get_gnu_base_flags: ${GNU_FLAGS_UNPARSED_ARGUMENTS}") + endif() + + set(cmake_compiler_version) + + if(${GNU_FLAGS_C} AND ${GNU_FLAGS_CXX}) + message(FATAL_ERROR "Only one language is accepted") + elseif(GNU_FLAGS_C) + set(cmake_compiler_version ${CMAKE_C_COMPILER_VERSION}) + elseif(GNU_FLAGS_CXX) + set(cmake_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) + else() + message(FATAL_ERROR "No language passed") + endif() + + set(gnu_flags) + + list(APPEND gnu_flags "-Wcast-align") + list(APPEND gnu_flags "-Wdouble-promotion") + list(APPEND gnu_flags "-Werror") + list(APPEND gnu_flags "-Wfloat-equal") + list(APPEND gnu_flags "-Wformat-nonliteral") + list(APPEND gnu_flags "-Wformat-security") + list(APPEND gnu_flags "-Wformat=2") + list(APPEND gnu_flags "-Winit-self") + list(APPEND gnu_flags "-Wmissing-declarations") + list(APPEND gnu_flags "-Wmissing-field-initializers") + list(APPEND gnu_flags "-Wpacked") + list(APPEND gnu_flags "-Wpointer-arith") + list(APPEND gnu_flags "-Wredundant-decls") + list(APPEND gnu_flags "-Wswitch-enum") + list(APPEND gnu_flags "-Wundef") + list(APPEND gnu_flags "-Wuninitialized") + list(APPEND gnu_flags "-Wunreachable-code") + list(APPEND gnu_flags "-Wunused") + list(APPEND gnu_flags "-Wwrite-strings") + + # Non-fatal informational warnings. + # We don't turn on the unsafe-loop-optimizations warning after gcc7, + # it's too noisy to tolerate. Regardless, don't fail even when it's + # configured. + list(APPEND gnu_flags "-Wno-error=unsafe-loop-optimizations") + + # Create a function to return the base flags! + # We cannot return a value, pass in a parent variable, the function will set it. + if(${cmake_compiler_version} VERSION_EQUAL 4.7) + list(APPEND gnu_flags "-Wno-c11-extensions") + list(APPEND gnu_flags "-Wunsafe-loop-optimizations") + elseif(${cmake_compiler_version} VERSION_EQUAL 5) + list(APPEND gnu_flags "-Wunsafe-loop-optimizations") + elseif(${cmake_compiler_version} VERSION_EQUAL 6) + list(APPEND gnu_flags "-Wunsafe-loop-optimizations") + endif() + + if(${cmake_compiler_version} VERSION_GREATER_EQUAL 5) + list(APPEND gnu_flags "-Wformat-signedness") + list(APPEND gnu_flags "-Wunused-macros") + list(APPEND gnu_flags "-Wvariadic-macros") + endif() + if(${cmake_compiler_version} VERSION_GREATER_EQUAL 6) + list(APPEND gnu_flags "-Wduplicated-cond") + list(APPEND gnu_flags "-Wlogical-op") + list(APPEND gnu_flags "-Wunused-const-variable=2") + endif() + if(${cmake_compiler_version} VERSION_GREATER_EQUAL 7) + list(APPEND gnu_flags "-Walloca") + list(APPEND gnu_flags "-Walloc-zero") + list(APPEND gnu_flags "-Wduplicated-branches") + list(APPEND gnu_flags "-Wformat-overflow=2") + list(APPEND gnu_flags "-Wformat-truncation=2") + list(APPEND gnu_flags "-Wrestrict") + endif() + if(${cmake_compiler_version} VERSION_GREATER_EQUAL 8) + list(APPEND gnu_flags "-Wmultistatement-macros") + endif() + + set(${flags} ${gnu_flags} PARENT_SCOPE) + +endfunction() + +# get_clang_base_flags(flags) +# Helper function that generates a set of common CLANG flags for a given language. +# flags - list of flags. +function(get_clang_base_flags flags) + cmake_parse_arguments( + PARSE_ARGV + 1 + "CLANG_FLAGS" + "CXX;C" + "" + "" + ) + + if (NOT "${CLANG_FLAGS_UNPARSED_ARGUMENTS}" STREQUAL "") + message(FATAL_ERROR "Unknown arguments to get_clang_base_flags: ${CLANG_FLAGS_UNPARSED_ARGUMENTS}") + endif() + + set(cmake_compiler_version) + + if(${CLANG_FLAGS_C} AND ${CLANG_FLAGS_CXX}) + message(FATAL_ERROR "Only one language is accepted") + elseif(CLANG_FLAGS_C) + set(cmake_compiler_version ${CMAKE_C_COMPILER_VERSION}) + elseif(CLANG_FLAGS_CXX) + set(cmake_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) + else() + message(FATAL_ERROR "No language passed") + endif() + + set(clang_flags) + + list(APPEND clang_flags "-Werror") + list(APPEND clang_flags "-Wno-cast-align") + list(APPEND clang_flags "-Wno-documentation-unknown-command") + list(APPEND clang_flags "-Wno-format-nonliteral") + list(APPEND clang_flags "-Wno-packed") + list(APPEND clang_flags "-Wno-padded") + list(APPEND clang_flags "-Wno-reserved-id-macro") + list(APPEND clang_flags "-Wno-zero-length-array") + + # We should turn on cast-qual, but not as a fatal error: see WT-2690. + # For now, turn it off. + list(APPEND clang_flags "-Wno-cast-qual") + + # Turn off clang thread-safety-analysis, it doesn't like some of the + # code patterns in WiredTiger. + list(APPEND clang_flags "-Wno-thread-safety-analysis") + + # On Centos 7.3.1611, system header files aren't compatible with + # -Wdisabled-macro-expansion. + list(APPEND clang_flags "-Wno-disabled-macro-expansion") + + # We occasionally use an extra semicolon to indicate an empty loop or + # conditional body. + list(APPEND clang_flags "-Wno-extra-semi-stmt") + + # Ignore unrecognized options. + list(APPEND clang_flags "-Wno-unknown-warning-option") + + if(WT_DARWIN AND NOT CMAKE_CROSSCOMPILING) + # If we are not cross-compiling, we can safely disable this diagnostic. + # Its incompatible with strict diagnostics when including external + # libraries that are not in the default linker path + # e.g. linking zlib/snappy/... from /usr/local/. + list(APPEND clang_flags "-Wno-poison-system-directories") + endif() + + if(WT_DARWIN AND (${cmake_compiler_version} VERSION_EQUAL 4.1)) + # Apple clang has its own numbering system, and older OS X + # releases need some special love. Turn off some flags for + # Apple's clang 4.1: + # Apple clang version 4.1 + # ((tags/Apple/clang-421.11.66) (based on LLVM 3.1svn) + list(APPEND clang_flags "-Wno-attributes") + list(APPEND clang_flags "-Wno-pedantic") + list(APPEND clang_flags "-Wno-unused-command-line-argument") + endif() + + if(${cmake_compiler_version} VERSION_GREATER_EQUAL 10) + # Clang 10+ has added additional on-by-default diagnostics that isn't + # compatible with some of the code patterns in WiredTiger. + list(APPEND clang_flags "-Wno-implicit-fallthrough") + list(APPEND clang_flags "-Wno-implicit-int-float-conversion") + endif() + + set(${flags} ${clang_flags} PARENT_SCOPE) + +endfunction() + +# get_cl_base_flags(flags) +# Helper function that generates a set of common CL flags for a given language. +# flags - list of flags. +function(get_cl_base_flags flags) + cmake_parse_arguments( + PARSE_ARGV + 1 + "CL_FLAGS" + "CXX;C" + "" + "" + ) + + if (NOT "${CL_FLAGS_UNPARSED_ARGUMENTS}" STREQUAL "") + message(FATAL_ERROR "Unknown arguments to get_cl_base_flags: ${CL_FLAGS_UNPARSED_ARGUMENTS}") + endif() + + set(cmake_compiler_version) + + if(${CL_FLAGS_C} AND ${CL_FLAGS_CXX}) + message(FATAL_ERROR "Only one language is accepted") + elseif(CL_FLAGS_C) + set(cmake_compiler_version ${CMAKE_C_COMPILER_VERSION}) + elseif(CL_FLAGS_CXX) + set(cmake_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) + else() + message(FATAL_ERROR "No language passed") + endif() + + set(cl_flags) + + # Warning level 3. + list(APPEND cl_flags "/WX") + # Ignore warning about mismatched const qualifiers. + list(APPEND cl_flags "/wd4090") + # Ignore deprecated functions. + list(APPEND cl_flags "/wd4996") + # Complain about unreferenced format parameter. + list(APPEND cl_flags "/we4100") + # Enable security check. + list(APPEND cl_flags "/GS") + + set(${flags} ${cl_flags} PARENT_SCOPE) + +endfunction() |