]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
GHA/configure-vs-cmake: add Windows build, fix issues
authorViktor Szakats <commit@vsz.me>
Sun, 25 Aug 2024 11:16:49 +0000 (13:16 +0200)
committerViktor Szakats <commit@vsz.me>
Mon, 26 Aug 2024 09:07:58 +0000 (11:07 +0200)
- configure: disable pthreads by default on Windows.
- configure: disable detecting `fseeko()` on Windows.
  (It exists in mingw-w64 2.0.0 and newer, but it's permanently ignored
  in CMake, as this function is never necessary on Windows.)
- extend existing exceptions with their Windows variants.
- `lib/formdata.c`: prioritize `_fseeki64()` over `fseeko()`.
  To reduce the difference between Windows builds, which now all use
  `_fseeki64()`.
- cmake: perm-enable `HAVE_DIRENT_H` and `HAVE_OPENDIR` for mingw-w64,
  to match configure.
  Follow-up to bfe54b0e88239da542493321e795cd71c14af9cc #13137
  This in theory could make the dir listing feature work in mingw-w64
  build, but in my tests (on WINE) it failed at the preceding `open()`
  call.
- cmake: perm-enable `HAVE_STRINGS_H` and `HAVE_UTIME_H` for mingw-w64,
  to match configure. (They are wrappers and make no difference in the build.)

Also:
- configure: sync `USE_MANUAL` macro with cmake, by only setting it for
  `src`. Drop checker exception.
- CI: use `--disable-dependency-tracking` in existing jobs.
- CI: install packages before git checkout, in existing jobs.

Closes #14678

.github/scripts/cmp-config.pl
.github/workflows/configure-vs-cmake.yml
CMake/Platforms/WindowsCache.cmake
configure.ac
lib/formdata.c
src/Makefile.am

