diff --git a/.travis.yml b/.travis.yml index 794d7ffb8b..5871227f6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -251,7 +251,7 @@ _matrix_linux_gnustd_nowarn: packages: - *deps_driverlibs - - env: NUT_MATRIX_TAG="gnu99-gcc-7-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=gcc-7 CXX=g++-7 + - env: NUT_MATRIX_TAG="gnu99-gcc-7-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++98" CC=gcc-7 CXX=g++-7 os: linux sudo: false services: @@ -451,7 +451,7 @@ _matrix_linux_gnustd_warn_viable: packages: - *deps_driverlibs - - env: NUT_MATRIX_TAG="gnu99-gcc-7-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++99" CC=gcc-7 CXX=g++-7 + - env: NUT_MATRIX_TAG="gnu99-gcc-7-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++98" CC=gcc-7 CXX=g++-7 os: linux sudo: false services: @@ -589,6 +589,71 @@ _matrix_linux_cstd_warn: packages: - *deps_driverlibs +_matrix_freebsd_gnustd_nowarn: + include: &_matrix_freebsd_gnustd_nowarn + - env: NUT_MATRIX_TAG="gnu99-gcc-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=gcc CXX=g++ + os: freebsd + compiler: gcc + cache: + directories: + - $HOME/.ccache + + - env: NUT_MATRIX_TAG="gnu99-clang-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=clang CXX=clang++ + os: freebsd + compiler: clang + cache: + directories: + - $HOME/.ccache + + - env: NUT_MATRIX_TAG="gnu17-gcc-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu17" CXXFLAGS="-std=gnu++17" CC=gcc CXX=g++ + os: freebsd + compiler: gcc + cache: + directories: + - $HOME/.ccache + + - env: NUT_MATRIX_TAG="gnu17-clang-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu17" CXXFLAGS="-std=gnu++17" CC=clang CXX=clang++ + os: freebsd + compiler: clang + cache: + directories: + - $HOME/.ccache + +_matrix_freebsd_gnustd_warn: + include: &_matrix_freebsd_gnustd_warn + - env: NUT_MATRIX_TAG="gnu99-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++99" CC=gcc CXX=g++ + os: freebsd + compiler: gcc + if: branch =~ fightwarn + cache: + directories: + - $HOME/.ccache + + - env: NUT_MATRIX_TAG="gnu17-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu17" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++17" CC=gcc CXX=g++ + os: freebsd + compiler: gcc + if: branch =~ fightwarn + cache: + directories: + - $HOME/.ccache + + - env: NUT_MATRIX_TAG="gnu99-clang-freebsd-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=gnu++99" CC=clang CXX=clang++ + os: freebsd + compiler: clang + if: branch =~ fightwarn + cache: + directories: + - $HOME/.ccache + + - env: NUT_MATRIX_TAG="gnu17-clang-freebsd-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=gnu17" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=gnu++17" CC=clang CXX=clang++ + os: freebsd + compiler: clang + if: branch =~ fightwarn + cache: + directories: + - $HOME/.ccache + + # Try also a range of platforms for MacOS X builds # Inspired by https://github.com/taocpp/operators/blob/master/.travis.yml _matrix_osx_gnustd_nowarn: @@ -717,6 +782,18 @@ _matrix_windows_gnustd_nowarn: - $HOME/.ccache - /C/tools +_matrix_windows_gnustd_warn: + include: &_matrix_windows_gnustd_warn + - env: NUT_MATRIX_TAG="gnu99-clang-win-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c99" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++99" CC=clang CXX=clang++ + os: windows + compiler: clang + if: branch =~ fightwarn + cache: + directories: + - $HOME/AppData/Local/Temp/chocolatey + - $HOME/.ccache + - /C/tools + _matrix_windows_cstd_nowarn: include: &_matrix_windows_cstd_nowarn - env: NUT_MATRIX_TAG="c99-clang-win-nowarn" BUILD_TYPE=default-all-errors CPPFLAGS="-fms-extensions" CFLAGS="-std=c99" CXXFLAGS="-std=c++99" CC=clang CXX=clang++ @@ -785,6 +862,19 @@ _matrix_linux: - *_matrix_required_linux - *_matrix_allowfail_linux +_matrix_freebsd: + include: &_matrix_freebsd + - *_matrix_freebsd_gnustd_nowarn + - *_matrix_freebsd_gnustd_warn + +_matrix_required_freebsd: + include: &_matrix_required_freebsd + - *_matrix_freebsd_gnustd_nowarn + +_matrix_allowfail_freebsd: + include: &_matrix_allowfail_freebsd + - *_matrix_freebsd_gnustd_warn + _matrix_allowfail_osx: include: &_matrix_allowfail_osx - *_matrix_osx_cstd_nowarn @@ -807,6 +897,7 @@ _matrix_osx: _matrix_allowfail_windows: include: &_matrix_allowfail_windows - *_matrix_windows_gnustd_nowarn + - *_matrix_windows_gnustd_warn - *_matrix_windows_cstd_nowarn - *_matrix_windows_cstd_warn @@ -826,25 +917,31 @@ _matrix_gnustd_nowarn: include: &_matrix_gnustd_nowarn - *_matrix_osx_gnustd_nowarn - *_matrix_linux_gnustd_nowarn + - *_matrix_freebsd_gnustd_nowarn +# -*_matrix_windows_gnustd_nowarn _matrix_warn: include: &_matrix_warn - *_matrix_linux_gnustd_warn - *_matrix_linux_cstd_warn + - *_matrix_freebsd_gnustd_warn - *_matrix_osx_gnustd_warn - *_matrix_osx_cstd_warn + - *_matrix_windows_gnustd_warn - *_matrix_windows_cstd_warn # Default "jobs:" matrix should reference at least this for master branches _matrix_required: include: &_matrix_required - *_matrix_required_linux + - *_matrix_required_freebsd - *_matrix_required_osx # - *_matrix_required_windows _matrix_all: include: &_matrix_all - *_matrix_linux + - *_matrix_freebsd - *_matrix_osx - *_matrix_windows @@ -856,6 +953,7 @@ _matrix_master: ### following items from becoming green: - *_matrix_allowfail_linux - *_matrix_allowfail_osx + - *_matrix_allowfail_freebsd - *_matrix_windows _matrix_fixbugs: @@ -884,7 +982,7 @@ jobs: # Note: "env" lines below must exactly describe a matrix option defined above allow_failures: #OK# - env: NUT_MATRIX_TAG="gnu99-gcc-default-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" -#OK# - env: NUT_MATRIX_TAG="gnu99-gcc-7-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=gcc-7 CXX=g++-7 +#OK# - env: NUT_MATRIX_TAG="gnu99-gcc-7-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++98" CC=gcc-7 CXX=g++-7 #OK# - env: NUT_MATRIX_TAG="gnu11-gcc-7-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu11" CXXFLAGS="-std=gnu++11" CC=gcc-7 CXX=g++-7 #OK# - env: NUT_MATRIX_TAG="gnu17-gcc-9-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu17" CXXFLAGS="-std=gnu++17" CC=gcc-9 CXX=g++-9 #OK# - env: NUT_MATRIX_TAG="gnu99-clang-5.0-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=clang-5.0 CXX=clang++-5.0 @@ -898,7 +996,7 @@ jobs: #OK# - env: NUT_MATRIX_TAG="cDefault-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic" CXXFLAGS="-Wall -Wextra -Werror" #OK# - env: NUT_MATRIX_TAG="gnu99-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++99" - env: NUT_MATRIX_TAG="c99-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=c99" CXXFLAGS="-Wall -Wextra -Werror -std=c++99" -#OK# - env: NUT_MATRIX_TAG="gnu99-gcc-7-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++99" CC=gcc-7 CXX=g++-7 +#OK# - env: NUT_MATRIX_TAG="gnu99-gcc-7-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++98" CC=gcc-7 CXX=g++-7 - env: NUT_MATRIX_TAG="c99-clang-5.0-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c99" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++99" CC=clang-5.0 CXX=clang++-5.0 - env: NUT_MATRIX_TAG="c11-clang-5.0-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c11" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++11" CC=clang-5.0 CXX=clang++-5.0 - env: NUT_MATRIX_TAG="c11-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=c11" CXXFLAGS="-Wall -Wextra -Werror -std=c++11" @@ -906,6 +1004,15 @@ jobs: #OK# - env: NUT_MATRIX_TAG="gnu89-gcc-default-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu89" CXXFLAGS="-std=gnu++89" - env: NUT_MATRIX_TAG="c89-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=c89" CXXFLAGS="-Wall -Wextra -Werror -std=c++89" - env: NUT_MATRIX_TAG="gnu89-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu89" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++89" +### FreeBSD +#OK# - env: NUT_MATRIX_TAG="gnu99-gcc-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=gcc CXX=g++ +#OK# - env: NUT_MATRIX_TAG="gnu99-clang-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=clang CXX=clang++ +#OK# - env: NUT_MATRIX_TAG="gnu17-gcc-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++17" CC=gcc CXX=g++ +#OK# - env: NUT_MATRIX_TAG="gnu17-clang-freebsd-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++17" CC=clang CXX=clang++ + - env: NUT_MATRIX_TAG="gnu99-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++99" CC=gcc CXX=g++ + - env: NUT_MATRIX_TAG="gnu17-gcc-default-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -pedantic -std=gnu17" CXXFLAGS="-Wall -Wextra -Werror -std=gnu++17" CC=gcc CXX=g++ + - env: NUT_MATRIX_TAG="gnu99-clang-freebsd-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=gnu99" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=gnu++99" CC=clang CXX=clang++ + - env: NUT_MATRIX_TAG="gnu17-clang-freebsd-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=gnu17" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=gnu++17" CC=clang CXX=clang++ ### macosx #OK# - env: NUT_MATRIX_TAG="gnu99-clang-xcode10.2-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=clang CXX=clang++ #OK# - env: NUT_MATRIX_TAG="gnu17-clang-xcode10.2-nowarn" BUILD_TYPE=default-all-errors CFLAGS="-std=gnu17" CXXFLAGS="-std=gnu++17" CC=clang CXX=clang++ @@ -919,6 +1026,7 @@ jobs: - env: NUT_MATRIX_TAG="c11-clang-xcode7.3-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c11" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++11" CC=clang CXX=clang++ ### windows - env: NUT_MATRIX_TAG="gnu99-clang-win-nowarn" BUILD_TYPE=default-all-errors CPPFLAGS="-fms-extensions" CFLAGS="-std=gnu99" CXXFLAGS="-std=gnu++99" CC=clang CXX=clang++ + - env: NUT_MATRIX_TAG="gnu99-clang-win-warn" BUILD_TYPE=default-all-errors CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c99" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++99" CC=clang CXX=clang++ - env: NUT_MATRIX_TAG="c99-clang-win-nowarn" BUILD_TYPE=default-all-errors CPPFLAGS="-fms-extensions" CFLAGS="-std=c99" CXXFLAGS="-std=c++99" CC=clang CXX=clang++ - env: NUT_MATRIX_TAG="c99-clang-win-warn" BUILD_TYPE=default-all-errors CPPFLAGS="-fms-extensions" CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c99" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++99" CC=clang CXX=clang++ - env: NUT_MATRIX_TAG="c20-clang-win-warn" BUILD_TYPE=default-all-errors CPPFLAGS="-fms-extensions" CFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -pedantic -std=c20" CXXFLAGS="-Wall -Wextra -Werror -Weverything -Wno-unused-macros -Wno-reserved-id-macro -Wno-padded -std=c++20" CC=clang CXX=clang++ @@ -941,10 +1049,17 @@ before_install: export XML_CATALOG_FILES fi fi + +# Please forgive the funny syntax below to dance around +# both YAML escaping and windows-acceptable shell syntax - |- if [[ $TRAVIS_OS_NAME == "windows" ]] ; then - choco install cygwin - C:\\tools\\cygwin\\cygwinsetup.exe -q -P make,unzip,automake,autoconf,zip + if [[ ! -s C:/tools/cygwin/bin/autoreconf.exe ]] ; then + if [[ ! -s C:/tools/cygwin/bin/autoreconf ]] ; then + choco install cygwin + C:\\tools\\cygwin\\cygwinsetup.exe -q -P make,unzip,automake,autoconf,zip + fi + fi if [[ ! -s C:/tools/bin/ccache.exe ]] ; then mkdir -p C:/tools/bin/ pushd C:/tools/bin/ || exit @@ -953,18 +1068,19 @@ before_install: rm -f ccache-3.7.12-windows-64.zip popd fi - export PATH=/C/tools/bin:$PATH + export PATH=/C/tools/bin:/cygdrive/c/tools/bin:$PATH:/C/tools/cygwin/bin:/cygdrive/c/tools/cygwin/bin CI_TRACE=true CI_TIME=false - export CI_TRACE CI_TIME + ( echo "user::rwx" + echo "group::r--" + echo "mask:rwx" + echo "other:r--" + ) > /tmp/faclx + if ! setfacl -f /tmp/faclx /cygdrive/c/tools/cygwin/*bin/* ; then + setfacl -f /tmp/faclx /C/tools/cygwin/*bin/* + fi fi - if [ -n "${NUT_MATRIX_TAG}" ] ; then export CFLAGS CXXFLAGS ; [ -z "$CC" ] || export CC ; [ -z "$CXX" ] || export CXX ; fi # Hand off to generated script for each BUILD_TYPE -script: -- |- - if [[ $OS_BUILD == "windows" ]]; then - powershell -Command "C:\tools\cygwin\bin\bash.exe -c './ci_build.sh'"; - else - ./ci_build.sh - fi +script: ./ci_build.sh diff --git a/autogen.sh b/autogen.sh index e152fa453a..a401914f0d 100755 --- a/autogen.sh +++ b/autogen.sh @@ -41,4 +41,4 @@ fi # now we can safely call autoreconf echo "Calling autoreconf..." -autoreconf -i +autoreconf -iv diff --git a/ci_build.sh b/ci_build.sh index e30b4e792f..6a8f966136 100755 --- a/ci_build.sh +++ b/ci_build.sh @@ -25,9 +25,15 @@ case "$CI_TRACE" in esac configure_nut() { - echo "=== CONFIGURING NUT: ./configure ${CONFIG_OPTS[*]}" + local CONFIGURE_SCRIPT=./configure + if [[ "$TRAVIS_OS_NAME" == "windows" ]] ; then + find . -ls + CONFIGURE_SCRIPT=./configure.bat + fi + + echo "=== CONFIGURING NUT: $CONFIGURE_SCRIPT ${CONFIG_OPTS[*]}" echo "=== CC='$CC' CXX='$CXX' CPP='$CPP'" - $CI_TIME ./configure "${CONFIG_OPTS[@]}" \ + $CI_TIME $CONFIGURE_SCRIPT "${CONFIG_OPTS[@]}" \ || { RES=$? echo "FAILED ($RES) to configure nut, will dump config.log in a second to help troubleshoot CI" >&2 echo " (or press Ctrl+C to abort now if running interactively)" >&2 @@ -46,7 +52,7 @@ build_to_only_catch_errors() { echo "`date`: Starting a 'make check' for quick sanity test of the products built with the current compiler and standards" $CI_TIME make VERBOSE=0 check \ - && echo "`date`: SUCCESS" \ + && echo "`date`: SUCCESS" \ || return $? return 0 @@ -194,7 +200,7 @@ default|default-alldrv|default-all-errors|default-spellcheck|default-shellcheck| CONFIG_OPTS+=("--with-doc=skip") # Enable as many binaries to build as current worker setup allows CONFIG_OPTS+=("--with-all=auto") - if [[ "$TRAVIS_OS_NAME" != "windows" ]] ; then + if [[ "$TRAVIS_OS_NAME" != "windows" ]] && [[ "$TRAVIS_OS_NAME" != "freebsd" ]] ; then # Currently --with-all implies this, but better be sure to # really build everything we can to be certain it builds: CONFIG_OPTS+=("--with-cgi=yes") diff --git a/configure.ac b/configure.ac index b3d6845e62..5279a19bb2 100644 --- a/configure.ac +++ b/configure.ac @@ -138,6 +138,7 @@ AC_C_BIGENDIAN AC_C_INLINE AC_C_FLEXIBLE_ARRAY_MEMBER AC_C_VARARRAYS +AX_C_PRAGMAS AX_C___ATTRIBUTE__ AC_CHECK_FUNCS(flock lockf fcvt fcvtl pow10 round abs_val abs) AC_CHECK_FUNCS(fabs, [], [], [#include ]) diff --git a/m4/ax_c_pragmas.m4 b/m4/ax_c_pragmas.m4 new file mode 100644 index 0000000000..8ded0de5fb --- /dev/null +++ b/m4/ax_c_pragmas.m4 @@ -0,0 +1,104 @@ +dnl Check for current compiler support of specific pragmas we use, +dnl e.g. diagnostics management to keep warnings quiet sometimes + +AC_DEFUN([AX_C_PRAGMAS], [ + CFLAGS_SAVED="${CFLAGS}" + AS_IF([test "${GCC}" = "yes"], + [dnl # This is expected to fail builds with unknown pragma names on GCC or CLANG at least + CFLAGS="${CFLAGS_SAVED} -Werror=pragmas -Werror=unknown-warning-option"], + [CFLAGS="${CFLAGS_SAVED} -Wall -Wextra -Werror"]) + + AC_CACHE_CHECK([for pragma GCC diagnostic push and pop], + [ax_cv__pragma__gcc__diags_push_pop], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +#pragma GCC diagnostic push +#pragma GCC diagnostic pop + ]], [])], + [ax_cv__pragma__gcc__diags_push_pop=yes], + [ax_cv__pragma__gcc__diags_push_pop=no] + )] + ) + AS_IF([test "$ax_cv__pragma__gcc__diags_push_pop" = "yes"],[ + AC_DEFINE([HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP], 1, [define if your compiler has #pragma GCC diagnostic push and pop]) + ]) + + AC_CACHE_CHECK([for pragma GCC diagnostic ignored "-Wformat-nonliteral"], + [ax_cv__pragma__gcc__diags_ignored_format_nonliteral], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#pragma GCC diagnostic ignored "-Wformat-nonliteral"]], [])], + [ax_cv__pragma__gcc__diags_ignored_format_nonliteral=yes], + [ax_cv__pragma__gcc__diags_ignored_format_nonliteral=no] + )] + ) + AS_IF([test "$ax_cv__pragma__gcc__diags_ignored_format_nonliteral" = "yes"],[ + AC_DEFINE([HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL], 1, [define if your compiler has #pragma GCC diagnostic ignored "-Wformat-nonliteral"]) + ]) + + AC_CACHE_CHECK([for pragma GCC diagnostic ignored "-Wformat-security"], + [ax_cv__pragma__gcc__diags_ignored_format_security], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#pragma GCC diagnostic ignored "-Wformat-security"]], [])], + [ax_cv__pragma__gcc__diags_ignored_format_security=yes], + [ax_cv__pragma__gcc__diags_ignored_format_security=no] + )] + ) + AS_IF([test "$ax_cv__pragma__gcc__diags_ignored_format_security" = "yes"],[ + AC_DEFINE([HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY], 1, [define if your compiler has #pragma GCC diagnostic ignored "-Wformat-security"]) + ]) + + AC_CACHE_CHECK([for pragma GCC diagnostic ignored "-Wunreachable-code-break"], + [ax_cv__pragma__gcc__diags_ignored_unreachable_code_break], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#pragma GCC diagnostic ignored "-Wunreachable-code-break"]], [])], + [ax_cv__pragma__gcc__diags_ignored_unreachable_code_break=yes], + [ax_cv__pragma__gcc__diags_ignored_unreachable_code_break=no] + )] + ) + AS_IF([test "$ax_cv__pragma__gcc__diags_ignored_unreachable_code_break" = "yes"],[ + AC_DEFINE([HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_BREAK], 1, [define if your compiler has #pragma GCC diagnostic ignored "-Wunreachable-code-break"]) + ]) + + AC_CACHE_CHECK([for pragma GCC diagnostic ignored "-Wunreachable-code"], + [ax_cv__pragma__gcc__diags_ignored_unreachable_code], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#pragma GCC diagnostic ignored "-Wunreachable-code"]], [])], + [ax_cv__pragma__gcc__diags_ignored_unreachable_code=yes], + [ax_cv__pragma__gcc__diags_ignored_unreachable_code=no] + )] + ) + AS_IF([test "$ax_cv__pragma__gcc__diags_ignored_unreachable_code" = "yes"],[ + AC_DEFINE([HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE], 1, [define if your compiler has #pragma GCC diagnostic ignored "-Wunreachable-code"]) + ]) + + dnl # Meta-macros for simpler use-cases where we pick + dnl # equivalent-effect macros for different compiler versions + AS_IF([test "$ax_cv__pragma__gcc__diags_push_pop" = "yes"],[ + AS_IF([test "$ax_cv__pragma__gcc__diags_ignored_format_security" = "yes" || test "$ax_cv__pragma__gcc__diags_ignored_format_nonliteral" = "yes" ],[ + AC_DEFINE([HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL], 1, [define if your compiler has pragmas for GCC diagnostic ignored "-Wformat-nonliteral" or "-Wformat-security" and for push-pop support]) + ]) + AS_IF([test "$ax_cv__pragma__gcc__diags_ignored_unreachable_code" = "yes" || test "$ax_cv__pragma__gcc__diags_ignored_unreachable_code_break" = "yes" ],[ + AC_DEFINE([HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE], 1, [define if your compiler has pragmas for GCC diagnostic ignored "-Wunreachable-code(-break)" and for push-pop support]) + ]) + ]) + + AC_CACHE_CHECK([for pragma BOGUSforTest], + [ax_cv__pragma__bogus], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#pragma BOGUSforTest]], [])], + [ax_cv__pragma__bogus=yes], + [ax_cv__pragma__bogus=no] + )] + ) + + AC_CACHE_CHECK([for pragma GCC diagnostic ignored "-WBOGUSforTest"], + [ax_cv__pragma__bogus_diag], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#pragma GCC diagnostic ignored "-WBOGUSforTest"]], [])], + [ax_cv__pragma__bogus_diag=yes], + [ax_cv__pragma__bogus_diag=no] + )] + ) + + CFLAGS="${CFLAGS_SAVED}" +])