name: 'Build Kernel' description: 'Builds kernel using legacy build.sh or Bazel (kleaf)' runs: using: composite steps: - name: 'Setup ccache and Build Environment' shell: bash working-directory: ${{ github.workspace }} run: | set -euo pipefail # Download and install ccache echo "Installing ccache..." curl -LfsS --retry 5 --retry-delay 5 --retry-all-errors --connect-timeout 30 --tcp-fastopen -H "User-Agent: Mozilla/5.0" "https://github.com/WildKernels/kernel_patches/raw/refs/heads/main/ccache/ccache-x86-64" -o ccache || { echo "❌ Failed to download ccache"; exit 1; } sudo cp -f ./ccache /usr/bin/ccache || { echo "❌ Failed to install ccache"; exit 1; } sudo chmod +x /usr/bin/ccache rm -f ./ccache # Verify ccache if ! /usr/bin/ccache --version > /dev/null 2>&1; then echo "❌ ccache installation failed or binary is corrupted" exit 1 fi echo "✅ ccache binary verified: $(/usr/bin/ccache --version | head -1)" # Setup cache directories export CCACHE_DIR="/home/runner/.ccache" echo "CCACHE_DIR=$CCACHE_DIR" >> $GITHUB_ENV export LDCACHE_DIR="/home/runner/.ld_cache" echo "LDCACHE_DIR=$LDCACHE_DIR" >> $GITHUB_ENV mkdir -p "$CCACHE_DIR" "$LDCACHE_DIR" # Create LD wrapper for thin-LTO caching cat > "$GITHUB_WORKSPACE/kernel/ld-wrapper" << 'EOF' #!/bin/bash ld.lld "$@" --thinlto-cache-dir="$LDCACHE_DIR" --thinlto-jobs="$(nproc --all)" EOF chmod +x "$GITHUB_WORKSPACE/kernel/ld-wrapper" # Setup ccache compiler wrappers in PATH (masquerade method) # This intercepts compiler invocations regardless of how the build system calls them #mkdir -p "$GITHUB_WORKSPACE/ccache-bin" #cp /usr/bin/ccache "$GITHUB_WORKSPACE/ccache-bin/clang" #cp /usr/bin/ccache "$GITHUB_WORKSPACE/ccache-bin/clang++" #cp /usr/bin/ccache "$GITHUB_WORKSPACE/ccache-bin/gcc" #cp /usr/bin/ccache "$GITHUB_WORKSPACE/ccache-bin/g++" #cp /usr/bin/ccache "$GITHUB_WORKSPACE/ccache-bin/ld.lld" #chmod +x "$GITHUB_WORKSPACE/ccache-bin"/* # Export environment variables for subsequent steps #echo "PATH=$GITHUB_WORKSPACE/ccache-bin:$PATH" >> $GITHUB_ENV export CC="/usr/bin/ccache clang" echo "CC=/usr/bin/ccache clang" >> $GITHUB_ENV export CXX="/usr/bin/ccache clang++" echo "CXX=/usr/bin/ccache clang++" >> $GITHUB_ENV export HOSTCC="/usr/bin/ccache clang" echo "HOSTCC=/usr/bin/ccache clang" >> $GITHUB_ENV export HOSTCXX="/usr/bin/ccache clang++" echo "HOSTCXX=/usr/bin/ccache clang++" >> $GITHUB_ENV export LD="$GITHUB_WORKSPACE/kernel/ld-wrapper" echo "LD=$GITHUB_WORKSPACE/kernel/ld-wrapper" >> $GITHUB_ENV #echo "HOSTLD=$GITHUB_WORKSPACE/kernel/ld-wrapper" >> $GITHUB_ENV #echo "CLANG_PREBUILT_BIN=$GITHUB_WORKSPACE/ccache-bin" >> $GITHUB_ENV export CCACHE_MAXSIZE="12G" echo CCACHE_MAXSIZE="12G" >> $GITHUB_ENV export CCACHE_COMPILERCHECK="content" echo CCACHE_COMPILERCHECK="content" >> $GITHUB_ENV export CCACHE_BASEDIR="${GITHUB_WORKSPACE}" echo CCACHE_BASEDIR="${GITHUB_WORKSPACE}" >> $GITHUB_ENV export CCACHE_NOHASHDIR="true" echo CCACHE_NOHASHDIR="true" >> $GITHUB_ENV export CCACHE_IGNOREOPTIONS="--sysroot*" echo CCACHE_IGNOREOPTIONS="--sysroot*" >> $GITHUB_ENV export CCACHE_COMPRESSION="true" echo CCACHE_COMPRESSION="true" >> $GITHUB_ENV export CCACHE_COMPRESSLEVEL="3" echo CCACHE_COMPRESSION_LEVEL="3" >> $GITHUB_ENV export CCACHE_DIRECT="true" echo CCACHE_DIRECT="true" >> $GITHUB_ENV export CCACHE_FILE_CLONE="true" echo CCACHE_FILE_CLONE="true" >> $GITHUB_ENV export CCACHE_INODE_CACHE="true" echo CCACHE_INODE_CACHE="true" >> $GITHUB_ENV export CCACHE_IS_KERNEL_COMPILING="true" echo CCACHE_IS_KERNEL_COMPILING="true" >> $GITHUB_ENV export CCACHE_UMASK="002" echo CCACHE_UMASK="002" >> $GITHUB_ENV export CCACHE_SLOPPINESS="file_macro,time_macros,include_file_mtime,include_file_ctime,pch_defines,system_headers,locale" echo CCACHE_SLOPPINESS="file_macro,time_macros,include_file_mtime,include_file_ctime,pch_defines,system_headers,locale" >> $GITHUB_ENV if ccache --help 2>&1 | grep -q 'depend_mode'; then export CCACHE_DEPEND=true echo "CCACHE_DEPEND=true" >> "$GITHUB_ENV" fi # Initialize ccache #ccache -M 100G ccache -p ccache -s ccache -z echo "✅ Build environment ready" echo " CCACHE_DIR: $CCACHE_DIR" echo " LDCACHE_DIR: $LDCACHE_DIR" echo " Compiler wrappers: $GITHUB_WORKSPACE/ccache-bin" - name: 'Build Kernel' shell: bash working-directory: ${{ github.workspace }}/kernel run: | set -euo pipefail if [ -f "build/build.sh" ]; then SKIP_MRPROPER=1 \ LTO=thin \ SKIP_VENDOR_BOOT=1 \ SKIP_EXT_MODULES=1 \ SKIP_CP_KERNEL_HDR=1 \ GKI_DEFCONFIG_FRAGMENT="$GITHUB_WORKSPACE/wild_gki.fragment" \ BUILD_CONFIG=common/build.config.gki.aarch64 \ CCACHE_DIR="$CCACHE_DIR" \ LD="$LD" \ LDCACHE_DIR="$LDCACHE_DIR" \ #CLANG_PREBUILT_BIN="$CLANG_PREBUILT_BIN" \ #PATH="$PATH" \ build/build.sh -j"$(nproc)" else cp "$GITHUB_WORKSPACE/wild_gki.fragment" common/arch/arm64/configs/wild_gki.fragment tools/bazel build --config=release --notrim --defconfig_fragment=//common:arch/arm64/configs/wild_gki.fragment --disk_cache=$LDCACHE_DIR --cache_dir=$GITHUB_WORKSPACE/kernel/.cache/bazel //common:kernel_aarch64 fi - name: 'Report Cache Sizes' shell: bash working-directory: ${{ github.workspace }}/kernel/common run: | set -euo pipefail echo "📊 Cache sizes after build:" echo " CCACHE usage:" du -sh "$CCACHE_DIR" || echo " (no ccache directory)" echo " LDCACHE usage:" du -sh "$LDCACHE_DIR" || echo " (no ldcache directory)" echo "Perform cache eviction!" # 3h = 10800s using seconds to support older ccache ccache --evict-older-than 10800s