Files
Xenia-Canary/.github/workflows/Linux_x86.yml
2026-07-14 03:24:00 -07:00

146 lines
6.1 KiB
YAML

name: Linux Build
on:
workflow_call:
inputs:
runs-on:
description: 'Image'
required: true
type: string
llvm_version:
description: 'LLVM Version'
required: true
type: string
ubuntu_base:
description: 'Ubuntu Base'
required: true
type: string
jobs:
build:
name: Build
runs-on: ${{ inputs.runs-on }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Cache Vulkan SDK
id: cache-vulkan-sdk-linux
uses: actions/cache@v6
with:
path: ~/vulkan-sdk
key: ${{ runner.os }}-vulkan-sdk-latest
- name: Cache linuxdeploy tools
id: cache-linuxdeploy
uses: actions/cache@v6
with:
path: ~/linuxdeploy
key: ${{ runner.os }}-linuxdeploy-tools
- name: Setup build environment
run: |-
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
sudo apt-add-repository "deb http://apt.llvm.org/${{ inputs.ubuntu_base }}/ llvm-toolchain-${{ inputs.ubuntu_base }}-${{ inputs.llvm_version }} main"
sudo apt-get -y update
sudo apt-get -y install mesa-vulkan-drivers valgrind libc++-dev libc++abi-dev libgtk-3-dev libsdl2-dev libvulkan-dev libx11-xcb-dev clang-${{ inputs.llvm_version }} lld-${{ inputs.llvm_version }} spirv-tools libfuse2
# Pin LLVM tools to the correct version so system ar/ranlib/lld
# don't use the older LLVM 17 gold plugin with clang-20 LTO bitcode
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${{ inputs.llvm_version }} 200
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${{ inputs.llvm_version }} 200
sudo update-alternatives --install /usr/bin/lld lld /usr/bin/lld-${{ inputs.llvm_version }} 200
sudo update-alternatives --install /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-${{ inputs.llvm_version }} 200
sudo update-alternatives --install /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-${{ inputs.llvm_version }} 200
sudo update-alternatives --install /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-${{ inputs.llvm_version }} 200
sudo update-alternatives --install /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-${{ inputs.llvm_version }} 200
# Download linuxdeploy tools if not cached
if [ ${{ steps.cache-linuxdeploy.outputs.cache-hit }} != true ]; then
mkdir -p ~/linuxdeploy
wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -O ~/linuxdeploy/linuxdeploy
chmod +x ~/linuxdeploy/linuxdeploy
fi
echo "${HOME}/linuxdeploy" >> $GITHUB_PATH
- name: Install Vulkan SDK
run: |-
if [ ${{ steps.cache-vulkan-sdk-linux.outputs.cache-hit }} != true ]; then
wget -qO vulkan-sdk.tar.xz https://sdk.lunarg.com/sdk/download/latest/linux/vulkan-sdk.tar.xz
mkdir -p ~/vulkan-sdk
tar -xf vulkan-sdk.tar.xz -C ~/vulkan-sdk
fi
VULKAN_SDK_VERSION=$(ls ~/vulkan-sdk)
echo "VULKAN_SDK=${HOME}/vulkan-sdk/${VULKAN_SDK_VERSION}/x86_64" >> $GITHUB_ENV
echo "${HOME}/vulkan-sdk/${VULKAN_SDK_VERSION}/x86_64/bin" >> $GITHUB_PATH
# Verify shader tools are available
for tool in glslangValidator spirv-opt spirv-dis; do
which "$tool" && "$tool" --version 2>/dev/null || echo "Warning: $tool not found"
done
- name: Download submodules
run: |- # Exclude unneeded submodules
SUBMODULES=$(grep -oP '(?<=path = )(?!third_party\/(?:DirectX(?:-Headers|ShaderCompiler)|xbyak_aarch64)).+' .gitmodules)
git submodule update --init --depth=1 -j$(getconf _NPROCESSORS_ONLN) $SUBMODULES
- name: Build Xenia
env:
CC: clang-${{ inputs.llvm_version }}
CXX: clang++-${{ inputs.llvm_version }}
run: ./xenia-build.py build --config=Release
- name: Prepare AppImage
id: prepare_artifacts
run: |-
binary=build/bin/Linux/Release/xenia_canary
if [ $(stat -c%s $binary) -le 100000 ]; then
echo "::error::Binary is too small."
exit 1
fi
chmod +x $binary
# Set up AppDir structure
APPDIR=artifacts/xenia_canary
mkdir -p ${APPDIR}/usr/bin
# Install icons
for size in 16 32 48 64 128 256 512 1024; do
mkdir -p ${APPDIR}/usr/share/icons/hicolor/${size}x${size}/apps
cp assets/icon/${size}.png ${APPDIR}/usr/share/icons/hicolor/${size}x${size}/apps/xenia_canary.png
done
# Copy any extra runtime data directories alongside the binary
find build/bin/Linux/Release -maxdepth 1 -type d ! -name Release -exec cp -r {} ${APPDIR}/usr/bin/ \;
# Build AppImage with linuxdeploy (requires absolute paths)
linuxdeploy --appdir $APPDIR \
--executable $binary \
--desktop-file ${GITHUB_WORKSPACE}/assets/xenia_canary.desktop \
--icon-file ${GITHUB_WORKSPACE}/assets/icon/256.png \
--output appimage
# Find the generated AppImage and move to release directory
appimage_file=$(ls -1 *.AppImage | head -n1)
if [ -z "$appimage_file" ]; then
echo "::error::AppImage file not found after linuxdeploy"
exit 1
fi
chmod +x "$appimage_file"
artifact=xenia_canary_linux.AppImage
mv "$appimage_file" $artifact
echo "path=$artifact" >> $GITHUB_OUTPUT
- name: Upload Xenia Canary artifact
if: ${{ steps.prepare_artifacts.outcome == 'success' }}
uses: actions/upload-artifact@v7
with:
path: ${{ steps.prepare_artifacts.outputs.path }}
if-no-files-found: error
retention-days: 7
archive: false