diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4348d7..bacb783 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,65 +11,94 @@ env: DOCKER_BUILDKIT: 1 jobs: - build_and_test: - name: Build and test + build: + name: Build (${{ matrix.display }}) runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - id: ubuntu-debug + display: Debug + dockerfile: Dockerfile.ubuntu + build_type: Debug + image: wibo-host-debug + - id: ubuntu-release + display: Release + dockerfile: Dockerfile.ubuntu + build_type: Release + image: wibo-host-release + - id: static-debug + display: Static, Debug + dockerfile: Dockerfile + build_type: Debug + image: wibo-static-debug + - id: static-release + display: Static, Release + dockerfile: Dockerfile + build_type: Release + image: wibo-static-release steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - name: Install dependencies + - name: Build + run: >- + docker build + -f ${{ matrix.dockerfile }} + --build-arg build_type=${{ matrix.build_type }} + --target build + -t ${{ matrix.image }} + . + + - name: Tests + run: docker run --rm ${{ matrix.image }} ctest --test-dir /wibo/build --output-on-failure + + - name: Export binary run: | - sudo apt-get update - sudo apt-get install -y \ - file \ - unzip \ - wget \ - cmake \ - ninja-build \ - g++-multilib \ - gcc-mingw-w64-i686 \ - binutils-mingw-w64-i686 + rm -rf dist + docker build \ + -f ${{ matrix.dockerfile }} \ + --build-arg build_type=${{ matrix.build_type }} \ + --target export \ + --output dist \ + . - - name: Build debug - run: docker build --build-arg build_type=Debug --target export --output build_debug . - - - name: Build release - run: docker build --build-arg build_type=Release --target export --output build . - - - name: Test - shell: bash - run: | - mv build_debug/wibo build/wibo_debug - wget -q https://files.decomp.dev/compilers_latest.zip - unzip -q compilers_latest.zip - set -x - build/wibo_debug Wii/1.7/mwcceppc.exe -nodefaults -c test/test.c -Itest -o test_debug.o - file test_debug.o - build/wibo Wii/1.7/mwcceppc.exe -nodefaults -c test/test.c -Itest -o test.o - file test.o - - - name: Fixture tests - run: | - cmake -S . -B build_ctest -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DWIBO_ENABLE_FIXTURE_TESTS=ON - cmake --build build_ctest - ctest --test-dir build_ctest --output-on-failure - - - name: Upload release + - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: wibo - path: build/wibo + name: ${{ matrix.id }} + path: dist/wibo - - name: Upload debug - uses: actions/upload-artifact@v4 + release: + name: Publish Release + if: startsWith(github.ref, 'refs/tags/') + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Download static debug + uses: actions/download-artifact@v4 with: - name: wibo_debug - path: build/wibo_debug + name: static-debug + path: artifacts/static-debug + + - name: Download static release + uses: actions/download-artifact@v4 + with: + name: static-release + path: artifacts/static-release + + - name: Prepare assets + run: | + mkdir -p artifacts/out + cp artifacts/static-debug/wibo artifacts/out/wibo_debug + cp artifacts/static-release/wibo artifacts/out/wibo - name: Publish release uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') with: files: | - build/wibo - build/wibo_debug + artifacts/out/wibo + artifacts/out/wibo_debug diff --git a/Dockerfile b/Dockerfile index 2fa409c..a759e86 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,16 +2,29 @@ FROM --platform=linux/i386 alpine:latest AS build # Install dependencies -RUN apk add --no-cache cmake ninja g++ linux-headers binutils +RUN apk add --no-cache \ + bash \ + cmake \ + ninja \ + g++ \ + linux-headers \ + binutils \ + mingw-w64-binutils \ + mingw-w64-gcc # Copy source files +WORKDIR /wibo COPY . /wibo # Build type (Release, Debug, RelWithDebInfo, MinSizeRel) ARG build_type=Release # Build static binary -RUN cmake -S /wibo -B /wibo/build -G Ninja -DCMAKE_BUILD_TYPE="$build_type" -DCMAKE_CXX_FLAGS="-static" \ +RUN cmake -S /wibo -B /wibo/build -G Ninja \ + -DCMAKE_BUILD_TYPE="$build_type" \ + -DCMAKE_CXX_FLAGS="-static" \ + -DBUILD_TESTING=ON \ + -DWIBO_ENABLE_FIXTURE_TESTS=ON \ && cmake --build /wibo/build \ && ( [ "$build_type" != "Release" ] || strip -g /wibo/build/wibo ) diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 05076ff..550b606 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -1,5 +1,7 @@ -# Ubuntu 24.04 environment that matches CI toolchain and fixture tests. -FROM ubuntu:24.04 AS deps +# Build stage +FROM ubuntu:24.04 AS build + +# Install dependencies ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get install -y --no-install-recommends \ @@ -15,14 +17,25 @@ RUN apt-get update \ wget \ && rm -rf /var/lib/apt/lists/* +# Copy source files WORKDIR /wibo - -FROM deps AS dev COPY . /wibo -ARG BUILD_TYPE=Debug -# Configure default build folders so docker build can cache compilation layers if desired. -RUN cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_TESTING=ON -DWIBO_ENABLE_FIXTURE_TESTS=ON \ - && cmake --build build +# Build type (Release, Debug, RelWithDebInfo, MinSizeRel) +ARG build_type=Release -ENTRYPOINT ["/bin/bash"] +RUN cmake -S /wibo -B /wibo/build -G Ninja \ + -DCMAKE_BUILD_TYPE="$build_type" \ + -DBUILD_TESTING=ON \ + -DWIBO_ENABLE_FIXTURE_TESTS=ON \ + && cmake --build /wibo/build \ + && ( [ "$build_type" != "Release" ] || strip -g /wibo/build/wibo ) + +# Export binary (usage: docker build -f Dockerfile.ubuntu --target export --output dist .) +FROM scratch AS export +COPY --from=build /wibo/build/wibo . + +# Runnable container +FROM ubuntu:24.04 +COPY --from=build /wibo/build/wibo /usr/local/sbin/wibo +CMD ["/usr/local/sbin/wibo"]