Implement the "unity" builds as known from CMake, but for autotools. It's limited to `lib` and `src` (CMake also supports it in `tests`). Enable with: `--enable-unity` (disabled by default) Unity builds speed up builds significantly. Cygwin and Windows builds in particular, but the effect is noticeable on most systems. It also allows discovering unity issues with autotools, benefitting also CMake when building the same combination. In CI it makes turnaround times quicker. This closes build performance with CMake. autotools still lags behind because it builds shared and static libcurl in two, separate passes. CMake does it in one. Manpage compilation isn't batched, it is in CMake. After unity and test bundle support the slowest parts of the build are the configuration phase (which is effectively a tedious, non-parallel, compilation and/or linking of 300+ tiny programs. The next bottleneck is compiling individual examples and finally test servers (only slow with autotools). The autotools implementation is slightly less efficient than CMake, because 3 sources are permanently excluded while in CMake this isn't necessary and solved more efficiently while building libtests. There is also no 'unity' support for tests, making them a less efficient also. Enable it in CI for most `configure` jobs. Except in GHA/dist (though it works fine there too), to use the default config there. Also skip for the Linux AWC-LC job where it made builds time a few seconds longer (reason undiscovered.) Autotools test suite builds compared between master -> `--enable-unity`: - GHA/Linux: 32s -> 12s https://github.com/curl/curl/actions/runs/10705668823/job/29681617374 https://github.com/curl/curl/actions/runs/10742978889/job/29796766297 - GHA/macOS: 37s -> 10s https://github.com/curl/curl/actions/runs/10705668813/job/29681632885 https://github.com/curl/curl/actions/runs/10742978699/job/29796768875 - GHA/FreeBSD: 15m25 -> 10m58 (full workflow time, ~qemu) https://github.com/curl/curl/actions/runs/10705668811/job/29681607915 https://github.com/curl/curl/actions/runs/10742978937/job/29796766115 - GHA/Cygwin: 3m32 -> 1m21 https://github.com/curl/curl/actions/runs/10705668809/job/29681609965 https://github.com/curl/curl/actions/runs/10742978645/job/29796756933 - GHA/MSYS2: 2m42 -> 50s https://github.com/curl/curl/actions/runs/10705668808/job/29681621166 https://github.com/curl/curl/actions/runs/10742978662/job/29799739289 - GHA/mingw-w64: 5m32 -> 1m23 https://github.com/curl/curl/actions/runs/10705668808/job/29681628787 https://github.com/curl/curl/actions/runs/10742978662/job/29799741568 Closes #14815
130 lines
4.5 KiB
YAML
130 lines
4.5 KiB
YAML
# Copyright (C) Daniel Fandrich, <dan@coneharvesters.com>, et al.
|
|
#
|
|
# SPDX-License-Identifier: curl
|
|
#
|
|
# Compile on an old version of Linux that has barely the minimal build
|
|
# requirements for CMake. This tests that curl is still usable on really
|
|
# outdated systems.
|
|
#
|
|
# Debian stretch is chosen as it closely matches some of the oldest major
|
|
# versions we support (especially cmake); see docs/INTERNALS.md and it
|
|
# is still supported (as of this writing).
|
|
# stretch has ELTS support from Freexian until 2027-06-30
|
|
# For ELTS info see https://www.freexian.com/lts/extended/docs/how-to-use-extended-lts/
|
|
# The Debian key will expire 2025-05-20, after which package signature
|
|
# verification may need to be disabled.
|
|
# httrack is one of the smallest downloaders, needed to bootstrap ELTS,
|
|
# and won't conflict with the curl we're building.
|
|
|
|
name: Old Linux
|
|
|
|
'on':
|
|
push:
|
|
branches:
|
|
- master
|
|
- '*/ci'
|
|
paths-ignore:
|
|
- '**/*.md'
|
|
- '.circleci/**'
|
|
- 'appveyor.*'
|
|
- 'packages/**'
|
|
- 'plan9/**'
|
|
- 'projects/**'
|
|
- 'winbuild/**'
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
paths-ignore:
|
|
- '**/*.md'
|
|
- '.circleci/**'
|
|
- 'appveyor.*'
|
|
- 'packages/**'
|
|
- 'plan9/**'
|
|
- 'projects/**'
|
|
- 'winbuild/**'
|
|
|
|
permissions: {}
|
|
|
|
env:
|
|
MAKEFLAGS: -j 5
|
|
DEBIAN_FRONTEND: noninteractive
|
|
|
|
jobs:
|
|
cmake:
|
|
name: linux (cmake & autoconf)
|
|
runs-on: 'ubuntu-latest'
|
|
container: 'debian:stretch'
|
|
|
|
steps:
|
|
- name: 'install prereqs'
|
|
# Remember, this shell is dash, not bash
|
|
run: |
|
|
sed -E -i -e s@[a-z]+\.debian\.org/@archive.debian.org/debian-archive/@ -e '/ stretch-updates /d' /etc/apt/sources.list
|
|
apt-get update
|
|
# See comment above if this fails after 2025-05-20
|
|
apt-get install -y --no-install-suggests --no-install-recommends httrack
|
|
httrack --get https://deb.freexian.com/extended-lts/pool/main/f/freexian-archive-keyring/freexian-archive-keyring_2022.06.08_all.deb
|
|
dpkg -i freexian-archive-keyring_2022.06.08_all.deb
|
|
echo 'deb http://deb.freexian.com/extended-lts stretch-lts main contrib non-free' | tee /etc/apt/sources.list.d/extended-lts.list
|
|
apt-get update
|
|
apt-get install -y --no-install-suggests --no-install-recommends cmake make automake autoconf libtool gcc pkg-config libpsl-dev libzstd-dev zlib1g-dev libssl1.0-dev libssh-dev libssh2-1-dev libc-ares-dev heimdal-dev libldap2-dev stunnel4 groff
|
|
# GitHub's actions/checkout needs a newer glibc. This one is the
|
|
# latest available for buster, the next stable release after stretch.
|
|
httrack --get https://security.debian.org/debian-security/pool/updates/main/g/glibc/libc6_2.28-10+deb10u4_amd64.deb
|
|
dpkg -i libc6_*_amd64.deb
|
|
|
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
|
|
|
|
- name: 'cmake build-only (out-of-tree, libssh2)'
|
|
run: |
|
|
mkdir bld-1
|
|
cd bld-1
|
|
cmake .. -DCMAKE_UNITY_BUILD=ON -DCURL_WERROR=ON -DBUILD_SHARED_LIBS=ON \
|
|
-DENABLE_ARES=OFF -DCURL_ZSTD=OFF -DCURL_USE_GSSAPI=OFF -DCURL_USE_LIBSSH2=ON -DCURL_USE_LIBSSH=OFF
|
|
make install
|
|
src/curl --disable --version
|
|
|
|
- name: 'cmake generate (out-of-tree, c-ares, libssh, zstd, gssapi)'
|
|
run: |
|
|
mkdir bld-cares
|
|
cd bld-cares
|
|
cmake .. -DCMAKE_UNITY_BUILD=ON -DCURL_WERROR=ON -DBUILD_SHARED_LIBS=ON \
|
|
-DENABLE_ARES=ON -DCURL_ZSTD=ON -DCURL_USE_GSSAPI=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON \
|
|
-DCURL_LIBCURL_VERSIONED_SYMBOLS=ON
|
|
|
|
- name: 'cmake build'
|
|
run: |
|
|
make -C bld-cares
|
|
bld-cares/src/curl --disable --version
|
|
|
|
- name: 'cmake install'
|
|
run: make -C bld-cares install
|
|
|
|
- name: 'cmake build tests'
|
|
run: make -C bld-cares testdeps
|
|
|
|
- name: 'cmake run tests'
|
|
run: make -C bld-cares test-ci
|
|
|
|
- name: 'autoreconf'
|
|
run: autoreconf -if
|
|
|
|
- name: 'configure (out-of-tree, libssh2)'
|
|
run: |
|
|
mkdir bld-am
|
|
cd bld-am
|
|
../configure --disable-dependency-tracking --enable-unity --enable-warnings --enable-werror \
|
|
--with-openssl --enable-ares --with-libssh --with-zstd --with-gssapi \
|
|
--prefix="$PWD"/../install-am
|
|
|
|
- name: 'autoconf build'
|
|
run: |
|
|
make -C bld-am
|
|
bld-am/src/curl --disable --version
|
|
|
|
- name: 'autoconf install'
|
|
run: make -C bld-am install
|
|
|
|
- name: 'autoconf build tests'
|
|
run: make -C bld-am/tests all
|