From fb711b50981e86c9dcdd6c2ba468b5d32edbcfce Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Tue, 29 Oct 2024 16:13:45 +0100 Subject: [PATCH] build: fix clang-cl builds, add CI job - appveyor: add build-only job for clang-cl. - cmake: `-pedantic-errors` enables `-Werror,-Wlanguage-extension-token` automatically, which makes `__int64` detection fail. Explictly disable this compiler warning for clang-cl to make the feature detection work and to accept `__int64` in the source code. - cmake: disable `-Wlanguage-extension-token` warning for clang-cl to fix these when encountering `__int64`: ``` lib/formdata.c(797,29): error : extension used [-Werror,-Wlanguage-extension-token] lib/warnless.c(117,33): error : extension used [-Werror,-Wlanguage-extension-token] lib/warnless.c(60,28): message : expanded from macro 'CURL_MASK_SCOFFT' lib/warnless.c(59,38): message : expanded from macro 'CURL_MASK_UCOFFT' include\curl/system.h(352,40): message : expanded from macro 'CURL_TYPEOF_CURL_OFF_T' ``` - make `__GNUC__` warning suppressions apply to `__clang__` too. Necessary for clang-cl, which defines the latter, but not the former. (Regular clang defines both.) - examples: fix clang-cl compiler warning in `http2-upload.c`. ``` docs\examples\http2-upload.c(56,5): error : no previous prototype for function 'my_gettimeofday' [-Werror,-Wmissing-prototypes] docs\examples\http2-upload.c(56,1): message : declare 'static' if the function is not intended to be used outside of this translation unit ``` - unit2604: add missing `#pragma GCC diagnostic pop`. Follow-up to e53523fef07894991c69d907a7c7794c7ada4ff4 #14859 - unit1652: limit compiler warning suppression to GCC. They do not affect clang builds. Follow-up to 71cf0d1fca9e1f53524e1545ef0c08d174458d80 #14772 Closes #15449 --- CMake/PickyWarnings.cmake | 9 ++++++++- appveyor.sh | 8 ++++---- appveyor.yml | 10 ++++++++++ docs/examples/http2-upload.c | 1 + lib/content_encoding.c | 4 ++-- lib/curl_setup.h | 2 +- lib/version.c | 4 ++-- src/tool_main.c | 4 ++-- tests/libtest/lib557.c | 4 ++-- tests/unit/unit1398.c | 4 ++-- tests/unit/unit1652.c | 24 ++++++++++++------------ tests/unit/unit2604.c | 8 ++++++-- tests/unit/unit3200.c | 6 +++--- 13 files changed, 55 insertions(+), 33 deletions(-) diff --git a/CMake/PickyWarnings.cmake b/CMake/PickyWarnings.cmake index 7e70d75a0f..b62f97f10a 100644 --- a/CMake/PickyWarnings.cmake +++ b/CMake/PickyWarnings.cmake @@ -31,6 +31,9 @@ if(CURL_WERROR AND NOT CMAKE_VERSION VERSION_LESS 3.23.0) OR # to avoid check_symbol_exists() conflicting with GCC -pedantic-errors CMAKE_C_COMPILER_ID MATCHES "Clang")) list(APPEND _picky "-pedantic-errors") + if(MSVC) # clang-cl + list(APPEND _picky "-Wno-language-extension-token") # Override default error to make __int64 size detection pass + endif() endif() if(APPLE AND @@ -130,9 +133,13 @@ if(PICKY_COMPILER) ${_picky_common_old} -Wshift-sign-overflow # clang 2.9 -Wshorten-64-to-32 # clang 1.0 - -Wlanguage-extension-token # clang 3.0 -Wformat=2 # clang 3.0 gcc 4.8 ) + if(NOT MSVC) + list(APPEND _picky_enable + -Wlanguage-extension-token # clang 3.0 # Avoid for clang-cl to allow __int64 + ) + endif() # Enable based on compiler version if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.6) OR (CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.3)) diff --git a/appveyor.sh b/appveyor.sh index 4b95e8e10d..46501437dc 100644 --- a/appveyor.sh +++ b/appveyor.sh @@ -38,6 +38,7 @@ openssl_root="$(cygpath "${openssl_root_win}")" if [ "${BUILD_SYSTEM}" = 'CMake' ]; then options='' [[ "${TARGET:-}" = *'ARM64'* ]] && SKIP_RUN='ARM64 architecture' + [ -n "${TOOLSET:-}" ] && options+=" -T ${TOOLSET}" [ "${OPENSSL}" = 'ON' ] && options+=" -DOPENSSL_ROOT_DIR=${openssl_root_win}" [ -n "${CURLDEBUG:-}" ] && options+=" -DENABLE_CURLDEBUG=${CURLDEBUG}" [ "${PRJ_CFG}" = 'Debug' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=' @@ -62,6 +63,9 @@ if [ "${BUILD_SYSTEM}" = 'CMake' ]; then '-DCMAKE_INSTALL_PREFIX=C:/curl' \ "-DCMAKE_BUILD_TYPE=${PRJ_CFG}" \ '-DCURL_USE_LIBPSL=OFF' + if false; then + cat _bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true + fi echo 'curl_config.h'; grep -F '#define' _bld/lib/curl_config.h | sort || true # shellcheck disable=SC2086 if ! cmake --build _bld --config "${PRJ_CFG}" --parallel 2 -- ${BUILD_OPT:-}; then @@ -119,10 +123,6 @@ else echo "Skip running curl.exe. Reason: ${SKIP_RUN}" fi -if false; then - cat CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true -fi - # build tests if [[ "${TFLAGS}" != 'skipall' ]] && \ diff --git a/appveyor.yml b/appveyor.yml index 1f3ec98512..8209cd119b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -89,6 +89,16 @@ environment: SCHANNEL: 'ON' ENABLE_UNICODE: 'OFF' EXAMPLES: 'ON' + - job_name: 'CMake, VS2022, Debug, x64, Schannel, Static, Unicode, Build-tests & examples, clang-cl' + APPVEYOR_BUILD_WORKER_IMAGE: 'Visual Studio 2022' + BUILD_SYSTEM: CMake + PRJ_GEN: 'Visual Studio 17 2022' + TARGET: '-A x64' + PRJ_CFG: Debug + SCHANNEL: 'ON' + ENABLE_UNICODE: 'ON' + EXAMPLES: 'ON' + TOOLSET: 'ClangCl' - job_name: 'CMake, VS2022, Debug, x64, Schannel, Static, Unicode, Build-tests' APPVEYOR_BUILD_WORKER_IMAGE: 'Visual Studio 2022' BUILD_SYSTEM: CMake diff --git a/docs/examples/http2-upload.c b/docs/examples/http2-upload.c index 30f0a95a70..e804fb76a9 100644 --- a/docs/examples/http2-upload.c +++ b/docs/examples/http2-upload.c @@ -53,6 +53,7 @@ #ifdef _MSC_VER #define gettimeofday(a, b) my_gettimeofday((a), (b)) +static int my_gettimeofday(struct timeval *tp, void *tzp) { (void)tzp; diff --git a/lib/content_encoding.c b/lib/content_encoding.c index 67c2fb758c..a4b16dda10 100644 --- a/lib/content_encoding.c +++ b/lib/content_encoding.c @@ -33,13 +33,13 @@ #endif #ifdef HAVE_BROTLI -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) /* Ignore -Wvla warnings in brotli headers */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wvla" #endif #include -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif #endif diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 1c715fd4fe..cfab140850 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -33,7 +33,7 @@ /* FIXME: Delete this once the warnings have been fixed. */ #if !defined(CURL_WARN_SIGN_CONVERSION) -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic ignored "-Wsign-conversion" #endif #endif diff --git a/lib/version.c b/lib/version.c index 8e1226ed70..1d5b96d2eb 100644 --- a/lib/version.c +++ b/lib/version.c @@ -63,13 +63,13 @@ #endif #ifdef HAVE_BROTLI -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) /* Ignore -Wvla warnings in brotli headers */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wvla" #endif #include -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif #endif diff --git a/src/tool_main.c b/src/tool_main.c index 01993123e2..07eb70bfd2 100644 --- a/src/tool_main.c +++ b/src/tool_main.c @@ -216,7 +216,7 @@ static void main_free(struct GlobalConfig *config) ** curl tool main function. */ #ifdef _UNICODE -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) /* GCC does not know about wmain() */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-prototypes" @@ -287,7 +287,7 @@ int main(int argc, char *argv[]) } #ifdef _UNICODE -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif #endif diff --git a/tests/libtest/lib557.c b/tests/libtest/lib557.c index d57f644a6b..d84626036f 100644 --- a/tests/libtest/lib557.c +++ b/tests/libtest/lib557.c @@ -37,7 +37,7 @@ #include "memdebug.h" -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wformat-extra-args" @@ -1559,6 +1559,6 @@ CURLcode test(char *URL) return CURLE_OK; } -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif diff --git a/tests/unit/unit1398.c b/tests/unit/unit1398.c index b73288518f..3e70309b4b 100644 --- a/tests/unit/unit1398.c +++ b/tests/unit/unit1398.c @@ -23,7 +23,7 @@ ***************************************************************************/ #include "curlcheck.h" -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat" #endif @@ -186,6 +186,6 @@ fail_unless(rc == 128, "return code should be 128"); UNITTEST_STOP -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif diff --git a/tests/unit/unit1652.c b/tests/unit/unit1652.c index a67e4c163d..8607ecc7e2 100644 --- a/tests/unit/unit1652.c +++ b/tests/unit/unit1652.c @@ -26,15 +26,6 @@ #include "urldata.h" #include "sendf.h" -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat" -#pragma GCC diagnostic ignored "-Wformat-zero-length" -#if !defined(__clang__) && __GNUC__ >= 7 -#pragma GCC diagnostic ignored "-Wformat-overflow" -#endif -#endif - /* * This test hardcodes the knowledge of the buffer size which is internal to * Curl_infof(). If that buffer is changed in size, this tests needs to be @@ -101,6 +92,15 @@ static int verify(const char *info, const char *two) UNITTEST_START +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat" +#pragma GCC diagnostic ignored "-Wformat-zero-length" +#if __GNUC__ >= 7 +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif +#endif + /* Injecting a simple short string via a format */ msnprintf(input, sizeof(input), "Simple Test"); Curl_infof(testdata, "%s", input); @@ -146,8 +146,8 @@ Curl_infof(testdata, "%s", input); fail_unless(strlen(output) == 2051, "Truncation of infof input 3"); fail_unless(output[sizeof(output) - 1] == '\0', "Truncation of infof input 3"); -UNITTEST_STOP - -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop #endif + +UNITTEST_STOP diff --git a/tests/unit/unit2604.c b/tests/unit/unit2604.c index 90c6ec3bd6..fc7017e4a8 100644 --- a/tests/unit/unit2604.c +++ b/tests/unit/unit2604.c @@ -46,7 +46,7 @@ struct set { UNITTEST_START #ifdef USE_SSH { -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Woverlength-strings" #endif @@ -78,7 +78,7 @@ UNITTEST_START { NULL, NULL, NULL, NULL, CURLE_OK } }; -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic warning "-Woverlength-strings" #endif @@ -114,6 +114,10 @@ UNITTEST_START free((void *)list[0].cp); } +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + #endif UNITTEST_STOP diff --git a/tests/unit/unit3200.c b/tests/unit/unit3200.c index ee478e2ad2..92e179fc79 100644 --- a/tests/unit/unit3200.c +++ b/tests/unit/unit3200.c @@ -47,7 +47,7 @@ static CURLcode unit_stop(void) return CURLE_OK; } -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Woverlength-strings" #endif @@ -78,7 +78,7 @@ static const char *filecontents[] = { "LINE1\x1aTEST" }; -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic warning "-Woverlength-strings" #endif @@ -173,7 +173,7 @@ UNITTEST_START return (CURLcode)rc; UNITTEST_STOP -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif