#!/usr/bin/env bash
#
#  Phalcon Framework
#
#  Copyright (c) 2011-2017 Phalcon Team (https://phalconphp.com)
#
#  This source file is subject to the New BSD License that is bundled
#  with this package in the file LICENSE.txt.
#
#  If you did not receive a copy of the license and are unable to
#  obtain it through the world-wide-web, please send an email
#  to license@phalconphp.com so we can send you a copy immediately.
#
#  Authors: Andres Gutierrez <andres@phalconphp.com>
#           Eduar Carvajal <eduar@phalconphp.com>
#
#  Available params:
#  --arch
#  --phpize
#  --php-config
#
#  Example:
#  ./install --phpize /usr/bin/phpize5.6 --php-config /usr/bin/php-config5.6 --arch 32bits

# Check best compilation flags for GCC
export CC="gcc"
export CFLAGS="-march=native -mtune=native -O2 -fomit-frame-pointer"
export CPPFLAGS="-DPHALCON_RELEASE"

# Set defaults
ARCH=
PHPIZE_BIN=$(command -v phpize 2>/dev/null)
PHPCONFIG_BIN=$(command -v php-config 2>/dev/null)

# Translate long options to short
for arg in "$@"; do
  shift
  case "$arg" in
    "--arch") set -- "$@" "-a" ;;
    "--phpize") set -- "$@" "-i" ;;
    "--php-config") set -- "$@" "-c" ;;
    *) set -- "$@" "$arg"
  esac
done

# Options switcher
while getopts a:i:c: opts; do
   case ${opts} in
      a) ARCH=${OPTARG} ;;
      i) PHPIZE_BIN=${OPTARG} ;;
      c) PHPCONFIG_BIN=${OPTARG} ;;
   esac
done

PHP_FULL_VERSION=`${PHPCONFIG_BIN} --version`

if [ $? != 0 ]; then
	echo "php-config is not installed"
	exit 1
fi

if [ "${PHP_FULL_VERSION:0:3}" == "5.3" ]; then
	echo "php 5.3 is no longer supported"
	exit 1
fi

if [ "${PHP_FULL_VERSION:0:3}" == "5.4" ]; then
	echo "php 5.4 is no longer supported"
	exit 1
fi

if [ "${PHP_FULL_VERSION:0:1}" == "5" ]; then
	PHP_VERSION="php5"
else
	PHP_VERSION="php7"
fi

# Detect possible flags
echo "int main() {}" > t.c
gcc ${CFLAGS} t.c -o t 2> t.t
if [ $? != 0 ]; then
	chmod +x gcccpuopt
	BFLAGS=`./gcccpuopt`
	export CFLAGS="-O2 -fomit-frame-pointer $BFLAGS"
	gcc ${CFLAGS} t.c -o t 2> t.t
	if [ $? != 0 ]; then
		export CFLAGS="-O2"
	fi
fi

# Activate some gcc specific optimizations for gcc >= 4
if [ $(gcc -dumpversion | cut -f1 -d.) -ge 4 ]; then
	gcc ${CFLAGS}-fvisibility=hidden t.c -o t 2> t.t && export CFLAGS="$CFLAGS -fvisibility=hidden"
fi

# gcc $CFLAGS -flto t.c -o t 2> t.t && { export CFLAGS="$CFLAGS -flto"; export LDFLAGS="$LDFLAGS $CFLAGS"; }
rm -f t.t t.c t

# Check processor architecture
if [ -z ${ARCH} ]; then
	DIR="32bits"
	gcc gccarch.c -o gccarch
	if [ -f gccarch ]; then
		P64BITS=`./gccarch`
		if [ "$P64BITS" == "1" ]; then
			DIR="64bits"
		fi
	fi
else
	DIR=${ARCH}
fi

# Move to specified architecture
cd "$PHP_VERSION/$DIR"

# Clean current compilation
if [ -f Makefile ]; then
	make clean
	${PHPIZE_BIN} --clean
fi

# Perform the compilation
${PHPIZE_BIN}

# For some reason the libtool script being generated by autogen contains lines referring
# to "$echo message" instead of "echo message".
export echo=echo

# Detect Gentoo Linux
if [ -f /etc/gentoo-release ]; then
    LIBTOOLIZE_BIN=$(command -v libtoolize 2>/dev/null)
    aclocal && ${LIBTOOLIZE_BIN} --force && autoheader && autoconf
fi

# Detect macOS
if [ "$(uname -s 2>/dev/null)" = "Darwin" ]; then
    LIBTOOLIZE_BIN=$(command -v glibtoolize 2>/dev/null)
    aclocal && ${LIBTOOLIZE_BIN} --force && autoheader && autoconf
fi

./configure --silent --with-php-config=${PHPCONFIG_BIN} --enable-phalcon

make -s -j"$(getconf _NPROCESSORS_ONLN)"
make -s install

echo -e "\nThanks for compiling Phalcon!\nBuild succeed: Please restart your web server to complete the installation\n"