index 49c8d0676964fe3254f7ae59de7db3336a148334..9046ad2961d84e8b59c51c631c68770b51645d7f 100755 (executable)
@@ -37,10 +37,15 @@ my %remove = (
     '#define _FILE_OFFSET_BITS 64' => 1,
     '#define CURL_EXTERN_SYMBOL' => 1,
     '#define CURL_SA_FAMILY_T sa_family_t' => 1,
+    '#define CURL_SA_FAMILY_T ADDRESS_FAMILY' => 1,
+    '#define HAVE_ADDRESS_FAMILY 1' => 1,
     '#define GETHOSTNAME_TYPE_ARG2 size_t' => 1,
+    '#define GETHOSTNAME_TYPE_ARG2 int' => 1,
     '#define HAVE_BROTLI 1' => 1,
     '#define HAVE_BROTLI_DECODE_H 1' => 1,
     '#define HAVE_DECL_GETPWUID_R 1' => 1,
+    '#define HAVE_DECL_GETPWUID_R 0' => 1,
+    '#define HAVE_DECL_GETPWUID_R_MISSING 1' => 1,
     '#define HAVE_DLFCN_H 1' => 1,
     '#define HAVE_GETHOSTBYNAME 1' => 1,
     '#define HAVE_INTTYPES_H 1' => 1,
@@ -78,7 +83,6 @@ my %remove = (
     '#define PACKAGE_URL ""' => 1,
     '#define PACKAGE_VERSION "-"' => 1,
     '#define SIZEOF_LONG_LONG 8' => 1,
-    '#define USE_MANUAL 1' => 1,
     '#define VERSION "-"' => 1,
     );
 
index d8580b973a7d17112f160a9ffa7c02134f4b9dc2..fefb138ec158522d29914ad0103b898f152035ef 100644 (file)
@@ -37,7 +37,7 @@ jobs:
       - name: run configure --with-openssl
         run: |
           autoreconf -fi
-          ./configure --with-openssl --without-libpsl
+          ./configure --disable-dependency-tracking --with-openssl --without-libpsl
 
       - name: run cmake
         run: |
@@ -49,16 +49,16 @@ jobs:
   check-macos:
     runs-on: macos-latest
     steps:
-      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
-
       - name: install packages
         run: |
           while [[ $? == 0 ]]; do for i in 1 2 3; do brew update && brew install libtool autoconf automake && break 2 || { echo Error: wait to try again; sleep 10; } done; false Too many retries; done
 
+      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+
       - name: run configure --with-openssl
         run: |
           autoreconf -fi
-          ./configure --with-openssl --without-libpsl
+          ./configure --disable-dependency-tracking --with-openssl --without-libpsl
 
       - name: run cmake
         run: |
@@ -68,3 +68,28 @@ jobs:
 
       - name: compare generated curl_config.h files
         run: ./.github/scripts/cmp-config.pl lib/curl_config.h build/lib/curl_config.h
+
+  check-windows:
+    runs-on: ubuntu-latest
+    env:
+      TRIPLET: 'x86_64-w64-mingw32'
+    steps:
+      - name: install packages
+        run: sudo apt-get --quiet 2 --option Dpkg::Use-Pty=0 install mingw-w64
+
+      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+
+      - name: run configure --with-schannel
+        run: |
+          autoreconf -fi
+          ./configure --disable-dependency-tracking --with-schannel --without-libpsl --host=${TRIPLET} \
+
+      - name: run cmake
+        run: |
+          cmake -B build -DCURL_USE_SCHANNEL=ON -DCURL_USE_LIBPSL=OFF \
+            -DCMAKE_SYSTEM_NAME=Windows \
+            -DCMAKE_C_COMPILER_TARGET=${TRIPLET} \
+            -DCMAKE_C_COMPILER=${TRIPLET}-gcc
+
+      - name: compare generated curl_config.h files
+        run: ./.github/scripts/cmp-config.pl lib/curl_config.h build/lib/curl_config.h
index 2d6373de519d60b225fbf2d284938b93f810ee32..317f21c875cf7675ee054e2b577bafb2cc4727d2 100644 (file)
@@ -41,6 +41,10 @@ if(MINGW)
   set(HAVE_SYS_PARAM_H 1)
   set(HAVE_SYS_TIME_H 1)
   set(HAVE_GETTIMEOFDAY 1)
+  set(HAVE_STRINGS_H 1)  # wrapper to string.h
+  set(HAVE_UTIME_H 1)  # wrapper to sys/utime.h
+  set(HAVE_DIRENT_H 1)
+  set(HAVE_OPENDIR 1)
 else()
   set(HAVE_LIBGEN_H 0)
   set(HAVE_STRCASECMP 0)
@@ -48,6 +52,10 @@ else()
   set(HAVE_SYS_PARAM_H 0)
   set(HAVE_SYS_TIME_H 0)
   set(HAVE_GETTIMEOFDAY 0)
+  set(HAVE_STRINGS_H 0)
+  set(HAVE_UTIME_H 0)
+  set(HAVE_DIRENT_H 0)
+  set(HAVE_OPENDIR 0)
   if(MSVC)
     set(HAVE_UNISTD_H 0)
     set(HAVE_LOCALE_H 1)
@@ -121,7 +129,6 @@ set(HAVE_IOCTL_SIOCGIFADDR 0)
 set(HAVE_POLL_H 0)
 set(HAVE_POLL_FINE 0)
 set(HAVE_PWD_H 0)
-set(HAVE_STRINGS_H 0)  # mingw-w64 has it (wrapper to string.h)
 set(HAVE_SYS_EVENTFD_H 0)
 set(HAVE_SYS_FILIO_H 0)
 set(HAVE_SYS_WAIT_H 0)
@@ -137,13 +144,9 @@ set(HAVE_SYS_UN_H 0)
 set(HAVE_SYS_UTIME_H 1)
 set(HAVE_TERMIOS_H 0)
 set(HAVE_TERMIO_H 0)
-set(HAVE_UTIME_H 0)  # mingw-w64 has it (wrapper to sys/utime.h)
 set(HAVE_LINUX_TCP_H 0)
 
-set(HAVE_DIRENT_H 0)
-set(HAVE_OPENDIR 0)
-
-set(HAVE_FSEEKO 0)
+set(HAVE_FSEEKO 0)  # mingw-w64 2.0.0 and newer has it
 set(HAVE__FSEEKI64 1)
 set(HAVE_SOCKET 1)
 set(HAVE_SELECT 1)
index d6521b8b80fff54eeef286e223a9a566a90edc47..5874b4002210b50a7376a65d253ad93670a0cf1b 100644 (file)
@@ -4003,7 +4003,6 @@ AC_CHECK_FUNCS([\
   arc4random \
   eventfd \
   fnmatch \
-  fseeko \
   geteuid \
   getpass_r \
   getppid \
@@ -4024,14 +4023,18 @@ AC_CHECK_FUNCS([\
   utimes \
 ])
 
-dnl On Android, the only way to know if fseeko can be used is to see if it is
-dnl declared or not (for this API level), as the symbol always exists in the
-dnl lib.
-AC_CHECK_DECL([fseeko],
-  [AC_DEFINE([HAVE_DECL_FSEEKO], [1],
-   [Define to 1 if you have the fseeko declaration])],
-  [],
-  [[#include <stdio.h>]])
+if test "$curl_cv_native_windows" != 'yes'; then
+  AC_CHECK_FUNCS([fseeko])
+
+  dnl On Android, the only way to know if fseeko can be used is to see if it is
+  dnl declared or not (for this API level), as the symbol always exists in the
+  dnl lib.
+  AC_CHECK_DECL([fseeko],
+    [AC_DEFINE([HAVE_DECL_FSEEKO], [1],
+     [Define to 1 if you have the fseeko declaration])],
+    [],
+    [[#include <stdio.h>]])
+fi
 
 CURL_CHECK_NONBLOCKING_SOCKET
 
@@ -4053,7 +4056,6 @@ dnl If the manual variable still is set, then we go with providing a built-in
 dnl manual
 
 if test "$USE_MANUAL" = "1"; then
-  AC_DEFINE(USE_MANUAL, 1, [If you want to build curl with the built-in manual])
   curl_manual_msg="enabled"
 fi
 
@@ -4096,8 +4098,13 @@ AS_HELP_STRING([--disable-pthreads],[Disable POSIX threads]),
     want_pthreads=yes
     ;;
   esac ], [
-    AC_MSG_RESULT(auto)
-    want_pthreads=auto
+    if test "$curl_cv_native_windows" = "yes"; then
+      AC_MSG_RESULT(no)
+      want_pthreads=no
+    else
+      AC_MSG_RESULT(auto)
+      want_pthreads=auto
+    fi
     ]
 )
 
index 7a282bdd3d79d236d49d3c2b600677965afef2e6..c260d442bd860bee5370b2c6d6cc57694123ffcb 100644 (file)
@@ -790,10 +790,10 @@ static CURLcode setname(curl_mimepart *part, const char *name, size_t len)
 /* wrap call to fseeko so it matches the calling convention of callback */
 static int fseeko_wrapper(void *stream, curl_off_t offset, int whence)
 {
-#if defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO)
-  return fseeko(stream, (off_t)offset, whence);
-#elif defined(HAVE__FSEEKI64)
+#if defined(HAVE__FSEEKI64)
   return _fseeki64(stream, (__int64)offset, whence);
+#elif defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO)
+  return fseeko(stream, (off_t)offset, whence);
 #else
   if(offset > LONG_MAX)
     return -1;
index a68e5c5e87a4e6569cd81ca5c4be133112d713d6..76af4602fc38273e29c00925d74bb4f02c2b286b 100644 (file)
@@ -113,6 +113,7 @@ CS_ = $(CS_0)
 
 if USE_MANUAL
 # Here are the stuff to create a built-in manual
+AM_CPPFLAGS += -DUSE_MANUAL
 
 $(ASCIIPAGE):
        cd $(top_builddir)/docs && $(MAKE)