Merge pull request #37 from apple1417/master #97
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: CI | |
on: [ | |
push, | |
pull_request, | |
workflow_dispatch | |
] | |
env: | |
# Important to pin the clang version, cause we also use it for linting | |
CLANG_VERSION: 17 | |
CLANG_TIDY_JOBS: 4 | |
# LLVM MinGW download | |
LLVM_MINGW_VERSION: llvm-mingw-20231128-msvcrt-ubuntu-20.04-x86_64 | |
LLVM_MINGW_DOWNLOAD: https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-msvcrt-ubuntu-20.04-x86_64.tar.xz | |
# xwin settings | |
XWIN_VERSION: xwin-0.5.0-x86_64-unknown-linux-musl | |
XWIN_DOWNLOAD: https://github.com/Jake-Shadle/xwin/releases/download/0.5.0/xwin-0.5.0-x86_64-unknown-linux-musl.tar.gz | |
jobs: | |
cache-clang: | |
runs-on: windows-latest | |
steps: | |
- name: Cache Clang | |
uses: actions/cache@v4 | |
id: cache-clang | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
lookup-only: true | |
- name: Setup Clang | |
if: steps.cache-clang.outputs.cache-hit != 'true' | |
uses: egor-tensin/setup-clang@v1 | |
with: | |
version: ${{ env.CLANG_VERSION }} | |
# ============================================================================== | |
build-windows: | |
runs-on: windows-latest | |
needs: cache-clang | |
strategy: | |
fail-fast: false | |
matrix: | |
preset: [ | |
"clang-ue3-x86-release", | |
"clang-ue4-x64-release", | |
"msvc-ue3-x86-release", | |
"msvc-ue4-x64-release", | |
] | |
steps: | |
- name: Restore Clang Cache | |
if: startswith(matrix.preset, 'clang') | |
uses: actions/cache/restore@v4 | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
fail-on-cache-miss: true | |
- name: Add MSVC to PATH | |
if: startswith(matrix.preset, 'msvc') | |
uses: TheMrMilchmann/setup-msvc-dev@v3 | |
with: | |
arch: ${{ fromJSON('["x86", "x64"]')[contains(matrix.preset, 'x64')] }} | |
- name: Setup CMake and Ninja | |
uses: lukka/get-cmake@latest | |
# We only actually need this python version to run the download script, we're not going to link | |
# against it, so don't need to specify arch | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ">=3.10" | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Configure build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: | | |
pip install requests | |
cmake . --preset ${{ matrix.preset }} -G Ninja | |
- name: Build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: cmake --build out/build/${{ matrix.preset }} | |
build-ubuntu: | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
preset: [ | |
"clang-cross-ue3-x86-release", | |
"clang-cross-ue4-x64-release", | |
"llvm-mingw-ue3-x86-release", | |
"llvm-mingw-ue4-x64-release", | |
# Currently, ubuntu-latest is 22.04, whose mingw version is too old, so disabling these | |
# builds for now | |
# Not sure of the exact threshold, 13.1.0 works | |
# "mingw-ue3-x86-release", | |
# "mingw-ue4-x64-release", | |
] | |
steps: | |
- name: Setup CMake and Ninja | |
uses: lukka/get-cmake@latest | |
- name: Setup msitools | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
packages: msitools | |
version: ${{ runner.os }}-apt | |
# Both Clang and MinGW install quick enough that it's not worth caching | |
# Caching would also lose the +x - so we'd have to tar before caching/untar after, making it | |
# even slower | |
- name: Setup Clang | |
if: startswith(matrix.preset, 'clang') | |
run: | | |
wget https://apt.llvm.org/llvm.sh | |
chmod +x llvm.sh | |
sudo ./llvm.sh ${{ env.CLANG_VERSION }} | |
sudo update-alternatives --install \ | |
/usr/bin/clang \ | |
clang \ | |
/usr/bin/clang-${{ env.CLANG_VERSION }} \ | |
200 | |
sudo update-alternatives --install \ | |
/usr/bin/clang++ \ | |
clang++ \ | |
/usr/bin/clang++-${{ env.CLANG_VERSION }} \ | |
200 | |
sudo update-alternatives --install \ | |
/usr/bin/llvm-rc \ | |
llvm-rc \ | |
/usr/bin/llvm-rc-${{ env.CLANG_VERSION }} \ | |
200 | |
- name: Setup LLVM MinGW | |
if: startswith(matrix.preset, 'llvm-mingw') | |
run: | | |
wget -nv ${{ env.LLVM_MINGW_DOWNLOAD }} | |
tar -xf ${{ env.LLVM_MINGW_VERSION }}.tar.xz -C ~/ | |
echo $(readlink -f ~/${{ env.LLVM_MINGW_VERSION }}/bin) >> $GITHUB_PATH | |
- name: Set up MinGW | |
if: startswith(matrix.preset, 'mingw') | |
uses: egor-tensin/setup-mingw@v2 | |
with: | |
platform: ${{ fromJSON('["x86", "x64"]')[contains(matrix.preset, 'x64')] }} | |
# xwin does take long enough that caching's worth it | |
- name: Restore xwin cache | |
if: contains(matrix.preset, 'cross') | |
uses: actions/cache@v4 | |
id: cache-xwin | |
with: | |
path: ~/xwin | |
key: ${{ runner.os }}-xwin | |
- name: Setup xwin | |
if: contains(matrix.preset, 'cross') && steps.cache-xwin.outputs.cache-hit != 'true' | |
run: | | |
wget -nv ${{ env.XWIN_DOWNLOAD }} | |
tar -xf ${{ env.XWIN_VERSION }}.tar.gz | |
${{ env.XWIN_VERSION }}/xwin \ | |
--accept-license \ | |
--arch x86,x86_64 \ | |
splat \ | |
--include-debug-libs \ | |
--output ~/xwin | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Configure build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: | | |
pip install requests | |
cmake . \ | |
--preset ${{ matrix.preset }} \ | |
-G Ninja \ | |
-DXWIN_DIR=$(readlink -f ~)/xwin | |
# The extra xwin dir arg will be ignored if we don't need it | |
- name: Build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: cmake --build out/build/${{ matrix.preset }} | |
# ============================================================================== | |
clang-tidy: | |
runs-on: windows-latest | |
needs: cache-clang | |
strategy: | |
fail-fast: false | |
matrix: | |
preset: [ | |
"clang-ue3-x86-release", | |
"clang-ue4-x64-release", | |
] | |
steps: | |
- name: Restore Clang Cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
fail-on-cache-miss: true | |
- name: Setup CMake and Ninja | |
uses: lukka/get-cmake@latest | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ">=3.10" | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Configure build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
# Also need pyyaml for clang tidy to enable `-export-fixes` | |
run: | | |
pip install pyyaml requests | |
cmake . ` | |
--preset ${{ matrix.preset }} ` | |
-G Ninja ` | |
-DCMAKE_DISABLE_PRECOMPILE_HEADERS=True | |
(Get-Content "out\build\${{ matrix.preset }}\compile_commands.json") ` | |
-replace "@CMakeFiles.+?\.modmap", "" ` | |
| Set-Content ` | |
-Path "out\build\${{ matrix.preset }}\compile_commands.json" | |
- name: Run clang-tidy | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: | | |
python (Get-Command run-clang-tidy).Source ` | |
-j ${{ env.CLANG_TIDY_JOBS }} ` | |
-p "out\build\${{ matrix.preset }}" ` | |
-export-fixes clang-tidy-fixes.yml ` | |
$([Regex]::Escape("$pwd\src") + ".+\.(c|cpp|h|hpp)$") ` | |
-extra-arg="-Wno-unknown-pragmas" | |
# For some reason, the above started giving unknown pragma errors in library headers (both | |
# unrealsdk and python) in clang-tidy 17 | |
# It compiles fine, doesn't show up in clangd, and doesn't happen in the unrealsdk build, so | |
# just suppressing it for now | |
- name: Process clang-tidy warnings | |
uses: asarium/clang-tidy-action@v1 | |
with: | |
fixesFile: clang-tidy-fixes.yml | |
clang-format: | |
runs-on: windows-latest | |
needs: cache-clang | |
steps: | |
- name: Restore Clang Cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
fail-on-cache-miss: true | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Run clang-format | |
run: | | |
clang-format ` | |
-n -Werror ` | |
$(Get-ChildItem ` | |
src ` | |
-File ` | |
-Recurse ` | |
-Include ("*.c", "*.cpp", "*.h", "*.hpp") ` | |
| % FullName) | |
spelling: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Check spelling | |
uses: crate-ci/typos@master | |
pyright: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Run pyright | |
uses: jakebailey/pyright-action@v2 | |
with: | |
working-directory: ./stubs | |
ruff: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Run Ruff Linting | |
uses: chartboost/ruff-action@v1 | |
with: | |
src: ./stubs | |
- name: Run Ruff Formatting | |
uses: chartboost/ruff-action@v1 | |
with: | |
src: ./stubs | |
args: format --check |