#!/usr/bin/env bash set -eo pipefail install_php() { local install_type=$1 local version=$2 local install_path=$3 if [ "$TMPDIR" = "" ]; then local tmp_download_dir=$(mktemp -d) else local tmp_download_dir=${TMPDIR%/} fi echo "Determining configuration options..." local source_path=$(get_download_file_path $install_type $version $tmp_download_dir) local configure_options="$(construct_configure_options $install_path)" local make_flags="-j$ASDF_CONCURRENCY" local operating_system=$(uname -a) if [[ $operating_system =~ "Darwin" ]]; then exit_if_homebrew_not_installed local bison_path=$(homebrew_package_path bison) local icu4c_path=$(homebrew_package_path icu4c) local krb5_path=$(homebrew_package_path krb5) local libedit_path=$(homebrew_package_path libedit) local libxml2_path=$(homebrew_package_path libxml2) local openssl_path=$(homebrew_package_path openssl) if [ -n "$bison_path" ]; then export "PATH=${bison_path}/bin:${PATH}" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING bison" fi if [ -n "$icu4c_path" ]; then export "PKG_CONFIG_PATH=${icu4c_path}/lib/pkgconfig:${PKG_CONFIG_PATH}" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING icu4c" fi if [ -n "$krb5_path" ]; then export "PKG_CONFIG_PATH=${krb5_path}/lib/pkgconfig:${PKG_CONFIG_PATH}" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING krb5" fi if [ -n "$libedit_path" ]; then export "PKG_CONFIG_PATH=${libedit_path}/lib/pkgconfig:${PKG_CONFIG_PATH}" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libedit" fi if [ -n "$libxml2_path" ]; then export "PKG_CONFIG_PATH=${libxml2_path}/lib/pkgconfig:${PKG_CONFIG_PATH}" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libxml2" fi if [ -n "$openssl_path" ]; then export "PKG_CONFIG_PATH=${openssl_path}/lib/pkgconfig:${PKG_CONFIG_PATH}" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING openssl" fi fi echo "Downloading source code..." download_source $install_type $version $source_path # Running this in a subshell because we don't to disturb the current # working directory. ( echo "Extracting source code..." cd $(dirname $source_path) tar -zxf $source_path || exit 1 cd $(untar_path $install_type $version $tmp_download_dir) # Target is OS-specific # target=$(get_target) # Build PHP echo "Running buildconfig..." ./buildconf --force || exit 1 echo "Running ./configure $configure_options" ./configure $configure_options || exit 1 echo "Running make \"$make_flags\"" make "$make_flags" || exit 1 echo "Running make install..." # make "$make_flags" test || exit 1 make "$make_flags" install || exit 1 ) # it's not obvious where php.ini should be placed, let us make it easy for the user mkdir -p $install_path/conf.d/ echo "# add system-wide php configuration options here" >$install_path/conf.d/php.ini } install_composer() { local bin_path=$1/bin local expected_signature="$(curl -sL https://composer.github.io/installer.sig)" $bin_path/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" $bin_path/php -r "if (hash_file('sha384', 'composer-setup.php') === '${expected_signature}') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" $bin_path/php composer-setup.php --install-dir=$bin_path --filename=composer $bin_path/php -r "unlink('composer-setup.php');" } construct_configure_options() { local install_path=$1 # many options included below are not applicable to newer PHP versions # including these will trigger a build warning, but will not b global_config="--prefix=$install_path \ --enable-bcmath \ --enable-calendar \ --enable-dba \ --enable-exif \ --enable-fpm \ --enable-ftp \ --enable-gd \ --enable-gd-native-ttf \ --enable-intl \ --enable-mbregex \ --enable-mbstring \ --enable-mysqlnd \ --enable-pcntl \ --enable-shmop \ --enable-soap \ --enable-sockets \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --enable-zip \ --sysconfdir=$install_path \ --with-config-file-path=$install_path \ --with-config-file-scan-dir=$install_path/conf.d \ --with-curl \ --with-external-gd \ --with-fpm-group=www-data \ --with-fpm-user=www-data \ --with-gd \ --with-mhash \ --with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-xmlrpc \ --with-zip \ --with-zlib \ --without-snmp" if [ "$PHP_CONFIGURE_OPTIONS" = "" ]; then local configure_options="$(os_based_configure_options) $global_config" else local configure_options="$PHP_CONFIGURE_OPTIONS $global_config" fi if [ "${PHP_WITHOUT_PEAR:-no}" != "no" ]; then configure_options="$configure_options --without-pear" else configure_options="$configure_options --with-pear" fi if [ "${PHP_WITHOUT_PDO_PGSQL:-no}" != "no" ]; then configure_options="$configure_options" else configure_options="$configure_options --with-pdo-pgsql" fi echo "$configure_options" } homebrew_package_path() { local package_name=$1 if [ "$(brew ls --versions $package_name)" = "" ]; then echo "" else echo "$(brew --prefix $package_name)" fi } exit_if_homebrew_not_installed() { if [ "$(brew --version 2>/dev/null)" = "" ]; then echo "ERROR: Please install homebrew for OSX" exit 1 fi } os_based_configure_options() { local operating_system=$(uname -a) local configure_options="" if [[ $operating_system =~ "Darwin" ]]; then exit_if_homebrew_not_installed local bison_path=$(homebrew_package_path bison) local bzip2_path=$(homebrew_package_path bzip2) local freetype_path=$(homebrew_package_path freetype) local gettext_path=$(homebrew_package_path gettext) local iconv_path=$(homebrew_package_path libiconv) local icu4c_path=$(homebrew_package_path icu4c) local jpeg_path=$(homebrew_package_path jpeg) local libedit_path=$(homebrew_package_path libedit) local libpng_path=$(homebrew_package_path libpng) local libxml2_path=$(homebrew_package_path libxml2) local libzip_path=$(homebrew_package_path libzip) local openssl_path=$(homebrew_package_path openssl) local readline_path=$(homebrew_package_path readline) local webp_path=$(homebrew_package_path webp) local zlib_path=$(homebrew_package_path zlib) # optional # if these packages exist they are included in the php compilation local gmp_path=$(homebrew_package_path gmp) local sodium_path=$(homebrew_package_path libsodium) if [ -n "$gmp_path" ]; then configure_options="--with-gmp=$gmp_path" else echo "gmp not found, not including in installation" fi if [ -n "$sodium_path" ]; then configure_options="$configure_options --with-sodium=$sodium_path" else echo "sodium not found, not including in installation" fi if [ -n "$freetype_path" ]; then configure_options="$configure_options --with-freetype-dir=$freetype_path" else export ASDF_PKG_MISSING="freetype" fi if [ -n "$bison_path" ]; then export ASDF_PKG_MISSING="$ASDF_PKG_MISSING bison" fi if [ -n "$gettext_path" ]; then configure_options="$configure_options --with-gettext=$gettext_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING gettext" fi if [ -n "$icu4c_path" ]; then configure_options="$configure_options --with-icu-dir=$icu4c_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING icu4c" fi if [ -n "$jpeg_path" ]; then configure_options="$configure_options --with-jpeg-dir=$jpeg_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING jpeg" fi if [ -n "$webp_path" ]; then configure_options="$configure_options --with-webp-dir=$webp_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING webp" fi if [ -n "$libpng_path" ]; then configure_options="$configure_options --with-png-dir=$libpng_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libpng" fi if [ -n "$openssl_path" ]; then configure_options="$configure_options --with-openssl=$openssl_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING openssl" fi if [ -n "$libxml2_path" ]; then configure_options="$configure_options --with-libxml-dir=$libxml2_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libxml2" fi if [ -n "$zlib_path" ]; then configure_options="$configure_options --with-zlib-dir=$zlib_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING zlib" fi if [ -n "$libzip_path" ]; then configure_options="$configure_options --with-libzip=$libzip_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libzip" fi if [ -n "$readline_path" ]; then configure_options="$configure_options --with-readline=$readline_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING readline" fi if [ -n "$libedit_path" ]; then configure_options="$configure_options --with-libedit=$libedit_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libedit" fi if [ -n "$bzip2_path" ]; then configure_options="$configure_options --with-bz2=$bzip2_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING bzip2" fi if [ -n "$iconv_path" ]; then configure_options="$configure_options --with-iconv=$iconv_path" else export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libiconv" fi else local jpeg_path=$(locate libjpeg.so | awk '{ print length(), $0 | "sort -n" }' | cut -d" " -f2- | head -n 1) local libpng_path=$(locate libpng.so | awk '{ print length(), $0 | "sort -n" }' | cut -d" " -f2- | head -n 1) configure_options="--with-openssl --with-curl --with-zlib --with-readline --with-gettext" if [ "$jpeg_path" = "" ]; then export ASDF_PKG_MISSING="$ASDF_PKG_MISSING jpeg" else configure_options="$configure_options --with-jpeg-dir=$jpeg_path --with-jpeg" fi if [ "$libpng_path" = "" ]; then export ASDF_PKG_MISSING="$ASDF_PKG_MISSING libpng" else configure_options="$configure_options --with-png-dir=$libpng_path --with-png" fi fi echo $configure_options } download_source() { local install_type=$1 local version=$2 local download_path=$3 local download_url=$(get_download_url $install_type $version) # curl -Lo $download_path -C - $download_url curl -Lo $download_path $download_url } get_download_file_path() { local install_type=$1 local version=$2 local tmp_download_dir=$3 local php_version=$(get_php_version $version) local pkg_name="php-${php_version}.tar.gz" echo "$tmp_download_dir/$pkg_name" } untar_path() { local install_type=$1 local version=$2 local tmp_download_dir=$3 local php_version=$(get_php_version $version) local dir_name="php-src-php-${php_version}" echo "$tmp_download_dir/$dir_name" } get_download_url() { local install_type=$1 local version=$2 echo "https://github.com/php/php-src/archive/php-${version}.tar.gz" } get_php_version() { IFS='-' read -a version_info <<<"$1" if [ "${#version_info[@]}" -eq 1 ]; then echo "${version_info[0]}" else echo "${version_info[0]}-${version_info[1]}" fi } install_php $ASDF_INSTALL_TYPE $ASDF_INSTALL_VERSION $ASDF_INSTALL_PATH install_composer ${ASDF_INSTALL_PATH}