mirror of
https://github.com/citron-neo/CI.git
synced 2026-07-05 15:21:59 -07:00
Revert "ci(linux): migrate CI builds to build-citron-linux.sh"
This commit is contained in:
@@ -71,9 +71,6 @@ jobs:
|
|||||||
if: needs.check-version.outputs.should_build == 'true'
|
if: needs.check-version.outputs.should_build == 'true'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
env:
|
|
||||||
CPM_SOURCE_CACHE: ${{ github.workspace }}/.cpm-cache
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -82,86 +79,92 @@ jobs:
|
|||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
artifact_suffix: "_x86_64"
|
artifact_suffix: "_x86_64"
|
||||||
script_suffix: ""
|
script_suffix: ""
|
||||||
arch_arg: ""
|
build_arg: ""
|
||||||
- name: "Citron Build (Optimized x86_64)"
|
- name: "Citron Build (Optimized x86_64)"
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
artifact_suffix: "_v3"
|
artifact_suffix: "_v3"
|
||||||
script_suffix: "_v3"
|
script_suffix: "_v3"
|
||||||
arch_arg: "--arch v3"
|
build_arg: "v3"
|
||||||
- name: "Citron Build (aarch64)"
|
- name: "Citron Build (aarch64)"
|
||||||
os: ubuntu-24.04-arm
|
os: ubuntu-24.04-arm
|
||||||
artifact_suffix: "_aarch64"
|
artifact_suffix: "_aarch64"
|
||||||
script_suffix: ""
|
script_suffix: ""
|
||||||
arch_arg: ""
|
build_arg: ""
|
||||||
|
|
||||||
|
container: ghcr.io/pkgforge-dev/archlinux:latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout CI Scripts
|
- name: Install Git
|
||||||
uses: actions/checkout@v4
|
run: pacman -Syu --noconfirm --needed git
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Clone Citron Source
|
- name: Checkout Workflow Scripts
|
||||||
# No --recursive: build-citron-linux.sh uses CPM to fetch all library
|
uses: actions/checkout@v4
|
||||||
# dependencies at cmake configure time. No submodule init is required.
|
|
||||||
|
- name: Clone Citron Source Code
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
REPO_URL="https://github.com/citron-neo/emulator.git"
|
REPO_URL="https://github.com/citron-neo/emulator.git"
|
||||||
|
|
||||||
ATTEMPT=0
|
ATTEMPT=0
|
||||||
MAX_ATTEMPTS=999
|
MAX_ATTEMPTS=999
|
||||||
|
|
||||||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
||||||
ATTEMPT=$((ATTEMPT + 1))
|
ATTEMPT=$((ATTEMPT + 1))
|
||||||
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS: Cloning..."
|
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS: Cloning repository..."
|
||||||
rm -rf citron
|
|
||||||
if git clone "$REPO_URL" citron; then
|
# 1. CRITICAL: Wipe the directory before every attempt
|
||||||
|
rm -rf emulator
|
||||||
|
|
||||||
|
if git clone --recursive "https://github.com/citron-neo/emulator.git" emulator; then
|
||||||
echo "✅ Clone successful on attempt $ATTEMPT."
|
echo "✅ Clone successful on attempt $ATTEMPT."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "⚠️ Clone failed. Retrying in 15 seconds..."
|
echo "⚠️ Clone failed. Retrying in 15 seconds..."
|
||||||
sleep 15
|
sleep 15
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "❌ Failed to clone after $MAX_ATTEMPTS attempts."
|
echo "❌ Failed to clone after $MAX_ATTEMPTS attempts."
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Set Git Safe Directory
|
- name: Prepare Build Environment
|
||||||
working-directory: ./citron
|
run: |
|
||||||
|
mv get-dependencies.sh emulator/
|
||||||
|
mv build-citron.sh emulator/
|
||||||
|
mv package-citron.sh emulator/
|
||||||
|
|
||||||
|
- name: Add Git Safe Directory
|
||||||
|
working-directory: ./emulator
|
||||||
run: git config --global --add safe.directory "$PWD"
|
run: git config --global --add safe.directory "$PWD"
|
||||||
|
|
||||||
- name: Cache CPM Sources
|
- name: Install dependencies
|
||||||
uses: actions/cache@v4
|
working-directory: ./emulator
|
||||||
with:
|
run: chmod +x ./get-dependencies.sh && ./get-dependencies.sh
|
||||||
path: ${{ github.workspace }}/.cpm-cache
|
|
||||||
key: cpm-linux-${{ runner.os }}-${{ matrix.os }}-${{ hashFiles('citron/CMakeModules/dependencies.cmake') }}
|
|
||||||
restore-keys: |
|
|
||||||
cpm-linux-${{ runner.os }}-${{ matrix.os }}-
|
|
||||||
|
|
||||||
- name: Setup Build Environment
|
- name: Build Citron from source
|
||||||
working-directory: ./citron
|
working-directory: ./emulator
|
||||||
run: |
|
|
||||||
chmod +x ./build-citron-linux.sh
|
|
||||||
./build-citron-linux.sh setup
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
working-directory: ./citron
|
|
||||||
run: echo "sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build Citron
|
|
||||||
working-directory: ./citron
|
|
||||||
env:
|
|
||||||
CITRON_BUILD_TYPE: Release
|
|
||||||
APP_VERSION: ${{ steps.version.outputs.sha }}
|
|
||||||
ARCH_SUFFIX: ${{ matrix.script_suffix }}
|
|
||||||
run: |
|
run: |
|
||||||
NPROC_VAL=$(nproc --all)
|
NPROC_VAL=$(nproc --all)
|
||||||
JOBS_VAL=$((NPROC_VAL > 4 ? 4 : NPROC_VAL))
|
JOBS_VAL=$((NPROC_VAL > 4 ? 4 : NPROC_VAL))
|
||||||
JOBS=${JOBS_VAL} ./build-citron-linux.sh use --pgo none --lto full ${{ matrix.arch_arg }}
|
chmod +x ./build-citron.sh
|
||||||
|
JOBS=${JOBS_VAL} DEVEL=false ./build-citron.sh ${{ matrix.build_arg }}
|
||||||
|
|
||||||
|
- name: Package AppImage with Correct Name
|
||||||
|
working-directory: ./emulator
|
||||||
|
run: |
|
||||||
|
GIT_SHA=$(git rev-parse --short HEAD)
|
||||||
|
export APP_VERSION="${GIT_SHA}"
|
||||||
|
export VERSION="${GIT_SHA}"
|
||||||
|
export ARCH_SUFFIX="${{ matrix.script_suffix }}"
|
||||||
|
export DEVEL="false"
|
||||||
|
chmod +x ./package-citron.sh
|
||||||
|
./package-citron.sh
|
||||||
|
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Artifacts${{ matrix.artifact_suffix }}
|
name: Artifacts${{ matrix.artifact_suffix }}
|
||||||
path: citron/build/use-nopgo/AppImage/
|
path: emulator/dist/
|
||||||
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
if: ${{ github.ref_name == 'main' }}
|
if: ${{ github.ref_name == 'main' }}
|
||||||
@@ -220,7 +223,7 @@ jobs:
|
|||||||
**Build Details:**
|
**Build Details:**
|
||||||
- Platform: Linux (x86_64, x86_64_v3, aarch64)
|
- Platform: Linux (x86_64, x86_64_v3, aarch64)
|
||||||
- Format: AppImage + tar.zst packages
|
- Format: AppImage + tar.zst packages
|
||||||
- Build Type: Release with LTO
|
- Build Type: Release with optimizations
|
||||||
- Date: ${{ env.BUILD_DATE }}
|
- Date: ${{ env.BUILD_DATE }}
|
||||||
|
|
||||||
- name: Update LATEST_VERSION
|
- name: Update LATEST_VERSION
|
||||||
|
|||||||
@@ -343,15 +343,13 @@ jobs:
|
|||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# LINUX
|
# LINUX
|
||||||
|
# ===========================================================================
|
||||||
build-linux:
|
build-linux:
|
||||||
name: "${{ matrix.name }}"
|
name: "${{ matrix.name }}"
|
||||||
needs: [check-version]
|
needs: [check-version]
|
||||||
if: needs.check-version.outputs.should_build == 'true'
|
if: needs.check-version.outputs.should_build == 'true'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
env:
|
|
||||||
CPM_SOURCE_CACHE: ${{ github.workspace }}/.cpm-cache
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -360,27 +358,28 @@ jobs:
|
|||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
artifact_suffix: "_x86_64"
|
artifact_suffix: "_x86_64"
|
||||||
script_suffix: ""
|
script_suffix: ""
|
||||||
arch_arg: ""
|
build_arg: ""
|
||||||
- name: "Citron Build (Optimized x86_64)"
|
- name: "Citron Build (Optimized x86_64)"
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
artifact_suffix: "_v3"
|
artifact_suffix: "_v3"
|
||||||
script_suffix: "_v3"
|
script_suffix: "_v3"
|
||||||
arch_arg: "--arch v3"
|
build_arg: "v3"
|
||||||
- name: "Citron Build (aarch64)"
|
- name: "Citron Build (aarch64)"
|
||||||
os: ubuntu-24.04-arm
|
os: ubuntu-24.04-arm
|
||||||
artifact_suffix: "_aarch64"
|
artifact_suffix: "_aarch64"
|
||||||
script_suffix: ""
|
script_suffix: ""
|
||||||
arch_arg: ""
|
build_arg: ""
|
||||||
|
|
||||||
|
container: ghcr.io/pkgforge-dev/archlinux:latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout CI Scripts
|
- name: Install Git
|
||||||
uses: actions/checkout@v4
|
run: pacman -Syu --noconfirm --needed git
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Clone Citron Source
|
- name: Checkout Workflow Scripts
|
||||||
# No --recursive: build-citron-linux.sh uses CPM to fetch all library
|
uses: actions/checkout@v4
|
||||||
# dependencies at cmake configure time. No submodule init is required.
|
|
||||||
|
- name: Clone Citron Source Code
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
REPO_URL="https://github.com/citron-neo/emulator.git"
|
REPO_URL="https://github.com/citron-neo/emulator.git"
|
||||||
@@ -388,9 +387,9 @@ jobs:
|
|||||||
MAX_ATTEMPTS=999
|
MAX_ATTEMPTS=999
|
||||||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
||||||
ATTEMPT=$((ATTEMPT + 1))
|
ATTEMPT=$((ATTEMPT + 1))
|
||||||
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS: Cloning..."
|
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS: Cloning repository..."
|
||||||
rm -rf citron
|
rm -rf emulator
|
||||||
if git clone "$REPO_URL" citron; then
|
if git clone --recursive "$REPO_URL" emulator; then
|
||||||
echo "✅ Clone successful on attempt $ATTEMPT."
|
echo "✅ Clone successful on attempt $ATTEMPT."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -400,45 +399,44 @@ jobs:
|
|||||||
echo "❌ Failed to clone after $MAX_ATTEMPTS attempts."
|
echo "❌ Failed to clone after $MAX_ATTEMPTS attempts."
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Set Git Safe Directory
|
- name: Prepare Build Environment
|
||||||
working-directory: ./citron
|
run: |
|
||||||
|
mv get-dependencies.sh emulator/
|
||||||
|
mv build-citron.sh emulator/
|
||||||
|
mv package-citron.sh emulator/
|
||||||
|
|
||||||
|
- name: Add Git Safe Directory
|
||||||
|
working-directory: ./emulator
|
||||||
run: git config --global --add safe.directory "$PWD"
|
run: git config --global --add safe.directory "$PWD"
|
||||||
|
|
||||||
- name: Cache CPM Sources
|
- name: Install dependencies
|
||||||
uses: actions/cache@v4
|
working-directory: ./emulator
|
||||||
with:
|
run: chmod +x ./get-dependencies.sh && ./get-dependencies.sh
|
||||||
path: ${{ github.workspace }}/.cpm-cache
|
|
||||||
key: cpm-linux-${{ runner.os }}-${{ matrix.os }}-${{ hashFiles('citron/CMakeModules/dependencies.cmake') }}
|
|
||||||
restore-keys: |
|
|
||||||
cpm-linux-${{ runner.os }}-${{ matrix.os }}-
|
|
||||||
|
|
||||||
- name: Setup Build Environment
|
- name: Build Citron from source
|
||||||
working-directory: ./citron
|
working-directory: ./emulator
|
||||||
run: |
|
|
||||||
chmod +x ./build-citron-linux.sh
|
|
||||||
./build-citron-linux.sh setup
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
working-directory: ./citron
|
|
||||||
run: echo "sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build Citron
|
|
||||||
working-directory: ./citron
|
|
||||||
env:
|
|
||||||
CITRON_BUILD_TYPE: Nightly
|
|
||||||
APP_VERSION: ${{ steps.version.outputs.sha }}
|
|
||||||
ARCH_SUFFIX: ${{ matrix.script_suffix }}
|
|
||||||
run: |
|
run: |
|
||||||
NPROC_VAL=$(nproc --all)
|
NPROC_VAL=$(nproc --all)
|
||||||
JOBS_VAL=$((NPROC_VAL > 4 ? 4 : NPROC_VAL))
|
JOBS_VAL=$((NPROC_VAL > 4 ? 4 : NPROC_VAL))
|
||||||
JOBS=${JOBS_VAL} ./build-citron-linux.sh use --pgo none --lto full ${{ matrix.arch_arg }}
|
chmod +x ./build-citron.sh
|
||||||
|
JOBS=${JOBS_VAL} DEVEL=false BUILD_TYPE=Nightly ./build-citron.sh ${{ matrix.build_arg }}
|
||||||
|
|
||||||
|
- name: Package AppImage with Correct Name
|
||||||
|
working-directory: ./emulator
|
||||||
|
run: |
|
||||||
|
GIT_SHA=$(git rev-parse --short HEAD)
|
||||||
|
export APP_VERSION="${GIT_SHA}"
|
||||||
|
export VERSION="${GIT_SHA}"
|
||||||
|
export ARCH_SUFFIX="${{ matrix.script_suffix }}"
|
||||||
|
export DEVEL="false"
|
||||||
|
chmod +x ./package-citron.sh
|
||||||
|
./package-citron.sh
|
||||||
|
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Artifacts${{ matrix.artifact_suffix }}
|
name: Artifacts${{ matrix.artifact_suffix }}
|
||||||
path: citron/build/use-nopgo/AppImage/
|
path: emulator/dist/
|
||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# macOS
|
# macOS
|
||||||
|
|||||||
@@ -342,15 +342,13 @@ jobs:
|
|||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# LINUX
|
# LINUX
|
||||||
|
# ===========================================================================
|
||||||
build-linux:
|
build-linux:
|
||||||
name: "${{ matrix.name }}"
|
name: "${{ matrix.name }}"
|
||||||
needs: [check-version]
|
needs: [check-version]
|
||||||
if: needs.check-version.outputs.should_build == 'true'
|
if: needs.check-version.outputs.should_build == 'true'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
timeout-minutes: 120
|
timeout-minutes: 120
|
||||||
env:
|
|
||||||
CPM_SOURCE_CACHE: ${{ github.workspace }}/.cpm-cache
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -359,27 +357,28 @@ jobs:
|
|||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
artifact_suffix: "_x86_64"
|
artifact_suffix: "_x86_64"
|
||||||
script_suffix: ""
|
script_suffix: ""
|
||||||
arch_arg: ""
|
build_arg: ""
|
||||||
- name: "Citron Build (Optimized x86_64)"
|
- name: "Citron Build (Optimized x86_64)"
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
artifact_suffix: "_v3"
|
artifact_suffix: "_v3"
|
||||||
script_suffix: "_v3"
|
script_suffix: "_v3"
|
||||||
arch_arg: "--arch v3"
|
build_arg: "v3"
|
||||||
- name: "Citron Build (aarch64)"
|
- name: "Citron Build (aarch64)"
|
||||||
os: ubuntu-24.04-arm
|
os: ubuntu-24.04-arm
|
||||||
artifact_suffix: "_aarch64"
|
artifact_suffix: "_aarch64"
|
||||||
script_suffix: ""
|
script_suffix: ""
|
||||||
arch_arg: ""
|
build_arg: ""
|
||||||
|
|
||||||
|
container: ghcr.io/pkgforge-dev/archlinux:latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout CI Scripts
|
- name: Install Git
|
||||||
uses: actions/checkout@v4
|
run: pacman -Syu --noconfirm --needed git
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Clone Citron Source
|
- name: Checkout Workflow Scripts
|
||||||
# No --recursive: build-citron-linux.sh uses CPM to fetch all library
|
uses: actions/checkout@v4
|
||||||
# dependencies at cmake configure time. No submodule init is required.
|
|
||||||
|
- name: Clone Citron Source Code
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
REPO_URL="https://github.com/citron-neo/emulator.git"
|
REPO_URL="https://github.com/citron-neo/emulator.git"
|
||||||
@@ -387,9 +386,9 @@ jobs:
|
|||||||
MAX_ATTEMPTS=999
|
MAX_ATTEMPTS=999
|
||||||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
||||||
ATTEMPT=$((ATTEMPT + 1))
|
ATTEMPT=$((ATTEMPT + 1))
|
||||||
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS: Cloning..."
|
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS: Cloning repository..."
|
||||||
rm -rf citron
|
rm -rf emulator
|
||||||
if git clone "$REPO_URL" citron; then
|
if git clone --recursive "$REPO_URL" emulator; then
|
||||||
echo "✅ Clone successful on attempt $ATTEMPT."
|
echo "✅ Clone successful on attempt $ATTEMPT."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -399,45 +398,44 @@ jobs:
|
|||||||
echo "❌ Failed to clone after $MAX_ATTEMPTS attempts."
|
echo "❌ Failed to clone after $MAX_ATTEMPTS attempts."
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Set Git Safe Directory
|
- name: Prepare Build Environment
|
||||||
working-directory: ./citron
|
run: |
|
||||||
|
mv get-dependencies.sh emulator/
|
||||||
|
mv build-citron.sh emulator/
|
||||||
|
mv package-citron.sh emulator/
|
||||||
|
|
||||||
|
- name: Add Git Safe Directory
|
||||||
|
working-directory: ./emulator
|
||||||
run: git config --global --add safe.directory "$PWD"
|
run: git config --global --add safe.directory "$PWD"
|
||||||
|
|
||||||
- name: Cache CPM Sources
|
- name: Install dependencies
|
||||||
uses: actions/cache@v4
|
working-directory: ./emulator
|
||||||
with:
|
run: chmod +x ./get-dependencies.sh && ./get-dependencies.sh
|
||||||
path: ${{ github.workspace }}/.cpm-cache
|
|
||||||
key: cpm-linux-${{ runner.os }}-${{ matrix.os }}-${{ hashFiles('citron/CMakeModules/dependencies.cmake') }}
|
|
||||||
restore-keys: |
|
|
||||||
cpm-linux-${{ runner.os }}-${{ matrix.os }}-
|
|
||||||
|
|
||||||
- name: Setup Build Environment
|
- name: Build Citron from source
|
||||||
working-directory: ./citron
|
working-directory: ./emulator
|
||||||
run: |
|
|
||||||
chmod +x ./build-citron-linux.sh
|
|
||||||
./build-citron-linux.sh setup
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
working-directory: ./citron
|
|
||||||
run: echo "sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build Citron
|
|
||||||
working-directory: ./citron
|
|
||||||
env:
|
|
||||||
CITRON_BUILD_TYPE: Stable
|
|
||||||
APP_VERSION: ${{ steps.version.outputs.sha }}
|
|
||||||
ARCH_SUFFIX: ${{ matrix.script_suffix }}
|
|
||||||
run: |
|
run: |
|
||||||
NPROC_VAL=$(nproc --all)
|
NPROC_VAL=$(nproc --all)
|
||||||
JOBS_VAL=$((NPROC_VAL > 4 ? 4 : NPROC_VAL))
|
JOBS_VAL=$((NPROC_VAL > 4 ? 4 : NPROC_VAL))
|
||||||
JOBS=${JOBS_VAL} ./build-citron-linux.sh use --pgo none --lto full ${{ matrix.arch_arg }}
|
chmod +x ./build-citron.sh
|
||||||
|
JOBS=${JOBS_VAL} DEVEL=false BUILD_TYPE=Stable ./build-citron.sh ${{ matrix.build_arg }}
|
||||||
|
|
||||||
|
- name: Package AppImage with Correct Name
|
||||||
|
working-directory: ./emulator
|
||||||
|
run: |
|
||||||
|
GIT_SHA=$(git rev-parse --short HEAD)
|
||||||
|
export APP_VERSION="${GIT_SHA}"
|
||||||
|
export VERSION="${GIT_SHA}"
|
||||||
|
export ARCH_SUFFIX="${{ matrix.script_suffix }}"
|
||||||
|
export DEVEL="false"
|
||||||
|
chmod +x ./package-citron.sh
|
||||||
|
./package-citron.sh
|
||||||
|
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Artifacts${{ matrix.artifact_suffix }}
|
name: Artifacts${{ matrix.artifact_suffix }}
|
||||||
path: citron/build/use-nopgo/AppImage/
|
path: emulator/dist/
|
||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# macOS
|
# macOS
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# Maintainer: Collecting <collecting@citron-emu.org>
|
||||||
|
|
||||||
|
# The '-git' suffix signifies this is a bleeding-edge build from the git repo
|
||||||
|
pkgname=citron-git
|
||||||
|
pkgver=0.1.r0.g1a2b3c4 # This will be replaced by the pkgver() function
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="A Nintendo Switch emulator"
|
||||||
|
arch=('x86_64' 'aarch64')
|
||||||
|
url="https://citron-emu.org/"
|
||||||
|
license=('GPL2')
|
||||||
|
|
||||||
|
# Dependencies needed to run the emulator
|
||||||
|
depends=(
|
||||||
|
'boost-libs' 'enet' 'fmt' 'ffmpeg' 'gamemode' 'glslang' 'hicolor-icon-theme'
|
||||||
|
'libdecor' 'libxkbcommon-x11' 'mbedtls2' 'nlohmann-json' 'qt6-base'
|
||||||
|
'qt6-multimedia' 'sdl2' 'vulkan-icd-loader'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Dependencies needed only to build the emulator from source
|
||||||
|
makedepends=(
|
||||||
|
'boost' 'catch2' 'cmake' 'git' 'ninja' 'nasm' 'qt6-tools' 'vulkan-headers'
|
||||||
|
)
|
||||||
|
|
||||||
|
# This points to the source code repository
|
||||||
|
source=("git+https://git.citron-emu.org/citron/emulator.git")
|
||||||
|
sha256sums=('SKIP')
|
||||||
|
|
||||||
|
# This function automatically generates a version string based on the latest git commit
|
||||||
|
pkgver() {
|
||||||
|
cd "$pkgname"
|
||||||
|
git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
|
||||||
|
}
|
||||||
|
|
||||||
|
# This function runs before the build and is used to apply patches
|
||||||
|
prepare() {
|
||||||
|
cd "$pkgname"
|
||||||
|
# Apply compatibility patches for newer Boost versions
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's/\bboost::asio::io_service\b/boost::asio::io_context/g'
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's/\bboost::asio::io_service::strand\b/boost::asio::strand<boost::asio::io_context::executor_type>/g'
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's|#include *<boost/process/async_pipe.hpp>|#include <boost/process/v1/async_pipe.hpp>|g'
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's/\bboost::process::async_pipe\b/boost::process::v1::async_pipe/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
# This function contains the build commands
|
||||||
|
build() {
|
||||||
|
cd "$pkgname"
|
||||||
|
# makepkg sets CFLAGS and CXXFLAGS, so we don't need to specify arch flags
|
||||||
|
cmake -B build -S . -GNinja \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||||
|
-DCITRON_USE_BUNDLED_VCPKG=OFF \
|
||||||
|
-DCITRON_USE_BUNDLED_QT=OFF \
|
||||||
|
-DUSE_SYSTEM_QT=ON \
|
||||||
|
-DCITRON_USE_BUNDLED_FFMPEG=OFF \
|
||||||
|
-DCITRON_USE_BUNDLED_SDL2=OFF \
|
||||||
|
-DCITRON_TESTS=OFF \
|
||||||
|
-DCITRON_CHECK_SUBMODULES=OFF \
|
||||||
|
-DCITRON_ENABLE_LTO=ON \
|
||||||
|
-DCITRON_USE_QT_MULTIMEDIA=ON \
|
||||||
|
-DENABLE_QT_TRANSLATION=ON
|
||||||
|
|
||||||
|
ninja -C build
|
||||||
|
}
|
||||||
|
|
||||||
|
# This function installs the built files into a temporary directory
|
||||||
|
package() {
|
||||||
|
cd "$pkgname"
|
||||||
|
DESTDIR="$pkgdir/" ninja -C build install
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
# 🍋 The Official Citron Neo CI
|
# 🍋 The Official Citron-CI
|
||||||
|
|
||||||
[](https://github.com/citron-neo/CI/releases/latest) [](https://github.com/citron-neo/CI/actions/workflows/build_nightly.yml) [](https://github.com/citron-neo/CI/actions/workflows/build_stable.yml)
|
[](https://github.com/citron-neo/CI/releases/latest)
|
||||||
|
[](https://github.com/citron-neo/CI/actions/workflows/build_nightly.yml)
|
||||||
|
[](https://github.com/citron-neo/CI/actions/workflows/build_stable.yml)
|
||||||
|
|
||||||
## Star History
|
## Star History
|
||||||
|
|
||||||
@@ -18,45 +20,57 @@ This repository makes Nightly builds for **x86_64** (Standard), **x86_64_v3** (C
|
|||||||
|
|
||||||
Would you like to submit a compatibility report for the emulator? You can do so here:
|
Would you like to submit a compatibility report for the emulator? You can do so here:
|
||||||
|
|
||||||
- [Submit Compatibility Report](https://github.com/citron-neo/Citron-Compatability)
|
* [Submit Compatibility Report](https://github.com/citron-neo/Citron-Compatability)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Direct links for other information you may need can also be found below:
|
Direct links for other information you may need can also be found below:
|
||||||
|
|
||||||
- [Latest Commits Can Be Found Here](https://github.com/citron-neo/emulator/commits/main)
|
* [Latest Commits Can Be Found Here](https://github.com/citron-neo/emulator/commits/main)
|
||||||
|
|
||||||
- [Latest Android Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-android)
|
* [Latest Android Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-android)
|
||||||
|
|
||||||
- [Latest Linux Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-linux)
|
* [Latest Linux Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-linux)
|
||||||
|
|
||||||
- [Latest Windows Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-windows)
|
* [Latest Windows Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-windows)
|
||||||
|
|
||||||
- [Latest macOS Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-macos)
|
* [Latest macOS Nightly Release](https://github.com/citron-neo/CI/releases/tag/nightly-macos)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# READ THIS IF YOU HAVE ISSUES
|
# READ THIS IF YOU HAVE ISSUES
|
||||||
|
|
||||||
If you are on wayland (specially GNOME wayland) and get freezes or crashes, you are likely affected by this issue that affects all Qt6 apps: [citron-neo#50](https://github.com/citron-neo/CI/pull/50)
|
If you are on wayland (specially GNOME wayland) and get freezes or crashes, you are likely affected by this issue that affects all Qt6 apps: https://github.com/citron-neo/CI/issues/50
|
||||||
|
|
||||||
To fix it simply set the env variable `QT_QPA_PLATFORM=xcb`
|
To fix it simply set the env variable `QT_QPA_PLATFORM=xcb`
|
||||||
|
|
||||||
**Also, are you looking for AppImages of other emulators? Check:** [AnyLinux-AppImages](https://pkgforge-dev.github.io/Anylinux-AppImages/)
|
**Also, are you looking for AppImages of other emulators? Check:** [AnyLinux-AppImages](https://pkgforge-dev.github.io/Anylinux-AppImages/)
|
||||||
|
|
||||||
---
|
----
|
||||||
|
|
||||||
AppImage made using [sharun](https://github.com/VHSgunzo/sharun), which makes it extremely easy to turn any binary into a portable package without using containers or similar tricks.
|
AppImage made using [sharun](https://github.com/VHSgunzo/sharun), which makes it extremely easy to turn any binary into a portable package without using containers or similar tricks.
|
||||||
|
|
||||||
**These AppImages bundle everything and should work on any Linux distro, even on musl based ones.**
|
**These AppImages bundle everything and should work on any Linux distro, even on musl based ones.**
|
||||||
|
|
||||||
A `tar.zst` portable archive of the same build is also published alongside the AppImage on each Linux release, for users who prefer an install-free tarball over the AppImage format.
|
It is possible that the AppImages may fail to work with appimagelauncher, we recommend these alternatives instead:
|
||||||
|
|
||||||
These AppImages work without fuse2 as it can use fuse3 instead, it can also work without fuse at all thanks to the [uruntime](https://github.com/VHSgunzo/uruntime)
|
* [AM](https://github.com/ivan-hc/AM) `am -i citron` or `appman -i citron`
|
||||||
|
|
||||||
|
* [dbin](https://github.com/xplshn/dbin) `dbin install citron.appimage`
|
||||||
|
|
||||||
|
* [soar](https://github.com/pkgforge/soar) `soar install citron`
|
||||||
|
|
||||||
|
These AppImages works without fuse2 as it can use fuse3 instead, it can also work without fuse at all thanks to the [uruntime](https://github.com/VHSgunzo/uruntime)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b><i>raison d'être</i></b></summary>
|
||||||
|
<img src="https://github.com/user-attachments/assets/d40067a6-37d2-4784-927c-2c7f7cc6104b" alt="Inspiration Image">
|
||||||
|
</a>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**The following information above and the creation of the AppImages Citron currently creates & distributes derives from Pkgforges previous work. You can find their repository here: https://github.com/pkgforge-dev/Citron-AppImage**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Thank-you for being apart of & using Citron Neo, we value all members of the community whom help shape the emulator into what it is today!
|
Thank-you for being apart of & using Citron, we value all members of the community whom help shape the emulator into what it is today!
|
||||||
|
- The Citron Team
|
||||||
- The Citron Neo Team
|
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
# --- Architecture and Compiler Flag Setup ---
|
||||||
|
ARCH="${ARCH:-$(uname -m)}"
|
||||||
|
|
||||||
|
if [ "$1" = 'v3' ] && [ "$ARCH" = 'x86_64' ]; then
|
||||||
|
ARCH_FLAGS="-march=x86-64-v3 -O3 -USuccess -UNone -fuse-ld=lld"
|
||||||
|
elif [ "$ARCH" = 'x86_64' ]; then
|
||||||
|
ARCH_FLAGS="-march=x86-64 -mtune=generic -O3 -USuccess -UNone -fuse-ld=lld"
|
||||||
|
else
|
||||||
|
ARCH_FLAGS="-march=armv8-a -mtune=generic -O3 -USuccess -UNone -fuse-ld=lld"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Source Code Checkout and Versioning ---
|
||||||
|
git clone --recursive "https://github.com/citron-neo/emulator.git" ./citron
|
||||||
|
cd ./citron
|
||||||
|
|
||||||
|
if [ "$DEVEL" = 'true' ]; then
|
||||||
|
CITRON_TAG="$(git rev-parse --short HEAD)"
|
||||||
|
VERSION="$CITRON_TAG"
|
||||||
|
else
|
||||||
|
if CITRON_TAG="$(git describe --tags 2>/dev/null)"; then
|
||||||
|
git checkout "$CITRON_TAG"
|
||||||
|
VERSION="$(echo "$CITRON_TAG" | awk -F'-' '{print $1}')"
|
||||||
|
else
|
||||||
|
# Fallback for repositories without tags (or shallow history without reachable tags)
|
||||||
|
VERSION="$(git rev-parse --short HEAD)"
|
||||||
|
echo "No tags found, falling back to commit version: $VERSION"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Apply Necessary Source Code Patches for Compatibility ---
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's/\bboost::asio::io_service\b/boost::asio::io_context/g'
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's/\bboost::asio::io_service::strand\b/boost::asio::strand<boost::asio::io_context::executor_type>/g'
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's|#include *<boost/process/async_pipe.hpp>|#include <boost/process/v1/async_pipe.hpp>|g'
|
||||||
|
find . -type f \( -name '*.cpp' -o -name '*.h' \) | xargs sed -i 's/\bboost::process::async_pipe\b/boost::process::v1::async_pipe/g'
|
||||||
|
sed -i '/sse2neon/d' ./src/video_core/CMakeLists.txt
|
||||||
|
sed -i 's/cmake_minimum_required(VERSION 2.8)/cmake_minimum_required(VERSION 3.5)/' externals/xbyak/CMakeLists.txt
|
||||||
|
|
||||||
|
# --- Find Qt6 Private Headers ---
|
||||||
|
HEADER_PATH=$(pacman -Ql qt6-base | grep 'qpa/qplatformnativeinterface.h$' | awk '{print $2}')
|
||||||
|
if [ -z "$HEADER_PATH" ]; then
|
||||||
|
echo "ERROR: Could not find qplatformnativeinterface.h path." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
QT_PRIVATE_INCLUDE_DIR=$(dirname "$(dirname "$HEADER_PATH")")
|
||||||
|
CXX_FLAGS_EXTRA="-I${QT_PRIVATE_INCLUDE_DIR}"
|
||||||
|
|
||||||
|
# --- Build Process ---
|
||||||
|
JOBS=$(nproc --all)
|
||||||
|
|
||||||
|
mkdir build && cd build
|
||||||
|
|
||||||
|
# Configure the build using CMake
|
||||||
|
cmake .. -GNinja \
|
||||||
|
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
|
||||||
|
-DCITRON_USE_BUNDLED_VCPKG=OFF \
|
||||||
|
-DCITRON_USE_BUNDLED_QT=OFF \
|
||||||
|
-DUSE_SYSTEM_QT=ON \
|
||||||
|
-DENABLE_QT6=ON \
|
||||||
|
-DCITRON_USE_BUNDLED_FFMPEG=OFF \
|
||||||
|
-DCITRON_USE_BUNDLED_SDL2=ON \
|
||||||
|
-DCITRON_USE_EXTERNAL_SDL2=OFF \
|
||||||
|
-DCITRON_TESTS=OFF \
|
||||||
|
-DCITRON_CHECK_SUBMODULES=OFF \
|
||||||
|
-DCITRON_USE_LLVM_DEMANGLE=OFF \
|
||||||
|
-DCITRON_ENABLE_LTO=ON \
|
||||||
|
-DCITRON_USE_QT_MULTIMEDIA=ON \
|
||||||
|
-DCITRON_USE_QT_WEB_ENGINE=OFF \
|
||||||
|
-DENABLE_QT_TRANSLATION=ON \
|
||||||
|
-DUSE_DISCORD_PRESENCE=ON \
|
||||||
|
-DENABLE_WEB_SERVICE=ON \
|
||||||
|
-DENABLE_OPENSSL=ON \
|
||||||
|
-DBUNDLE_SPEEX=ON \
|
||||||
|
-DCITRON_USE_FASTER_LD=OFF \
|
||||||
|
-DCITRON_USE_EXTERNAL_Vulkan_HEADERS=ON \
|
||||||
|
-DCITRON_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES=ON \
|
||||||
|
-DCITRON_USE_AUTO_UPDATER=ON \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||||
|
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS -Wno-error -w ${CXX_FLAGS_EXTRA}" \
|
||||||
|
-DCMAKE_C_FLAGS="$ARCH_FLAGS" \
|
||||||
|
-DCMAKE_SYSTEM_PROCESSOR="$(uname -m)" \
|
||||||
|
-DCITRON_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
|
||||||
|
# Compile and install the project
|
||||||
|
ninja -j${JOBS}
|
||||||
|
sudo ninja install
|
||||||
|
|
||||||
|
# --- Output Version Info ---
|
||||||
|
echo "$VERSION" >~/version
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
ARCH="$(uname -m)"
|
||||||
|
EXTRA_PACKAGES="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/get-debloated-pkgs.sh"
|
||||||
|
|
||||||
|
pacman -Syu --noconfirm --needed \
|
||||||
|
base-devel \
|
||||||
|
boost \
|
||||||
|
boost-libs \
|
||||||
|
catch2 \
|
||||||
|
clang \
|
||||||
|
cmake \
|
||||||
|
curl \
|
||||||
|
enet \
|
||||||
|
fmt \
|
||||||
|
gamemode \
|
||||||
|
gcc \
|
||||||
|
git \
|
||||||
|
glslang \
|
||||||
|
glu \
|
||||||
|
hidapi \
|
||||||
|
libvpx \
|
||||||
|
libxi \
|
||||||
|
libxkbcommon-x11 \
|
||||||
|
libxss \
|
||||||
|
lld \
|
||||||
|
llvm \
|
||||||
|
rapidjson \
|
||||||
|
mesa \
|
||||||
|
nasm \
|
||||||
|
ninja \
|
||||||
|
nlohmann-json \
|
||||||
|
numactl \
|
||||||
|
openal \
|
||||||
|
patchelf \
|
||||||
|
pulseaudio \
|
||||||
|
pulseaudio-alsa \
|
||||||
|
qt6-networkauth \
|
||||||
|
qt6-multimedia \
|
||||||
|
qt6-svg \
|
||||||
|
qt6-tools \
|
||||||
|
qt6-translations \
|
||||||
|
sdl2 \
|
||||||
|
unzip \
|
||||||
|
vulkan-headers \
|
||||||
|
vulkan-mesa-layers \
|
||||||
|
wget \
|
||||||
|
xcb-util-cursor \
|
||||||
|
xcb-util-image \
|
||||||
|
xcb-util-renderutil \
|
||||||
|
xcb-util-wm \
|
||||||
|
xorg-server-xvfb \
|
||||||
|
zip \
|
||||||
|
zsync
|
||||||
|
|
||||||
|
wget --retry-connrefused --tries=30 "$EXTRA_PACKAGES" -O ./get-debloated-pkgs.sh
|
||||||
|
chmod +x ./get-debloated-pkgs.sh
|
||||||
|
./get-debloated-pkgs.sh --add-mesa ffmpeg-mini qt6-base-mini libxml2-mini opus-mini icu-mini
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -ex
|
||||||
|
ARCH="${ARCH:-$(uname -m)}"
|
||||||
|
|
||||||
|
# The VERSION is now passed as an environment variable from the workflow
|
||||||
|
if [ -z "$APP_VERSION" ]; then
|
||||||
|
echo "Error: APP_VERSION environment variable is not set."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Construct unique names for the AppImage and tarball based on the build matrix.
|
||||||
|
OUTNAME_BASE="citron_nightly-${APP_VERSION}-linux-${ARCH}${ARCH_SUFFIX}"
|
||||||
|
|
||||||
|
SHARUN="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/quick-sharun.sh"
|
||||||
|
export OUTNAME="${OUTNAME_BASE}.AppImage"
|
||||||
|
export OUTPATH="$PWD"/dist
|
||||||
|
export DESKTOP=/usr/share/applications/org.citron_emu.citron.desktop
|
||||||
|
export ICON=/usr/share/icons/hicolor/scalable/apps/org.citron_emu.citron.svg
|
||||||
|
export DEPLOY_OPENGL=1
|
||||||
|
export DEPLOY_VULKAN=1
|
||||||
|
export DEPLOY_PIPEWIRE=1
|
||||||
|
|
||||||
|
if [ "$DEVEL" = 'true' ]; then
|
||||||
|
export DEVEL_RELEASE=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun
|
||||||
|
chmod +x ./quick-sharun
|
||||||
|
./quick-sharun /usr/bin/citron* /usr/lib/libgamemode.so*
|
||||||
|
./quick-sharun --make-appimage
|
||||||
Reference in New Issue
Block a user