curl/appveyor.yml
Viktor Szakats 3f8fc25720
cmake: add support for "unity" builds
Aka "jumbo" or "amalgamation" builds. It means to compile all sources
per target as a single C source. This is experimental.

You can enable it by passing `-DCMAKE_UNITY_BUILD=ON` to cmake.
It requires CMake 3.16 or newer.

It makes builds (much) faster, allows for better optimizations and tends
to promote less ambiguous code.

Also add a new AppVeyor CI job and convert an existing one to use
"unity" mode (one MSVC, one MinGW), and enable it for one macOS CI job.

Fix related issues:
- add missing include guard to `easy_lock.h`.
- rename static variables and functions (and a macro) with names reused
  across sources, or shadowed by local variables.
- add an `#undef` after use.
- add a missing `#undef` before use.
- move internal definitions from `ftp.h` to `ftp.c`.
- `curl_memory.h` fixes to make it work when included repeatedly.
- stop building/linking curlx bits twice for a static-mode curl tool.
  These caused doubly defined symbols in unity builds.
- silence missing extern declarations compiler warning for ` _CRT_glob`.
- fix extern declarations for `tool_freq` and `tool_isVistaOrGreater`.
- fix colliding static symbols in debug mode: `debugtime()` and
  `statename`.
- rename `ssl_backend_data` structure to unique names for each
  TLS-backend, along with the `ssl_connect_data` struct member
  referencing them. This required adding casts for each access.
- add workaround for missing `[P]UNICODE_STRING` types in certain Windows
  builds when compiling `lib/ldap.c`. To support "unity" builds, we had
  to enable `SCHANNEL_USE_BLACKLISTS` for Schannel (a Windows
  `schannel.h` option) _globally_. This caused an indirect inclusion of
  Windows `schannel.h` from `ldap.c` via `winldap.h` to have it enabled
  as well. This requires `[P]UNICODE_STRING` types, which is apperantly
  not defined automatically (as seen with both MSVS and mingw-w64).
  This patch includes `<subauth.h>` to fix it.
  Ref: https://github.com/curl/curl/runs/13987772013
  Ref: https://dev.azure.com/daniel0244/curl/_build/results?buildId=15827&view=logs&jobId=2c9f582d-e278-56b6-4354-f38a4d851906&j=2c9f582d-e278-56b6-4354-f38a4d851906&t=90509b00-34fa-5a81-35d7-5ed9569d331c
- tweak unity builds to compile `lib/memdebug.c` separately in memory
  trace builds to avoid PP confusion.
- force-disable unity for test programs.
- do not compile and link libcurl sources to libtests _twice_ when libcurl
  is built in static mode.

KNOWN ISSUES:
- running tests with unity builds may fail in cases.
- some build configurations/env may not compile in unity mode. E.g.:
  https://ci.appveyor.com/project/curlorg/curl/builds/47230972/job/51wfesgnfuauwl8q#L250

Ref: https://github.com/libssh2/libssh2/issues/1034
Ref: https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html
Ref: https://en.wikipedia.org/wiki/Unity_build

Closes #11095
2023-06-07 13:06:08 +00:00

392 lines
14 KiB
YAML

