Enable CCache to make CI builds run more quickly. (#1328)

* Enable CCache to make CI builds run more quickly.

* Ensure Hamlib is also part of ccache.

* Try creating symlink.

* Increase ccache max size limit.

* Add ccache for Windows builds.

* Add cache for lint as well.

* Make sure PGO is covered by ccache.

* Dummy change to make sure build is cached.

* macOS: Ensure node 24 is used for ccache

* Windows: use node 24.

* Increase max cache size on macOS to 5G.

* Add Windows debugging for ccache.

* Use CMake compiler launcher to launch ccache.

* Use symlinks for PGO builds.

* Don't cache PGO use steps, we can't afford to with only 10GB available.

* Fix issue causing cache misses.

* Forgot that we need to use single quotes.

* Revert previous whitespace change.

* Enable ccache for Linux builds.

* Fix shell command error.

* Add PR #1328 to changelog.
ms-zero-audio-startup
Mooneer Salem 2026-08-12 17:43:22 -07:00 committed by GitHub
parent c3102f4ac5
commit 52f1b5daf9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 92 additions and 31 deletions

View File

@ -26,6 +26,12 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
with:
key: ${{ github.job }}
max-size: "5G"
- name: Install required packages
shell: bash
run: |
@ -47,7 +53,7 @@ jobs:
run: |
mkdir build_linux
cd build_linux
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ..
# Build so we have all required .h and .c/.cpp files
make -j$(nproc)
@ -75,6 +81,20 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
if: ${{ matrix.os == 'ubuntu-22.04-arm' }}
with:
key: ${{ github.job }}-aarch64
max-size: "5G"
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
if: ${{ matrix.os == 'ubuntu-22.04' }}
with:
key: ${{ github.job }}-x86_64
max-size: "5G"
- name: Install LLVM/Clang >=20.0
run: |
set -euxo pipefail
@ -144,7 +164,7 @@ jobs:
working-directory: ${{github.workspace}}
run: |
. ./rade-venv/bin/activate
BUILD_TYPE=Release CC=clang-21 CXX=clang++-21 PGO_INSTRUMENT=1 ENABLE_LTO=1 STATIC_LIBGCC=1 ./build_linux.sh
BUILD_TYPE=Release CC=clang-21 CXX=clang++-21 USE_CCACHE=1 PGO_INSTRUMENT=1 ENABLE_LTO=1 STATIC_LIBGCC=1 ./build_linux.sh
- name: Generate optimization profile
shell: bash
@ -457,6 +477,12 @@ jobs:
# with:
# detached: true
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
with:
key: ${{ github.job }}-${{ matrix.os }}-${{ matrix.sanitizer }}-${{ matrix.native-audio }}
max-size: "5G"
- name: Install LLVM/Clang >=20.0
if: ${{ matrix.os == 'ubuntu-24.04' || matrix.os == 'ubuntu-24.04-arm' }}
run: |
@ -552,7 +578,7 @@ jobs:
if: ${{ matrix.sanitizer != 'WITH_ASAN=0' }}
run: |
. ./rade-venv/bin/activate
UT_ENABLE=1 CC=clang-21 CXX=clang++-21 ${{matrix.native-audio}} ${{matrix.sanitizer}} ./build_linux.sh
UT_ENABLE=1 CC=clang-21 CXX=clang++-21 USE_CCACHE=1 ${{matrix.native-audio}} ${{matrix.sanitizer}} ./build_linux.sh
- name: Build freedv-gui
shell: bash
@ -560,7 +586,7 @@ jobs:
if: ${{ matrix.sanitizer == 'WITH_ASAN=0' }}
run: |
. ./rade-venv/bin/activate
UT_ENABLE=1 CC=clang-21 CXX=clang++-21 ${{matrix.native-audio}} ${{matrix.sanitizer}} ./build_linux.sh
UT_ENABLE=1 CC=clang-21 CXX=clang++-21 USE_CCACHE=1 ${{matrix.native-audio}} ${{matrix.sanitizer}} ./build_linux.sh
- name: Execute unit tests
shell: bash

View File

@ -20,6 +20,12 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
with:
key: ${{ github.job }}
max-size: "5G"
- name: Install needed packages
run: |
brew install automake libtool numpy sox wxwidgets speexdsp portaudio libsndfile hamlib libebur128
@ -42,7 +48,7 @@ jobs:
run: |
mkdir build_osx
cd build_osx
CC=clang CXX=clang++ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
CC=clang CXX=clang++ cmake -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
# Build so we have all required .h and .c/.cpp files
make -j$(sysctl -n hw.logicalcpu)
@ -64,6 +70,13 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
with:
key: ${{ github.job }}-${{ matrix.os }}-${{ matrix.sanitizer }}
create-symlink: true
max-size: "5G"
#- name: Setup tmate session
# uses: mxschmitt/action-tmate@v3
# with:
@ -145,6 +158,25 @@ jobs:
# with:
# detached: true
# There's a bug where macos-26 ends up downloading macos-26-intel's cache and thus
# having few/no cache hits. To prevent this, we make sure that the cache key is unique
# enough on both platforms to avoid inadvertent matches.
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
if: ${{ matrix.os == 'macos-26-intel' }}
with:
key: ${{ github.job }}-x86_64
max-size: "5G"
create-symlink: true
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
if: ${{ matrix.os == 'macos-26' }}
with:
key: ${{ github.job }}-aarch64
max-size: "5G"
create-symlink: true
- name: Install needed packages
run: |
brew install automake libtool numpy sox llvm@20 lld@20 # note: LLVM 21 introduces incompatibilities - see https://github.com/Homebrew/homebrew-core/issues/235411
@ -174,7 +206,7 @@ jobs:
shell: bash
working-directory: ${{github.workspace}}
run: |
BUILD_TYPE=Release UT_ENABLE=0 UNIV_BUILD=0 BUILD_DEPS=1 PGO_INSTRUMENT=1 ENABLE_LTO=1 ./build_osx.sh
BUILD_TYPE=Release UT_ENABLE=0 UNIV_BUILD=0 BUILD_DEPS=1 PGO_INSTRUMENT=1 ENABLE_LTO=1 USE_CCACHE=1 ./build_osx.sh
- name: Generate optimization profile
shell: bash

View File

@ -28,6 +28,13 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2.23
with:
key: ${{ github.job }}-${{ matrix.arch }}
max-size: "5G"
verbose: 2
- name: Install required packages
shell: bash
working-directory: ${{github.workspace}}
@ -49,7 +56,7 @@ jobs:
export PATH=${{github.workspace}}/llvm-mingw-20251216-ucrt-ubuntu-22.04-x86_64/bin:$PATH
mkdir build_windows
cd build_windows
cmake -DENABLE_LTO=1 -DPGO_INSTRUMENT=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/cross-compile/freedv-mingw-llvm-${{ matrix.arch }}.cmake ..
cmake -DENABLE_LTO=1 -DPGO_INSTRUMENT=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/cross-compile/freedv-mingw-llvm-${{ matrix.arch }}.cmake ..
- name: Build freedv-gui (unsigned)
shell: bash

View File

@ -992,6 +992,7 @@ LDPC | Low Density Parity Check Codes - a family of powerful FEC codes
* Require C++20 to build FreeDV. (PR #1440)
* Enable LTO/PGO for macOS .app build. (PR #1456)
* Enable PGO for Windows builds. (PR #1457)
* Add support for CCache. (PR #1328)
4. Other:
* FlexRadio/KA9Q integrations moved to freedv-integrations repo. (PR #1368)
* Improve tab save/load behavior on systems with wxWidgets 3.3+. (PR #1435)

View File

@ -18,14 +18,21 @@ STATIC_LIBGCC=${STATIC_LIBGCC:-0}
ENABLE_LTO=${ENABLE_LTO:-0}
PGO_INSTRUMENT=${PGO_INSTRUMENT:-0}
PGO_USE_PROFILE=${PGO_USE_PROFILE:-}
USE_CCACHE=${USE_CCACHE:-0}
export FREEDVGUIDIR=${PWD}
if [ $USE_CCACHE == 1 ]; then
CCACHE_ARGS="-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
else
CCACHE_ARGS=""
fi
# Finally, build freedv-gui
cd $FREEDVGUIDIR
if [ -d .git ]; then
git pull
fi
mkdir -p build_linux && cd build_linux && rm -Rf *
cmake -DPGO_INSTRUMENT=${PGO_INSTRUMENT} -DPGO_USE_PROFILE=${PGO_USE_PROFILE} -DENABLE_LTO=${ENABLE_LTO} -DSTATIC_LIBGCC=${STATIC_LIBGCC} -DENABLE_UBSAN=${WITH_UBSAN} -DENABLE_TSAN=${WITH_TSAN} -DENABLE_RTSAN=${WITH_RTSAN} -DENABLE_ASAN=${WITH_ASAN} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DUSE_NATIVE_AUDIO=$USE_NATIVE_AUDIO -DUNITTEST=$UT_ENABLE ..
cmake ${CCACHE_ARGS} -DPGO_INSTRUMENT=${PGO_INSTRUMENT} -DPGO_USE_PROFILE=${PGO_USE_PROFILE} -DENABLE_LTO=${ENABLE_LTO} -DSTATIC_LIBGCC=${STATIC_LIBGCC} -DENABLE_UBSAN=${WITH_UBSAN} -DENABLE_TSAN=${WITH_TSAN} -DENABLE_RTSAN=${WITH_RTSAN} -DENABLE_ASAN=${WITH_ASAN} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DUSE_NATIVE_AUDIO=$USE_NATIVE_AUDIO -DUNITTEST=$UT_ENABLE ..
make -j$(nproc)

View File

@ -5,7 +5,6 @@
# lpcnet repos so they are available for parallel development.
export FREEDVGUIDIR=${PWD}
export HAMLIBDIR=$FREEDVGUIDIR/hamlib
export UT_ENABLE=${UT_ENABLE:-0}
export UNIV_BUILD=${UNIV_BUILD:-1}
export CODESIGN_IDENTITY=${CODESIGN_IDENTITY:--}
@ -19,6 +18,7 @@ export WITH_UBSAN=${WITH_UBSAN:-0}
export ENABLE_LTO=${ENABLE_LTO:-0}
export PGO_INSTRUMENT=${PGO_INSTRUMENT:-0}
export PGO_USE_PROFILE=${PGO_USE_PROFILE:-}
export USE_CCACHE=${USE_CCACHE:-0}
# Prerequisite: build dylibbundler
if [ ! -d macdylibbundler ]; then
@ -28,25 +28,7 @@ if [ ! -d macdylibbundler ]; then
cd ..
fi
# Prerequisite: build hamlib
cd $FREEDVGUIDIR
if [ $BUILD_DEPS == 1 ]; then
if [ ! -d hamlib-code ]; then
git clone https://github.com/Hamlib/Hamlib.git hamlib-code
fi
cd hamlib-code && git checkout 4.7.2 && git pull
./bootstrap
if [ $UNIV_BUILD == 1 ]; then
CFLAGS="-g -O3 -mmacosx-version-min=11.0 -arch x86_64 -arch arm64" CXXFLAGS="-g -O3 -mmacosx-version-min=11.0 -arch x86_64 -arch arm64" ./configure --enable-shared --prefix $HAMLIBDIR --without-libusb
else
CFLAGS="-g -O3 -mmacosx-version-min=11.0" CXXFLAGS="-g -O3 -mmacosx-version-min=11.0" ./configure --enable-shared --prefix $HAMLIBDIR --without-libusb
fi
make -j$(sysctl -n hw.logicalcpu)
make install
fi
# Finally, build freedv-gui
# Build freedv-gui
cd $FREEDVGUIDIR
if [ -d .git ]; then
git pull
@ -57,10 +39,16 @@ if [ "$CODESIGN_KEYCHAIN_PROFILE" != "" ]; then
export CODESIGN_KEYCHAIN_PROFILE_ARG=-DMACOS_CODESIGN_KEYCHAIN_PROFILE=$CODESIGN_KEYCHAIN_PROFILE
fi
if [ $BUILD_DEPS == 1 ]; then
cmake -DCMAKE_AR=/usr/bin/ar -DCMAKE_RANLIB=/usr/bin/ranlib -DPGO_INSTRUMENT=${PGO_INSTRUMENT} -DPGO_USE_PROFILE=${PGO_USE_PROFILE} -DENABLE_LTO=${ENABLE_LTO} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_UBSAN=${WITH_UBSAN} -DENABLE_TSAN=${WITH_TSAN} -DENABLE_RTSAN=${WITH_RTSAN} -DENABLE_ASAN=${WITH_ASAN} -DUSE_NATIVE_AUDIO=$USE_NATIVE_AUDIO -DBUILD_OSX_UNIVERSAL=${UNIV_BUILD} -DUNITTEST=$UT_ENABLE -DBOOTSTRAP_WXWIDGETS=1 -DUSE_STATIC_SPEEXDSP=1 -DUSE_STATIC_PORTAUDIO=1 -DUSE_STATIC_SAMPLERATE=1 -DUSE_STATIC_SNDFILE=1 -DUSE_STATIC_LIBRESSL=1 -DHAMLIB_INCLUDE_DIR=${HAMLIBDIR}/include -DHAMLIB_LIBRARY=${HAMLIBDIR}/lib/libhamlib.dylib -DMACOS_CODESIGN_IDENTITY=${CODESIGN_IDENTITY} ${CODESIGN_KEYCHAIN_PROFILE_ARG} ..
if [ $USE_CCACHE == 1 ]; then
CCACHE_ARGS=-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache
else
cmake -DCMAKE_AR=/usr/bin/ar -DCMAKE_RANLIB=/usr/bin/ranlib -DPGO_INSTRUMENT=${PGO_INSTRUMENT} -DPGO_USE_PROFILE=${PGO_USE_PROFILE} -DENABLE_LTO=${ENABLE_LTO} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_UBSAN=${WITH_UBSAN} -DENABLE_TSAN=${WITH_TSAN} -DENABLE_RTSAN=${WITH_RTSAN} -DENABLE_ASAN=${WITH_ASAN} -DUSE_NATIVE_AUDIO=$USE_NATIVE_AUDIO -DBUILD_OSX_UNIVERSAL=${UNIV_BUILD} -DUNITTEST=$UT_ENABLE -DMACOS_CODESIGN_IDENTITY=${CODESIGN_IDENTITY} ${CODESIGN_KEYCHAIN_PROFILE_ARG} ..
CCACHE_ARGS=
fi
if [ $BUILD_DEPS == 1 ]; then
cmake ${CCACHE_ARGS} -DCMAKE_AR=/usr/bin/ar -DCMAKE_RANLIB=/usr/bin/ranlib -DPGO_INSTRUMENT=${PGO_INSTRUMENT} -DPGO_USE_PROFILE=${PGO_USE_PROFILE} -DENABLE_LTO=${ENABLE_LTO} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_UBSAN=${WITH_UBSAN} -DENABLE_TSAN=${WITH_TSAN} -DENABLE_RTSAN=${WITH_RTSAN} -DENABLE_ASAN=${WITH_ASAN} -DUSE_NATIVE_AUDIO=$USE_NATIVE_AUDIO -DBUILD_OSX_UNIVERSAL=${UNIV_BUILD} -DUNITTEST=$UT_ENABLE -DBOOTSTRAP_WXWIDGETS=1 -DUSE_STATIC_SPEEXDSP=1 -DUSE_STATIC_PORTAUDIO=1 -DUSE_STATIC_SAMPLERATE=1 -DUSE_STATIC_SNDFILE=1 -DUSE_STATIC_LIBRESSL=1 -DMACOS_CODESIGN_IDENTITY=${CODESIGN_IDENTITY} ${CODESIGN_KEYCHAIN_PROFILE_ARG} ..
else
cmake ${CCACHE_ARGS} -DCMAKE_AR=/usr/bin/ar -DCMAKE_RANLIB=/usr/bin/ranlib -DPGO_INSTRUMENT=${PGO_INSTRUMENT} -DPGO_USE_PROFILE=${PGO_USE_PROFILE} -DENABLE_LTO=${ENABLE_LTO} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_UBSAN=${WITH_UBSAN} -DENABLE_TSAN=${WITH_TSAN} -DENABLE_RTSAN=${WITH_RTSAN} -DENABLE_ASAN=${WITH_ASAN} -DUSE_NATIVE_AUDIO=$USE_NATIVE_AUDIO -DBUILD_OSX_UNIVERSAL=${UNIV_BUILD} -DUNITTEST=$UT_ENABLE -DMACOS_CODESIGN_IDENTITY=${CODESIGN_IDENTITY} ${CODESIGN_KEYCHAIN_PROFILE_ARG} ..
fi
make -j$(sysctl -n hw.logicalcpu)