|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +set -o errexit |
| 4 | +set -x |
| 5 | + |
| 6 | +# Ensure required tools are installed |
| 7 | +if ! command -v rpmbuild &>/dev/null; then |
| 8 | + echo "Error: rpm-build is required to create RPM packages." |
| 9 | + echo "Install it with: sudo dnf install rpm-build" |
| 10 | + exit 1 |
| 11 | +fi |
| 12 | + |
| 13 | +if ! command -v ruby &>/dev/null; then |
| 14 | + echo "Error: Ruby is required by FPM." |
| 15 | + echo "Install it with: sudo dnf install ruby" |
| 16 | + exit 1 |
| 17 | +fi |
| 18 | + |
| 19 | +if ! command -v fpm &>/dev/null; then |
| 20 | + echo "Error: FPM (rubygem-fpm) is required to create RPM packages." |
| 21 | + echo "Install it with: sudo gem install fpm" |
| 22 | + exit 1 |
| 23 | +fi |
| 24 | + |
| 25 | +arch="$(uname -m)" |
| 26 | +os="$(uname -s | tr '[:upper:]' '[:lower:]')" |
| 27 | +bin="frankenphp-${os}-${arch}" |
| 28 | + |
| 29 | +if [ ! -f "dist/$bin" ]; then |
| 30 | + echo "Error: dist/$bin not found. Run './build-static.sh' first" |
| 31 | + exit 1 |
| 32 | +fi |
| 33 | + |
| 34 | +if [ -z "${FRANKENPHP_VERSION}" ]; then |
| 35 | + FRANKENPHP_VERSION="$(git rev-parse --verify HEAD)" |
| 36 | + export FRANKENPHP_VERSION |
| 37 | +elif [ -d ".git/" ]; then |
| 38 | + CURRENT_REF="$(git rev-parse --abbrev-ref HEAD)" |
| 39 | + export CURRENT_REF |
| 40 | + |
| 41 | + if echo "${FRANKENPHP_VERSION}" | grep -F -q "."; then |
| 42 | + # Tag |
| 43 | + |
| 44 | + # Trim "v" prefix if any |
| 45 | + FRANKENPHP_VERSION=${FRANKENPHP_VERSION#v} |
| 46 | + export FRANKENPHP_VERSION |
| 47 | + |
| 48 | + git checkout "v${FRANKENPHP_VERSION}" |
| 49 | + else |
| 50 | + git checkout "${FRANKENPHP_VERSION}" |
| 51 | + fi |
| 52 | +fi |
| 53 | + |
| 54 | +if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then |
| 55 | + echo "Warning: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" |
| 56 | + echo "Falling back to non-release version 0.0.0" |
| 57 | + FRANKENPHP_VERSION=0.0.0 |
| 58 | +fi |
| 59 | + |
| 60 | +group_preexists=0 |
| 61 | +user_preexists=0 |
| 62 | + |
| 63 | +if getent group frankenphp >/dev/null; then |
| 64 | + group_preexists=1 |
| 65 | +else |
| 66 | + groupadd --system frankenphp |
| 67 | +fi |
| 68 | + |
| 69 | +if getent passwd frankenphp >/dev/null; then |
| 70 | + user_preexists=1 |
| 71 | +else |
| 72 | + useradd --system \ |
| 73 | + --gid frankenphp \ |
| 74 | + --create-home \ |
| 75 | + --home-dir /var/lib/frankenphp \ |
| 76 | + --shell /usr/sbin/nologin \ |
| 77 | + --comment "FrankenPHP web server" \ |
| 78 | + frankenphp |
| 79 | +fi |
| 80 | + |
| 81 | +mkdir -p package/empty |
| 82 | +mkdir -p package/etc |
| 83 | +[ -f ./dist/static-php-cli/source/php-src/php.ini-production ] && cp -f ./dist/static-php-cli/source/php-src/php.ini-production ./package/etc/php.ini |
| 84 | + |
| 85 | +cd dist |
| 86 | +iteration=1 |
| 87 | +glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) |
| 88 | +cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sort -V | tail -n1) |
| 89 | + |
| 90 | +fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ |
| 91 | + --config-files /etc/frankenphp/Caddyfile \ |
| 92 | + --config-files /etc/frankenphp/php.ini \ |
| 93 | + --depends "libc.so.6(${glibc_version})(64bit)" \ |
| 94 | + --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ |
| 95 | + --before-install ../package/rhel/preinstall.sh \ |
| 96 | + --after-install ../package/rhel/postinstall.sh \ |
| 97 | + --before-remove ../package/rhel/preuninstall.sh \ |
| 98 | + --after-remove ../package/rhel/postuninstall.sh \ |
| 99 | + --iteration "${iteration}" \ |
| 100 | + --rpm-user frankenphp --rpm-group frankenphp \ |
| 101 | + "${bin}=/usr/bin/frankenphp" \ |
| 102 | + "../package/rhel/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ |
| 103 | + "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ |
| 104 | + "../package/content/=/usr/share/frankenphp" \ |
| 105 | + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ |
| 106 | + "../package/empty/=/etc/frankenphp/php.d" \ |
| 107 | + "../package/empty/=/usr/lib/frankenphp/modules" \ |
| 108 | + "../package/empty/=/var/lib/frankenphp" |
| 109 | + |
| 110 | +glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sed 's/GLIBC_//' | sort -V | tail -n1) |
| 111 | +cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sed 's/CXXABI_//' | sort -V | tail -n1) |
| 112 | + |
| 113 | +fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ |
| 114 | + --config-files /etc/frankenphp/Caddyfile \ |
| 115 | + --config-files /etc/frankenphp/php.ini \ |
| 116 | + --depends "libc6 (>= ${glibc_version})" \ |
| 117 | + --depends "libstdc++6 (>= ${cxxabi_version})" \ |
| 118 | + --after-install ../package/debian/postinst.sh \ |
| 119 | + --before-remove ../package/debian/prerm.sh \ |
| 120 | + --after-remove ../package/debian/postrm.sh \ |
| 121 | + --iteration "${iteration}" \ |
| 122 | + --deb-user frankenphp --deb-group frankenphp \ |
| 123 | + "${bin}=/usr/bin/frankenphp" \ |
| 124 | + "../package/debian/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ |
| 125 | + "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ |
| 126 | + "../package/content/=/usr/share/frankenphp" \ |
| 127 | + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ |
| 128 | + "../package/empty/=/etc/frankenphp/php.d" \ |
| 129 | + "../package/empty/=/usr/lib/frankenphp/modules" \ |
| 130 | + "../package/empty/=/var/lib/frankenphp" |
| 131 | + |
| 132 | +[ "$user_preexists" -eq 0 ] && userdel frankenphp |
| 133 | +[ "$group_preexists" -eq 0 ] && groupdel frankenphp |
| 134 | + |
| 135 | +cd .. |
0 commit comments