name: Build Vinix

on:
  workflow_call:
  pull_request:
    paths-ignore:
      - '**.md'
      - '**.yml'
      - '!**/vinix_ci.yml'
      - 'cmd/tools/vrepl.v'
  push:
    branches:
      - master
    paths-ignore:
      - '**.md'
      - '**.yml'
      - '!**/vinix_ci.yml'
      - 'cmd/tools/vrepl.v'

concurrency:
  group: vinix-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  vinix-build:
    runs-on: ubuntu-24.04
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - name: Build V
        run: make -j4 && ./v symlink

      - name: Install dependencies
        run: |
          v retry -- sudo apt update
          v retry -- sudo apt install build-essential -y

      - name: Clone current Vinix
        run: v retry -- git clone --depth=1 https://github.com/vlang/vinix.git

      - name: Download Vinix kernel dependencies
        run: cd vinix/kernel && v retry -- ./get-deps

      - name: Attempt to build the Vinix kernel (debug)
        run: |
          set -e
          cd vinix/kernel
          make PROD=false \
            CFLAGS="-Ulinux -U__linux -U__linux__ -U__gnu_linux__ -D__vinix__ -O2 -g -pipe" \
            V="$(realpath ../../v)"
          make clean

      - name: Attempt to build the Vinix kernel (prod)
        run: |
          set -e
          cd vinix/kernel
          make PROD=true \
            CFLAGS="-Ulinux -U__linux -U__linux__ -U__gnu_linux__ -D__vinix__ -O2 -g -pipe" \
            V="$(realpath ../../v)"
          make clean

      - name: Attempt to build the util-vinix (debug)
        run: |
          set -e
          cd vinix/util-vinix
          make PROD=false \
            VFLAGS="-os vinix -gc none" \
            CFLAGS="-Ulinux -U__linux -U__linux__ -U__gnu_linux__ -D__vinix__ -O2 -g -pipe" \
            V="$(realpath ../../v)"
          make clean

      - name: Attempt to build the util-vinix (prod)
        run: |
          set -e
          cd vinix/util-vinix
          make PROD=true \
            VFLAGS="-os vinix -gc none" \
            CFLAGS="-Ulinux -U__linux -U__linux__ -U__gnu_linux__ -D__vinix__ -O2 -g -pipe" \
            V="$(realpath ../../v)"
          make clean
