]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
build: fix clang-cl builds, add CI job
authorViktor Szakats <commit@vsz.me>
Tue, 29 Oct 2024 15:13:45 +0000 (16:13 +0100)
committerViktor Szakats <commit@vsz.me>
Wed, 30 Oct 2024 22:15:32 +0000 (23:15 +0100)
- 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

13 files changed:
CMake/PickyWarnings.cmake
appveyor.sh
appveyor.yml
docs/examples/http2-upload.c
lib/content_encoding.c
lib/curl_setup.h
lib/version.c
src/tool_main.c
tests/libtest/lib557.c
tests/unit/unit1398.c
tests/unit/unit1652.c
tests/unit/unit2604.c
tests/unit/unit3200.c

index 7e70d75a0f6f5fd50725e0d2ee9d22c21800554c..b62f97f10a73253921dd8e04cd1686df8e4a029b 100644 (file)
@@ -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))
index 4b95e8e10dfdcaf884b665474bb42c8a80e56390..46501437dcfba4897d024d0b63043a0bce8b5d9c 100644 (file)
@@ -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' ]] && \
index 1f3ec98512fdf9db587bfae427d55617b90ccb68..8209cd119bdaf1308f9be6ccb5107e7ec5210b0a 100644 (file)
@@ -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
index 30f0a95a70800089b09d46882039ceea16d9b509..e804fb76a97f97f2ee622e52f7429ce749e14824 100644 (file)
@@ -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;
index 67c2fb758cea742edbe8377a89d9fdadacd4de22..a4b16dda10310ec5666e13418885fe6411c9fa50 100644 (file)
 #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 <brotli/decode.h>
-#if defined(__GNUC__)
+#if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
 #endif
index 1c715fd4fee684ec7ae6df695a6b626f80c6ca33..cfab140850430bb4b02252dcb28fc341aabd49aa 100644 (file)
@@ -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
index 8e1226ed70c5fb8fc247e579e80c5b86171a3871..1d5b96d2eb0a5da85db31529418cc518fcb5ed11 100644 (file)
 #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 <brotli/decode.h>
-#if defined(__GNUC__)
+#if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic pop
 #endif
 #endif
index 01993123e25b1f254da31d12948566e2eafd0cf2..07eb70bfd296111868cc5530401d5ab569e74044 100644 (file)
@@ -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
index d57f644a6b81479f86bf0bc3965d2866e7a48f90..d84626036f24556426ce04bef34461e889bdffe3 100644 (file)
@@ -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
index b73288518f8dd8dd8894897f86a87ac0bca8ab57..3e70309b4bbf7d5b93973d16f7de6092fd32e0a3 100644 (file)
@@ -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
index a67e4c163d63d837ca6cd46b158e45192d59c470..8607ecc7e270c2eff78e37e1d78170d4916d1db0 100644 (file)
 #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
index 90c6ec3bd629614d498feabb273523f4becb0aac..fc7017e4a89a3713bc46b0047a92ac11105d8506 100644 (file)
@@ -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
index ee478e2ad26bf88f9abc2e2ee22bd6f09fbcba84..92e179fc79ccfdfe803deb10c618d23b25f74158 100644 (file)
@@ -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