#!/bin/bash
set -o errexit
set -o nounset

#
# Required for build:
#
# aspell-devel (rocky-devel)
# autoconf
# bzip2-devel
# freetype-devel
# gdbm-devel (rocky-devel)
# httpd-devel
# krb5-devel
# libcurl-devel
# libjpeg-turbo-devel
# libpng-devel
# libxml2-devel
# libxslt-devel
# libzip-devel (rocky-devel)
# oniguruma-devel (rocky-devel)
# ImageMagick-devel (epel)
#

# Setup the versions
VERSION='8.3.31'
MINOR_VERSION='8.3'
PHP_API_VERSION='20230831'

# Setup extension versions
EXT_IMAGICK_VERSION='3.8.1'
EXT_RAPHF_VERSION='2.0.2'
EXT_REDIS_VERSION='6.3.0'
EXT_PECL_HTTP_VERSION='4.3.1'
EXT_MEMCACHED_VERSION='3.4.0'

# Setup dependency versions
LIBMEMCACHED_VERSION='1'
POSTGRESQL_MAJOR_VERSION='16'

# Concurrent make
JOBS="$(expr "$(getconf _NPROCESSORS_ONLN)" + 1)"

# Create temp build directory
TMPDIR="`su -c \"mktemp -d \\\"/tmp/php-${MINOR_VERSION}-build.XXXXXXXXXX\\\"\" mockbuild`"

# Untar the new source
su -c "tar -xJ -C \"${TMPDIR}\" -f \"/opt/php-${MINOR_VERSION}/src/php-${VERSION}.tar.xz\"" mockbuild

# Setup compilation environment
cd "${TMPDIR}/php-${VERSION}"
export LDFLAGS="-L/opt/postgresql-${POSTGRESQL_MAJOR_VERSION}/lib"

# Compile Apache module, CLI, and CGI all at once
su -c "./configure \
    --srcdir=\"${TMPDIR}/php-${VERSION}\" \
    --prefix=\"/opt/php-${MINOR_VERSION}\" \
    --sysconfdir=\"/etc/opt/php-${MINOR_VERSION}\" \
    --localstatedir=\"/var/opt/php-${MINOR_VERSION}\" \
    --mandir=\"/opt/php-${MINOR_VERSION}/man\" \
    --with-apxs2=/usr/bin/apxs \
    --enable-cli \
    --enable-cgi \
    --disable-debug \
    --with-layout=PHP \
    --with-config-file-path=\"/etc/opt/php-${MINOR_VERSION}\" \
    --with-config-file-scan-dir=\"/etc/opt/php-${MINOR_VERSION}/conf.d\" \
    --with-openssl \
    --with-kerberos \
    --with-pcre-jit \
    --with-sqlite3=shared \
    --with-zlib \
    --enable-bcmath=shared \
    --with-bz2=shared \
    --enable-calendar \
    --with-curl=shared \
    --enable-dba=shared \
    --with-gdbm \
    --enable-dom=shared \
    --enable-exif \
    --enable-ftp \
    --enable-gd=shared \
    --with-jpeg \
    --with-freetype \
    --with-gettext \
    --with-gmp=shared \
    --enable-intl=shared \
    --enable-mbstring=shared \
    --enable-mbregex \
    --with-mysqli=shared \
    --enable-pcntl \
    --with-pdo-mysql=shared \
    --with-pdo-pgsql=shared,\"/opt/postgresql-${POSTGRESQL_MAJOR_VERSION}\" \
    --with-pdo-sqlite=shared \
    --with-pgsql=shared,\"/opt/postgresql-${POSTGRESQL_MAJOR_VERSION}\" \
    --with-pspell=shared \
    --with-readline \
    --enable-simplexml=shared \
    --enable-soap=shared \
    --enable-sockets \
    --enable-sysvmsg \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-tokenizer \
    --enable-xml=shared \
    --enable-xmlreader=shared \
    --enable-xmlwriter=shared \
    --with-xsl=shared \
    --with-zip=shared \
    --enable-mysqlnd=shared \
    --with-pear \
    --with-pic" mockbuild
su -c "make -j \"$JOBS\"" mockbuild

# Run tests
# Failure seems normal, commented-out:
# export TEST_PHP_ARGS='-q'
# su -c "make test" mockbuild

