feat: Add -fprofile-update support (#1408) #300
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build | |
on: | |
push: | |
pull_request: | |
env: | |
CTEST_OUTPUT_ON_FAILURE: ON | |
VERBOSE: 1 | |
defaults: | |
run: | |
shell: bash | |
permissions: | |
contents: read | |
jobs: | |
build_and_test: | |
timeout-minutes: 30 | |
env: | |
CMAKE_GENERATOR: Ninja | |
name: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.version }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-20.04 | |
compiler: gcc | |
version: "8" | |
- os: ubuntu-20.04 | |
compiler: gcc | |
version: "9" | |
- os: ubuntu-20.04 | |
compiler: gcc | |
version: "10" | |
- os: ubuntu-20.04 | |
compiler: clang | |
version: "9" | |
- os: ubuntu-20.04 | |
compiler: clang | |
version: "10" | |
- os: ubuntu-20.04 | |
compiler: clang | |
version: "11" | |
- os: ubuntu-20.04 | |
compiler: clang | |
version: "12" | |
- os: ubuntu-22.04 | |
compiler: clang | |
version: "13" | |
- os: ubuntu-22.04 | |
compiler: clang | |
version: "14" | |
- os: ubuntu-22.04 | |
compiler: clang | |
version: "15" | |
- os: ubuntu-22.04 | |
compiler: gcc | |
version: "11" | |
- os: ubuntu-22.04 | |
compiler: gcc | |
version: "12" | |
- os: ubuntu-22.04 | |
compiler: gcc | |
version: "13" | |
- os: macOS-11 | |
compiler: xcode | |
version: "11.7" | |
- os: macOS-11 | |
compiler: xcode | |
version: "12.5.1" | |
- os: macOS-12 | |
compiler: xcode | |
version: "13.4.1" | |
- os: macOS-12 | |
compiler: xcode | |
version: "14.2" | |
steps: | |
- name: Install dependencies on Linux | |
if: ${{ runner.os == 'Linux' }} | |
run: | | |
sudo apt-get update | |
packages="elfutils libhiredis-dev libzstd-dev ninja-build pkg-config python3 redis-server redis-tools" | |
# Install ld.gold (binutils) and ld.lld (lld) on different runs. | |
if [ "${{ matrix.os }}" = "ubuntu-22.04" ]; then | |
sudo apt-get install -y $packages binutils | |
else | |
sudo apt-get install -y $packages lld | |
fi | |
if [ "${{ matrix.compiler }}" = "gcc" ]; then | |
echo "CC=gcc-${{ matrix.version }}" >> $GITHUB_ENV | |
echo "CXX=g++-${{ matrix.version }}" >> $GITHUB_ENV | |
sudo apt-get install -y g++-${{ matrix.version }} g++-${{ matrix.version }}-multilib | |
if [ "${{ matrix.version }}" = 8 ]; then | |
# The compilation test in StdFilesystem.cmake doesn't work when | |
# GCC 9 is installed as well, so need to force linking with | |
# libstdc++fs for GCC 8. Note: This requires using -fuse-ld=lld to | |
# work. | |
echo "LDFLAGS=-lstdc++fs" >> $GITHUB_ENV | |
fi | |
else | |
echo "CC=clang-${{ matrix.version }}" >> $GITHUB_ENV | |
echo "CXX=clang++-${{ matrix.version }}" >> $GITHUB_ENV | |
sudo apt-get install -y clang-${{ matrix.version }} g++-multilib lld-${{ matrix.version }} | |
fi | |
- name: Install dependencies on macOS | |
if: ${{ runner.os == 'macOS' }} | |
run: | | |
HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 \ | |
brew install ninja pkg-config hiredis redis | |
if [ "${{ matrix.compiler }}" = "gcc" ]; then | |
brew install gcc@${{ matrix.version }} | |
echo "CC=gcc-${{ matrix.version }}" >> $GITHUB_ENV | |
echo "CXX=g++-${{ matrix.version }}" >> $GITHUB_ENV | |
else | |
sudo xcode-select -switch /Applications/Xcode_${{ matrix.version }}.app | |
echo "CC=clang" >> $GITHUB_ENV | |
echo "CXX=clang++" >> $GITHUB_ENV | |
fi | |
- name: Get source | |
uses: actions/checkout@v4 | |
- name: Build and test | |
run: ci/build | |
env: | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI | |
- name: Collect testdir from failed tests | |
if: failure() | |
run: ci/collect-testdir | |
- name: Upload testdir from failed tests | |
if: failure() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.version }}-testdir.tar.xz | |
path: testdir.tar.xz | |
build_and_test_msys: | |
timeout-minutes: 30 | |
runs-on: windows-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- sys: mingw64 | |
env: x86_64 | |
compiler: gcc | |
- sys: mingw64 | |
env: x86_64 | |
compiler: clang | |
name: 'Windows ${{ matrix.sys }} ${{ matrix.compiler }}' | |
defaults: | |
run: | |
shell: msys2 {0} | |
steps: | |
- name: '${{ matrix.sys }} Setup MSYS2' | |
uses: msys2/setup-msys2@v2 | |
with: | |
msystem: ${{matrix.sys}} | |
update: true | |
install: >- | |
git | |
diffutils | |
tar | |
mingw-w64-${{matrix.env}}-toolchain | |
mingw-w64-${{matrix.env}}-cmake | |
mingw-w64-${{matrix.env}}-ninja | |
mingw-w64-${{matrix.env}}-hiredis | |
mingw-w64-${{matrix.env}}-lld | |
mingw-w64-${{matrix.env}}-${{matrix.compiler}} | |
- name: setup env | |
run: | | |
if [ "${{ matrix.compiler }}" = "gcc" ]; then | |
echo "CC=gcc" >> $GITHUB_ENV | |
echo "CXX=g++" >> $GITHUB_ENV | |
else | |
echo "CC=clang" >> $GITHUB_ENV | |
echo "CXX=clang++" >> $GITHUB_ENV | |
fi | |
- name: Get source | |
uses: actions/checkout@v4 | |
- name: Build and test | |
run: ci/build | |
continue-on-error: ${{ matrix.allow_test_failures == true && | |
steps.build-and-test.outputs.exit_status == 8 }} | |
env: | |
CMAKE_GENERATOR: Ninja | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI | |
TEST_CC: gcc | |
- name: Collect testdir from failed tests | |
if: failure() | |
run: ci/collect-testdir | |
- name: Upload testdir from failed tests | |
if: failure() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.sys}}-${{ matrix.env }}-${{ matrix.compiler }}-testdir.tar.xz | |
path: testdir.tar.xz | |
build_macos_universal: | |
timeout-minutes: 30 | |
name: macOS universal binary | |
runs-on: macos-12 | |
env: | |
CMAKE_GENERATOR: Ninja | |
steps: | |
- name: Get source | |
uses: actions/checkout@v4 | |
- name: Install Dependencies | |
run: | | |
HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 \ | |
brew install ninja | |
- name: Build macOS universal binary | |
run: ci/build-macos-binary | |
- name: Archive universal binary | |
uses: actions/upload-artifact@v4 | |
with: | |
name: macOS-binary | |
path: build_universal/ccache | |
specific_tests: | |
name: ${{ matrix.name }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- name: Linux GCC debug + in source + tracing | |
os: ubuntu-20.04 | |
CC: gcc | |
CXX: g++ | |
BUILDDIR: . | |
CCACHE_LOC: . | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=Debug -DENABLE_TRACING=1 | |
apt_get: elfutils libzstd-dev pkg-config libhiredis-dev | |
- name: Linux GCC 32-bit | |
os: ubuntu-20.04 | |
CC: gcc | |
CXX: g++ | |
CFLAGS: -m32 -g -O2 | |
CXXFLAGS: -m32 -g -O2 | |
LDFLAGS: -m32 | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
apt_get: elfutils gcc-multilib g++-multilib lib32stdc++-10-dev | |
- name: Linux GCC CUDA | |
os: ubuntu-20.04 | |
CC: gcc | |
CXX: g++ | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
CUDA: 11.7.0-1 | |
apt_get: elfutils libzstd-dev | |
- name: Linux MinGW 32-bit | |
os: ubuntu-20.04 | |
CC: i686-w64-mingw32-gcc-posix | |
CXX: i686-w64-mingw32-g++-posix | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DCMAKE_SYSTEM_NAME=Windows -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
RUN_TESTS: none | |
apt_get: elfutils mingw-w64 | |
- name: Linux MinGW 64-bit | |
os: ubuntu-20.04 | |
CC: x86_64-w64-mingw32-gcc-posix | |
CXX: x86_64-w64-mingw32-g++-posix | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DCMAKE_SYSTEM_NAME=Windows -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
RUN_TESTS: unittest-in-wine | |
apt_get: elfutils mingw-w64 wine | |
- name: Windows VS2019 32-bit Ninja | |
os: windows-2019 | |
msvc_arch: x64_x86 | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Ninja | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
TEST_CC: clang -target i686-pc-windows-msvc | |
- name: Windows VS2019 32-bit MSBuild | |
os: windows-2019 | |
msvc_arch: x64_x86 | |
allow_test_failures: true # For now, don't fail the build on failure | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Visual Studio 16 2019 | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON -A Win32 | |
TEST_CC: clang -target i686-pc-windows-msvc | |
- name: Windows VS2019 64-bit Ninja | |
os: windows-2019 | |
msvc_arch: x64 | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Ninja | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
TEST_CC: clang -target x86_64-pc-windows-msvc | |
- name: Windows VS2019 64-bit MSBuild | |
os: windows-2019 | |
msvc_arch: x64 | |
allow_test_failures: true # For now, don't fail the build on failure | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Visual Studio 16 2019 | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON -A x64 | |
TEST_CC: clang -target x86_64-pc-windows-msvc | |
- name: Windows VS2022 32-bit Ninja | |
os: windows-2022 | |
msvc_arch: x64_x86 | |
allow_test_failures: true # For now, don't fail the build on failure | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Ninja | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
TEST_CC: clang -target i686-pc-windows-msvc | |
- name: Windows VS2022 32-bit MSBuild | |
os: windows-2022 | |
msvc_arch: x64_x86 | |
allow_test_failures: true # For now, don't fail the build on failure | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Visual Studio 17 2022 | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON -A Win32 | |
TEST_CC: clang -target i686-pc-windows-msvc | |
- name: Windows VS2022 64-bit Ninja | |
os: windows-2022 | |
msvc_arch: x64 | |
allow_test_failures: true # For now, don't fail the build on failure | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Ninja | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON | |
TEST_CC: clang -target x86_64-pc-windows-msvc | |
- name: Windows VS2022 64-bit MSBuild | |
os: windows-2022 | |
msvc_arch: x64 | |
allow_test_failures: true # For now, don't fail the build on failure | |
CC: cl | |
CXX: cl | |
CMAKE_GENERATOR: Visual Studio 17 2022 | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DZSTD_FROM_INTERNET=ON -DHIREDIS_FROM_INTERNET=ON -A x64 | |
TEST_CC: clang -target x86_64-pc-windows-msvc | |
- name: Clang address & UB sanitizer | |
os: ubuntu-20.04 | |
CC: clang | |
CXX: clang++ | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=CI -DENABLE_SANITIZER_ADDRESS=ON -DENABLE_SANITIZER_UNDEFINED_BEHAVIOR=ON | |
ASAN_OPTIONS: detect_leaks=0 | |
apt_get: elfutils libzstd-dev pkg-config libhiredis-dev | |
- name: Clang static analyzer | |
os: ubuntu-20.04 | |
CC: clang | |
CXX: clang++ | |
CMAKE_PREFIX: scan-build | |
RUN_TESTS: none | |
apt_get: libzstd-dev pkg-config libhiredis-dev | |
- name: Linux binary | |
os: ubuntu-20.04 | |
CC: gcc | |
CXX: g++ | |
SPECIAL: build-and-verify-package | |
CMAKE_PARAMS: -DCMAKE_BUILD_TYPE=Release | |
apt_get: elfutils libzstd-dev pkg-config libhiredis-dev ninja-build | |
- name: Source package | |
os: ubuntu-20.04 | |
CC: gcc | |
CXX: g++ | |
SPECIAL: build-and-verify-source-package | |
apt_get: elfutils libzstd-dev pkg-config libhiredis-dev ninja-build asciidoctor | |
- name: HTML documentation | |
os: ubuntu-20.04 | |
EXTRA_CMAKE_BUILD_FLAGS: --target doc-html | |
RUN_TESTS: none | |
apt_get: libzstd-dev pkg-config libhiredis-dev asciidoctor | |
- name: Manual page | |
os: ubuntu-20.04 | |
EXTRA_CMAKE_BUILD_FLAGS: --target doc-man-page | |
RUN_TESTS: none | |
apt_get: libzstd-dev pkg-config libhiredis-dev asciidoctor | |
- name: Clang-Tidy | |
os: ubuntu-20.04 | |
CC: clang-12 | |
CXX: clang++-12 | |
RUN_TESTS: none | |
CMAKE_PARAMS: -DENABLE_CLANG_TIDY=ON -DCLANGTIDY=/usr/bin/clang-tidy-12 | |
apt_get: libzstd-dev pkg-config libhiredis-dev clang-12 clang-tidy-12 | |
steps: | |
- name: Get source | |
uses: actions/checkout@v4 | |
- name: Install CUDA | |
if: matrix.CUDA != '' | |
run: sudo --preserve-env=CUDA,GITHUB_PATH ci/install-cuda | |
env: | |
CUDA: ${{ matrix.CUDA }} | |
- name: Run apt-get | |
if: matrix.apt_get != '' | |
run: sudo apt-get update && sudo apt-get install ${{ matrix.apt_get }} | |
- name: Prepare Windows environment (Visual Studio) | |
if: runner.os == 'Windows' | |
uses: ilammy/[email protected] | |
with: | |
arch: ${{ matrix.msvc_arch }} | |
- name: Prepare Windows environment (Clang) | |
if: runner.os == 'Windows' | |
shell: powershell | |
run: | | |
$ErrorActionPreference = 'Stop' | |
# The test suite currently requires that the compiler specified by the | |
# "CC" environment variable is on a path without spaces. Provide that | |
# by creating a junction from ~/opt/llvm to the Visual Studio path. | |
$null = New-Item ` | |
-Path "${HOME}\opt\llvm" ` | |
-ItemType Junction ` | |
-Target "${env:VCINSTALLDIR}\Tools\Llvm\x64" ` | |
-Force | |
"Path=${HOME}\opt\llvm\bin;${env:Path}" | ` | |
Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
- name: Build and test | |
id: build-and-test | |
env: | |
ASAN_OPTIONS: ${{ matrix.ASAN_OPTIONS }} | |
BUILDDIR: ${{ matrix.BUILDDIR }} | |
CC: ${{ matrix.CC }} | |
CCACHE_LOC: ${{ matrix.CCACHE_LOC }} | |
CFLAGS: ${{ matrix.CFLAGS }} | |
CMAKE_GENERATOR: ${{ matrix.CMAKE_GENERATOR }} | |
CMAKE_PARAMS: ${{ matrix.CMAKE_PARAMS }} | |
CXX: ${{ matrix.CXX }} | |
CXXFLAGS: ${{ matrix.CXXFLAGS }} | |
EXTRA_CMAKE_BUILD_FLAGS: ${{ matrix.EXTRA_CMAKE_BUILD_FLAGS }} | |
LDFLAGS: ${{ matrix.LDFLAGS }} | |
RUN_TESTS: ${{ matrix.RUN_TESTS }} | |
SPECIAL: ${{ matrix.SPECIAL }} | |
TEST_CC: ${{ matrix.TEST_CC }} | |
run: | | |
rc=0 | |
ci/build || rc=$? | |
echo "exit_status=$rc" >> $GITHUB_OUTPUT | |
exit $rc | |
# CTest exits with return code 8 on test failure. | |
continue-on-error: ${{ matrix.allow_test_failures == true && | |
steps.build-and-test.outputs.exit_status == 8 }} | |
- name: Collect testdir from failed tests | |
if: failure() || steps.build-and-test.outcome == 'failure' | |
run: ci/collect-testdir | |
# TODO: in case of build-and-verify-*package the BUILDDIR is set within those scripts. | |
- name: Upload testdir from failed tests | |
if: failure() || steps.build-and-test.outcome == 'failure' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.name }} - testdir.tar.xz | |
path: testdir.tar.xz | |
check_format: | |
timeout-minutes: 30 | |
name: Code formatting | |
runs-on: ubuntu-20.04 | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Get source | |
uses: actions/checkout@v4 | |
- name: Run Clang-Format in check mode | |
run: misc/format-files --all --check | |
spelling: | |
timeout-minutes: 30 | |
name: Spelling | |
runs-on: ubuntu-22.04 | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Get source | |
uses: actions/checkout@v4 | |
- name: Install spell checkers | |
run: | | |
sudo apt-get update | |
sudo apt-get install python3-pip | |
pip3 install codespell==2.2.6 typos==1.16.26 | |
- name: Run codespell | |
run: codespell -q 7 -S ".git,build*,./misc/typos.toml,./src/third_party/*" -I misc/codespell-allowlist.txt | |
- name: Run typos | |
run: typos -c misc/typos.toml |