name: CI on: push: branches: [ master, dev, ci_testing, experiments ] pull_request: branches: [ master, dev ] workflow_dispatch: env: LLVM_RELEASE_VERSION: 21.x LLVM_RELEASE_VERSION_LINUX_MUSL: 20 LLVM_RELEASE_VERSION_OPENBSD: 20 LLVM_RELEASE_VERSION_NETBSD: 19 LLVM_DEV_VERSION: 22 jobs: build-msvc: runs-on: windows-latest timeout-minutes: 30 strategy: fail-fast: false matrix: build_type: [ Release, Debug ] defaults: run: shell: cmd steps: - uses: actions/checkout@v6 - uses: actions/cache@v5 with: path: build/_deps key: ${{ runner.os }}-llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ matrix.build_type }}-${{ hashFiles('CMakeLists.txt', '.github/workflows/main.yml') }} # set up the environment for Ninja - uses: ilammy/msvc-dev-cmd@v1 with: arch: x64 - name: CMake Build run: | cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DC3_FETCH_LLVM=ON cmake --build build --config ${{ matrix.build_type }} # We remove the GNU link tool so C3C picks up the MSVC link.exe - name: Remove GNU Link shell: bash run: rm -f /usr/bin/link - name: Run Unified Tests shell: bash run: ./scripts/tools/ci_tests.sh "./build/c3c.exe" - name: Cache MSVC SDK id: cache-msvc-sdk uses: actions/cache@v5 with: path: msvc_sdk key: msvc-sdk-${{ runner.os }}-${{ hashFiles('msvc_build_libraries.py') }} - if: steps.cache-msvc-sdk.outputs.cache-hit != 'true' run: py msvc_build_libraries.py --accept-license - name: Bundle (Windows) shell: bash run: ./scripts/tools/package_build.sh "./build/c3c.exe" "c3-windows-${{ matrix.build_type }}" "zip" - uses: actions/upload-artifact@v6 with: name: c3-windows-${{ matrix.build_type }} path: c3-windows-${{ matrix.build_type }}.zip build-msys2-mingw: runs-on: windows-latest timeout-minutes: 30 strategy: fail-fast: false matrix: build_type: [Release, Debug] defaults: run: shell: msys2 {0} steps: - uses: actions/checkout@v6 - uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: false install: git binutils mingw-w64-x86_64-clang mingw-w64-x86_64-ninja mingw-w64-x86_64-cmake mingw-w64-x86_64-toolchain mingw-w64-x86_64-python mingw-w64-x86_64-llvm mingw-w64-x86_64-llvm-libs - name: Install LLD run: | echo "Server = https://mirror.msys2.org/mingw/mingw64" > /etc/pacman.d/mirrorlist.mingw64 pacman -Sy --noconfirm --needed \ mingw-w64-x86_64-llvm \ mingw-w64-x86_64-llvm-libs \ mingw-w64-x86_64-lld \ mingw-w64-x86_64-clang - name: CMake Build run: | cmake -B build -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_LINKER=lld -DC3_LINK_DYNAMIC=OFF -DLLVM_DIR=/mingw64/lib/cmake/llvm -DC3_LLD_DIR=/mingw64/lib/ cmake --build build - name: Run Unified Tests run: ./scripts/tools/ci_tests.sh "./build/c3c" build-msys2-clang: runs-on: windows-latest timeout-minutes: 30 strategy: fail-fast: false matrix: build_type: [Release, Debug] defaults: run: shell: msys2 {0} steps: - uses: actions/checkout@v6 - uses: msys2/setup-msys2@v2 with: msystem: CLANG64 update: false install: git binutils mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-toolchain mingw-w64-clang-x86_64-python - name: CMake Build run: | cmake -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} cmake --build build - name: Run Unified Tests run: ./scripts/tools/ci_tests.sh "./build/c3c" build-linux: runs-on: ubuntu-latest strategy: fail-fast: false matrix: build_type: [Release, Debug] steps: - uses: actions/checkout@v6 - run: sudo apt-get update && sudo apt-get install -y zlib1g zlib1g-dev python3 ninja-build curl libcurl4-openssl-dev - name: CMake Build run: | cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DC3_FETCH_LLVM=ON cmake --build build - name: Run Unified Tests run: ./scripts/tools/ci_tests.sh "./build/c3c" - name: Embedded/QEMU Tests run: | sudo apt-get install -y opensbi qemu-system-misc u-boot-qemu gcc-riscv64-unknown-elf cd resources/examples/embedded/riscv-qemu make C3C_PATH=../../../../build/ run - name: Bundle & Upload (Linux) run: | bash ./scripts/tools/package_build.sh "./build/c3c" "c3-linux-${{matrix.build_type}}" "tar" - uses: actions/upload-artifact@v6 with: name: c3-linux-${{matrix.build_type}} path: c3-linux-${{matrix.build_type}}.tar.gz build-linux-alpine: runs-on: ubuntu-22.04 container: image: alpine:3.22 strategy: fail-fast: false matrix: build_type: [Release, Debug] llvm_version: [18, 19, 20] steps: - uses: actions/checkout@v6 - run: apk update && apk add zlib-dev zlib-static python3 samurai cmake curl-dev curl-static openssl-dev bash - name: Install Clang run: apk add "llvm${{matrix.llvm_version}}-dev" "llvm${{matrix.llvm_version}}-static" "llvm${{matrix.llvm_version}}-gtest" "llvm${{matrix.llvm_version}}-linker-tools" "lld${{matrix.llvm_version}}-dev" "clang${{matrix.llvm_version}}-dev" "clang${{matrix.llvm_version}}-static" - name: CMake Build run: | C3_LLVM_VER=${{matrix.llvm_version}} if [[ "${{matrix.llvm_version}}" -ge 18 && "${{matrix.llvm_version}}" != "${{env.LLVM_DEV_VERSION}}" ]]; then C3_LLVM_VER="${{matrix.llvm_version}}.1"; fi cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DCMAKE_C_COMPILER=clang-${{matrix.llvm_version}} -DCMAKE_CXX_COMPILER=clang++-${{matrix.llvm_version}} -DCMAKE_LINKER=lld-link-${{matrix.llvm_version}} -DCMAKE_OBJCOPY=llvm-objcopy-${{matrix.llvm_version}} -DCMAKE_STRIP=llvm-strip-${{matrix.llvm_version}} -DCMAKE_DLLTOOL=llvm-dlltool-${{matrix.llvm_version}} -DLLVM_ENABLE_LIBXML2=OFF -DC3_LINK_DYNAMIC=ON -DC3_LLVM_VERSION=$C3_LLVM_VER cmake --build build - name: Run Unified Tests run: ./scripts/tools/ci_tests.sh "./build/c3c" - name: Bundle & Upload (Alpine) if: matrix.llvm_version == env.LLVM_RELEASE_VERSION_LINUX_MUSL run: bash ./scripts/tools/package_build.sh "./build/c3c" "c3-linux-musl-${{matrix.build_type}}" "tar" - uses: actions/upload-artifact@v6 if: matrix.llvm_version == env.LLVM_RELEASE_VERSION_LINUX_MUSL with: name: c3-linux-musl-${{matrix.build_type}} path: c3-linux-musl-${{matrix.build_type}}.tar.gz build-mac: runs-on: macos-latest strategy: fail-fast: false matrix: build_type: [Release, Debug] steps: - uses: actions/checkout@v6 - name: CMake Build run: | cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DC3_FETCH_LLVM=ON cmake --build build - name: Run Unified Tests run: ./scripts/tools/ci_tests.sh "./build/c3c" - name: Build Lib (Mac) run: | cd resources/testproject ../../build/c3c build hello_world_lib -vv --trust=full - name: Bundle & Upload (Mac) run: bash ./scripts/tools/package_build.sh "./build/c3c" "c3-macos-${{matrix.build_type}}" "zip" - uses: actions/upload-artifact@v6 with: name: c3-macos-${{matrix.build_type}} path: c3-macos-${{matrix.build_type}}.zip build-openbsd: runs-on: ubuntu-latest strategy: fail-fast: false matrix: build_type: [Release, Debug] version: ['7.8'] steps: - uses: actions/checkout@v6 - name: Build, Test and Package in OpenBSD uses: vmactions/openbsd-vm@v1 with: sync: rsync usesh: true release: ${{ matrix.version }} prepare: pkg_add ninja cmake llvm%${{ env.LLVM_RELEASE_VERSION_OPENBSD }} bash # Combine all logic here so rsync copyback triggers at the end run: | export MALLOC_OPTIONS=j # Disable junk filling (it's faster) cd "$GITHUB_WORKSPACE" # Build cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{matrix.build_type}} cmake --build build # Run Unified Tests chmod +x scripts/tools/ci_tests.sh ulimit -d unlimited ./scripts/tools/ci_tests.sh "./build/c3c" # Package chmod +x scripts/tools/package_build.sh ./scripts/tools/package_build.sh "./build/c3c" "c3-openbsd-${{matrix.build_type}}" "tar" - uses: actions/upload-artifact@v6 with: name: c3-openbsd-${{matrix.build_type}} path: c3-openbsd-${{matrix.build_type}}.tar.gz build-netbsd: runs-on: ubuntu-latest strategy: fail-fast: false matrix: build_type: [Release, Debug] version: ['10.1'] steps: - uses: actions/checkout@v6 - name: Build, Test and Package in NetBSD uses: vmactions/netbsd-vm@v1 with: sync: rsync usesh: true release: ${{ matrix.version }} prepare: | export PATH="/usr/pkg/sbin:/usr/pkg/bin:$PATH" export PKG_PATH="https://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/$(uname -m)/$(uname -r)/All/" /usr/sbin/pkg_add pkgin pkgin -y update pkgin -y install cmake gcc14 ninja-build bash \ 'llvm>=${{ env.LLVM_RELEASE_VERSION_NETBSD }}' \ 'clang>=${{ env.LLVM_RELEASE_VERSION_NETBSD }}' \ 'lld>=${{ env.LLVM_RELEASE_VERSION_NETBSD }}' run: | export PATH="/usr/pkg/sbin:/usr/pkg/bin:$PATH" export CC=clang export CXX=clang++ cd "$GITHUB_WORKSPACE" # Build cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{matrix.build_type}} cmake --build build # Run Unified Tests chmod +x scripts/tools/ci_tests.sh ./scripts/tools/ci_tests.sh "./build/c3c" # Package chmod +x scripts/tools/package_build.sh ./scripts/tools/package_build.sh "./build/c3c" "c3-netbsd-${{matrix.build_type}}" "tar" - uses: actions/upload-artifact@v6 with: name: c3-netbsd-${{matrix.build_type}} path: c3-netbsd-${{matrix.build_type}}.tar.gz build-with-docker: runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: ubuntu_version: [20.04, 22.04] build_type: [Release, Debug] llvm_version: [17, 18, 19] steps: - uses: actions/checkout@v6 - uses: docker/setup-buildx-action@v3 - name: Build run: | chmod +x ./build-with-docker.sh LLVM_VERSION=${{ matrix.llvm_version }} UBUNTU_VERSION=${{ matrix.ubuntu_version }} CMAKE_BUILD_TYPE=${{ matrix.build_type }} ./build-with-docker.sh - name: Run Unified Tests in Docker run: | chmod +x ./scripts/tools/ci_tests.sh docker run --rm \ -u 0 \ -v "$(pwd):/home/c3c/source" \ -w /home/c3c/source \ c3c-builder \ bash -c "./scripts/tools/ci_tests.sh ./bin/c3c" build-nix: runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: build_type: [ Release, Debug ] nixpkgs: [ Lock, Latest ] steps: - uses: actions/checkout@v6 - uses: cachix/install-nix-action@v31 with: github_access_token: ${{ secrets.GITHUB_TOKEN }} - name: Update flake if: matrix.nixpkgs == 'Latest' run: nix flake update - name: CMake build and run Unified Tests run: | CHECK_NAME=".#c3c-checks" if [[ ${{ matrix.build_type }} = "Debug" ]]; then CHECK_NAME=".#c3c-debug-checks"; fi nix build -L "$CHECK_NAME" release: runs-on: ubuntu-22.04 needs: [build-msvc, build-linux, build-mac, build-linux-alpine, build-openbsd, build-netbsd] if: github.ref == 'refs/heads/master' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v6 - uses: actions/download-artifact@v4 - name: Prepare Assets run: | # --- Release Assets --- mv c3-windows-Release/c3-windows-Release.zip c3-windows.zip mv c3-macos-Release/c3-macos-Release.zip c3-macos.zip mv c3-linux-Release/c3-linux-Release.tar.gz c3-linux.tar.gz mv c3-linux-musl-Release/c3-linux-musl-Release.tar.gz c3-linux-musl.tar.gz mv c3-openbsd-Release/c3-openbsd-Release.tar.gz c3-openbsd.tar.gz || true mv c3-netbsd-Release/c3-netbsd-Release.tar.gz c3-netbsd.tar.gz || true # --- Debug Assets --- mv c3-windows-Debug/c3-windows-Debug.zip c3-windows-debug.zip mv c3-macos-Debug/c3-macos-Debug.zip c3-macos-debug.zip mv c3-linux-Debug/c3-linux-Debug.tar.gz c3-linux-debug.tar.gz mv c3-linux-musl-Debug/c3-linux-musl-Debug.tar.gz c3-linux-musl-debug.tar.gz mv c3-openbsd-Debug/c3-openbsd-Debug.tar.gz c3-openbsd-debug.tar.gz || true mv c3-netbsd-Debug/c3-netbsd-Debug.tar.gz c3-netbsd-debug.tar.gz || true - run: gh release delete latest-prerelease-tag --cleanup-tag -y || true - run: echo "RELEASE_NAME=latest-prerelease-$(date +'%Y%m%d-%H%M')" >> $GITHUB_ENV - uses: softprops/action-gh-release@v2 with: tag_name: latest-prerelease-tag name: ${{ env.RELEASE_NAME }} prerelease: true files: | c3-windows.zip c3-macos.zip c3-linux.tar.gz c3-linux-musl.tar.gz c3-openbsd.tar.gz c3-netbsd.tar.gz # --- Debug Artifacts --- c3-windows-debug.zip c3-macos-debug.zip c3-linux-debug.tar.gz c3-linux-musl-debug.tar.gz c3-openbsd-debug.tar.gz c3-netbsd-debug.tar.gz