xserver/.github/workflows/build-xserver.yml
Enrico Weigelt, metux IT consult 627b6da5a2
Some checks failed
Build X servers / ubuntu-fetch-pkg (push) Has been cancelled
Build X servers / xserver-build-ubuntu-no-gbm (push) Has been cancelled
Build X servers / xserver-build-ubuntu (push) Has been cancelled
Build X servers / abi-changes-check (push) Has been cancelled
Build X servers / xserver-build-ubuntu-debug (push) Has been cancelled
Build X servers / ubuntu-deps-image (push) Has been cancelled
Build X servers / build-sdk-image (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-elographics:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-evdev:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-joystick:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-keyboard:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-libinput:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-mouse:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-synaptics:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-vmmouse:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-void:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-wacom:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-amdgpu:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-apm:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-ark:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-ast:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-ati:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-chips:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-cirrus:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-dummy:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-fbdev:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-freedreno:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-geode:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-i128:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-i740:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-intel:25.0.1) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-mach64:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-mga:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-neomagic:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-nested:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-nouveau:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-nv:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-omap:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-qxl:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-r128:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-rendition:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-s3virge:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-savage:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-siliconmotion:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sis:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sisusb:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suncg14:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suncg3:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suncg6:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sunffb:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sunleo:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suntcx:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-tdfx:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-trident:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-v4l:25.0.1) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-vbox:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-vesa:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-vmware:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-voodoo:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-xgi:25.0.0) (push) Has been cancelled
Build X servers / xserver-build-mingw32-ubuntu (push) Has been cancelled
Build X servers / xserver-build-macos (push) Has been cancelled
Build X servers / xserver-build-freebsd (push) Has been cancelled
Build X servers / xserver-build-dragonflybsd (push) Has been cancelled
Build X servers / xserver-build-netbsd (push) Has been cancelled
Build X servers / xserver-build-solaris (push) Has been cancelled
Build X servers / xserver-build-openbsd (push) Has been cancelled
Build X servers / xserver-build-hurd (push) Has been cancelled
Build X servers / xserver-build-alpine (push) Has been cancelled
Build X servers / gentoo-deps-image (push) Has been cancelled
Build X servers / xserver-build-gentoo (push) Has been cancelled
Build X servers / xserver-build-rhel (10) (push) Has been cancelled
Build X servers / xserver-build-rhel (9) (push) Has been cancelled
Build X servers / xserver-build-cygwin (push) Has been cancelled
Build X servers / xserver-build-arch (push) Has been cancelled
Build X servers / Check Signed-Off-By (push) Has been cancelled
Build X servers / Release pushed tag (push) Has been cancelled
check PRs for merge conflicts / notify (push) Has been cancelled
.github: content-address all deps images, drop standalone image builders
Make every CI base image content-addressed and built-if-missing, and
fold the three standalone image-builder workflows into the main "Build
X servers" pipeline.

Previously the gentoo / ubuntu base images and the SDK image were built
by their own workflows (gentoo-image.yml, ubuntu-deps-image.yml,
sdk-image.yml). Those rebuilt the full image on every branch that
touched the relevant paths (and a brand-new branch matched the push
path filter spuriously), wasting ~15-22 min per run; and a WIP branch
that changed the deps still consumed master's :latest base, so its build
could be stale.

Now each deps image gets a tag derived from a hash of its build inputs
and is built only when that exact tag is missing in GHCR:

  - gentoo-deps-image  : tag = hash(gentoo Dockerfile)
  - ubuntu-deps-image  : tag = hash(ubuntu Dockerfile + install-pkg.sh +
                                    install-prereq.sh + conf.sh + util.sh)

An unchanged image is reused on ANY branch via a few-second
`docker manifest inspect` existence check (no rebuild); a branch that
edits the deps automatically gets its own image — no waste and no
staleness. :latest is moved only by master.

The per-commit SDK (build-sdk-image) now builds FROM the content-hashed
ubuntu base: the SDK Dockerfile takes `ARG BASE` and the job passes
`--build-arg BASE=…/xserver-ubuntu-build:<hash>`, so a WIP branch's SDK
is built on exactly the deps that branch defines. This also makes the
standalone sdk-image.yml redundant (build-sdk-image already produces the
per-commit xserver-sdk:<sha> that the driver jobs consume), so it is
removed too.

ubuntu-deps-image is gated like build-sdk-image (its only consumer),
i.e. it runs when the ABI changed or on a tag. prune-sdk-images.yml is
kept (it still prunes accumulated xserver-sdk:<sha> tags).

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2026-06-30 17:47:36 +02:00

