Files
coco875 e2cf6ecbb4 Fix 32 bit (#697)
* try x86

* ci: uniform build-linux-release-docker and their x86

* Update main.yml

* fix animation

Co-Authored-By: Alessio Tosto <rinnegatamante@gmail.com>

* add explanation

* add windows 32 in release

* Update windows-compile.yml

* fix windows compilation

* fix win32 windows

* Update libultraship

---------

Co-authored-by: Alessio Tosto <rinnegatamante@gmail.com>
2026-05-03 02:13:30 +02:00

161 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
set -e
# Unified build script for SpaghettiKart
#
# Usage:
# ./script/build.sh # Build x64 Release (default)
# ./script/build.sh x64 # Build x64 Release
# ./script/build.sh x86 # Build x86 32-bit Release
# ./script/build.sh x64 Debug # Build x64 Debug
# ./script/build.sh all # Build both architectures
# ./script/build.sh x64 Release appimage # Build x64 with AppImage
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
ARCH="${1:-x64}"
BUILD_TYPE="${2:-Release}"
PACKAGE="${3:-}" # Optional: "appimage" to generate AppImage
USER_ID=$(id -u)
GROUP_ID=$(id -g)
cd "$PROJECT_DIR"
build_arch() {
local arch=$1
local build_type=$2
local package=$3
local build_dir="build-docker-${arch}"
local image_name="spaghettikart-${arch}"
local dockerfile=""
local platform=""
local triplet=""
echo "========================================"
echo "Building ${arch} ${build_type}"
echo "========================================"
# Set architecture-specific options
if [ "$arch" = "x86" ]; then
dockerfile="script/Dockerfile.x86"
platform="--platform linux/386"
triplet="x86-linux"
# Ensure QEMU is set up for i386 emulation
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 2>/dev/null || true
else
dockerfile="script/Dockerfile"
triplet="x64-linux"
fi
# Build Docker image
echo "Building Docker image for ${arch}..."
docker build \
${platform} \
-t "${image_name}" \
-f "${dockerfile}" .
# Clean build directory if it contains incompatible cache
if [[ -f "${build_dir}/CMakeCache.txt" ]]; then
echo "Cleaning existing build cache..."
rm -rf "${build_dir}"
fi
# Build package command if requested
local package_cmd=""
if [ "$package" = "appimage" ]; then
package_cmd="&& cd ${build_dir} && cpack -G External"
fi
# Run build in Docker
echo "Building in Docker container..."
# Different build commands for x64 (with vcpkg) and x86 (without vcpkg)
if [ "$arch" = "x86" ]; then
# x86: No vcpkg available, use system packages
docker run --rm \
${platform} \
-v "$(pwd):/project" \
-e BUILD_TYPE="${build_type}" \
-e USER_ID="${USER_ID}" \
-e GROUP_ID="${GROUP_ID}" \
"${image_name}" \
bash -c "
cmake -B ${build_dir} -G Ninja \
-DCMAKE_BUILD_TYPE=${build_type} && \
cmake --build ${build_dir} --parallel && \
cp -f spaghetti.o2r ${build_dir}/ 2>/dev/null || true && \
cp -f mk64.o2r ${build_dir}/ 2>/dev/null || true ${package_cmd} && \
chown -R ${USER_ID}:${GROUP_ID} /project/${build_dir} 2>/dev/null || true
"
else
# x64: Use vcpkg for static linking
docker run --rm \
${platform} \
-v "$(pwd):/project" \
-e BUILD_TYPE="${build_type}" \
-e USER_ID="${USER_ID}" \
-e GROUP_ID="${GROUP_ID}" \
"${image_name}" \
bash -c "
# Install vcpkg dependencies
if [ -f vcpkg.json ]; then
cp vcpkg.json /tmp/vcpkg.json && \
cd /tmp && \
\${VCPKG_ROOT}/vcpkg install --triplet ${triplet} 2>/dev/null || true && \
cd /project
fi && \
cmake -B ${build_dir} -G Ninja \
-DCMAKE_BUILD_TYPE=${build_type} \
-DCMAKE_TOOLCHAIN_FILE=/opt/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_TARGET_TRIPLET=${triplet} && \
cmake --build ${build_dir} --parallel && \
cp -f spaghetti.o2r ${build_dir}/ 2>/dev/null || true && \
cp -f mk64.o2r ${build_dir}/ 2>/dev/null || true ${package_cmd} && \
chown -R ${USER_ID}:${GROUP_ID} /project/${build_dir} 2>/dev/null || true
"
fi
echo ""
echo "${arch} build complete!"
echo "Executable: ${build_dir}/Spaghettify"
if [ -f "${build_dir}/Spaghettify" ]; then
file "${build_dir}/Spaghettify"
fi
if [ "$package" = "appimage" ]; then
ls -1 "${build_dir}"/*.appimage 2>/dev/null && echo "AppImage generated!" || echo "Note: AppImage may have failed"
fi
echo ""
}
case "$ARCH" in
x64|x86)
build_arch "$ARCH" "$BUILD_TYPE" "$PACKAGE"
;;
all)
build_arch x64 "$BUILD_TYPE" "$PACKAGE"
build_arch x86 "$BUILD_TYPE" "$PACKAGE"
;;
*)
echo "Usage: $0 [x64|x86|all] [Release|Debug] [appimage]"
echo ""
echo "Architectures:"
echo " x64 - x86_64 64-bit (default)"
echo " x86 - x86 32-bit"
echo " all - Build both architectures"
echo ""
echo "Options:"
echo " appimage - Generate AppImage package"
echo ""
echo "Examples:"
echo " $0 # Build x64 Release"
echo " $0 x86 # Build x86 Release"
echo " $0 x64 Release appimage # Build x64 with AppImage"
exit 1
;;
esac
echo "========================================"
echo "All builds completed successfully!"
echo "========================================"