Skip to content

build

build #167

Workflow file for this run

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