#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
# SPDX-License-Identifier: curl
#
###########################################################################
# https://ci.appveyor.com/project/curlorg/curl/history
# Appveyor configuration
# https://www.appveyor.com/docs/appveyor-yml/
version: 7.50.0.{build}
environment:
UNITY: "OFF"
matrix:
# generated CMake-based Visual Studio Release builds
- job_name: "CMake, VS2008, Release x86, Schannel"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 9 2008"
PRJ_CFG: Release
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: OFF
SHARED: ON
DISABLED_TESTS: ""
- job_name: "CMake, VS2022, Release x64, OpenSSL, WebSockets, Unity"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 17 2022"
TARGET: "-A x64"
PRJ_CFG: Release
OPENSSL: ON
SCHANNEL: OFF
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: OFF
SHARED: ON
DISABLED_TESTS: ""
WEBSOCKETS: ON
UNITY: "ON"
- job_name: "CMake, VS2022, Release arm64, Schannel, Static"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 17 2022"
TARGET: "-A ARM64"
PRJ_CFG: Release
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: OFF
SHARED: OFF
DISABLED_TESTS: ""
# generated CMake-based Visual Studio Debug builds
- job_name: "CMake, VS2010, Debug x64, no SSL, Static"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 10 2010 Win64"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: OFF
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "!1139 !1501 ~1056"
ADD_PATH: "C:\\msys64\\usr\\bin"
- job_name: "CMake, VS2022, Debug x64, Schannel, Static, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 17 2022"
TARGET: "-A x64"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: ON
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "~571 !1139 !1501 ~1056"
ADD_PATH: "C:\\msys64\\usr\\bin"
- job_name: "CMake, VS2022, Debug x64, no SSL, Static"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 17 2022"
TARGET: "-A x64"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: OFF
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "~571 !1139 !1501 ~1056"
ADD_PATH: "C:\\msys64\\usr\\bin"
- job_name: "CMake, VS2022, Debug x64, no SSL, Static, HTTP only"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: CMake
PRJ_GEN: "Visual Studio 17 2022"
TARGET: "-A x64"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: OFF
ENABLE_UNICODE: OFF
HTTP_ONLY: ON
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "!1139 !1501 ~1056"
ADD_PATH: "C:\\msys64\\usr\\bin"
# generated CMake-based MSYS Makefiles builds (mingw cross-compiling)
- job_name: "CMake, mingw-w64, Debug x64, Schannel, Static, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: CMake
PRJ_GEN: "MSYS Makefiles"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: ON
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "!1139 !1501 ~1056"
ADD_PATH: "C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;C:\\msys64\\usr\\bin"
MSYS2_ARG_CONV_EXCL: "/*"
BUILD_OPT: -k
- job_name: "CMake, mingw-w64, Debug x64, Schannel, Static, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: CMake
PRJ_GEN: "MSYS Makefiles"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: ON
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "!1139 !1501 ~1056"
ADD_PATH: "C:\\mingw-w64\\x86_64-7.2.0-posix-seh-rt_v5-rev1\\mingw64\\bin;C:\\msys64\\usr\\bin"
MSYS2_ARG_CONV_EXCL: "/*"
BUILD_OPT: -k
- job_name: "CMake, mingw-w64, Debug x64, Schannel, Static, Unity"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: CMake
PRJ_GEN: "MSYS Makefiles"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: OFF
SHARED: OFF
ADD_PATH: "C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;C:\\msys64\\usr\\bin"
MSYS2_ARG_CONV_EXCL: "/*"
BUILD_OPT: -k
UNITY: "ON"
- job_name: "CMake, mingw-w64, Debug x86, Schannel, Static"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: CMake
PRJ_GEN: "MSYS Makefiles"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: ON
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "!1139 !1501 ~1056"
ADD_PATH: "C:\\mingw-w64\\i686-6.3.0-posix-dwarf-rt_v5-rev1\\mingw32\\bin;C:\\msys64\\usr\\bin"
MSYS2_ARG_CONV_EXCL: "/*"
BUILD_OPT: -k
- job_name: "CMake, mingw, Debug x86, no SSL, Static"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: CMake
PRJ_GEN: "MSYS Makefiles"
PRJ_CFG: Debug
OPENSSL: OFF
SCHANNEL: OFF
ENABLE_UNICODE: OFF
HTTP_ONLY: OFF
TESTING: ON
SHARED: OFF
DISABLED_TESTS: "!1139 !1501 ~1056"
ADD_PATH: "C:\\MinGW\\bin;C:\\msys64\\usr\\bin"
MSYS2_ARG_CONV_EXCL: "/*"
BUILD_OPT: -k
# winbuild-based builds
- job_name: "winbuild, VS2015, Debug"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: winbuild_vs2015
DEBUG: yes
PATHPART: debug
TESTING: OFF
ENABLE_UNICODE: no
- job_name: "winbuild, VS2015, Release"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: winbuild_vs2015
DEBUG: no
PATHPART: release
TESTING: OFF
ENABLE_UNICODE: no
- job_name: "winbuild, VS2017, Debug"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: winbuild_vs2017
DEBUG: yes
PATHPART: debug
TESTING: OFF
ENABLE_UNICODE: no
- job_name: "winbuild, VS2017, Release"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: winbuild_vs2017
DEBUG: no
PATHPART: release
TESTING: OFF
ENABLE_UNICODE: no
- job_name: "winbuild, VS2015, Debug, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: winbuild_vs2015
DEBUG: yes
PATHPART: debug
TESTING: OFF
ENABLE_UNICODE: yes
- job_name: "winbuild, VS2015, Release, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2015"
BUILD_SYSTEM: winbuild_vs2015
DEBUG: no
PATHPART: release
TESTING: OFF
ENABLE_UNICODE: yes
- job_name: "winbuild, VS2017, Debug, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: winbuild_vs2017
DEBUG: yes
PATHPART: debug
TESTING: OFF
ENABLE_UNICODE: yes
- job_name: "winbuild, VS2017, Release, Unicode"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: winbuild_vs2017
DEBUG: no
PATHPART: release
TESTING: OFF
ENABLE_UNICODE: yes
# generated VisualStudioSolution-based builds
- job_name: "VisualStudioSolution, VS2017, Debug"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: VisualStudioSolution
PRJ_CFG: "DLL Debug - DLL Windows SSPI - DLL WinIDN"
TESTING: OFF
VC_VERSION: VC14.10
# autotools-based builds (NOT mingw cross-compiling, but msys2 native)
- job_name: "autotools, msys2, Debug, no Proxy, no SSL"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: autotools
TESTING: ON
DISABLED_TESTS: "!19 ~1056 !1233"
ADD_PATH: "C:\\msys64\\usr\\bin"
CONFIG_ARGS: "--enable-debug --enable-werror --disable-threaded-resolver --disable-proxy --without-ssl --enable-websockets"
- job_name: "autotools, msys2, Debug, no SSL"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: autotools
TESTING: ON
DISABLED_TESTS: "!19 !504 !704 !705 ~1056 !1233"
ADD_PATH: "C:\\msys64\\usr\\bin"
CONFIG_ARGS: "--enable-debug --enable-werror --disable-threaded-resolver --without-ssl --enable-websockets"
- job_name: "autotools, msys2, Release, no SSL"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"
BUILD_SYSTEM: autotools
TESTING: ON
DISABLED_TESTS: "!19 !504 !704 !705 ~1056 !1233"
ADD_PATH: "C:\\msys64\\usr\\bin"
CONFIG_ARGS: "--enable-warnings --enable-werror --without-ssl --enable-websockets"
# autotools-based Cygwin build
- job_name: "autotools, cygwin, Debug, no SSL"
APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2022"
BUILD_SYSTEM: autotools
TESTING: ON
DISABLED_TESTS: "~1056"
ADD_PATH: "C:\\cygwin64\\bin"
CONFIG_ARGS: "--enable-debug --enable-werror --disable-threaded-resolver --without-ssl --enable-websockets"
POSIX_PATH_PREFIX: "/cygdrive"
install:
- if not "%ADD_PATH%"=="" (
set "PATH=%ADD_PATH%;%PATH%" )
build_script:
- if %BUILD_SYSTEM%==CMake (
cmake .
-G"%PRJ_GEN%"
%TARGET%
-DCURL_USE_OPENSSL=%OPENSSL%
-DCURL_USE_SCHANNEL=%SCHANNEL%
-DHTTP_ONLY=%HTTP_ONLY%
-DBUILD_SHARED_LIBS=%SHARED%
-DBUILD_TESTING=%TESTING%
-DENABLE_WEBSOCKETS=%WEBSOCKETS%
-DCMAKE_UNITY_BUILD=%UNITY%
-DCURL_WERROR=ON
-DENABLE_DEBUG=ON
-DENABLE_UNICODE=%ENABLE_UNICODE%
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=""
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=""
-DCMAKE_INSTALL_PREFIX="C:/CURL"
-DCMAKE_BUILD_TYPE=%PRJ_CFG% &&
cmake --build . --config %PRJ_CFG% --parallel 2 --clean-first -- %BUILD_OPT%
) else (
if %BUILD_SYSTEM%==VisualStudioSolution (
cd projects &&
.\\generate.bat %VC_VERSION% &&
msbuild.exe /p:Configuration="%PRJ_CFG%" "Windows\\%VC_VERSION%\\curl-all.sln"
) else (
if %BUILD_SYSTEM%==winbuild_vs2015 (
call buildconf.bat &&
cd winbuild &&
call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 &&
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 &&
nmake /f Makefile.vc mode=dll VC=14 "SSL_PATH=C:\OpenSSL-v111-Win64" WITH_SSL=dll MACHINE=x64 DEBUG=%DEBUG% ENABLE_UNICODE=%ENABLE_UNICODE% &&
..\builds\libcurl-vc14-x64-%PATHPART%-dll-ssl-dll-ipv6-sspi\bin\curl.exe -V
) else (
if %BUILD_SYSTEM%==winbuild_vs2017 (
call buildconf.bat &&
cd winbuild &&
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" &&
nmake /f Makefile.vc mode=dll VC=14.10 "SSL_PATH=C:\OpenSSL-v111-Win64" WITH_SSL=dll MACHINE=x64 DEBUG=%DEBUG% ENABLE_UNICODE=%ENABLE_UNICODE% &&
..\builds\libcurl-vc14.10-x64-%PATHPART%-dll-ssl-dll-ipv6-sspi\bin\curl.exe -V
) else (
if %BUILD_SYSTEM%==autotools (
bash.exe -e -l -c "cd %POSIX_PATH_PREFIX%/c/projects/curl && autoreconf -fi && ./configure %CONFIG_ARGS% && make V=1 && make V=1 examples && cd tests && make V=1"
)))))
- if %TESTING%==ON (
if %BUILD_SYSTEM%==CMake (
cmake --build . --config %PRJ_CFG% --parallel 2 --target testdeps
))
test_script:
- if exist C:/msys64/usr/bin/curl.exe (
set ACURL=-ac %POSIX_PATH_PREFIX%/c/msys64/usr/bin/curl.exe )
- if exist C:/Windows/System32/curl.exe (
set ACURL=-ac %POSIX_PATH_PREFIX%/c/Windows/System32/curl.exe )
- if %TESTING%==ON (
if %BUILD_SYSTEM%==CMake (
set TFLAGS=%ACURL% %DISABLED_TESTS% &&
cmake --build . --config %PRJ_CFG% --target test-ci
) else (
if %BUILD_SYSTEM%==autotools (
bash.exe -e -l -c "cd %POSIX_PATH_PREFIX%/c/projects/curl && make V=1 TFLAGS='%ACURL% %DISABLED_TESTS%' test-ci"
) else (
bash.exe -e -l -c "cd %POSIX_PATH_PREFIX%/c/projects/curl/tests && ./runtests.pl -a -p !flaky -r -rm %ACURL% %DISABLED_TESTS%"
))
)
# select branches to avoid testing feature branches twice (as branch and as pull request)
branches:
only:
- master
- /\/ci$/
skip_commits:
files:
- '.azure-pipelines.yml'
- '.circleci/**/*'
- '.cirrus.yml'
- '.github/**/*'
- 'packages/**/*'
- 'plan9/**/*'
artifacts:
- path: '**/curl.exe'
name: curl
- path: '**/*curl*.dll'
name: libcurl dll