diff options
-rw-r--r-- | infrastructure/cmake/CMakeLists.txt | 18 | ||||
-rw-r--r-- | infrastructure/m4/boxbackup_tests.m4 | 35 |
2 files changed, 35 insertions, 18 deletions
diff --git a/infrastructure/cmake/CMakeLists.txt b/infrastructure/cmake/CMakeLists.txt index a00e10d7..e6f46148 100644 --- a/infrastructure/cmake/CMakeLists.txt +++ b/infrastructure/cmake/CMakeLists.txt @@ -478,7 +478,7 @@ move_file_if_exists( "${boxconfig_cmake_h_dir}/BoxConfig.cmake.h.bak") foreach(m4_filename boxbackup_tests.m4 ax_check_mount_point.m4 ax_func_syscall.m4) - file(STRINGS "${base_dir}/infrastructure/m4/${m4_filename}" m4_functions REGEX "^ *AC[_A-Z]+\\(.*\\)$") + file(STRINGS "${base_dir}/infrastructure/m4/${m4_filename}" m4_functions REGEX "^ *(AC|AX|BOX)_[A-Z_]+\\(.*\\)$") foreach(m4_function ${m4_functions}) if(DEBUG) message(STATUS "Processing m4_function: ${m4_function}") @@ -560,6 +560,22 @@ foreach(m4_filename boxbackup_tests.m4 ax_check_mount_point.m4 ax_func_syscall.m } ]=] "HAVE_${platform_var_name}") file(APPEND "${boxconfig_h_file}" "#cmakedefine HAVE_${platform_var_name}\n") + elseif(m4_function MATCHES "^ *BOX_CHECK_CXX_FLAG\\((-[A-Za-z_,=-]+)\\)") + if(DEBUG) + message(STATUS "Processing BOX_CHECK_CXX_FLAG: ${CMAKE_MATCH_1}") + endif() + + if(NOT CMAKE_MATCH_1 STREQUAL "-Wall") + set(flag "${CMAKE_MATCH_1}") + string(TOLOWER "have_flag_${flag}" have_flag_var_name) + string(REGEX REPLACE "[^a-z_]" "_" have_flag_var_name ${have_flag_var_name}) + string(REGEX REPLACE "__+" "_" have_flag_var_name ${have_flag_var_name}) + + CHECK_CXX_COMPILER_FLAG(${flag} ${have_flag_var_name}) + if(${have_flag_var_name}) + add_definitions("${flag}") + endif() + endif() endif() endforeach() diff --git a/infrastructure/m4/boxbackup_tests.m4 b/infrastructure/m4/boxbackup_tests.m4 index 74a870e9..86aa560a 100644 --- a/infrastructure/m4/boxbackup_tests.m4 +++ b/infrastructure/m4/boxbackup_tests.m4 @@ -10,27 +10,28 @@ solaris*) ;; esac +# If the compiler supports it, force errors on unknown flags, so that detection works: +AX_CHECK_COMPILE_FLAG(-Werror=unknown-warning-option, + [cxxflags_force_error="-Werror=unknown-warning-option"]) + +# Reduce compiler flag checking to a one-liner, needed for CMake to parse them +AC_DEFUN([BOX_CHECK_CXX_FLAG], + AX_CHECK_COMPILE_FLAG($1, + [cxxflags_strict="$cxxflags_strict $1"],, + $cxxflags_force_error) +) + # Enable some compiler flags if the compiler supports them. This gives better warnings # and detects some problems early. -AX_CHECK_COMPILE_FLAG(-Wall, [cxxflags_strict="$cxxflags_strict -Wall"]) -# -Wundef would be a good idea, but Boost is full of undefined variable use, so we need -# to disable it for now so that we can concentrate on real errors: -dnl AX_CHECK_COMPILE_FLAG(-Wundef, [cxxflags_strict="$cxxflags_strict -Wundef"]) -AX_CHECK_COMPILE_FLAG(-Werror=return-type, - [cxxflags_strict="$cxxflags_strict -Werror=return-type"]) -AX_CHECK_COMPILE_FLAG(-Werror=delete-non-virtual-dtor, - [cxxflags_strict="$cxxflags_strict -Werror=delete-non-virtual-dtor"]) -AX_CHECK_COMPILE_FLAG(-Werror=undefined-bool-conversion, - [cxxflags_strict="$cxxflags_strict -Werror=undefined-bool-conversion"]) -# We should really enable -Werror=sometimes-uninitialized, but QDBM violates it: -dnl AX_CHECK_COMPILE_FLAG(-Werror=sometimes-uninitialized, -dnl [cxxflags_strict="$cxxflags_strict -Werror=sometimes-uninitialized"]) +BOX_CHECK_CXX_FLAG(-Wall) +BOX_CHECK_CXX_FLAG(-Werror=return-type) +BOX_CHECK_CXX_FLAG(-Werror=delete-non-virtual-dtor) +BOX_CHECK_CXX_FLAG(-Werror=undefined-bool-conversion) # This error is detected by MSVC, but not usually by GCC/Clang: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58114 -AX_CHECK_COMPILE_FLAG(-Werror=delete-incomplete, - [cxxflags_strict="$cxxflags_strict -Werror=delete-incomplete"]) -AX_CHECK_COMPILE_FLAG(-Wno-deprecated-declarations, - [cxxflags_strict="$cxxflags_strict -Wno-deprecated-declarations"]) +BOX_CHECK_CXX_FLAG(-Werror=delete-incomplete) +BOX_CHECK_CXX_FLAG(-Wno-deprecated-declarations) + AC_SUBST([CXXFLAGS_STRICT], [$cxxflags_strict]) if test "x$GXX" = "xyes"; then |