GHA/configure-vs-cmake: add Windows build, fix issues

- 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 bfe54b0e88 #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
This commit is contained in:
Viktor Szakats 2024-08-25 13:16:49 +02:00
parent 7673c12929
commit aaacd02466
No known key found for this signature in database
GPG Key ID: B5ABD165E2AEF201
6 changed files with 66 additions and 26 deletions

View File

@ -37,10 +37,15 @@ my %remove = (
'#define _FILE_OFFSET_BITS 64' => 1, '#define _FILE_OFFSET_BITS 64' => 1,
'#define CURL_EXTERN_SYMBOL' => 1, '#define CURL_EXTERN_SYMBOL' => 1,
'#define CURL_SA_FAMILY_T sa_family_t' => 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 size_t' => 1,
'#define GETHOSTNAME_TYPE_ARG2 int' => 1,
'#define HAVE_BROTLI 1' => 1, '#define HAVE_BROTLI 1' => 1,
'#define HAVE_BROTLI_DECODE_H 1' => 1, '#define HAVE_BROTLI_DECODE_H 1' => 1,
'#define HAVE_DECL_GETPWUID_R 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_DLFCN_H 1' => 1,
'#define HAVE_GETHOSTBYNAME 1' => 1, '#define HAVE_GETHOSTBYNAME 1' => 1,
'#define HAVE_INTTYPES_H 1' => 1, '#define HAVE_INTTYPES_H 1' => 1,
@ -78,7 +83,6 @@ my %remove = (
'#define PACKAGE_URL ""' => 1, '#define PACKAGE_URL ""' => 1,
'#define PACKAGE_VERSION "-"' => 1, '#define PACKAGE_VERSION "-"' => 1,
'#define SIZEOF_LONG_LONG 8' => 1, '#define SIZEOF_LONG_LONG 8' => 1,
'#define USE_MANUAL 1' => 1,
'#define VERSION "-"' => 1, '#define VERSION "-"' => 1,
); );

View File

@ -37,7 +37,7 @@ jobs:
- name: run configure --with-openssl - name: run configure --with-openssl
run: | run: |
autoreconf -fi autoreconf -fi
./configure --with-openssl --without-libpsl ./configure --disable-dependency-tracking --with-openssl --without-libpsl
- name: run cmake - name: run cmake
run: | run: |
@ -49,16 +49,16 @@ jobs:
check-macos: check-macos:
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- name: install packages - name: install packages
run: | 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 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 - name: run configure --with-openssl
run: | run: |
autoreconf -fi autoreconf -fi
./configure --with-openssl --without-libpsl ./configure --disable-dependency-tracking --with-openssl --without-libpsl
- name: run cmake - name: run cmake
run: | run: |
@ -68,3 +68,28 @@ jobs:
- name: compare generated curl_config.h files - name: compare generated curl_config.h files
run: ./.github/scripts/cmp-config.pl lib/curl_config.h build/lib/curl_config.h 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

View File