930 lines
40 KiB
YAML

name: Build X servers
permissions:
contents: write
env:
MESON_BUILDDIR: "__BUILD"
X11_PREFIX: /home/runner/x11
X11_BUILD_DIR: /home/runner/work/xserver/xserver/WORK/sources/3rdparty
GOXPROTO_REF: v0.0.4
on:
push:
pull_request:
# If a ref is pushed again (or a PR gets a new commit) while its previous run is
# still in flight, cancel the stale run — only the newest commit needs building.
# Keyed by ref, so each branch/PR is independent.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
ubuntu-fetch-pkg:
# De-duplicate PR runs without a branch-name convention: on a same-repo
# pull_request the branch's own push event already builds it, so skip the
# redundant build here. Fork PRs raise no push event in this repo, so
# they still build. Every build job chains off this root (and the three
# other no-needs roots below), so skipping it skips them too. Normal
# branch pushes are unaffected — they build exactly as before, and the
# push run's checks still populate the PR's status indicator.
if: >-
github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name != github.repository
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-fetch-pkg
xserver-build-ubuntu-no-gbm:
env:
MESON_ARGS: -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true -Dgbm=false -Dxorg=true -Dxvfb=true -Dxnest=true -Dxfbdev=true -Dtest_xephyr_gles=false
LIBGL_ALWAYS_SOFTWARE: 1
GALLIUM_DRIVER: llvmpipe
PIGLIT_PLATFORM: x11_egl
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
steps:
- name: Check out repository code
uses: actions/checkout@v4
- uses: ./.github/actions/ubuntu-install-pkg
- name: prepare build environment
run: |
MACHINE=`gcc -dumpmachine`
echo "MACHINE=$MACHINE" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/$MACHINE/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
sudo chown root /bin/tar && sudo chmod u+s /bin/tar
- name: X11 prereq cache
uses: actions/cache@v5
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
${{ env.X11_BUILD_DIR }}/goxproto
key: ${{ runner.name }}-x11-deps-${{ hashFiles('.github/scripts/ubuntu/install-prereq.sh') }}
restore-keys: ${{ runner.name }}-x11-deps-
- name: build and test
run: .github/scripts/ubuntu/run-xserver-build-and-test.sh
- name: archive build logs
uses: actions/upload-artifact@v4
with:
name: build-logs
path: |
__BUILD/meson-logs/*
__BUILD/test/piglit-results/*
xserver-build-ubuntu:
env:
MESON_ARGS: -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true -Dxorg=true -Dxvfb=true -Dxnest=true -Dxfbdev=true -Dtest_xephyr_gles=false
LIBGL_ALWAYS_SOFTWARE: 1
GALLIUM_DRIVER: llvmpipe
PIGLIT_PLATFORM: x11_egl
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
steps:
- name: Check out repository code
uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-install-pkg
- name: prepare build environment
run: |
MACHINE=`gcc -dumpmachine`
echo "MACHINE=$MACHINE" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/$MACHINE/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
- name: X11 prereq cache
uses: actions/cache@v5
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
${{ env.X11_BUILD_DIR }}/goxproto
key: ${{ runner.name }}-x11-deps-${{ hashFiles('.github/scripts/ubuntu/install-prereq.sh') }}
restore-keys: ${{ runner.name }}-x11-deps-
- name: build and test
run: .github/scripts/ubuntu/run-xserver-build-and-test.sh
- name: archive build logs
uses: actions/upload-artifact@v4
with:
name: build-logs
path: |
__BUILD/meson-logs/*
__BUILD/test/piglit-results/*
abi-changes-check:
runs-on: ubuntu-latest
outputs:
abi_changed: ${{ steps.filter.outputs.abi_changed }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
abi_changed:
- 'include/**'
- 'meson.build'
- 'meson_options.txt'
- 'xorg-server.pc.in'
- 'xlibre-server.pc.in'
- 'xorg-server.m4'
- 'hw/xfree86/xlibre-server.h.meson.in'
- 'hw/xfree86/drivers/input/inputtest/xf86-input-inputtest-protocol.h'
xserver-build-ubuntu-debug:
env:
MESON_ARGS: --buildtype=debug -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true -Dxorg=true -Dxvfb=true -Dxnest=true -Dxfbdev=true -Dtest_xephyr_gles=false
LIBGL_ALWAYS_SOFTWARE: 1
GALLIUM_DRIVER: llvmpipe
PIGLIT_PLATFORM: x11_egl
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
steps:
- name: Check out repository code
uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-install-pkg
- name: prepare build environment
run: |
MACHINE=`gcc -dumpmachine`
echo "MACHINE=$MACHINE" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/$MACHINE/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
- name: X11 prereq cache
uses: actions/cache@v5
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
key: ${{ runner.name }}-x11-deps-${{ hashFiles('.github/scripts/ubuntu/install-prereq.sh') }}
restore-keys: ${{ runner.name }}-x11-deps-
- name: build and test
run: .github/scripts/ubuntu/run-xserver-build-and-test.sh
- name: archive build logs
uses: actions/upload-artifact@v4
with:
name: build-logs-debug
path: |
__BUILD/meson-logs/*
__BUILD/test/piglit-results/*
ubuntu-deps-image:
# Content-addressed base image (apt deps + from-source prereqs baked in),
# consumed by build-sdk-image below. The tag is a hash of the image's
# build inputs (Dockerfile + the install scripts + conf.sh/util.sh), and
# we build only if that tag is missing — an unchanged image is reused on
# ANY branch (a few-second existence check, no ~15min rebuild); a branch
# that changes the deps automatically gets its own image, so the SDK it
# builds is never stale. :latest is only moved by master. Replaces the
# standalone ubuntu-deps-image.yml. Gated like build-sdk-image since the
# SDK is its only consumer.
runs-on: ubuntu-latest
needs: abi-changes-check
if: needs.abi-changes-check.outputs.abi_changed == 'true' || startsWith(github.ref, 'refs/tags/')
permissions:
contents: read
packages: write
outputs:
tag: ${{ steps.tag.outputs.tag }}
steps:
- uses: actions/checkout@v6
- id: tag
run: |
echo "tag=$(cat .github/docker/ubuntu/Dockerfile \
.github/scripts/ubuntu/install-pkg.sh \
.github/scripts/ubuntu/install-prereq.sh \
.github/scripts/conf.sh \
.github/scripts/util.sh \
| sha256sum | cut -c1-16)" >> "$GITHUB_OUTPUT"
- name: Log in to GHCR
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
- name: Build ubuntu deps image if missing
run: |
set -eux
img="ghcr.io/$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')/xserver-ubuntu-build"
tag="${{ steps.tag.outputs.tag }}"
if docker manifest inspect "$img:$tag" >/dev/null 2>&1; then
echo "image $img:$tag already exists — reusing"
else
docker build -t "$img:$tag" -f .github/docker/ubuntu/Dockerfile .
docker push "$img:$tag"
if [ "${{ github.ref }}" = "refs/heads/master" ]; then
docker tag "$img:$tag" "$img:latest"
docker push "$img:latest"
fi
fi
build-sdk-image:
# Build the X-server + SDK from this commit and push it to GHCR as
# xserver-sdk:<sha>; the driver builds below run in that image. Replaces
# the old drivers-prepare-ubuntu + actions/cache, whose SDK cache could
# be evicted under load before the queued driver jobs restored it (then
# the whole pipeline had to be re-run by hand). A registry image is not
# subject to that LRU eviction.
runs-on: ubuntu-latest
needs:
- ubuntu-fetch-pkg
- abi-changes-check
- ubuntu-deps-image
if: needs.abi-changes-check.outputs.abi_changed == 'true' || startsWith(github.ref, 'refs/tags/')
permissions:
contents: read
packages: write
steps:
- name: Check out repository code
uses: actions/checkout@v6
- name: Log in to GHCR
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
- name: Build and push SDK image (xserver-sdk:<sha>)
run: |
set -eux
owner="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')"
base="ghcr.io/$owner/xserver-ubuntu-build:${{ needs.ubuntu-deps-image.outputs.tag }}"
img="ghcr.io/$owner/xserver-sdk"
docker build --build-arg BASE="$base" -t "$img:${GITHUB_SHA}" -f .github/docker/sdk/Dockerfile .
docker push "$img:${GITHUB_SHA}"
drivers-build-ubuntu:
needs:
- build-sdk-image
- abi-changes-check
if: needs.abi-changes-check.outputs.abi_changed == 'true' || startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
# The SDK + prereqs live at /opt/x11 in the image; override the
# workflow-level X11_PREFIX (which points at the host /home/runner path)
# so conf.sh derives PKG_CONFIG_PATH from the in-image prefix.
env:
X11_PREFIX: /opt/x11
X11_BUILD_DIR: /opt/x11-build
# Run in the per-commit SDK image: the xserver SDK + all build deps are
# baked in under /opt/x11, so each driver job only compiles the driver
# (no apt, no prereq build, no cache restore). The image is public, so it
# pulls anonymously — no credentials / packages permission needed.
container:
image: ghcr.io/x11libre/xserver-sdk:${{ github.sha }}
strategy:
matrix:
driver:
- input-elographics:25.0.0
- input-evdev:25.0.0
- input-joystick:25.0.0
- input-keyboard:25.0.0
- input-libinput:25.0.0
- input-mouse:25.0.0
- input-synaptics:25.0.0
- input-vmmouse:25.0.0
- input-void:25.0.0
- input-wacom:25.0.0
- video-amdgpu:25.0.0
- video-apm:25.0.0
- video-ark:25.0.0
- video-ast:25.0.0
- video-ati:25.0.0
- video-chips:25.0.0
- video-cirrus:25.0.0
- video-dummy:25.0.0
- video-fbdev:25.0.0
- video-freedreno:25.0.0
- video-geode:25.0.0
- video-i128:25.0.0
- video-i740:25.0.0
- video-intel:25.0.1
- video-mach64:25.0.0
- video-mga:25.0.0
- video-neomagic:25.0.0
- video-nested:25.0.0
- video-nouveau:25.0.0
- video-nv:25.0.0
- video-omap:25.0.0
- video-qxl:25.0.0
- video-r128:25.0.0
- video-rendition:25.0.0
- video-s3virge:25.0.0
- video-savage:25.0.0
- video-siliconmotion:25.0.0
- video-sis:25.0.0
- video-sisusb:25.0.0
- video-suncg14:25.0.0
- video-suncg3:25.0.0
- video-suncg6:25.0.0
- video-sunffb:25.0.0
- video-suntcx:25.0.0
- video-sunleo:25.0.0
- video-tdfx:25.0.0
- video-trident:25.0.0
- video-vesa:25.0.0
- video-vmware:25.0.0
- video-v4l:25.0.1
- video-vbox:25.0.0
- video-voodoo:25.0.0
- video-xgi:25.0.0
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: compile driver ${{ matrix.driver }}
run: .github/scripts/ubuntu/compile-driver-single.sh ${{ matrix.driver }}
xserver-build-mingw32-ubuntu:
runs-on: ubuntu-latest
env:
MESON_ARGS: -Dprefix=/home/runner/x11 --cross-file=.github/scripts/mingw32/cross-i686-w64-mingw32.txt -Dwerror=true -Dglx=false -Dlisten_tcp=true -Dxvmc=true -Dxv=true -Dxvfb=true -Dxnest=true -Dxephyr=true -Dxfbdev=false
needs: ubuntu-fetch-pkg
steps:
- name: Check out repository code
uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-install-pkg
- name: prepare build environment
run: |
MACHINE=`gcc -dumpmachine`
echo "MACHINE=$MACHINE" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/$MACHINE/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
- name: X11 prereq cache
uses: actions/cache@v5
with:
path: |
${{ env.X11_PREFIX }}
${{ env.X11_BUILD_DIR }}/xts
${{ env.X11_BUILD_DIR }}/piglit
key: ${{ runner.name }}-x11-deps-${{ hashFiles('.github/scripts/mingw32/cross-prereqs-build.sh') }}
restore-keys: ${{ runner.name }}-x11-deps-
- name: install crosscompiler
run: sudo apt-get install -y mingw-w64-tools gcc-mingw-w64 gcc-mingw-w64-i686 libz-mingw-w64-dev
- name: cross prereq
run: sudo .github/scripts/mingw32/cross-prereqs-build.sh i686-w64-mingw32
- name: build
run: .github/scripts/meson-build.sh --run-install
xserver-build-macos:
# skip the redundant same-repo PR rebuild (see ubuntu-fetch-pkg)
if: >-
github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name != github.repository
env:
MESON_ARGS: -Dprefix=/tmp -Dglx=false -Dxnest=false -Dxfbdev=false
X11_PREFIX: /Users/runner/x11
X11_BUILD_DIR: /Users/runner/build-deps
runs-on: macos-latest
steps:
- name: Check out repository code
uses: actions/checkout@v6
- name: prepare build environment
run: |
echo "PKG_CONFIG_PATH=$X11_PREFIX/share/pkgconfig:$X11_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" >> "$GITHUB_ENV"
- name: homebrew cache
uses: actions/cache@v5
with:
path: /Users/runner/Library/Caches/Homebrew
key: ${{ runner.os }}-homebrew-cache-${{ hashFiles('.github/scripts/macos/install-pkg.sh') }}
restore-keys: ${{ runner.os }}-homebrew-cache-
- name: pkg install
run: .github/scripts/macos/install-pkg.sh
- name: X11 prereq cache
uses: actions/cache@v5
with:
path: |
${{ env.X11_PREFIX }}
key: ${{ runner.os }}-x11-deps-${{ hashFiles('.github/scripts/macos/install-prereq.sh') }}
restore-keys: ${{ runner.os }}-x11-deps-
- name: generic prereq
run: .github/scripts/macos/install-prereq.sh
- name: build
run: .github/scripts/meson-build.sh
- name: tests (may fail)
continue-on-error: true
run: meson test -C "${{ env.MESON_BUILDDIR }}" --print-errorlogs -j1 || true
env:
XTEST_DIR: ${{ env.X11_BUILD_DIR }}/xts
PIGLIT_DIR: ${{ env.X11_BUILD_DIR }}/piglit
- name: archive build logs
uses: actions/upload-artifact@v4
with:
name: build-logs-macos
path: |
__BUILD/meson-logs/*
__BUILD/test/piglit-results/*
- name: ddx build check
run: .github/scripts/check-ddx-build.sh
- name: manpage check
run: .github/scripts/manpages-check
xserver-build-freebsd:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
timeout-minutes: 90
env:
MYTOKEN : ${{ secrets.MYTOKEN }}
MESON_ARGS: -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true -Dxorg=true -Dxvfb=true -Dxnest=true -Dxfbdev=false
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-pkg-cache
# VM boot / image provisioning flakes transiently; retry the whole
# VM step up to 3x, tearing down the leftover domain between tries
# (see .github/actions/libvirt-cleanup). Only the last attempt is
# allowed to fail the job; a success short-circuits the rest.
- name: run in freebsd VM (attempt 1)
id: freebsd-1
continue-on-error: true
uses: vmactions/freebsd-vm@v1
with:
envs: 'MYTOKEN MESON_ARGS'
usesh: true
release: "14.3"
run: ./.github/scripts/freebsd/run-xserver-build.sh
- name: cleanup stale VM before retry
if: steps.freebsd-1.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: freebsd
- name: run in freebsd VM (attempt 2)
id: freebsd-2
if: steps.freebsd-1.outcome == 'failure'
continue-on-error: true
uses: vmactions/freebsd-vm@v1
with:
envs: 'MYTOKEN MESON_ARGS'
usesh: true
release: "14.3"
run: ./.github/scripts/freebsd/run-xserver-build.sh
- name: cleanup stale VM before final retry
if: steps.freebsd-1.outcome == 'failure' && steps.freebsd-2.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: freebsd
- name: run in freebsd VM (attempt 3)
if: steps.freebsd-1.outcome == 'failure' && steps.freebsd-2.outcome == 'failure'
uses: vmactions/freebsd-vm@v1
with:
envs: 'MYTOKEN MESON_ARGS'
usesh: true
release: "14.3"
run: ./.github/scripts/freebsd/run-xserver-build.sh
xserver-build-dragonflybsd:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
timeout-minutes: 90
env:
MESON_ARGS: -Dwerror=true -Dxephyr=true -Dxorg=true -Dxvfb=true -Dxnest=true -Dxfbdev=false
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-pkg-cache
# VM boot / image provisioning flakes transiently; retry the whole
# VM step up to 3x, tearing down the leftover domain between tries
# (see .github/actions/libvirt-cleanup). Without that teardown the
# retry collides with attempt 1's leftover VM
# ("Guest name 'dragonflybsd' is already in use") and times out.
- name: run in DragonFlyBSD VM (attempt 1)
id: dfly-1
continue-on-error: true
uses: vmactions/dragonflybsd-vm@v1.1.4
with:
envs: 'MESON_ARGS'
usesh: true
release: "6.4.2"
run: ./.github/scripts/DragonFlyBSD/run-xserver-build.sh
- name: cleanup stale VM before retry
if: steps.dfly-1.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: dragonflybsd
- name: run in DragonFlyBSD VM (attempt 2)
id: dfly-2
if: steps.dfly-1.outcome == 'failure'
continue-on-error: true
uses: vmactions/dragonflybsd-vm@v1.1.4
with:
envs: 'MESON_ARGS'
usesh: true
release: "6.4.2"
run: ./.github/scripts/DragonFlyBSD/run-xserver-build.sh
- name: cleanup stale VM before final retry
if: steps.dfly-1.outcome == 'failure' && steps.dfly-2.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: dragonflybsd
- name: run in DragonFlyBSD VM (attempt 3)
if: steps.dfly-1.outcome == 'failure' && steps.dfly-2.outcome == 'failure'
uses: vmactions/dragonflybsd-vm@v1.1.4
with:
envs: 'MESON_ARGS'
usesh: true
release: "6.4.2"
run: ./.github/scripts/DragonFlyBSD/run-xserver-build.sh
xserver-build-netbsd:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
timeout-minutes: 90
env:
MESON_ARGS: -Dwerror=true -Dxephyr=true -Dxorg=true -Dxvfb=true -Dxnest=true -Dxfbdev=false
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-pkg-cache
# VM boot / image provisioning flakes transiently; retry the whole
# VM step up to 3x, tearing down the leftover domain between tries
# (see .github/actions/libvirt-cleanup).
- name: run in netbsd VM (attempt 1)
id: netbsd-1
continue-on-error: true
uses: vmactions/netbsd-vm@v1.2.3
with:
envs: 'MESON_ARGS'
usesh: true
release: '10.1'
run: ./.github/scripts/netbsd/run-xserver-build.sh
- name: cleanup stale VM before retry
if: steps.netbsd-1.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: netbsd
- name: run in netbsd VM (attempt 2)
id: netbsd-2
if: steps.netbsd-1.outcome == 'failure'
continue-on-error: true
uses: vmactions/netbsd-vm@v1.2.3
with:
envs: 'MESON_ARGS'
usesh: true
release: '10.1'
run: ./.github/scripts/netbsd/run-xserver-build.sh
- name: cleanup stale VM before final retry
if: steps.netbsd-1.outcome == 'failure' && steps.netbsd-2.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: netbsd
- name: run in netbsd VM (attempt 3)
if: steps.netbsd-1.outcome == 'failure' && steps.netbsd-2.outcome == 'failure'
uses: vmactions/netbsd-vm@v1.2.3
with:
envs: 'MESON_ARGS'
usesh: true
release: '10.1'
run: ./.github/scripts/netbsd/run-xserver-build.sh
# illumos / Solaris build, run in an OpenIndiana VM (vmactions, same
# mechanism as the BSD jobs above). Exercises the Solaris-specific os/ code
# paths (procfs/psinfo, the sunos meson branch) that no other CI covers.
# OpenIndiana packages the full X stack incl. Mesa, so GLX stays enabled.
# werror is off for now since this platform is freshly added; tighten once
# it is green.
xserver-build-solaris:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
env:
# dri2/dri3 disabled: illumos has no kernel DRM/KMS, so the
# libdrm-backed direct-rendering extensions can't work (and OI's
# xf86drm.h pulls a drm.h that only exists for Linux). glx stays on
# (Mesa is packaged) for indirect/software GLX.
MESON_ARGS: -Dwerror=false -Dxvfb=true -Dxnest=true -Dxorg=false -Dxephyr=false -Dxfbdev=false -Ddri2=false -Ddri3=false
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-pkg-cache
- name: run in OpenIndiana (illumos) VM
id: vm
uses: vmactions/openindiana-vm@v1
with:
envs: 'MESON_ARGS'
usesh: true
run: ./.github/scripts/solaris/run-xserver-build.sh
# OpenBSD build, run in an OpenBSD VM (vmactions, same mechanism as the
# other BSD jobs). OpenBSD ships X.Org (xenocara) in base, so only build
# tooling is installed; X libs (incl. Mesa) come from /usr/X11R6. glx stays
# enabled (indirect/software GLX against the base Mesa); dri2/dri3 stay off
# (direct rendering needs a working DRM/KMS, n/a in the headless VM).
# werror off while the platform is freshly added.
xserver-build-openbsd:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
timeout-minutes: 90
env:
MESON_ARGS: -Dwerror=false -Dxvfb=true -Dxnest=true -Dxorg=false -Dxephyr=false -Dxfbdev=false -Ddri2=false -Ddri3=false
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/ubuntu-pkg-cache
# VM boot / image provisioning flakes transiently; retry the whole
# VM step up to 3x, tearing down the leftover domain between tries
# (see .github/actions/libvirt-cleanup). Only the last attempt is
# allowed to fail the job; a success short-circuits the rest.
- name: run in OpenBSD VM (attempt 1)
id: openbsd-1
continue-on-error: true
uses: vmactions/openbsd-vm@v1
with:
envs: 'MESON_ARGS'
usesh: true
run: ./.github/scripts/openbsd/run-xserver-build.sh
- name: cleanup stale VM before retry
if: steps.openbsd-1.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: openbsd
- name: run in OpenBSD VM (attempt 2)
id: openbsd-2
if: steps.openbsd-1.outcome == 'failure'
continue-on-error: true
uses: vmactions/openbsd-vm@v1
with:
envs: 'MESON_ARGS'
usesh: true
run: ./.github/scripts/openbsd/run-xserver-build.sh
- name: cleanup stale VM before final retry
if: steps.openbsd-1.outcome == 'failure' && steps.openbsd-2.outcome == 'failure'
uses: ./.github/actions/libvirt-cleanup
with:
guest: openbsd
- name: run in OpenBSD VM (attempt 3)
if: steps.openbsd-1.outcome == 'failure' && steps.openbsd-2.outcome == 'failure'
uses: vmactions/openbsd-vm@v1
with:
envs: 'MESON_ARGS'
usesh: true
run: ./.github/scripts/openbsd/run-xserver-build.sh
xserver-build-hurd:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
timeout-minutes: 120
env:
REPO: ${{ github.repository }}
SHA: ${{ github.sha }}
steps:
- uses: actions/checkout@v6
- name: Install QEMU
run: |
sudo apt-get update
sudo apt-get install -y qemu-system-x86 qemu-utils openssh-client
- name: Boot GNU/Hurd VM and build (Xvfb + Xnest)
run: ./.github/scripts/hurd/run-vm-build.sh
xserver-build-alpine:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
container:
image: alpine:latest
env:
MESON_ARGS: -Dprefix=/usr -Dxcsecurity=true -Dxorg=true -Dxephyr=true -Dxvfb=true -Dxnest=true -Dxfbdev=false -Dsystemd_logind=false -Dwerror=false
steps:
# actions/checkout is a JS action; GitHub's bundled Node is
# glibc-linked, so musl-based Alpine needs gcompat to run it.
- name: prepare JS-action runtime
run: apk add --no-cache git gcompat libstdc++ nodejs
- name: Check out repository code
uses: actions/checkout@v6
- name: build
run: ./.github/scripts/alpine/run-xserver-build.sh
gentoo-deps-image:
# Content-addressed deps image: tag = hash of the gentoo Dockerfile, and
# build only if that tag is missing. An unchanged image is reused on ANY
# branch (a few-second existence check, no 22min rebuild); a branch that
# edits the Dockerfile automatically gets a fresh image — no waste and no
# staleness. :latest is only moved by master.
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
permissions:
contents: read
packages: write
outputs:
tag: ${{ steps.tag.outputs.tag }}
steps:
- uses: actions/checkout@v6
- id: tag
run: echo "tag=$(sha256sum .github/docker/gentoo/Dockerfile | cut -c1-16)" >> "$GITHUB_OUTPUT"
- name: Log in to GHCR
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
- name: Build gentoo deps image if missing
run: |
set -eux
img="ghcr.io/$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')/xserver-gentoo-deps"
tag="${{ steps.tag.outputs.tag }}"
if docker manifest inspect "$img:$tag" >/dev/null 2>&1; then
echo "image $img:$tag already exists — reusing"
else
docker build -t "$img:$tag" -f .github/docker/gentoo/Dockerfile .github/docker/gentoo
docker push "$img:$tag"
if [ "${{ github.ref }}" = "refs/heads/master" ]; then
docker tag "$img:$tag" "$img:latest"
docker push "$img:latest"
fi
fi
xserver-build-gentoo:
runs-on: ubuntu-latest
needs: gentoo-deps-image
# Deps image built/reused by gentoo-deps-image above, addressed by
# content hash so this always runs against matching deps. Only runs
# meson (~5 min) instead of emerging 115 packages (~20 min).
container:
image: ghcr.io/x11libre/xserver-gentoo-deps:${{ needs.gentoo-deps-image.outputs.tag }}
env:
# werror off: Gentoo's hardened toolchain (FORTIFY_SOURCE) trips
# -Werror=format-truncation in the bundled Xtrans (a bounded snprintf
# into sun_path) which other platforms don't hit. Matches the other
# freshly-added lanes (solaris/openbsd) while the platform is new.
MESON_ARGS: -Dprefix=/usr -Dwerror=false -Dxcsecurity=true -Dxorg=true -Dxephyr=true -Dxvfb=true -Dxnest=true -Dxfbdev=false -Dsystemd_logind=false
steps:
- name: Check out repository code
uses: actions/checkout@v6
- name: build
run: ./.github/scripts/gentoo/run-xserver-build.sh
xserver-build-rhel:
runs-on: ubuntu-latest
needs: ubuntu-fetch-pkg
strategy:
fail-fast: false
matrix:
rhelver: ['9', '10']
container:
# AlmaLinux is an ABI-identical RHEL rebuild; it stands in for
# RHEL here since the real UBI images can't enable CRB without
# an entitlement on public runners.
image: almalinux:${{ matrix.rhelver }}
env:
MESON_ARGS: -Dprefix=/usr -Dwerror=true -Dxcsecurity=true -Dxorg=true -Dxephyr=true -Dxvfb=true -Dxnest=true -Dxfbdev=false -Dsystemd_logind=false
steps:
- name: Check out repository code
uses: actions/checkout@v6
- name: build
run: ./.github/scripts/rhel/run-xserver-build.sh
xserver-build-cygwin:
# skip the redundant same-repo PR rebuild (see ubuntu-fetch-pkg)
if: >-
github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name != github.repository
runs-on: windows-latest
steps:
- name: Cygwin packages cache
uses: actions/cache@v5
with:
path: D:\cygwin-packages
key: ${{ runner.os }}-packages
restore-keys: ${{ runner.os }}-packages
- uses: cygwin/cygwin-install-action@master
with:
# FIXME: temporary workaround for cygwin mirror problem
# https://github.com/cygwin/cygwin-install-action/issues/39
check-installer-sig: false
platform: x86_64
site: |
https://mirror.wisegs.com/cygwin/
https://mirrors.sonic.net/cygwin/
https://mirror.cpsc.ucalgary.ca/mirror/cygwin.com/
https://muug.ca/mirror/cygwin/
https://mirror.csclub.uwaterloo.ca/cygwin/
https://cygwin.mirror.gtcomm.net/
http://cygwin.mirror.rafal.ca/
packages: >-
binutils, bison, ccache, flex, gcc-core, meson, ninja,
pkg-config, python39, windowsdriproto, xorgproto,
libepoxy-devel, libfontenc-devel, libfreetype-devel,
libGL-devel, libnettle-devel, libpixman1-devel,
libtirpc-devel, libXRes-devel, libXaw-devel, libXdmcp-devel,
libXext-devel, libXfont2-devel, libXi-devel,
libXinerama-devel, libXmu-devel, libXpm-devel,
libXrender-devel, libXtst-devel, libxcb-composite-devel,
libxcb-ewmh-devel, libxcb-icccm-devel, libxcb-image-devel,
libxcb-keysyms-devel, libxcb-randr-devel,
libxcb-render-devel, libxcb-render-util-devel,
libxcb-shape-devel, libxcb-util-devel, libxcb-xkb-devel,
libxcvt-devel, libxkbfile-devel, font-util,
khronos-opengl-registry, python39-lxml, xkbcomp-devel,
xkeyboard-config, git
- name: Cygwin ccache cache
uses: actions/cache@v5
with:
path: D:\cygwin\home\runneradmin\.ccache
key: ${{ runner.os }}-ccache
restore-keys: ${{ runner.os }}-ccache
- run: git config --global --add safe.directory /cygdrive/d/a/xserver/xserver
- uses: actions/checkout@v4
with:
set-safe-directory: false
- name: set PATH
run: echo "PATH=/usr/bin:$(cygpath '$SYSTEMROOT')/system32" >> "$GITHUB_ENV"
- name: build
run: bash ./.github/scripts/Cygwin/build.sh
- name: test
run: bash -c 'ninja -C build test'
xserver-build-arch:
# skip the redundant same-repo PR rebuild (see ubuntu-fetch-pkg)
if: >-
github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name != github.repository
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with: # needed for `git describe` to work
fetch-tags: true
fetch-depth: 0
- name: determine pkg version from git
run: git describe | sed -e 's~^xlibre-xserver-~~; s~-[0-9a-z]*$~~' | tr '-' '.' > .github/arch/GIT_VERSION
- name: build arch package
uses: callmetango/archlinux-build-package-action@v0.6.0
with:
path: .github/arch
makepkg-opts: -cfse --noconfirm
- name: upload-artifacts
uses: actions/upload-artifact@v7
with:
name: arch-binpkg
path: |
./.github/arch/xlibre-xserver-*.tar.zst
check-sign-off:
name: Check Signed-Off-By
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
env:
FORCE_COLOR: 1
runs-on: ubuntu-latest
steps:
- uses: live627/check-pr-signoff-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
release:
name: Release pushed tag
runs-on: ubuntu-latest
if: ${{ startsWith(github.ref, 'refs/tags/xlibre-xserver-') }}
needs:
- xserver-build-alpine
- xserver-build-ubuntu
- xserver-build-ubuntu-debug
- drivers-build-ubuntu
- xserver-build-mingw32-ubuntu
- xserver-build-macos
- xserver-build-freebsd
- xserver-build-dragonflybsd
- xserver-build-netbsd
- xserver-build-arch
- xserver-build-gentoo
- xserver-build-rhel
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Create release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref_name }}
run: .github/scripts/github/make-release