# Clean old install
rm -rf \
    "/etc/opt/php-${MINOR_VERSION}" \
    "/opt/php-${MINOR_VERSION}/bin" \
    "/opt/php-${MINOR_VERSION}/include" \
    "/opt/php-${MINOR_VERSION}/lib" \
    "/opt/php-${MINOR_VERSION}/man" \
    "/var/opt/php-${MINOR_VERSION}"

# Install new files
rm -f '/root/.pearrc'
make install
mkdir -m 755 "/opt/php-${MINOR_VERSION}/lib/apache"
mv /usr/lib64/httpd/modules/libphp.so "/opt/php-${MINOR_VERSION}/lib/apache/libphp.so"

# Strip binaries
strip "/opt/php-${MINOR_VERSION}/lib/apache/libphp.so"
strip "/opt/php-${MINOR_VERSION}/lib/php/extensions/no-debug-non-zts-${PHP_API_VERSION}"/*.so
strip "/opt/php-${MINOR_VERSION}/bin/php"
strip "/opt/php-${MINOR_VERSION}/bin/php-cgi"
strip "/opt/php-${MINOR_VERSION}/bin/phpdbg"

# Create the default php.ini
[ -d "/etc/opt/php-${MINOR_VERSION}" ] || mkdir -m 755 "/etc/opt/php-${MINOR_VERSION}"
cp "${TMPDIR}/php-${VERSION}/php.ini-production" "/etc/opt/php-${MINOR_VERSION}/php.ini"
sed -i.bak \
    -e 's/expose_php = On/expose_php = Off/' \
    -e "s/;include_path = \"\\.:\\/php\\/includes\"/include_path = \".:\\/opt\\/php-${MINOR_VERSION}\\/lib\\/php\"/" \
    -e "s/;extension_dir = \"\\.\\/\"/extension_dir = \"\\/opt\\/php-${MINOR_VERSION}\\/lib\\/php\\/extensions\\/no-debug-non-zts-${PHP_API_VERSION}\"/" \
    -e 's/;pcre\.jit=1/;Disabled for SELinux compatibility\n;To enable: setsebool -P httpd_execmem 1\npcre.jit=0/' \
    -e 's/;sendmail_path =/sendmail_path = \/usr\/lib\/sendmail -t -i/' \
    "/etc/opt/php-${MINOR_VERSION}/php.ini"
rm -f "/etc/opt/php-${MINOR_VERSION}/php.ini.bak"
mkdir -m 755 "/etc/opt/php-${MINOR_VERSION}/conf.d"
echo 'zend_extension=opcache' > "/etc/opt/php-${MINOR_VERSION}/conf.d/05-opcache.ini"
echo 'extension=bcmath'       > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-bcmath.ini"
echo 'extension=bz2'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-bz2.ini"
echo 'extension=curl'         > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-curl.ini"
echo 'extension=dba'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-dba.ini"
echo 'extension=dom'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-dom.ini"
echo 'extension=gd'           > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-gd.ini"
echo 'extension=gmp'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-gmp.ini"
echo 'extension=intl'         > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-intl.ini"
echo 'extension=mbstring'     > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-mbstring.ini"
echo 'extension=mysqli'       > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-mysqli.ini"
echo 'extension=mysqlnd'      > "/etc/opt/php-${MINOR_VERSION}/conf.d/10-mysqlnd.ini"
echo 'extension=pdo_mysql'    > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-pdo_mysql.ini"
echo 'extension=pdo_pgsql'    > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-pdo_pgsql.ini"
echo 'extension=pdo_sqlite'   > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-pdo_sqlite.ini"
echo 'extension=pgsql'        > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-pgsql.ini"
echo 'extension=pspell'       > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-pspell.ini"
echo 'extension=simplexml'    > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-simplexml.ini"
echo 'extension=soap'         > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-soap.ini"
echo 'extension=sqlite3'      > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-sqlite3.ini"
echo 'extension=xmlreader'    > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-xmlreader.ini"
echo 'extension=xml'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/15-xml.ini"
echo 'extension=xmlwriter'    > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-xmlwriter.ini"
echo 'extension=xsl'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-xsl.ini"
echo 'extension=zip'          > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-zip.ini"

# Remove the source code
cd "/opt/php-${MINOR_VERSION}/src"
su -c "rm -rf \"${TMPDIR}/php-${VERSION}\"" mockbuild

# Extensions
. "/opt/php-${MINOR_VERSION}/profile.sh"
#mv "/opt/php-${MINOR_VERSION}/lib/php/.channels" "/opt/php-${MINOR_VERSION}/lib/php/.channels.orig"
#pecl update-channels
#pecl install pecl_http </dev/null

# Compile imagick extension
su -c "tar -xz -C \"${TMPDIR}\" -f \"/opt/php-${MINOR_VERSION}/src/imagick-${EXT_IMAGICK_VERSION}.tgz\"" mockbuild
cd "${TMPDIR}/imagick-${EXT_IMAGICK_VERSION}"
su -c "phpize" mockbuild
su -c "./configure" mockbuild
su -c "make -j \"$JOBS\"" mockbuild
make install
cd "/opt/php-${MINOR_VERSION}/src"
su -c "rm -f \"${TMPDIR}/package.xml\"" mockbuild
su -c "rm -rf \"${TMPDIR}/imagick-${EXT_IMAGICK_VERSION}\"" mockbuild
echo 'extension=imagick' > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-imagick.ini"

# Compile raphf extension
su -c "tar -xz -C \"${TMPDIR}\" -f \"/opt/php-${MINOR_VERSION}/src/raphf-${EXT_RAPHF_VERSION}.tgz\"" mockbuild
cd "${TMPDIR}/raphf-${EXT_RAPHF_VERSION}"
su -c "phpize" mockbuild
su -c "./configure" mockbuild
su -c "make -j \"$JOBS\"" mockbuild
make install
cd "/opt/php-${MINOR_VERSION}/src"
su -c "rm -f \"${TMPDIR}/package.xml\"" mockbuild
su -c "rm -rf \"${TMPDIR}/raphf-${EXT_RAPHF_VERSION}\"" mockbuild
echo 'extension=raphf' > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-raphf.ini"

# Compile redis extension
su -c "tar -xz -C \"${TMPDIR}\" -f \"/opt/php-${MINOR_VERSION}/src/redis-${EXT_REDIS_VERSION}.tgz\"" mockbuild
cd "${TMPDIR}/redis-${EXT_REDIS_VERSION}"
su -c "phpize" mockbuild
su -c "./configure" mockbuild
su -c "make -j \"$JOBS\"" mockbuild
make install
cd "/opt/php-${MINOR_VERSION}/src"
su -c "rm -f \"${TMPDIR}/package.xml\"" mockbuild
su -c "rm -rf \"${TMPDIR}/redis-${EXT_REDIS_VERSION}\"" mockbuild
echo 'extension=redis' > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-redis.ini"

# Compile pecl_http extension
su -c "tar -xz -C \"${TMPDIR}\" -f \"/opt/php-${MINOR_VERSION}/src/pecl_http-${EXT_PECL_HTTP_VERSION}.tgz\"" mockbuild
cd "${TMPDIR}/pecl_http-${EXT_PECL_HTTP_VERSION}"
su -c "phpize" mockbuild
su -c "./configure" mockbuild
su -c "make -j \"$JOBS\"" mockbuild
make install
cd "/opt/php-${MINOR_VERSION}/src"
su -c "rm -f \"${TMPDIR}/package.xml\"" mockbuild
su -c "rm -rf \"${TMPDIR}/pecl_http-${EXT_PECL_HTTP_VERSION}\"" mockbuild
echo 'extension=http' > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-http.ini"

# Compile memcached extension
su -c "tar -xz -C \"${TMPDIR}\" -f \"/opt/php-${MINOR_VERSION}/src/memcached-${EXT_MEMCACHED_VERSION}.tgz\"" mockbuild
cd "${TMPDIR}/memcached-${EXT_MEMCACHED_VERSION}"
su -c "phpize" mockbuild
su -c "./configure --with-libmemcached-dir=\"/opt/libmemcached-awesome-${LIBMEMCACHED_VERSION}\" --disable-memcached-sasl" mockbuild
su -c "make -j \"$JOBS\"" mockbuild
make install
cd "/opt/php-${MINOR_VERSION}/src"
su -c "rm -f \"${TMPDIR}/package.xml\"" mockbuild
su -c "rm -rf \"${TMPDIR}/memcached-${EXT_MEMCACHED_VERSION}\"" mockbuild
echo 'extension=memcached' > "/etc/opt/php-${MINOR_VERSION}/conf.d/20-memcached.ini"

# Remove temp build directory
su -c "rmdir \"${TMPDIR}\"" mockbuild

# Success
cat "/opt/php-${MINOR_VERSION}/src/build-success.txt"
