2023-06-20 00:07:26 -03:00
#!/bin/sh
2025-11-18 12:32:45 +03:00
set -e
2023-06-20 00:07:26 -03:00
2025-11-18 12:32:45 +03:00
# Usage:
# ./build.sh -> desktop build (static SDL if available)
# ./build.sh shared -> build shared lib (forces dynamic SDL)
# ./build.sh ios -> build iOS dylib using iPhone SDK + ios/Frameworks/SDL2.xcframework
2025-11-19 05:43:44 +03:00
# ./build.sh macosapp -> build desktop exe and bundle armsx.app
2025-11-22 11:08:13 +03:00
# ./build.sh wasm -> build WebAssembly target to bin/wasm using emscripten
2025-11-23 05:24:54 +03:00
# ./build.sh android -> build SDL2/libarmsx for Android and stage under android/app/src/main/jniLibs
2026-04-06 05:00:18 +02:00
# ./build.sh psvita -> build Vita native archive + Rust SDL host and package ARMSX.vpk
2025-11-18 12:32:45 +03:00
MODE = " $1 "
2026-04-04 22:08:46 +02:00
BUILD_JOBS = " ${ BUILD_JOBS :- 4 } "
2026-07-27 21:23:15 +02:00
export USE_CHD = " ${ USE_CHD :- 1 } "
2026-04-04 22:08:46 +02:00
2026-08-01 15:45:00 +02:00
resolve_fsui_python() {
if [ -n " ${ FSUI_PYTHON_EXECUTABLE :- } " ] ; then
if [ ! -x " ${ FSUI_PYTHON_EXECUTABLE } " ] ||
! " ${ FSUI_PYTHON_EXECUTABLE } " -c "import jinja2" >/dev/null 2>& 1; then
echo "FSUI_PYTHON_EXECUTABLE must name an executable Python with jinja2 installed." >& 2
return 1
fi
printf '%s\n' " ${ FSUI_PYTHON_EXECUTABLE } "
return 0
fi
for candidate_name in python3 python; do
candidate = " $( command -v " ${ candidate_name } " 2>/dev/null || true ) "
if [ -n " ${ candidate } " ] &&
" ${ candidate } " -c "import jinja2" >/dev/null 2>& 1; then
printf '%s\n' " ${ candidate } "
return 0
fi
done
echo "fsui requires a Python with jinja2. Set FSUI_PYTHON_EXECUTABLE to an existing interpreter." >& 2
return 1
}
2026-04-04 22:08:46 +02:00
build_fsui_native() {
if [ " $( uname -s) " = "Darwin" ] ; then
MACOS_DEPLOYMENT_TARGET = " ${ MACOS_DEPLOYMENT_TARGET :- 10 .15 } "
2026-08-04 23:07:17 +02:00
cmake -S third_party/fuse-lib -B build/fsui/native \
2026-04-04 22:08:46 +02:00
-DFSUI_BUILD_SAMPLES= OFF \
-DFSUI_PLATFORM_BACKEND= SDL2 \
-DFSUI_USE_SYSTEM_SDL2= ON \
-DCMAKE_OSX_DEPLOYMENT_TARGET= " ${ MACOS_DEPLOYMENT_TARGET } "
else
2026-08-04 23:07:17 +02:00
cmake -S third_party/fuse-lib -B build/fsui/native \
2026-04-04 22:08:46 +02:00
-DFSUI_BUILD_SAMPLES= OFF \
-DFSUI_PLATFORM_BACKEND= SDL2 \
-DFSUI_USE_SYSTEM_SDL2= ON
fi
cmake --build build/fsui/native -j" ${ BUILD_JOBS } "
}
build_fsui_wasm() {
2026-04-07 17:22:44 +02:00
if ! command -v emcmake >/dev/null 2>& 1 || ! command -v emcc >/dev/null 2>& 1; then
2026-04-07 23:21:51 +02:00
for candidate in " ${ EMSCRIPTEN_ROOT :- } " " ${ EMSDK :- } " " $HOME /emsdk" "/opt/emsdk" "/Volumes/FastDrive/linkertools/emsdk" ; do
2026-04-07 17:22:44 +02:00
if [ -z " ${ candidate } " ] || [ ! -d " ${ candidate } " ] ; then
continue
fi
if [ -x " ${ candidate } /upstream/emscripten/emcmake" ] && [ -x " ${ candidate } /upstream/emscripten/emcc" ] ; then
export EMSDK = " ${ candidate } "
export EMSCRIPTEN = " ${ candidate } /upstream/emscripten"
PATH = " ${ candidate } /upstream/emscripten: ${ PATH } "
node_bin = " $( find " ${ candidate } /node" -type f -name node 2>/dev/null | head -n 1) "
if [ -n " ${ node_bin } " ] ; then
PATH = " $( dirname " ${ node_bin } " ) : ${ PATH } "
fi
export PATH
break
fi
if [ -x " ${ candidate } /emcmake" ] && [ -x " ${ candidate } /emcc" ] ; then
PATH = " ${ candidate } : ${ PATH } "
export PATH
break
fi
done
fi
if ! command -v emcmake >/dev/null 2>& 1 || ! command -v emcc >/dev/null 2>& 1; then
2026-04-07 23:21:51 +02:00
echo "emcmake/emcc are required for the wasm FSUI build. Set EMSCRIPTEN_ROOT, EMSDK, or install Emscripten under \$HOME/emsdk."
2026-04-04 22:08:46 +02:00
exit 1
fi
2026-08-04 23:07:17 +02:00
emcmake cmake -S third_party/fuse-lib -B build/fsui/wasm \
2026-04-04 22:08:46 +02:00
-DFSUI_BUILD_SAMPLES= OFF \
-DFSUI_PLATFORM_BACKEND= SDL2
cmake --build build/fsui/wasm -j" ${ BUILD_JOBS } "
}
2025-11-18 12:32:45 +03:00
2026-04-06 05:00:18 +02:00
build_fsui_psvita() {
if [ -z " ${ VITASDK :- } " ] ; then
echo "VITASDK must be set for PSVita builds."
exit 1
fi
cmake -S cmake/psvita-fsui -B build/fsui/psvita \
-DCMAKE_TOOLCHAIN_FILE= " ${ VITASDK } /share/vita.toolchain.cmake" \
-DCMAKE_BUILD_TYPE= Release \
2026-04-07 17:22:44 +02:00
-DCMAKE_POSITION_INDEPENDENT_CODE= OFF \
2026-04-06 05:00:18 +02:00
-DVITASDK= " ${ VITASDK } " \
-DFSUI_BUILD_SAMPLES= OFF \
-DFSUI_ENABLE_INSTALL= OFF \
-DFSUI_PLATFORM_BACKEND= SDL2 \
-DFSUI_IMGUI_OPENGL_ES3= ON
cmake --build build/fsui/psvita -j" ${ BUILD_JOBS } "
2026-04-07 17:22:44 +02:00
# The Vita Rust wrapper expects the FSUI archives in the CMake root output
2026-08-04 23:07:17 +02:00
# directory, so stage the real archives out of the nested fuse-lib build.
cp build/fsui/psvita/fuse-lib/libfsui*.a build/fsui/psvita/
2026-04-06 05:00:18 +02:00
}
2025-11-18 12:32:45 +03:00
bundle_macos_app() {
2026-04-06 05:00:18 +02:00
rm -rf armsx.app/Contents/Libraries
mkdir -p armsx.app/Contents/MacOS
mkdir -p armsx.app/Contents/Resources/icons
cp bin/armsx armsx.app/Contents/MacOS
cp icons/ArmsxDesktop.icns armsx.app/Contents/Resources/armsx.icns
cp -R icons/. armsx.app/Contents/Resources/icons/
chmod 777 armsx.app/Contents/MacOS/armsx
dylibbundler -b -x ./armsx.app/Contents/MacOS/armsx -d ./armsx.app/Contents/Libraries/ -p @executable_path/../Libraries/ -cd
cp Info.plist armsx.app/Contents/Info.plist
2026-04-04 22:14:30 +02:00
}
stage_android_runtime_icons() {
mkdir -p android/app/src/main/assets/icons
cp -R icons/. android/app/src/main/assets/icons/
2025-11-18 12:32:45 +03:00
}
2026-04-04 22:08:46 +02:00
prepare_ios_sdl_package() {
IOS_SDL_FRAMEWORK = " $1 "
IOS_SDL_PACKAGE_ROOT = " $( pwd ) /build/fsui/ios-sdl-package/SDL2.framework"
rm -rf " ${ IOS_SDL_PACKAGE_ROOT } "
mkdir -p " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A/Resources/CMake"
mkdir -p " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A"
ln -s " ${ IOS_SDL_FRAMEWORK } /Headers" " ${ IOS_SDL_PACKAGE_ROOT } /Headers"
ln -s " ${ IOS_SDL_FRAMEWORK } /Headers" " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A/Headers"
ln -s " ${ IOS_SDL_FRAMEWORK } /SDL2" " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A/SDL2"
cp " ${ IOS_SDL_FRAMEWORK } /CMake/sdl2-config.cmake" " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A/Resources/CMake/"
cp " ${ IOS_SDL_FRAMEWORK } /CMake/sdl2-config-version.cmake" " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A/Resources/CMake/"
printf '%s\n' " ${ IOS_SDL_PACKAGE_ROOT } /Versions/A/Resources/CMake"
}
2025-11-18 12:32:45 +03:00
if [ " $MODE " = "ios" ] ; then
IOS_SDK = " ${ IOS_SDK :- iphoneos } "
IOS_DEPLOYMENT_TARGET = " ${ IOS_DEPLOYMENT_TARGET :- 13 .0 } "
IOS_SDKROOT = " $( xcrun --sdk " ${ IOS_SDK } " --show-sdk-path) "
IOS_CC = " $( xcrun --sdk " ${ IOS_SDK } " --find clang) "
IOS_CXX = " $( xcrun --sdk " ${ IOS_SDK } " --find clang++) "
DEFAULT_SDL_FW_ROOT = " $( pwd ) /ios/Frameworks/SDL2.xcframework"
IOS_SDL_FRAMEWORK = " ${ IOS_SDL_FRAMEWORK :- $DEFAULT_SDL_FW_ROOT } "
# Resolve to the actual SDL2.framework path
if [ -d " ${ IOS_SDL_FRAMEWORK } /SDL2.framework" ] ; then
IOS_SDL_FRAMEWORK = " ${ IOS_SDL_FRAMEWORK } /SDL2.framework"
elif [ -d " ${ IOS_SDL_FRAMEWORK } /ios-arm64/SDL2.framework" ] ; then
IOS_SDL_FRAMEWORK = " ${ IOS_SDL_FRAMEWORK } /ios-arm64/SDL2.framework"
elif [ ! -d " ${ IOS_SDL_FRAMEWORK } /Headers" ] ; then
echo "SDL2.framework not found under ${ IOS_SDL_FRAMEWORK } "
echo "Place the xcframework in ios/Frameworks or set IOS_SDL_FRAMEWORK to the SDL2.framework path."
exit 1
fi
if [ ! -d " ${ IOS_SDL_FRAMEWORK } " ] ; then
echo "SDL2.xcframework not found at ${ IOS_SDL_FRAMEWORK } "
echo "Place the framework in ios/Frameworks (or set IOS_SDL_FRAMEWORK) and retry."
exit 1
fi
2026-04-04 22:08:46 +02:00
IOS_SDL2_DIR = " $( prepare_ios_sdl_package " ${ IOS_SDL_FRAMEWORK } " ) "
2026-08-01 15:45:00 +02:00
FSUI_PYTHON = " $( resolve_fsui_python) "
2026-04-04 22:08:46 +02:00
2025-11-18 12:32:45 +03:00
echo "Building iOS dylib with SDK ${ IOS_SDK } ( ${ IOS_SDKROOT } )"
2026-08-04 23:07:17 +02:00
cmake -S third_party/fuse-lib -B build/fsui/ios \
2026-04-04 22:08:46 +02:00
-DFSUI_BUILD_SAMPLES= OFF \
-DFSUI_PLATFORM_BACKEND= SDL2 \
-DFSUI_USE_SYSTEM_SDL2= ON \
-DCMAKE_SYSTEM_NAME= iOS \
-DCMAKE_OSX_ARCHITECTURES= arm64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET= " ${ IOS_DEPLOYMENT_TARGET } " \
-DCMAKE_OSX_SYSROOT= " ${ IOS_SDKROOT } " \
2026-08-01 15:45:00 +02:00
-DPython_EXECUTABLE= " ${ FSUI_PYTHON } " \
2026-04-04 22:08:46 +02:00
-DSDL2_DIR= " ${ IOS_SDL2_DIR } "
cmake --build build/fsui/ios -j" ${ BUILD_JOBS } "
2025-11-18 12:32:45 +03:00
make clean
2026-04-04 22:08:46 +02:00
IOS_ENV = "IOS_TARGET=1 IOS_SDK= ${ IOS_SDK } IOS_DEPLOYMENT_TARGET= ${ IOS_DEPLOYMENT_TARGET } SDKROOT= ${ IOS_SDKROOT } CC= ${ IOS_CC } CXX= ${ IOS_CXX } SDL_STATIC=0 IOS_SDL_FRAMEWORK= ${ IOS_SDL_FRAMEWORK } FSUI_BUILD_DIR= $( pwd ) /build/fsui/ios"
2026-04-09 19:08:02 +02:00
eval "make shared LIBCHDR_BUILD_DIR= $( pwd ) /build/libchdr/ios ${ IOS_ENV } "
2025-11-19 05:43:44 +03:00
echo "Copying libarmsx.dylib to ios/Frameworks/"
cp bin/libarmsx.dylib ios/Frameworks/
2025-11-18 12:32:45 +03:00
elif [ " $MODE " = "shared" ] ; then
2026-04-04 22:08:46 +02:00
build_fsui_native
2025-11-18 12:32:45 +03:00
make clean
2026-04-09 19:08:02 +02:00
SDL_STATIC = 0 MACOS_DEPLOYMENT_TARGET = " ${ MACOS_DEPLOYMENT_TARGET :- 10 .15 } " FSUI_BUILD_DIR = " $( pwd ) /build/fsui/native" LIBCHDR_BUILD_DIR = " $( pwd ) /build/libchdr/native" make shared
2025-11-18 12:32:45 +03:00
2025-11-23 05:24:54 +03:00
elif [ " $MODE " = "android" ] ; then
2026-04-04 22:14:30 +02:00
stage_android_runtime_icons
ANDROID_NDK_ROOT = " ${ ANDROID_NDK_ROOT :- ${ ANDROID_NDK_HOME :- ${ NDK_HOME :- }}} "
2025-11-23 05:24:54 +03:00
if [ -z " ${ ANDROID_NDK_ROOT } " ] ; then
echo "ANDROID_NDK_ROOT (or ANDROID_NDK_HOME / NDK_HOME) must be set to a valid NDK path."
exit 1
fi
if [ ! -d " ${ ANDROID_NDK_ROOT } " ] ; then
echo "Android NDK path ${ ANDROID_NDK_ROOT } does not exist."
exit 1
fi
ANDROID_ABI = " ${ ANDROID_ABI :- arm64 -v8a } "
ANDROID_API = " ${ ANDROID_API :- 26 } "
ANDROID_PLATFORM = "android- ${ ANDROID_API } "
case " ${ ANDROID_ABI } " in
arm64-v8a)
ANDROID_TRIPLE = "aarch64-linux-android"
2026-04-07 08:30:44 +02:00
ANDROID_CXX_RUNTIME_TRIPLE = "aarch64-linux-android"
2025-11-23 05:24:54 +03:00
;;
armeabi-v7a)
ANDROID_TRIPLE = "armv7a-linux-androideabi"
2026-04-07 08:30:44 +02:00
ANDROID_CXX_RUNTIME_TRIPLE = "arm-linux-androideabi"
;;
x86)
ANDROID_TRIPLE = "i686-linux-android"
ANDROID_CXX_RUNTIME_TRIPLE = "i686-linux-android"
2025-11-23 05:24:54 +03:00
;;
x86_64)
ANDROID_TRIPLE = "x86_64-linux-android"
2026-04-07 08:30:44 +02:00
ANDROID_CXX_RUNTIME_TRIPLE = "x86_64-linux-android"
2025-11-23 05:24:54 +03:00
;;
*)
echo "Unsupported ANDROID_ABI ' ${ ANDROID_ABI } '."
exit 1
;;
esac
HOST_OS = " $( uname -s | tr '[:upper:]' '[:lower:]' ) "
HOST_ARCH = " $( uname -m) "
case " ${ HOST_ARCH } " in
arm64| aarch64)
HOST_ARCH_TAG = "arm64"
;;
x86_64)
HOST_ARCH_TAG = "x86_64"
;;
*)
HOST_ARCH_TAG = " ${ HOST_ARCH } "
;;
esac
HOST_TAG = " ${ HOST_OS } - ${ HOST_ARCH_TAG } "
TOOLCHAIN_DIR = " ${ ANDROID_NDK_ROOT } /toolchains/llvm/prebuilt/ ${ HOST_TAG } "
if [ ! -d " ${ TOOLCHAIN_DIR } " ] ; then
# Fallback to the first available prebuilt toolchain
TOOLCHAIN_DIR = " $( ls -d " ${ ANDROID_NDK_ROOT } /toolchains/llvm/prebuilt/" * 2>/dev/null | head -n 1) "
if [ -z " ${ TOOLCHAIN_DIR } " ] ; then
echo "Unable to locate LLVM toolchain inside ${ ANDROID_NDK_ROOT } ."
exit 1
fi
HOST_TAG = " $( basename " ${ TOOLCHAIN_DIR } " ) "
fi
echo "Using Android NDK at ${ ANDROID_NDK_ROOT } (toolchain ${ HOST_TAG } , ABI ${ ANDROID_ABI } , API ${ ANDROID_API } )"
2026-04-07 08:30:44 +02:00
ANDROID_TOOLCHAIN_FILE = " ${ ANDROID_NDK_ROOT } /build/cmake/android.toolchain.cmake"
if [ ! -f " ${ ANDROID_TOOLCHAIN_FILE } " ] ; then
echo "Android toolchain file not found at ${ ANDROID_TOOLCHAIN_FILE } "
exit 1
fi
REPO_ROOT = " $( pwd ) "
2026-04-07 17:22:44 +02:00
SDL_BUILD_ROOT = " ${ REPO_ROOT } /build/android/sdl/ ${ ANDROID_ABI } "
2025-11-23 05:24:54 +03:00
SDL_INSTALL_DIR = " ${ SDL_BUILD_ROOT } /install"
2026-04-07 17:22:44 +02:00
rm -rf " ${ SDL_BUILD_ROOT } "
2025-11-23 05:24:54 +03:00
mkdir -p " ${ SDL_BUILD_ROOT } "
cmake -S third_party/SDL -B " ${ SDL_BUILD_ROOT } " \
2026-04-07 08:30:44 +02:00
-DCMAKE_TOOLCHAIN_FILE= " ${ ANDROID_TOOLCHAIN_FILE } " \
2025-11-23 05:24:54 +03:00
-DANDROID_ABI= " ${ ANDROID_ABI } " \
-DANDROID_PLATFORM= " ${ ANDROID_PLATFORM } " \
-DANDROID_STL= c++_shared \
2026-08-01 15:45:00 +02:00
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES= ON \
2025-11-23 05:24:54 +03:00
-DCMAKE_BUILD_TYPE= Release \
-DBUILD_SHARED_LIBS= ON \
-DSDL_STATIC= OFF \
-DSDL_TEST= OFF \
2026-08-01 15:45:00 +02:00
-DCMAKE_SHARED_LINKER_FLAGS= "-Wl,-z,common-page-size=16384" \
2025-11-23 05:24:54 +03:00
-DCMAKE_INSTALL_PREFIX= " ${ SDL_INSTALL_DIR } "
cmake --build " ${ SDL_BUILD_ROOT } " --config Release
cmake --install " ${ SDL_BUILD_ROOT } " --config Release
SDL_LIB_PATH = " ${ SDL_INSTALL_DIR } /lib"
SDL_INCLUDE_PATH = " ${ SDL_INSTALL_DIR } /include/SDL2"
SDL_SHARED_LIB = " ${ SDL_LIB_PATH } /libSDL2.so"
2026-04-07 08:30:44 +02:00
CXX_SHARED_RUNTIME = " ${ TOOLCHAIN_DIR } /sysroot/usr/lib/ ${ ANDROID_CXX_RUNTIME_TRIPLE } /libc++_shared.so"
2025-11-23 05:24:54 +03:00
if [ ! -f " ${ SDL_SHARED_LIB } " ] ; then
echo "SDL shared library not found at ${ SDL_SHARED_LIB } "
exit 1
fi
2026-04-07 08:30:44 +02:00
if [ ! -f " ${ CXX_SHARED_RUNTIME } " ] ; then
echo "Android C++ shared runtime not found at ${ CXX_SHARED_RUNTIME } "
exit 1
fi
2025-11-23 05:24:54 +03:00
2026-04-07 08:30:44 +02:00
JNI_LIB_DIR = " ${ REPO_ROOT } /android/app/src/main/jniLibs/ ${ ANDROID_ABI } "
SDL_HEADER_STAGE = " ${ REPO_ROOT } /android/native-deps/SDL2/include"
2025-11-23 05:24:54 +03:00
mkdir -p " ${ JNI_LIB_DIR } "
rm -rf " ${ SDL_HEADER_STAGE } "
mkdir -p " ${ SDL_HEADER_STAGE } "
cp -R " ${ SDL_INCLUDE_PATH } /." " ${ SDL_HEADER_STAGE } /"
TOOLCHAIN_BIN = " ${ TOOLCHAIN_DIR } /bin"
CC = " ${ TOOLCHAIN_BIN } / ${ ANDROID_TRIPLE }${ ANDROID_API } -clang"
CXX = " ${ TOOLCHAIN_BIN } / ${ ANDROID_TRIPLE }${ ANDROID_API } -clang++"
2026-08-01 15:45:00 +02:00
AR = " ${ TOOLCHAIN_BIN } /llvm-ar"
RANLIB = " ${ TOOLCHAIN_BIN } /llvm-ranlib"
2025-11-23 05:24:54 +03:00
export CC
export CXX
2026-08-01 15:45:00 +02:00
export AR
export RANLIB
2025-11-23 05:24:54 +03:00
2026-08-01 15:45:00 +02:00
SDL_CFLAGS = "-D_REENTRANT -DANDROID -D__BIONIC_NO_PAGE_SIZE_MACRO -I ${ SDL_INCLUDE_PATH } "
2025-11-23 05:24:54 +03:00
SDL_LIBS = "-L ${ SDL_LIB_PATH } -lSDL2 -llog -landroid -lGLESv3 -lEGL -lOpenSLES -lm -lc++_shared"
2026-08-01 15:45:00 +02:00
ANDROID_FLEXIBLE_PAGE_LDFLAGS = "-Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384"
2025-11-23 05:24:54 +03:00
2026-04-07 08:30:44 +02:00
FSUI_BUILD_ROOT = " ${ REPO_ROOT } /build/fsui/android/ ${ ANDROID_ABI } "
2026-08-01 15:45:00 +02:00
FSUI_PYTHON = " $( resolve_fsui_python) "
2026-08-04 23:07:17 +02:00
cmake -S third_party/fuse-lib -B " ${ FSUI_BUILD_ROOT } " \
2026-04-04 22:08:46 +02:00
-DFSUI_BUILD_SAMPLES= OFF \
-DFSUI_PLATFORM_BACKEND= SDL2 \
-DFSUI_USE_SYSTEM_SDL2= ON \
2026-08-01 15:45:00 +02:00
-DFSUI_IMGUI_OPENGL_ES3= ON \
-DPython_EXECUTABLE= " ${ FSUI_PYTHON } " \
2026-04-07 08:30:44 +02:00
-DCMAKE_TOOLCHAIN_FILE= " ${ ANDROID_TOOLCHAIN_FILE } " \
2026-04-04 22:08:46 +02:00
-DANDROID_ABI= " ${ ANDROID_ABI } " \
-DANDROID_PLATFORM= " ${ ANDROID_PLATFORM } " \
-DANDROID_STL= c++_shared \
2026-08-01 15:45:00 +02:00
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES= ON \
2026-04-04 22:08:46 +02:00
-DCMAKE_BUILD_TYPE= Release \
2026-04-07 08:30:44 +02:00
-DCMAKE_PREFIX_PATH= " ${ SDL_INSTALL_DIR } " \
-DSDL2_DIR= " ${ SDL_INSTALL_DIR } /lib/cmake/SDL2"
2026-04-04 22:08:46 +02:00
cmake --build " ${ FSUI_BUILD_ROOT } " --config Release -j" ${ BUILD_JOBS } "
2025-11-23 05:24:54 +03:00
make clean
2026-04-07 08:30:44 +02:00
make \
SDL_STATIC = 0 \
SDL_CFLAGS = " ${ SDL_CFLAGS } " \
SDL_LIBS_DYNAMIC = " ${ SDL_LIBS } " \
FSUI_BUILD_DIR = " ${ FSUI_BUILD_ROOT } " \
2026-04-09 19:08:02 +02:00
LIBCHDR_BUILD_DIR = " ${ REPO_ROOT } /build/libchdr/android/ ${ ANDROID_ABI } " \
2026-08-01 15:45:00 +02:00
LIBCHDR_CMAKE_TOOLCHAIN_FILE = " ${ ANDROID_TOOLCHAIN_FILE } " \
LIBCHDR_ANDROID_ABI = " ${ ANDROID_ABI } " \
LIBCHDR_ANDROID_PLATFORM = " ${ ANDROID_PLATFORM } " \
LIBCHDR_ANDROID_FLEXIBLE_PAGE_SIZES = ON \
2026-04-07 08:30:44 +02:00
PLATFORM = Android \
OS_INFO = Android \
2026-08-01 15:45:00 +02:00
PLATFORM_EXTRA_LDFLAGS = " ${ ANDROID_FLEXIBLE_PAGE_LDFLAGS } " \
2026-04-07 08:30:44 +02:00
PLATFORM_EXTRA_LIBS = \
shared
2025-11-23 05:24:54 +03:00
cp " ${ SDL_SHARED_LIB } " " ${ JNI_LIB_DIR } /"
2026-04-07 08:30:44 +02:00
cp " ${ CXX_SHARED_RUNTIME } " " ${ JNI_LIB_DIR } /"
2025-11-23 05:24:54 +03:00
cp bin/libarmsx.so " ${ JNI_LIB_DIR } /"
2026-04-06 05:00:18 +02:00
elif [ " $MODE " = "psvita" ] ; then
if [ -z " ${ VITASDK :- } " ] ; then
echo "VITASDK must be set for PSVita builds."
exit 1
fi
if ! command -v cargo >/dev/null 2>& 1; then
echo "cargo is required for the PSVita Rust host build."
exit 1
fi
export PATH = " ${ VITASDK } /bin: ${ PATH } "
build_fsui_psvita
make clean
2026-04-09 19:08:02 +02:00
VITASDK = " ${ VITASDK } " PSVITA_TARGET = 1 FSUI_BUILD_DIR = " $( pwd ) /build/fsui/psvita" LIBCHDR_BUILD_DIR = " $( pwd ) /build/libchdr/psvita" make psvita-lib
2026-04-06 05:00:18 +02:00
export PKG_CONFIG_ALLOW_CROSS = 1
export PKG_CONFIG = " ${ VITASDK } /bin/arm-vita-eabi-pkg-config"
export CARGO_TARGET_ARMV7_SONY_VITA_NEWLIBEABIHF_LINKER = arm-vita-eabi-g++
export ARMSX_VITA_NATIVE_DIR = " $( pwd ) /bin/psvita"
export ARMSX_VITA_FSUI_DIR = " $( pwd ) /build/fsui/psvita"
2026-04-09 19:08:02 +02:00
export ARMSX_VITA_LIBCHDR_DIR = " $( pwd ) /build/libchdr/psvita"
2026-04-06 05:00:18 +02:00
cargo build \
--manifest-path psvita/Cargo.toml \
--release \
--target armv7-sony-vita-newlibeabihf \
-Z build-std= std,panic_abort
VITA_PACKAGE_DIR = " $( pwd ) /build/psvita/package"
VITA_TARGET_DIR = " $( pwd ) /psvita/target/armv7-sony-vita-newlibeabihf/release"
2026-04-07 17:22:44 +02:00
VITA_ELF = " ${ VITA_TARGET_DIR } /ARMSX_vita.elf"
if [ ! -f " ${ VITA_ELF } " ] && [ -f " ${ VITA_TARGET_DIR } /ARMSX_vita" ] ; then
VITA_ELF = " ${ VITA_TARGET_DIR } /ARMSX_vita"
fi
2026-04-06 05:00:18 +02:00
VITA_VELF = " ${ VITA_PACKAGE_DIR } /eboot.velf"
VITA_EBOOT = " ${ VITA_PACKAGE_DIR } /eboot.bin"
VITA_PARAM = " ${ VITA_PACKAGE_DIR } /param.sfo"
VITA_VPK = " ${ VITA_PACKAGE_DIR } /ARMSX.vpk"
if [ ! -f " ${ VITA_ELF } " ] ; then
echo "Expected Vita host ELF not found at ${ VITA_ELF } "
exit 1
fi
rm -rf " ${ VITA_PACKAGE_DIR } "
mkdir -p " ${ VITA_PACKAGE_DIR } /sce_sys"
2026-04-07 17:22:44 +02:00
cp icons/ArmsxDesktop.png " ${ VITA_PACKAGE_DIR } /sce_sys/icon0.png"
2026-04-06 05:00:18 +02:00
vita-mksfoex -s TITLE_ID = ARMSX001 "ARMSX PSVita" " ${ VITA_PARAM } "
vita-elf-create -s " ${ VITA_ELF } " " ${ VITA_VELF } "
vita-make-fself -s " ${ VITA_VELF } " " ${ VITA_EBOOT } "
vita-pack-vpk " ${ VITA_VPK } " \
-s " ${ VITA_PARAM } " \
-b " ${ VITA_EBOOT } " \
-a " $( pwd ) /icons=icons" \
-a " ${ VITA_PACKAGE_DIR } /sce_sys=sce_sys"
cp " ${ VITA_VPK } " bin/psvita/
echo "Packaged Vita build at bin/psvita/ARMSX.vpk"
2025-11-22 11:08:13 +03:00
elif [ " $MODE " = "wasm" ] ; then
2026-04-04 22:08:46 +02:00
build_fsui_wasm
2025-11-22 11:08:13 +03:00
make clean
if command -v emmake >/dev/null 2>& 1; then
2026-04-09 19:08:02 +02:00
emmake make wasm FSUI_BUILD_DIR = " $( pwd ) /build/fsui/wasm" LIBCHDR_BUILD_DIR = " $( pwd ) /build/libchdr/wasm"
2025-11-22 11:08:13 +03:00
else
2026-04-09 19:08:02 +02:00
make wasm FSUI_BUILD_DIR = " $( pwd ) /build/fsui/wasm" LIBCHDR_BUILD_DIR = " $( pwd ) /build/libchdr/wasm"
2025-11-22 11:08:13 +03:00
fi
2025-11-18 12:32:45 +03:00
elif [ " $MODE " = "macosapp" ] ; then
2026-04-04 22:08:46 +02:00
build_fsui_native
2025-11-18 12:32:45 +03:00
make clean
2026-04-09 19:08:02 +02:00
SDL_STATIC = 0 MACOS_DEPLOYMENT_TARGET = " ${ MACOS_DEPLOYMENT_TARGET :- 10 .15 } " FSUI_BUILD_DIR = " $( pwd ) /build/fsui/native" LIBCHDR_BUILD_DIR = " $( pwd ) /build/libchdr/native" make
2025-11-18 12:32:45 +03:00
bundle_macos_app
2023-06-20 00:07:26 -03:00
2025-11-18 03:59:11 +03:00
else
2026-04-04 22:08:46 +02:00
build_fsui_native
2025-11-18 12:32:45 +03:00
make clean
2026-04-09 19:08:02 +02:00
SDL_STATIC = 0 MACOS_DEPLOYMENT_TARGET = " ${ MACOS_DEPLOYMENT_TARGET :- 10 .15 } " FSUI_BUILD_DIR = " $( pwd ) /build/fsui/native" LIBCHDR_BUILD_DIR = " $( pwd ) /build/libchdr/native" make
2025-11-18 03:59:11 +03:00
fi