mirror of
https://github.com/fleetbase/fleetbase.git
synced 2026-01-08 15:26:19 +00:00
170 lines
8.0 KiB
Bash
Executable File
170 lines
8.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
log() {
|
|
echo -e "\033[1;34m[🔧 $1]\033[0m"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "\033[1;32m[✅ $1]\033[0m"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "\033[1;33m[⚠️ $1]\033[0m"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "\033[1;31m[❌ $1]\033[0m"
|
|
}
|
|
|
|
# Define base paths
|
|
log "Resolving directories..."
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
OSX_DIR="$ROOT_DIR/builds/osx"
|
|
DIST_DIR="$ROOT_DIR/builds/dist"
|
|
APP_DIR="$ROOT_DIR/api"
|
|
BREW_PREFIX="/opt/homebrew"
|
|
|
|
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
|
ARCH="$(uname -m)"
|
|
BINARY_NAME="fleetbase-$OS-$ARCH"
|
|
|
|
log "Binary will be: $BINARY_NAME"
|
|
|
|
# Setup PHP 8.4
|
|
log "Detecting current PHP version..."
|
|
ORIGINAL_PHP_PATH="$(which php)"
|
|
ORIGINAL_PHP_VERSION="$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION.".".PHP_RELEASE_VERSION;' 2>/dev/null)"
|
|
IS_ASDF_MANAGED=false
|
|
|
|
if [[ "$ORIGINAL_PHP_PATH" == *".asdf"* ]]; then
|
|
IS_ASDF_MANAGED=true
|
|
fi
|
|
|
|
# 🔁 Trap to restore PHP when script exits
|
|
trap 'if [ "$IS_ASDF_MANAGED" = true ]; then
|
|
log "Restoring asdf-managed PHP version: $ORIGINAL_PHP_VERSION"
|
|
asdf set php "$ORIGINAL_PHP_VERSION"
|
|
log "Reverted to PHP $(php -v | head -n 1)"
|
|
else
|
|
log "Unsetting asdf set to restore system PHP"
|
|
asdf set php system
|
|
log "Reverted to PHP $(php -v | head -n 1)"
|
|
fi' EXIT
|
|
|
|
log "Detected PHP version: $ORIGINAL_PHP_VERSION"
|
|
log "Detected PHP binary: $ORIGINAL_PHP_PATH"
|
|
|
|
if ! asdf list php | grep -q "8.4.0"; then
|
|
# Use brew to install required dependencies for asdf php management
|
|
log "Checking and installing Homebrew packages required for PHP 8.4 build..."
|
|
|
|
for pkg in autoconf automake bison freetype gd gettext icu4c krb5 libedit libiconv libjpeg libpng libxml2 libzip pkg-config re2c zlib sqlite3 libsodium oniguruma openssl@3 nasm; do
|
|
if ! brew list "$pkg" &>/dev/null; then
|
|
log_warn "$pkg not found. Installing..."
|
|
arch -arm64 brew install "$pkg"
|
|
else
|
|
log "$pkg already installed. Skipping."
|
|
fi
|
|
done
|
|
|
|
# Set necessary env flags/paths for PHP build on OSX ARM64
|
|
export CPPFLAGS="-I$BREW_PREFIX/opt/oniguruma/include -I$BREW_PREFIX/opt/libsodium/include -I$BREW_PREFIX/opt/bzip2/include -I$BREW_PREFIX/opt/zlib/include -I$BREW_PREFIX/opt/openssl@3/include -I$BREW_PREFIX/opt/libxml2/include -I$BREW_PREFIX/opt/libedit/include -I$BREW_PREFIX/opt/curl/include -I$BREW_PREFIX/opt/sqlite3/include -I$BREW_PREFIX/opt/freetype/include -I$BREW_PREFIX/opt/jpeg/include -I$BREW_PREFIX/opt/libpng/include -I$BREW_PREFIX/opt/libzip/include"
|
|
export LDFLAGS="-L$BREW_PREFIX/opt/openssl@3/lib -lssl -lcrypto -lz -L$BREW_PREFIX/opt/oniguruma/lib -lonig -L$BREW_PREFIX/opt/libsodium/lib -lsodium -L$BREW_PREFIX/opt/bzip2/lib -Wl,-rpath,$BREW_PREFIX/opt/bzip2/lib -lbz2 -L$BREW_PREFIX/opt/zlib/lib -L$BREW_PREFIX/opt/openssl@3/lib -L$BREW_PREFIX/opt/libxml2/lib -L$BREW_PREFIX/opt/libedit/lib -L$BREW_PREFIX/opt/sqlite3/lib -lsqlite3 -L$BREW_PREFIX/opt/curl/lib -lcurl -L$BREW_PREFIX/opt/freetype/lib -L$BREW_PREFIX/opt/jpeg/lib -L$BREW_PREFIX/opt/libpng/lib -L$BREW_PREFIX/opt/libzip/lib -lzip -lz"
|
|
export PKG_CONFIG_PATH="$BREW_PREFIX/opt/openssl/lib/pkgconfig:$BREW_PREFIX/opt/oniguruma/lib/pkgconfig:$BREW_PREFIX/opt/libsodium/lib/pkgconfig:$BREW_PREFIX/opt/libzip/lib/pkgconfig:$BREW_PREFIX/opt/gd/lib/pkgconfig:$BREW_PREFIX/opt/zlib/lib/pkgconfig:$BREW_PREFIX/opt/openssl@3/lib/pkgconfig:$BREW_PREFIX/opt/libxml2/lib/pkgconfig:$BREW_PREFIX/opt/curl/lib/pkgconfig:$BREW_PREFIX/opt/sqlite3/lib/pkgconfig:$BREW_PREFIX/opt/freetype/lib/pkgconfig:$BREW_PREFIX/opt/jpeg/lib/pkgconfig:$BREW_PREFIX/opt/libpng/lib/pkgconfig"
|
|
export PHP_CONFIGURE_OPTIONS="--with-openssl=$(brew --prefix openssl) --with-iconv=$(brew --prefix libiconv)"
|
|
|
|
log "Installing PHP 8.4.0 with asdf..."
|
|
asdf install php 8.4.0 --verbose
|
|
fi
|
|
|
|
log "Switching to PHP 8.4.0 with asdf set..."
|
|
asdf set php 8.4.0 --home
|
|
|
|
# Clone FrankenPHP
|
|
if [ ! -d "$OSX_DIR/frankenphp" ]; then
|
|
log "Cloning FrankenPHP..."
|
|
git clone https://github.com/dunglas/frankenphp "$OSX_DIR/frankenphp"
|
|
else
|
|
log_warn "FrankenPHP already cloned. Skipping."
|
|
fi
|
|
|
|
cd "$OSX_DIR/frankenphp"
|
|
|
|
# Patch build script
|
|
log "Patching build-static.sh to skip git pull..."
|
|
sed -i '' 's/^[ \t]*git pull/# git pull/' ./build-static.sh
|
|
|
|
# Set environment variables
|
|
log "Exporting build environment variables..."
|
|
export PHP_VERSION=8.2
|
|
export PHP_EXTENSIONS="pdo_mysql,gd,bcmath,redis,intl,zip,gmp,apcu,opcache,imagick,sockets,pcntl,geos,iconv,mbstring,fileinfo,ctype,tokenizer,simplexml,dom,filter,session"
|
|
export PHP_EXTENSION_LIBS="libgeos,libzip,bzip2,libxml2,openssl,zlib"
|
|
export SPC_REL_TYPE=source
|
|
export NO_COMPRESS=1
|
|
export SPC_OPT_BUILD_ARGS="--debug"
|
|
export CMAKE_OSX_ARCHITECTURES=arm64
|
|
|
|
# Clone and prepare static-php-cli in dist/
|
|
STATIC_PHP_CLI_DIR="$OSX_DIR/frankenphp/dist/static-php-cli"
|
|
if [ ! -d "$STATIC_PHP_CLI_DIR" ]; then
|
|
log "Cloning static-php-cli into dist/..."
|
|
git clone https://github.com/crazywhalecc/static-php-cli.git "$STATIC_PHP_CLI_DIR"
|
|
else
|
|
log_warn "static-php-cli already exists in dist/. Skipping clone."
|
|
fi
|
|
|
|
# Inject libgeos support
|
|
log "Injecting libgeos patch files..."
|
|
cp "$ROOT_DIR/builds/osx/spc/libgeos-unix.php" "$STATIC_PHP_CLI_DIR/src/SPC/builder/unix/library/libgeos.php"
|
|
cp "$ROOT_DIR/builds/osx/spc/libgeos-macos.php" "$STATIC_PHP_CLI_DIR/src/SPC/builder/macos/library/libgeos.php"
|
|
cp "$ROOT_DIR/builds/osx/spc/UnixBuilderBase-macos.php" "$STATIC_PHP_CLI_DIR/src/SPC/builder/unix/UnixBuilderBase.php"
|
|
|
|
# Patch SPC config
|
|
log "Patching SPC config files (source.json, ext.json, lib.json)..."
|
|
jq '. + {"php-geos": {"type": "url", "url": "https://github.com/libgeos/php-geos/archive/dfe1ab17b0f155cc315bc13c75689371676e02e1.zip", "license": [{"type": "file", "path": "php-geos-dfe1ab17b0f155cc315bc13c75689371676e02e1/MIT-LICENSE"}, {"type": "file", "path": "php-geos-dfe1ab17b0f155cc315bc13c75689371676e02e1/LGPL-2"}]}}' \
|
|
"$STATIC_PHP_CLI_DIR/config/source.json" > "$STATIC_PHP_CLI_DIR/config/source.tmp.json" && \
|
|
mv "$STATIC_PHP_CLI_DIR/config/source.tmp.json" "$STATIC_PHP_CLI_DIR/config/source.json"
|
|
|
|
jq '. + {"libgeos": {"type": "url", "url": "https://download.osgeo.org/geos/geos-3.12.1.tar.bz2", "filename": "geos-3.12.1.tar.bz2", "extract": "geos-3.12.1", "build-dir": "build", "license": [{"type": "file", "path": "COPYING"}]}}' \
|
|
"$STATIC_PHP_CLI_DIR/config/source.json" > "$STATIC_PHP_CLI_DIR/config/source.tmp.json" && \
|
|
mv "$STATIC_PHP_CLI_DIR/config/source.tmp.json" "$STATIC_PHP_CLI_DIR/config/source.json"
|
|
|
|
jq '. + {"libgeos": {"source": "libgeos", "static-libs-unix": ["libgeos.a", "libgeos_c.a"]}}' \
|
|
"$STATIC_PHP_CLI_DIR/config/lib.json" > "$STATIC_PHP_CLI_DIR/config/lib.tmp.json" && \
|
|
mv "$STATIC_PHP_CLI_DIR/config/lib.tmp.json" "$STATIC_PHP_CLI_DIR/config/lib.json"
|
|
|
|
jq '. + {"geos": {"type": "external", "arg-type": "enable", "source": "php-geos", "lib-depends": ["libgeos"]}}' \
|
|
"$STATIC_PHP_CLI_DIR/config/ext.json" > "$STATIC_PHP_CLI_DIR/config/ext.tmp.json" && \
|
|
mv "$STATIC_PHP_CLI_DIR/config/ext.tmp.json" "$STATIC_PHP_CLI_DIR/config/ext.json"
|
|
|
|
# Prepare app embed folder
|
|
log "📦 Preparing embedded app directory..."
|
|
rm -rf ./dist/app
|
|
mkdir -p ./dist/app
|
|
cp -R "$APP_DIR"/* ./dist/app/
|
|
|
|
log "Patching build-static.sh to skip git pull and composer install..."
|
|
|
|
# Skip `git pull`
|
|
sed -i '' 's/^[[:space:]]*git pull/# git pull/' "$OSX_DIR/frankenphp/build-static.sh"
|
|
|
|
# Patch add CoreServices framework for Caddy build on OSX
|
|
sed -i '' 's/-framework CoreFoundation -framework SystemConfiguration/& -framework CoreServices/' "$OSX_DIR/frankenphp/build-static.sh"
|
|
|
|
# Build the binary
|
|
log "⚙️ Running FrankenPHP build-static.sh..."
|
|
EMBED=dist/app ./build-static.sh
|
|
|
|
# Move built binary to dist
|
|
log "Moving built binary to output folder..."
|
|
mkdir -p "$DIST_DIR"
|
|
mv dist/frankenphp-mac-$ARCH "$DIST_DIR/$BINARY_NAME"
|
|
|
|
log_success "✅ macOS binary built at: $DIST_DIR/$BINARY_NAME"
|
|
|
|
# Clean up frankenphp build and app embed folder
|
|
log "🧹 Cleaning temporary app directory..."
|
|
rm -rf "$OSX_DIR/frankenphp" |