From 54357ac1f3b44bfa82b03611b26a61851a424173 Mon Sep 17 00:00:00 2001 From: apple1417 Date: Wed, 20 Sep 2023 19:04:10 +1200 Subject: [PATCH] add ci --- .clang-tidy | 1 + .clangd | 4 + .cruft.json | 2 +- .github/workflows/build.yml | 274 ++++++++++++++++++++++++++++++++++++ 4 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build.yml diff --git a/.clang-tidy b/.clang-tidy index 0a09168..4885f75 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -14,6 +14,7 @@ Checks: > -cppcoreguidelines-pro-type-union-access, -cppcoreguidelines-pro-type-vararg, misc-*, + -misc-include-cleaner, -misc-non-private-member-variables-in-classes, -misc-no-recursion, modernize-*, diff --git a/.clangd b/.clangd index 0d20081..bfa7c2d 100644 --- a/.clangd +++ b/.clangd @@ -1,3 +1,7 @@ +# Turn off include cleaner for now, since it can't handle exports yet, required to use a pch +Diagnostics: + UnusedIncludes: None +--- If: PathMatch: src/pch.h CompileFlags: diff --git a/.cruft.json b/.cruft.json index fd30d96..b8b09e2 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,6 +1,6 @@ { "template": "git@github.com:bl-sdk/common_dotfiles.git", - "commit": "c6cad57d450e0b696fb8586daaf29814427ef7c1", + "commit": "a66f9767ed477bfa89d6ca505392d226ebdd4275", "checkout": null, "context": { "cookiecutter": { diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..ef03a8a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,274 @@ +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 + # Since we use rather new c++ features, we need a rather new version of MinGW + # LLVM MinGW seems to be the newest prebuilt binaries around + LLVM_MINGW_VERSION: llvm-mingw-20230919-msvcrt-ubuntu-20.04-x86_64 + LLVM_MINGW_DOWNLOAD: https://github.com/mstorsjo/llvm-mingw/releases/download/20230919/llvm-mingw-20230919-msvcrt-ubuntu-20.04-x86_64.tar.xz + # xwin settings + XWIN_VERSION: xwin-0.3.1-x86_64-unknown-linux-musl + XWIN_DOWNLOAD: https://github.com/Jake-Shadle/xwin/releases/download/0.3.1/xwin-0.3.1-x86_64-unknown-linux-musl.tar.gz + +jobs: + cache-clang: + runs-on: windows-latest + + steps: + - name: Cache Clang + uses: actions/cache@v3 + 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-x86-release", + "clang-x64-release", + "msvc-x86-release", + "msvc-x64-release", + ] + + steps: + - name: Restore Clang Cache + if: contains(matrix.preset, 'clang') + uses: actions/cache/restore@v3 + with: + path: C:\Program Files\LLVM + key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} + fail-on-cache-miss: true + + - name: Add MSVC to PATH + if: contains(matrix.preset, 'msvc') + uses: TheMrMilchmann/setup-msvc-dev@v2 + with: + arch: ${{ fromJSON('["x86", "x64"]')[contains(matrix.preset, 'x64')] }} + + - name: Setup CMake and Ninja + uses: lukka/get-cmake@latest + + - name: Checkout repository and submodules + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Configure CMake + working-directory: ${{ env.GITHUB_WORKSPACE }} + run: cmake . --preset ${{ matrix.preset }} + + - name: Build + working-directory: ${{ env.GITHUB_WORKSPACE }} + run: cmake --build out/build/${{ matrix.preset }} --target install + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.preset }} + path: out/install/${{ matrix.preset }}/ + + build-ubuntu: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + preset: [ + "mingw-x86-release", + "mingw-x64-release", + "clang-cross-x86-release", + "clang-cross-x64-release", + ] + + steps: + - name: Setup CMake and Ninja + uses: lukka/get-cmake@latest + + # 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: contains(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 MinGW + if: contains(matrix.preset, '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 + + # xwin does take long enough that caching's worth it + - name: Restore xwin cache + if: contains(matrix.preset, 'cross') + uses: actions/cache@v3 + 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@v3 + with: + submodules: recursive + + - name: Configure CMake + working-directory: ${{ env.GITHUB_WORKSPACE }} + # The extra xwin dir arg won't do anything if we're not cross compiling + run: > + cmake . + --preset ${{ matrix.preset }} + -G Ninja + -DXWIN_DIR=$(readlink -f ~)/xwin + + - name: Build + working-directory: ${{ env.GITHUB_WORKSPACE }} + run: cmake --build out/build/${{ matrix.preset }} --target install + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.preset }} + path: out/install/${{ matrix.preset }}/ + +# ============================================================================== + + clang-tidy: + runs-on: windows-latest + needs: cache-clang + + strategy: + fail-fast: false + matrix: + preset: [ + "clang-x86-release", + "clang-x64-release", + ] + + steps: + - name: Restore Clang Cache + uses: actions/cache/restore@v3 + 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 + + # Needed for clang tidy to enable `-export-fixes` + - name: Install pyyaml + run: pip install pyyaml + + - name: Checkout repository and submodules + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Configure CMake + working-directory: ${{ env.GITHUB_WORKSPACE }} + run: cmake . --preset ${{ matrix.preset }} -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On + + - 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)$") + + - 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@v3 + with: + path: C:\Program Files\LLVM + key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} + fail-on-cache-miss: true + + - name: Checkout repository + uses: actions/checkout@v3 + + - 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@v3 + + - name: Check spelling + uses: crate-ci/typos@master