name: Build Linux Release # document this later, while that, put both release & debug in parallel # debug still always comes second and that's sad. on: push: paths: - '**.cpp' - '**.h' - '**.c' - '**/meson.build' - 'meson.build' - '**/CMakeLists.txt' - 'CMakeLists.txt' - '.github/workflows/build-linux.yml' pull_request: paths: - '**.cpp' - '**.h' - '**.c' - '**/meson.build' - 'meson.build' - '**/CMakeLists.txt' - 'CMakeLists.txt' - '.github/workflows/build-linux.yml' jobs: build-release: runs-on: ubuntu-latest concurrency: group: build-linux-release-${{ github.ref }} cancel-in-progress: true steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y build-essential python3 python3-pip python3-setuptools libgl1-mesa-dev libglu1-mesa-dev libglfw3-dev libpng-dev pkg-config clang lld ccache libssl-dev patchelf ccache -M 5G || true - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Cache pip packages uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('.github/workflows/build-linux.yml') }} - name: Install Meson and Ninja run: | python -m pip install --upgrade pip pip install meson ninja - name: Restore ccache uses: actions/cache@v4 with: path: ~/.ccache key: ${{ runner.os }}-ccache-release-${{ hashFiles('**/meson.build') }} - name: Restore meson cache uses: actions/cache@v4 with: path: ~/.cache/meson key: ${{ runner.os }}-meson-${{ hashFiles('**/meson.build') }} - name: Configure Meson env: CC: "ccache clang" CXX: "ccache clang++" CCACHE_DIR: ${{ runner.temp }}/ccache run: | mkdir -p "$CCACHE_DIR" meson setup build_meson --wipe --buildtype=release - name: Build with Ninja env: CC: "ccache clang" CXX: "ccache clang++" CCACHE_DIR: ${{ runner.temp }}/ccache run: | export CCACHE_DIR="${{ runner.temp }}/ccache" ninja -C build_meson -j$(nproc) -v - name: Bundle executable + libraries env: GITHUB_SHA: ${{ github.sha }} run: | set -euo pipefail EXE_PATH=build_meson/Minecraft.Client/Minecraft.Client if [ ! -f "$EXE_PATH" ]; then echo "ERROR: expected executable at $EXE_PATH" >&2 ls -la build_meson || true exit 1 fi SHORT_SHA=$(echo "$GITHUB_SHA" | cut -c1-8) BUNDLE=out/minecraft-client-linux-${SHORT_SHA} mkdir -p "$BUNDLE/lib" cp "$EXE_PATH" "$BUNDLE/Minecraft.Client" ldd "$EXE_PATH" \ | awk '/=>/ { print $3 }' \ | grep -v '^(' \ | grep -Ev '/(libc|libm|libdl|libpthread|librt|libgcc_s|libstdc\+\+|ld-linux)[^/]*\.so' \ | sort -u \ | while read -r lib; do [ -f "$lib" ] && cp "$lib" "$BUNDLE/lib/" || true done patchelf --set-rpath '$ORIGIN/lib' "$BUNDLE/Minecraft.Client" cat > "$BUNDLE/run.sh" << 'RUNEOF' #!/usr/bin/env bash DIR="$(cd "$(dirname "$0")" && pwd)" if [ ! -d "$DIR/Common" ]; then echo "ERROR: Missing 'Common' assets folder." echo "Download LCEWindows64.zip from:" echo " https://github.com/smartcmd/MinecraftConsoles/releases/tag/nightly" echo "Extract it and copy the 'Common' folder next to this run.sh file." exit 1 fi cd "$DIR" exec ./Minecraft.Client "$@" RUNEOF chmod +x "$BUNDLE/run.sh" cat > "$BUNDLE/README.txt" << 'EOF' 4JCraft Linux Build =================== This bundle contains: Minecraft.Client - compiled Linux binary lib/ - all required shared libraries (GL, GLFW, png, zlib, X11 etc.) run.sh - launcher script To run: 1. Download LCEWindows64.zip from the MinecraftConsoles nightly release: https://github.com/smartcmd/MinecraftConsoles/releases/tag/nightly 2. Extract it and copy the "Common" folder into this directory (so you have Common/ sitting next to run.sh) 3. Run: ./run.sh [--width W] [--height H] [--fullscreen] EOF echo "Bundle ready: $BUNDLE" ls -lh "$BUNDLE" "$BUNDLE/lib" - name: Upload artifact uses: actions/upload-artifact@v4 with: name: minecraft-client-linux-${{ github.sha }} path: out/minecraft-client-linux-*/ retention-days: 7 build-debug: runs-on: ubuntu-latest concurrency: group: build-linux-debug-${{ github.ref }} cancel-in-progress: true steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y build-essential python3 python3-pip python3-setuptools libgl1-mesa-dev libglu1-mesa-dev libglfw3-dev libpng-dev pkg-config clang lld ccache libssl-dev patchelf ccache -M 5G || true - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Cache pip packages uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('.github/workflows/build-linux.yml') }} - name: Install Meson and Ninja run: | python -m pip install --upgrade pip pip install meson ninja - name: Restore ccache uses: actions/cache@v4 with: path: ~/.ccache key: ${{ runner.os }}-ccache-debug-${{ hashFiles('**/meson.build') }} - name: Restore meson cache uses: actions/cache@v4 with: path: ~/.cache/meson key: ${{ runner.os }}-meson-${{ hashFiles('**/meson.build') }} - name: Configure Meson env: CC: "ccache clang" CXX: "ccache clang++" CCACHE_DIR: ${{ runner.temp }}/ccache run: | mkdir -p "$CCACHE_DIR" meson setup build_debug --wipe --buildtype=debug - name: Build with Ninja env: CC: "ccache clang" CXX: "ccache clang++" CCACHE_DIR: ${{ runner.temp }}/ccache run: | export CCACHE_DIR="${{ runner.temp }}/ccache" ninja -C build_debug -j$(nproc) -v - name: Bundle debug executable + libraries env: GITHUB_SHA: ${{ github.sha }} run: | set -euo pipefail EXE_PATH=build_debug/Minecraft.Client/Minecraft.Client if [ ! -f "$EXE_PATH" ]; then echo "ERROR: expected debug executable at $EXE_PATH" >&2 ls -la build_debug || true exit 1 fi SHORT_SHA=$(echo "$GITHUB_SHA" | cut -c1-8) BUNDLE=out/minecraft-client-linux-${SHORT_SHA}-debug mkdir -p "$BUNDLE/lib" cp "$EXE_PATH" "$BUNDLE/Minecraft.Client.debug" ldd "$EXE_PATH" \ | awk '/=>/ { print $3 }' \ | grep -v '^(' \ | grep -Ev '/(libc|libm|libdl|libpthread|librt|libgcc_s|libstdc\+\+|ld-linux)[^/]*\.so' \ | sort -u \ | while read -r lib; do [ -f "$lib" ] && cp "$lib" "$BUNDLE/lib/" || true done patchelf --set-rpath '$ORIGIN/lib' "$BUNDLE/Minecraft.Client.debug" echo "Debug bundle ready: $BUNDLE" ls -lh "$BUNDLE" "$BUNDLE/lib" - name: Upload artifact uses: actions/upload-artifact@v4 with: name: minecraft-client-linux-${{ github.sha }}-debug path: out/minecraft-client-linux-*-debug/ retention-days: 7