@ -41,6 +41,10 @@ if(MINGW)
set(HAVE_SYS_PARAM_H 1) set(HAVE_SYS_PARAM_H 1)
set(HAVE_SYS_TIME_H 1) set(HAVE_SYS_TIME_H 1)
set(HAVE_GETTIMEOFDAY 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() else()
set(HAVE_LIBGEN_H 0) set(HAVE_LIBGEN_H 0)
set(HAVE_STRCASECMP 0) set(HAVE_STRCASECMP 0)
@ -48,6 +52,10 @@ else()
set(HAVE_SYS_PARAM_H 0) set(HAVE_SYS_PARAM_H 0)
set(HAVE_SYS_TIME_H 0) set(HAVE_SYS_TIME_H 0)
set(HAVE_GETTIMEOFDAY 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) if(MSVC)
set(HAVE_UNISTD_H 0) set(HAVE_UNISTD_H 0)
set(HAVE_LOCALE_H 1) set(HAVE_LOCALE_H 1)
@ -121,7 +129,6 @@ set(HAVE_IOCTL_SIOCGIFADDR 0)
set(HAVE_POLL_H 0) set(HAVE_POLL_H 0)
set(HAVE_POLL_FINE 0) set(HAVE_POLL_FINE 0)
set(HAVE_PWD_H 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_EVENTFD_H 0)
set(HAVE_SYS_FILIO_H 0) set(HAVE_SYS_FILIO_H 0)
set(HAVE_SYS_WAIT_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_SYS_UTIME_H 1)
set(HAVE_TERMIOS_H 0) set(HAVE_TERMIOS_H 0)
set(HAVE_TERMIO_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_LINUX_TCP_H 0)
set(HAVE_DIRENT_H 0) set(HAVE_FSEEKO 0) # mingw-w64 2.0.0 and newer has it
set(HAVE_OPENDIR 0)
set(HAVE_FSEEKO 0)
set(HAVE__FSEEKI64 1) set(HAVE__FSEEKI64 1)
set(HAVE_SOCKET 1) set(HAVE_SOCKET 1)
set(HAVE_SELECT 1) set(HAVE_SELECT 1)

View File

@ -4003,7 +4003,6 @@ AC_CHECK_FUNCS([\
arc4random \ arc4random \
eventfd \ eventfd \
fnmatch \ fnmatch \
fseeko \
geteuid \ geteuid \
getpass_r \ getpass_r \
getppid \ getppid \
@ -4024,6 +4023,9 @@ AC_CHECK_FUNCS([\
utimes \ utimes \
]) ])
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 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 declared or not (for this API level), as the symbol always exists in the
dnl lib. dnl lib.
@ -4032,6 +4034,7 @@ AC_CHECK_DECL([fseeko],
[Define to 1 if you have the fseeko declaration])], [Define to 1 if you have the fseeko declaration])],
[], [],
[[#include <stdio.h>]]) [[#include <stdio.h>]])
fi
CURL_CHECK_NONBLOCKING_SOCKET 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 dnl manual
if test "$USE_MANUAL" = "1"; then 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" curl_manual_msg="enabled"
fi fi
@ -4096,8 +4098,13 @@ AS_HELP_STRING([--disable-pthreads],[Disable POSIX threads]),
want_pthreads=yes want_pthreads=yes
;; ;;
esac ], [ esac ], [
if test "$curl_cv_native_windows" = "yes"; then
AC_MSG_RESULT(no)
want_pthreads=no
else
AC_MSG_RESULT(auto) AC_MSG_RESULT(auto)
want_pthreads=auto want_pthreads=auto
fi
] ]
) )

View 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 */ /* wrap call to fseeko so it matches the calling convention of callback */
static int fseeko_wrapper(void *stream, curl_off_t offset, int whence) static int fseeko_wrapper(void *stream, curl_off_t offset, int whence)
{ {
#if defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO) #if defined(HAVE__FSEEKI64)
return fseeko(stream, (off_t)offset, whence);
#elif defined(HAVE__FSEEKI64)
return _fseeki64(stream, (__int64)offset, whence); return _fseeki64(stream, (__int64)offset, whence);
#elif defined(HAVE_FSEEKO) && defined(HAVE_DECL_FSEEKO)
return fseeko(stream, (off_t)offset, whence);
#else #else
if(offset > LONG_MAX) if(offset > LONG_MAX)
return -1; return -1;

View File

@ -113,6 +113,7 @@ CS_ = $(CS_0)
if USE_MANUAL if USE_MANUAL
# Here are the stuff to create a built-in manual # Here are the stuff to create a built-in manual
AM_CPPFLAGS += -DUSE_MANUAL
$(ASCIIPAGE): $(ASCIIPAGE):
cd $(top_builddir)/docs && $(MAKE) cd $(top_builddir)/docs && $(MAKE)