mirror of
https://github.com/curl/curl.git
synced 2026-01-26 06:57:57 +00:00
To enable known linker options dropping unused, dead, code and data from the executables built. Useful to reduce binary sizes for curl, libcurl shared lib and apps linking static libcurl. It's effective on both "unity" and non-unity builds. Aligning "unity" build sizes with default, non-unity ones. Supported platforms: Apple, MSVC, llvm/clang and GCC on all tested platforms: Linux, BSDs, Windows, MSYS2/Cygwin, Android, MS-DOS. Notes: - Static libraries grow 20-30% with non-Apple toolchains. This effect is controlled by separate, optional compiler flags on non-Apple. This patch enables them automatically for public binaries (libcurl and curl tool), and leaves them off for internal/test ones. - MSVC enables this option by default for 'Release' configurations. The curl build option has no effect on it. - Observed effect on VS2010 is negligible. VS2012+ is recommended. - Works with LTO, Fil-C. - No observed/conclusive effect on build speed. - On Windows with clang/gcc (mingw-w64/MSYS2/Cygwin) it also enables `-fno-asynchronous-unwind-tables` as a workaround to make the toolchain options actually work. Ref: https://sourceware.org/bugzilla/show_bug.cgi?id=11539 Thanks-to: Andarwinux Also: - GHA: enable in Linux and MinGW jobs to test it. Size changes: - linux aws-lc H3: curl: 2000000 -> 1937152, libcurl.a: 2065724 -> 2716532 bytes - macos clang HTTP-only: curl: 1364376 -> 128799 bytes, libcurl.a: unchanged - macos llvm MultiSSL: curl: 410056 -> 405720, libcurl.dylib: 1350336 -> 1348480 bytes - mingw schannel c-ares U: curl: 1588736 -> 1507328, libcurl-d.a: 3322040 -> 3884746 bytes bld: 34 -> 35MB - GHA: enable in MSVC and Apple jobs to reduce disk footprint, with no obvious downside. Size changes: - AppVeyor CI VS2019: curl: 2339840 -> 1295872, libcurl-d.dll: 3155968 -> 1900544 bytes bld: 161 -> 97MB - AppVeyor CI VS2022 clang-cl: curl: 2933248 -> 2332160, libcurl-d.lib: 4762688 -> 5511330 bytes bld: 133 -> 121MB - AppVeyor CI VS2022 HTTP-only: curl: 3514368 -> 2177024, libcurl-d.lib: 2538420 -> 3151740 bytes bld: 137 -> 83MB - GHA intel: curl: 2629120 -> 2023424, libcurl-d.lib: 4366652 -> 5350670 bytes bld: 86 -> 69MB - GHA arm64: curl: 2832896 -> 2063872, libcurl-d.lib: 4690616 -> 5597250 bytes bld: 82 -> 66MB Refs: https://maskray.me/blog/2021-02-28-linker-garbage-collection https://web.archive.org/web/20110811230637/msdn.microsoft.com/en-us/library/bxwfs976.aspx (VS2010) https://learn.microsoft.com/cpp/build/reference/opt-optimizations https://learn.microsoft.com/cpp/build/reference/gy-enable-function-level-linking Closes #20357
144 lines
5.6 KiB
Bash
144 lines
5.6 KiB
Bash
#!/usr/bin/env bash
|
|
#***************************************************************************
|
|
# _ _ ____ _
|
|
# 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
|
|
#
|
|
###########################################################################
|
|
|
|
# shellcheck disable=SC3040,SC2039
|
|
set -eux; [ -n "${BASH:-}${ZSH_NAME:-}" ] && set -o pipefail
|
|
|
|
# build
|
|
|
|
if [ -n "${CMAKE_GENERATOR:-}" ]; then
|
|
|
|
PRJ_CFG='Debug'
|
|
[[ "${APPVEYOR_JOB_NAME}" = *'Release'* ]] && PRJ_CFG='Release'
|
|
|
|
# Configure OpenSSL
|
|
case "${CMAKE_GENERATE:-}" in
|
|
*Win32*) openssl_suffix='-Win32';;
|
|
*) openssl_suffix='-Win64';;
|
|
esac
|
|
|
|
if [ "${APPVEYOR_BUILD_WORKER_IMAGE}" = 'Visual Studio 2022' ]; then
|
|
openssl_root_win="C:/OpenSSL-v35${openssl_suffix}"
|
|
openssl_root="$(cygpath "${openssl_root_win}")"
|
|
elif [ "${APPVEYOR_BUILD_WORKER_IMAGE}" = 'Visual Studio 2019' ]; then
|
|
openssl_root_win="C:/OpenSSL-v30${openssl_suffix}"
|
|
openssl_root="$(cygpath "${openssl_root_win}")"
|
|
fi
|
|
|
|
# Install custom cmake version
|
|
if [ -n "${CMAKE_VERSION:-}" ]; then
|
|
cmake_ver=$(printf '%02d%02d' \
|
|
"$(echo "${CMAKE_VERSION}" | cut -f1 -d.)" \
|
|
"$(echo "${CMAKE_VERSION}" | cut -f2 -d.)")
|
|
if [ "${cmake_ver}" -ge '0320' ]; then
|
|
fn="cmake-${CMAKE_VERSION}-windows-x86_64"
|
|
else
|
|
fn="cmake-${CMAKE_VERSION}-win64-x64"
|
|
fi
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \
|
|
--location "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${fn}.zip" --output bin.zip
|
|
7z x -y bin.zip >/dev/null
|
|
rm -f bin.zip
|
|
PATH="$PWD/${fn}/bin:$PATH"
|
|
fi
|
|
|
|
# Set env CHKPREFILL to the value '_chkprefill' to compare feature detection
|
|
# results with and without the pre-fill feature. They have to match.
|
|
for _chkprefill in '' ${CHKPREFILL:-}; do
|
|
options=''
|
|
[ "${_chkprefill}" = '_chkprefill' ] && options+=' -D_CURL_PREFILL=OFF'
|
|
[[ "${CMAKE_GENERATE:-}" = *'-A ARM64'* ]] && SKIP_RUN='ARM64 architecture'
|
|
[[ "${CMAKE_GENERATE:-}" = *'-DCURL_USE_OPENSSL=ON'* ]] && options+=" -DOPENSSL_ROOT_DIR=${openssl_root_win}"
|
|
if [ "${APPVEYOR_BUILD_WORKER_IMAGE}" = 'Visual Studio 2013' ]; then
|
|
mkdir "_bld${_chkprefill}"
|
|
cd "_bld${_chkprefill}"
|
|
options+=' ..'
|
|
root='..'
|
|
else
|
|
options+=" -B _bld${_chkprefill}"
|
|
options+=' -DCMAKE_VS_GLOBALS=TrackFileAccess=false'
|
|
options+=' -DCMAKE_UNITY_BUILD=ON'
|
|
root='.'
|
|
fi
|
|
# CMAKE_GENERATOR env requires CMake 3.15+, pass it manually to make it work with older versions.
|
|
# shellcheck disable=SC2086
|
|
time cmake -G "${CMAKE_GENERATOR}" \
|
|
-DENABLE_DEBUG=ON -DCURL_WERROR=ON \
|
|
-DCURL_STATIC_CRT=ON \
|
|
-DCURL_DROP_UNUSED=ON \
|
|
-DCURL_USE_SCHANNEL=ON -DCURL_USE_LIBPSL=OFF \
|
|
${CMAKE_GENERATE:-} \
|
|
${options} \
|
|
|| { cat "${root}"/_bld/CMakeFiles/CMake* 2>/dev/null; false; }
|
|
[ "${APPVEYOR_BUILD_WORKER_IMAGE}" = 'Visual Studio 2013' ] && cd ..
|
|
done
|
|
if [ -d _bld_chkprefill ] && ! diff -u _bld/lib/curl_config.h _bld_chkprefill/lib/curl_config.h; then
|
|
cat _bld_chkprefill/CMakeFiles/CMake* 2>/dev/null || true
|
|
false
|
|
fi
|
|
echo 'curl_config.h'; grep -F '#define' _bld/lib/curl_config.h | sort || true
|
|
time cmake --build _bld --config "${PRJ_CFG}" --parallel 2
|
|
[[ "${CMAKE_GENERATE:-}" != *'-DBUILD_SHARED_LIBS=OFF'* ]] && PATH="$PWD/_bld/lib/${PRJ_CFG}:$PATH"
|
|
[[ "${CMAKE_GENERATE:-}" = *'-DCURL_USE_OPENSSL=ON'* ]] && { PATH="${openssl_root}:$PATH"; cp "${openssl_root}"/*.dll "_bld/src/${PRJ_CFG}"; }
|
|
curl="_bld/src/${PRJ_CFG}/curl.exe"
|
|
else
|
|
(
|
|
cd projects/Windows
|
|
./generate.bat "${VC_VERSION}"
|
|
msbuild.exe -maxcpucount "-property:Configuration=${PRJ_CFG}" "-property:Platform=${PLAT}" "${VC_VERSION}/curl-all.sln"
|
|
)
|
|
[ "${PLAT}" = 'x64' ] && platdir='Win64' || platdir='Win32'
|
|
[[ "${PRJ_CFG}" = *'Debug'* ]] && binsuffix='d' || binsuffix=''
|
|
curl="build/${platdir}/${VC_VERSION}/${PRJ_CFG}/curl${binsuffix}.exe"
|
|
fi
|
|
|
|
find . \( -name '*.exe' -o -name '*.dll' -o -name '*.lib' -o -name '*.pdb' \) -print0 | grep -z curl | xargs -0 file --
|
|
find . \( -name '*.exe' -o -name '*.dll' -o -name '*.lib' -o -name '*.pdb' \) -print0 | grep -z curl | xargs -0 stat -c '%10s bytes: %n' --
|
|
|
|
if [ -z "${SKIP_RUN:-}" ]; then
|
|
"${curl}" --disable --version
|
|
else
|
|
echo "Skip running curl.exe. Reason: ${SKIP_RUN}"
|
|
fi
|
|
|
|
# build tests
|
|
|
|
if [ -n "${CMAKE_GENERATOR:-}" ] && [[ "${APPVEYOR_JOB_NAME}" = *'Build-tests'* ]]; then
|
|
time cmake --build _bld --config "${PRJ_CFG}" --parallel 2 --target testdeps
|
|
fi
|
|
|
|
# build examples
|
|
|
|
if [ -n "${CMAKE_GENERATOR:-}" ] && [[ "${APPVEYOR_JOB_NAME}" = *'examples'* ]]; then
|
|
time cmake --build _bld --config "${PRJ_CFG}" --parallel 2 --target curl-examples-build
|
|
fi
|
|
|
|
# disk space used
|
|
|
|
du -sh .; echo; du -sh -t 250KB ./*
|
|
if [ -n "${CMAKE_GENERATOR:-}" ]; then
|
|
echo; du -h -t 250KB _bld
|
|
fi
|