mirror of
https://github.com/lifting-bits/sleigh
synced 2026-06-21 13:56:12 +00:00
8243a7b4b4
- Add TrackFileAccess=false to CMAKE_VS_GLOBALS in ccache-msvc.cmake to prevent MSBuild from tracking ccache files as build outputs - Move Windows ccache directory to %TEMP% to avoid Visual Studio's file tracking triggering unnecessary rebuilds - Update cache action path to use platform-specific locations Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
259 lines
9.6 KiB
YAML
259 lines
9.6 KiB
YAML
name: Build
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- "*"
|
|
|
|
# Version tags should start with "v"
|
|
tags:
|
|
- "v*"
|
|
|
|
pull_request:
|
|
branches:
|
|
- "*"
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ${{ matrix.os }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
build_type: [RelWithDebInfo, Debug]
|
|
release: [stable, HEAD]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
|
|
- name: Setup Git User for Applying Patches
|
|
# See this thread for more details https://github.community/t/github-actions-bot-email-address/17204/5
|
|
run: |
|
|
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
git config --global user.name "github-actions[bot]"
|
|
|
|
- name: Install Linux system dependencies
|
|
if: runner.os == 'Linux'
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y rpm ccache doxygen graphviz xdot
|
|
|
|
- name: Install macOS system dependencies
|
|
if: runner.os == 'macOS'
|
|
run: |
|
|
echo "MACOSX_DEPLOYMENT_TARGET=10.15" >> ${GITHUB_ENV}
|
|
brew install --formula \
|
|
ccache \
|
|
doxygen \
|
|
graphviz
|
|
|
|
- name: Install Windows system dependencies
|
|
if: runner.os == 'Windows'
|
|
uses: nick-fields/retry@v3
|
|
with:
|
|
timeout_minutes: 10
|
|
max_attempts: 3
|
|
command: |
|
|
choco install ccache doxygen.install graphviz
|
|
Add-Content -Path $env:GITHUB_ENV -Value "CCACHE_EXE=$(Resolve-Path C:\ProgramData\chocolatey\lib\ccache\tools\*\ccache.exe)"
|
|
vcpkg install zlib:x64-windows-static
|
|
|
|
- name: Generate cache key
|
|
shell: cmake -P {0}
|
|
run: |
|
|
string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC)
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CACHE_KEY=build_${{ matrix.os }}_type-${{ matrix.build_type }}-${{ matrix.release }}\n")
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CACHE_TIMESTAMP=${current_date}\n")
|
|
|
|
- name: Update the cache (ccache)
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: ${{ runner.os == 'Windows' && env.TEMP || github.workspace }}/ccache
|
|
key: ${{ env.CACHE_KEY }}_ccache_${{ env.CACHE_TIMESTAMP }}
|
|
restore-keys: |
|
|
${{ env.CACHE_KEY }}_ccache_
|
|
|
|
- name: Setup ccache
|
|
working-directory: "${{ github.workspace }}"
|
|
shell: cmake -P {0}
|
|
run: |
|
|
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/ccache")
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CCACHE_BASEDIR=${CMAKE_CURRENT_SOURCE_DIR}\n")
|
|
if(WIN32)
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CCACHE_DIR=$ENV{TEMP}/ccache\n")
|
|
else()
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CCACHE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/ccache\n")
|
|
endif()
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CCACHE_COMPRESS=true\n")
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CCACHE_COMPRESSLEVEL=10\n")
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CCACHE_MAXSIZE=400M\n")
|
|
# These only work for Ninja/Makefiles, not VS generators
|
|
# But harmless to set for all platforms
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CMAKE_CXX_COMPILER_LAUNCHER=ccache\n")
|
|
file(APPEND "$ENV{GITHUB_ENV}" "CMAKE_C_COMPILER_LAUNCHER=ccache\n")
|
|
# Clear stats before every build
|
|
execute_process(COMMAND ccache -z)
|
|
|
|
- name: CMake version
|
|
run: cmake --version
|
|
|
|
- name: Configure the project
|
|
shell: pwsh
|
|
run: cmake "--preset=ci-$("${{ matrix.os }}".split("-")[0])"
|
|
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
|
-Dsleigh_RELEASE_TYPE=${{ matrix.release }}
|
|
"-DCMAKE_PROJECT_INCLUDE:FILEPATH=${{ github.workspace }}/cmake/ccache-msvc.cmake"
|
|
-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded
|
|
|
|
- name: Build the project
|
|
run: cmake
|
|
--build build
|
|
--config ${{ matrix.build_type }}
|
|
-j 4
|
|
-v
|
|
|
|
- name: Test the project
|
|
working-directory: build
|
|
run: ctest -VV -C ${{ matrix.build_type }}
|
|
|
|
- name: Build the docs
|
|
run: cmake
|
|
--build build
|
|
--config ${{ matrix.build_type }}
|
|
--target docs
|
|
-v
|
|
|
|
- name: Run the example
|
|
run: cmake
|
|
--build build
|
|
-j 4
|
|
--config ${{ matrix.build_type }}
|
|
--target sleigh_example_runner
|
|
|
|
- name: Run the install target
|
|
run: cmake --install build
|
|
--config ${{ matrix.build_type }}
|
|
--prefix install
|
|
|
|
- name: Smoketest sleigh lift
|
|
run: |
|
|
./install/bin/sleigh-lift --version
|
|
./install/bin/sleigh-lift disassemble x86-64.sla 4881ecc00f0000
|
|
./install/bin/sleigh-lift pcode x86-64.sla 4881ecc00f0000
|
|
|
|
- name: Test install directory Unix
|
|
if: runner.os != 'Windows'
|
|
working-directory: tests/find_package
|
|
run: |
|
|
cmake -B build -S . "-Dsleigh_DIR=${{ github.workspace }}/install/lib/cmake/sleigh" -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
|
cmake --build build -j 4 --config ${{ matrix.build_type }}
|
|
cd build
|
|
ctest -V -C ${{ matrix.build_type }}
|
|
- name: Test install directory Windows
|
|
if: runner.os == 'Windows'
|
|
working-directory: tests/find_package
|
|
run: |
|
|
cmake -B build -S . "-Dsleigh_DIR=${{ github.workspace }}/install/lib/cmake/sleigh" -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} "-DCMAKE_TOOLCHAIN_FILE=$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-static
|
|
cmake --build build -j 4 --config ${{ matrix.build_type }}
|
|
cd build
|
|
ctest -V -C ${{ matrix.build_type }}
|
|
|
|
- name: Test tool install directory Unix
|
|
if: runner.os != 'Windows'
|
|
working-directory: extra-tools/sleigh-lift
|
|
run: |
|
|
cmake -B build -S . "-Dsleigh_DIR=${{ github.workspace }}/install/lib/cmake/sleigh" -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
|
cmake --build build -j 4 --config ${{ matrix.build_type }}
|
|
cmake --install build --config ${{ matrix.build_type }} --prefix install
|
|
./install/bin/sleigh-lift --version
|
|
./install/bin/sleigh-lift disassemble x86-64.sla 4881ecc00f0000
|
|
./install/bin/sleigh-lift pcode x86-64.sla 4881ecc00f0000
|
|
- name: Test tool install directory Windows
|
|
if: runner.os == 'Windows'
|
|
working-directory: extra-tools/sleigh-lift
|
|
run: |
|
|
cmake -B build -S . "-Dsleigh_DIR=${{ github.workspace }}/install/lib/cmake/sleigh" -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} "-DCMAKE_TOOLCHAIN_FILE=$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-static
|
|
cmake --build build -j 4 --config ${{ matrix.build_type }}
|
|
cmake --install build --config ${{ matrix.build_type }} --prefix install
|
|
./install/bin/sleigh-lift --version
|
|
./install/bin/sleigh-lift disassemble x86-64.sla 4881ecc00f0000
|
|
./install/bin/sleigh-lift pcode x86-64.sla 4881ecc00f0000
|
|
|
|
- name: Create the packages
|
|
run: cmake
|
|
--build build
|
|
-j 4
|
|
--config ${{ matrix.build_type }}
|
|
--target package
|
|
|
|
- name: Test the DEB package
|
|
if: runner.os == 'Linux'
|
|
run: |
|
|
sudo dpkg -i build/*.deb
|
|
|
|
cmake -S tests/find_package -B find_package_build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
|
cmake --build find_package_build -j 4 --config ${{ matrix.build_type }} --verbose
|
|
|
|
- name: Locate the packages (RelWithDebInfo only)
|
|
if: matrix.build_type == 'RelWithDebInfo'
|
|
shell: bash
|
|
run: |
|
|
echo "DEB_PACKAGE_PATH=$(ls build/*.deb)" >> $GITHUB_ENV
|
|
echo "DEB_PACKAGE_NAME=$(cd build && ls *.deb)" >> $GITHUB_ENV
|
|
|
|
echo "RPM_PACKAGE_PATH=$(ls build/*.rpm)" >> $GITHUB_ENV
|
|
echo "RPM_PACKAGE_NAME=$(cd build && ls *.rpm)" >> $GITHUB_ENV
|
|
|
|
# Rename .tar.gz files for OS
|
|
pushd build
|
|
for f in *.tar.gz; do mv "$f" "${{ runner.os }}-$f"; done
|
|
popd
|
|
|
|
echo "TGZ_PACKAGE_PATH=$(ls build/*.tar.gz)" >> $GITHUB_ENV
|
|
echo "TGZ_PACKAGE_NAME=$(cd build && ls *.tar.gz)" >> $GITHUB_ENV
|
|
|
|
# DEB Package
|
|
- name: Upload the DEB package artifact (RelWithDebInfo only)
|
|
if: matrix.build_type == 'RelWithDebInfo' && runner.os == 'Linux'
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: ${{ env.DEB_PACKAGE_NAME }}
|
|
path: ${{ env.DEB_PACKAGE_PATH }}
|
|
|
|
- name: Release DEB package artifact (RelWithDebInfo only)
|
|
uses: softprops/action-gh-release@v2.5.0
|
|
if: matrix.build_type == 'RelWithDebInfo' && runner.os == 'Linux' && startsWith(github.ref, 'refs/tags/') && matrix.release == 'stable'
|
|
with:
|
|
files: ${{ env.DEB_PACKAGE_PATH }}
|
|
|
|
# RPM Package
|
|
- name: Upload the RPM package artifact (RelWithDebInfo only)
|
|
if: matrix.build_type == 'RelWithDebInfo' && runner.os == 'Linux'
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: ${{ env.RPM_PACKAGE_NAME }}
|
|
path: ${{ env.RPM_PACKAGE_PATH }}
|
|
- name: Release RPM package artifact (RelWithDebInfo only)
|
|
uses: softprops/action-gh-release@v2.5.0
|
|
if: matrix.build_type == 'RelWithDebInfo' && runner.os == 'Linux' && startsWith(github.ref, 'refs/tags/') && matrix.release == 'stable'
|
|
with:
|
|
files: ${{ env.RPM_PACKAGE_PATH }}
|
|
|
|
# TGZ Package
|
|
- name: Upload the TGZ package artifact (RelWithDebInfo only)
|
|
if: matrix.build_type == 'RelWithDebInfo'
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: ${{ env.TGZ_PACKAGE_NAME }}
|
|
path: ${{ env.TGZ_PACKAGE_PATH }}
|
|
|
|
- name: Release TGZ package artifact (RelWithDebInfo only)
|
|
uses: softprops/action-gh-release@v2.5.0
|
|
if: matrix.build_type == 'RelWithDebInfo' && startsWith(github.ref, 'refs/tags/') && matrix.release == 'stable'
|
|
with:
|
|
files: ${{ env.TGZ_PACKAGE_PATH }}
|
|
|
|
- name: ccache stats
|
|
run: ccache -s
|