build #167
This file contains hidden or 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: build | |
| on: | |
| pull_request: | |
| branches: [main] | |
| push: | |
| branches: [main] | |
| workflow_dispatch: | |
| # Не держим в очереди старые ребилды одного и того же PR — отменяем их. | |
| concurrency: | |
| group: build-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| # --------------------------------------------------------------------------- | |
| # Linux job — быстрый. Делает реальный correctness-чек (cross-toolchain GCC | |
| # 15.x в готовом контейнере). Падает при любом warning'е, который у нас в | |
| # CFLAGS не whitelisted, но Wall/Wextra — не -Werror, так что warnings | |
| # пройдут, упадёт только при настоящих ошибках компиляции/линковки. | |
| # --------------------------------------------------------------------------- | |
| build-linux: | |
| name: Linux (Ubuntu, cross-gcc container) | |
| runs-on: ubuntu-latest | |
| container: | |
| image: randomdude/gcc-cross-x86_64-elf:latest | |
| steps: | |
| - name: Install host build tools | |
| run: | | |
| set -eux | |
| apt-get update | |
| apt-get install -y --no-install-recommends \ | |
| nasm xorriso make python3 git ca-certificates | |
| ln -sf /usr/bin/python3 /usr/local/bin/python | |
| - name: Checkout (with submodules) | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Show toolchain versions | |
| run: | | |
| x86_64-elf-gcc --version | head -1 | |
| x86_64-elf-ld --version | head -1 | |
| nasm --version | |
| xorriso --version 2>&1 | head -1 | |
| make --version | head -1 | |
| - name: Build (make ci) | |
| run: | | |
| set -eux | |
| make -j"$(nproc)" ci | |
| - name: Sanity-check artefacts | |
| run: | | |
| set -eux | |
| test -f kernel.elf | |
| test -f equos.iso | |
| test -f iso_root/sys/kernel.elf | |
| test -f iso_root/bin/sysgui.elf | |
| test -f iso_root/bin/doom.elf | |
| test -f iso_root/bin/snake.elf | |
| test -f iso_root/res/sysgui/init.lua | |
| ls -lh kernel.elf equos.iso | |
| - name: Upload ISO artefact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: equos-iso-linux-${{ github.sha }} | |
| path: | | |
| equos.iso | |
| kernel.elf | |
| if-no-files-found: error | |
| retention-days: 14 | |
| # --------------------------------------------------------------------------- | |
| # Windows job — проверяет, что Makefile / shell-эскейпы / cmd-flow всё ещё | |
| # работают на той же платформе, что использует мейнтейнер локально. | |
| # Toolchain — статически слинкованный x86_64-elf cross-gcc 7.1 от lordmilko. | |
| # Кэшируем zip, чтобы не качать 280 МБ на каждый PR. | |
| # --------------------------------------------------------------------------- | |
| build-windows: | |
| name: Windows (windows-latest, x86_64-elf-tools) | |
| runs-on: windows-latest | |
| env: | |
| TOOLCHAIN_VERSION: 7.1.0 | |
| TOOLCHAIN_URL: https://github.com/lordmilko/i686-elf-tools/releases/download/7.1.0/x86_64-elf-tools-windows.zip | |
| TOOLCHAIN_DIR: C:\opt\x86_64-elf-tools | |
| steps: | |
| - name: Checkout (with submodules) | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Install nasm + make via Chocolatey | |
| shell: pwsh | |
| run: | | |
| choco install -y --no-progress nasm make | |
| # NASM кладёт себя сюда: | |
| Add-Content $env:GITHUB_PATH 'C:\Program Files\NASM' | |
| - name: Install xorriso via MSYS2 | |
| shell: pwsh | |
| run: | | |
| # На windows-latest уже стоит MSYS2 в C:\msys64. Просто синкаем | |
| # репы и ставим xorriso. Заодно докидываем bash-утилиты в PATH | |
| # — Makefile они не используют, но xorriso.exe там же. | |
| & 'C:\msys64\usr\bin\pacman.exe' -Sy --noconfirm | |
| & 'C:\msys64\usr\bin\pacman.exe' -S --noconfirm --needed xorriso | |
| Add-Content $env:GITHUB_PATH 'C:\msys64\usr\bin' | |
| # Кэшируем только сам zip (один файл ~280 МБ), а распаковываем | |
| # каждый раз 7-Zip'ом. На Windows это в разы быстрее, чем кэшировать | |
| # распакованную директорию (тысячи мелких файлов) или использовать | |
| # Expand-Archive (он жутко тормозит на больших архивах). | |
| - name: Cache toolchain zip | |
| id: cache-toolchain | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ runner.temp }}\toolchain.zip | |
| key: x86_64-elf-tools-windows-${{ env.TOOLCHAIN_VERSION }}-zip-v2 | |
| - name: Download toolchain zip (cache miss) | |
| if: steps.cache-toolchain.outputs.cache-hit != 'true' | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = 'Stop' | |
| $zip = Join-Path $env:RUNNER_TEMP 'toolchain.zip' | |
| Write-Host "Downloading $env:TOOLCHAIN_URL -> $zip" | |
| # curl.exe качает GH releases быстрее, чем Invoke-WebRequest | |
| # (тот по умолчанию буферизует в память и тормозит на больших файлах). | |
| curl.exe -L --fail --silent --show-error -o $zip $env:TOOLCHAIN_URL | |
| Get-Item $zip | Format-List Length | |
| - name: Extract toolchain with 7-Zip | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = 'Stop' | |
| $zip = Join-Path $env:RUNNER_TEMP 'toolchain.zip' | |
| New-Item -ItemType Directory -Force -Path $env:TOOLCHAIN_DIR | Out-Null | |
| # 7-Zip предустановлен на windows-latest и распаковывает в ~5x | |
| # быстрее, чем Expand-Archive (Compress.FileSystem). | |
| & 'C:\Program Files\7-Zip\7z.exe' x $zip "-o$($env:TOOLCHAIN_DIR)" -y -bso0 -bsp0 | |
| if ($LASTEXITCODE -ne 0) { throw "7z extraction failed: $LASTEXITCODE" } | |
| - name: Add cross-toolchain to PATH | |
| shell: pwsh | |
| run: | | |
| Add-Content $env:GITHUB_PATH "$env:TOOLCHAIN_DIR\bin" | |
| - name: Show toolchain versions | |
| shell: cmd | |
| run: | | |
| x86_64-elf-gcc --version | |
| x86_64-elf-ld --version | |
| nasm --version | |
| xorriso --version 2>&1 | |
| make --version | |
| - name: Build (make ci) | |
| shell: cmd | |
| # Параллелизация make на Windows со spawn'ом cmd.exe в каждом | |
| # рецепте — нестабильна (race на mkdir). Поэтому без -j. | |
| run: make ci | |
| - name: Sanity-check artefacts | |
| shell: cmd | |
| run: | | |
| if not exist kernel.elf ( echo missing kernel.elf & exit /b 1 ) | |
| if not exist equos.iso ( echo missing equos.iso & exit /b 1 ) | |
| if not exist iso_root\sys\kernel.elf ( echo missing iso_root\sys\kernel.elf & exit /b 1 ) | |
| if not exist iso_root\bin\sysgui.elf ( echo missing sysgui.elf & exit /b 1 ) | |
| if not exist iso_root\bin\doom.elf ( echo missing doom.elf & exit /b 1 ) | |
| if not exist iso_root\bin\snake.elf ( echo missing snake.elf & exit /b 1 ) | |
| if not exist iso_root\res\sysgui\init.lua ( echo missing init.lua & exit /b 1 ) | |
| dir kernel.elf equos.iso | |
| - name: Upload ISO artefact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: equos-iso-windows-${{ github.sha }} | |
| path: | | |
| equos.iso | |
| kernel.elf | |
| if-no-files-found: error | |
| retention-days: 14 |