# Contributor: Valery Kartel <valery.kartel@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Valery Kartel <valery.kartel@gmail.com>

# Bundled libraries
#
# Name      | License | Location               | State
# ----------+---------+------------------------+---------
# bcmath    | LGPL2   | ext/bcmath/libbcmath   | used
# date      | MIT     | ext/date/lib           | used
# gd        | BSD     | ext/gd/libgd           | used
# file      | BSD     | ext/fileinfo/libmagic  | used
# libmbfl   | LGPLv2  | ext/mbstring/libmbfl   | used
# oniguruma | BSD     | ext/mbstring/oniguruma | used
# pcre      | BSD     | ext/pcre/pcrelib       | not used
# sqlite3   | Public  | ext/sqlite3/libsqlite  | not used
# libzip    | BSD     | ext/zip/lib            | not used
# libXMLRPC | BSD     | ext/xmlrpc/libxmlrpc   | used

setvar pkgname = 'php7'
setvar _pkgreal = 'php'
setvar pkgver = '7.1.10'
setvar pkgrel = '0'
setvar _apiver = '20160303'
setvar _suffix = ${pkgname#php}
# Is this package the default (latest) PHP version?
setvar _default_php = ""yes""
setvar pkgdesc = ""The PHP$_suffix language runtime engine""
setvar url = ""http://www.php.net/""
setvar arch = ""all""
setvar license = ""PHP-3 BSD LGPL2 MIT Zend""
setvar depends = ""$pkgname-common""
setvar depends_dev = ""$pkgname=$pkgver-r$pkgrel autoconf pcre-dev""
# Most dependencies between extensions is auto-discovered (see _extension()).
setvar _depends_mysqlnd = ""$pkgname-openssl""
setvar _depends_pdo_mysql = ""$pkgname-pdo $pkgname-mysqlnd""
setvar _depends_phar = "$pkgname"
# openssl is actually transitive dependency here, but we need to because of
# load index based on number of dependencies.
setvar _depends_mysqli = ""$pkgname-mysqlnd $pkgname-openssl""
setvar makedepends = ""
	autoconf
	apache2-dev
	aspell-dev
	bison
	bzip2-dev
	curl-dev
	db-dev
	enchant-dev
	freetds-dev
	freetype-dev
	gdbm-dev
	gettext-dev
	gmp-dev
	icu-dev
	imap-dev
	krb5-dev
	libedit-dev
	libical-dev
	libjpeg-turbo-dev
	libmcrypt-dev
	libpng-dev
	libressl-dev
	libwebp-dev
	libxml2-dev
	libxpm-dev
	libxslt-dev
	libzip-dev
	net-snmp-dev
	openldap-dev
	pcre-dev
	postgresql-dev
	re2c
	recode-dev
	sqlite-dev
	tidyhtml-dev
	unixodbc-dev
	zlib-dev
	""
setvar provides = ""$pkgname-cli""  # for backward compatibility
setvar subpackages = ""$pkgname-dev $pkgname-doc $pkgname-apache2 $pkgname-phpdbg
	$pkgname-embed $pkgname-litespeed $pkgname-cgi $pkgname-fpm
	$pkgname-pear::noarch
	""
setvar source = ""http://php.net/distributions/$_pkgreal-$pkgver.tar.bz2
	$pkgname-fpm.initd
	$pkgname-fpm.logrotate
	$pkgname-module.conf
	disabled-tests.list
	install-pear.patch
	includedir.patch
	fix-asm-constraints-in-aarch64-multiply-macro.patch
	php7-fpm-version-suffix.patch
	allow-build-recode-and-imap-together.patch
	fix-tests-devserver.patch
	""
setvar builddir = ""$srcdir/$_pkgreal-$pkgver""

setvar _libdir = ""/usr/lib/$pkgname""
setvar _extension_dir = ""$_libdir/modules""
setvar _extension_confd = ""/etc/$pkgname/conf.d""

setvar _extensions = ""
	bcmath
	bz2
	calendar
	ctype
	curl
	dba
	dom
	enchant
	exif
	fileinfo
	ftp
	gd
	gettext
	gmp
	iconv
	imap
	intl
	json
	ldap
	mbstring
	mcrypt
	mysqli
	mysqlnd
	odbc
	opcache
	openssl
	pcntl
	pdo
	pdo_dblib
	pdo_mysql
	pdo_odbc
	pdo_pgsql
	pdo_sqlite
	pgsql
	phar
	posix
	pspell
	recode
	session
	shmop
	simplexml
	snmp
	soap
	sockets
	sqlite3
	sysvmsg
	sysvsem
	sysvshm
	tidy
	tokenizer
	wddx
	xml
	xmlreader
	xmlrpc
	xmlwriter
	xsl
	zip
	zlib
	""
for _ext in $_extensions {
	case (_ext) {
		phar { setvar subpackages = ""$subpackages $pkgname-$_ext:$_ext""}
		* { setvar subpackages = ""$subpackages $pkgname-$_ext:_extension""}
	}
}
setvar subpackages = ""$subpackages $pkgname-common::noarch""

# FIXME: tests fails on s390x and x86_64
case (CARCH) {
x86_64 { setvar options = ""$options !check""}
s390x { setvar options = ""$options !check""}
}

# secfixes:
#   7.1.7.-r0:
#     - CVE-2017-7890
#     - CVE-2017-9224
#     - CVE-2017-9226
#     - CVE-2017-9227
#     - CVE-2017-9228
#     - CVE-2017-9229

proc prepare {
	cd $builddir

	default_prepare
	update_config_sub

	local vapi=$(sed -n '/#define PHP_API_VERSION/{s/.* //;p}' main/php.h)
	if test $vapi != $_apiver {
		error "Upstreram API version is now $vapi. Expecting $_apiver"
		error "After updating _apiver, all 3rd-party extensions must be rebuilt."
		return 1
	}

	# https://bugs.php.net/63362 - Not needed but installed headers.
	# Drop some Windows specific headers to avoid installation,
	# before build to ensure they are really not needed.
	rm -f TSRM/tsrm_win32.h \
		TSRM/tsrm_config.w32.h \
		Zend/zend_config.w32.h \
		ext/mysqlnd/config-win.h \
		ext/standard/winver.h \
		main/win32_internal_function_disabled.h \
		main/win95nt.h

	# Fix some bogus permissions.
	find . -name '*'.[ch] -exec chmod 644 {} ';'

	# XXX: Delete failing tests.
	sed -n '/^[^#]/p' "$srcdir"/disabled-tests.list | while read item {
		rm -r $item  # do it in this way to apply globbing...
	}

	autoconf
}

# Notes:
# * gd-jis-conv breaks any non-latin font rendering (vakartel).
# * libxml cannot be build as shared.
# * Doesn't work with system-provided onigurama, some tests fail (invalid code
#   point); probably because bundled onigurama is version 5.x, but we have 6.x.
proc _build {
	local without_pcre_jit
	test $CARCH = "s390x" && setvar without_pcre_jit = ""--without-pcre-jit"""

	EXTENSION_DIR=$_extension_dir" ./configure \
		--build=$CBUILD \
		--host=$CHOST \
		--prefix=/usr \
		--program-suffix=$_suffix \
		--libdir=$_libdir \
		--datadir=/usr/share/$pkgname \
		--sysconfdir=/etc/$pkgname \
		--localstatedir=/var \
		--with-layout=GNU \
		--with-pic \
		--with-pear=/usr/share/$pkgname \
		--with-config-file-path=/etc/$pkgname \
		--with-config-file-scan-dir=$_extension_confd \
		--disable-short-tags \
		\
		--enable-bcmath=shared \
		--with-bz2=shared \
		--enable-calendar=shared \
		--enable-ctype=shared \
		--with-curl=shared \
		--enable-dba=shared \
			--with-db4 \
			--with-dbmaker=shared \
			--with-gdbm \
		--enable-dom=shared \
		--with-enchant=shared \
		--enable-exif=shared \
		--enable-fileinfo=shared \
		--enable-ftp=shared \
		--with-gd=shared \
			--with-freetype-dir=/usr \
			--disable-gd-jis-conv \
			--enable-gd-native-ttf \
			--with-jpeg-dir=/usr \
			--with-png-dir=/usr \
			--with-webp-dir=/usr \
			--with-xpm-dir=/usr \
		--with-gettext=shared \
		--with-gmp=shared \
		--with-iconv=shared \
		--with-imap=shared \
			--with-imap-ssl \
		--with-icu-dir=/usr \
		--enable-intl=shared \
		--enable-json=shared \
		--with-kerberos \
		--with-ldap=shared \
			--with-ldap-sasl \
		--with-libedit \
		--enable-libxml \
		--with-libxml-dir=/usr \
		--enable-mbstring=shared \
		--with-mcrypt=shared \
		--with-mysqli=shared,mysqlnd \
			--with-mysql-sock=/run/mysqld/mysqld.sock \
		--enable-mysqlnd=shared \
		--enable-opcache=shared \
		--with-openssl=shared  \
			--with-system-ciphers \
		--enable-pcntl=shared \
		--with-pcre-regex=/usr \
			$without_pcre_jit \
		--enable-pdo=shared \
			--with-pdo-dblib=shared \
			--with-pdo-mysql=shared,mysqlnd \
			--with-pdo-odbc=shared,unixODBC,/usr \
			--with-pdo-pgsql=shared \
			--with-pdo-sqlite=shared,/usr \
		--with-pgsql=shared \
		--enable-phar=shared \
		--enable-posix=shared \
		--with-pspell=shared \
		--without-readline \
		--with-recode=shared \
		--enable-session=shared \
		--enable-shmop=shared \
		--enable-simplexml=shared \
		--with-snmp=shared \
		--enable-soap=shared \
		--enable-sockets=shared \
		--with-sqlite3=shared,/usr \
		--enable-sysvmsg=shared \
		--enable-sysvsem=shared \
		--enable-sysvshm=shared \
		--with-tidy=shared \
		--enable-tokenizer=shared \
		--with-unixODBC=shared,/usr \
		--enable-wddx=shared \
		--enable-xml=shared \
		--enable-xmlreader=shared \
		--with-xmlrpc=shared \
		--enable-xmlwriter=shared \
		--with-xsl=shared \
		--enable-zip=shared \
			--with-libzip=/usr \
		--with-zlib=shared \
		--with-zlib-dir=/usr \
		$[join(ARGV)]
	make
}

proc build {
	cd $builddir

	# phpdbg
	_build --enable-phpdbg \
		--enable-phpdbg-webhelper \
		--disable-cgi \
		--disable-cli

	# apache2 module
	_build --disable-phpdbg \
		--disable-cgi \
		--disable-cli \
		--with-apxs2
	mv libs/libphp$_suffix.so sapi/apache2handler/mod_php$_suffix.so

	# cgi, cli, fpm, embed, litespeed
	_build --disable-phpdbg \
		--enable-fpm \
		--enable-embed \
		--with-litespeed
}

proc check {
	cd $builddir

	# PHP is so stupid that it's not able to resolve dependencies
	# between extensions and load them in correct order, so we must
	# help it...
	# opcache is Zend extension, it's handled specially in Makefile
	local php_modules=$(_extensions_by_load_order \
		| grep -vx opcache \
		| xargs -n 1 printf "'$builddir/modules/%s.la' ")
	sed -i "/^PHP_TEST_SHARED_EXTENSIONS/,/extension=/ \
		s|in \$(PHP_MODULES)\"*|in $php_modules|" Makefile

	# XXX: Few tests fail on the named platforms.
	# Ignore it for now and continue build even on test failures.
	local allow_fail='no'
	case (CARCH) {
		x86 | armhf | aarch64 { setvar allow_fail = ''yes''
	}
}'

	NO_INTERACTION=1'' REPORT_EXIT_STATUS=1'' \
		SKIP_SLOW_TESTS=1'' SKIP_ONLINE_TESTS=1'' TEST_TIMEOUT=10''''''' \
		TZ= LANG= LC_ALL= \
		make test || test $allow_fail = yes || return 1

	echo 'NOTE: We have skipped quite a lot tests, see disabled-tests.list.'
}

proc package {
	cd $builddir

	make -j1 INSTALL_ROOT="$pkgdir" install

	install -Dm644 php.ini-production "$pkgdir"/etc/$pkgname/php.ini

	local file; for file in pear peardev pecl {
		sed -i -e "s|/usr/bin/php|/usr/bin/php$_suffix|g" \
			-e "s|PHP=php|PHP=php$_suffix|" \
			"$pkgdir"/usr/bin/$file
	}

	find $pkgdir -name '.*' | xargs rm -rf
	rmdir "$pkgdir"/var/run

	if test $_default_php = yes {
		ln -s php$_suffix "$pkgdir"/usr/bin/php
	}
}

proc dev {
	default_dev
	setvar replaces = ""php-dev""

	cd $pkgdir

	_mv usr/bin/php-config$_suffix \
		usr/bin/phpize$_suffix \
		"$subpkgdir"/usr/bin/

	_mv ./$_libdir/build "$subpkgdir"/$_libdir/

	if test $_default_php = yes {
		ln -s phpize$_suffix "$subpkgdir"/usr/bin/phpize
		ln -s php-config$_suffix "$subpkgdir"/usr/bin/php-config
	}
}

proc doc {
	default_doc

	cd $builddir

	mkdir -p "$subpkgdir"/usr/share/doc/$pkgname
	cp CODING_STANDARDS CREDITS EXTENSIONS INSTALL LICENSE NEWS \
		README* UPGRADING* \
		"$subpkgdir"/usr/share/doc/$pkgname/
}

proc apache2 {
	setvar pkgdesc = ""PHP$_suffix Module for Apache2""
	setvar depends = ""$depends apache2""

	install -D -m 755 "$builddir"/sapi/apache2handler/mod_php$_suffix.so \
		"$subpkgdir"/usr/lib/apache2/mod_php$_suffix.so

	install -D -m 644 "$srcdir"/php$_suffix-module.conf \
		"$subpkgdir"/etc/apache2/conf.d/php$_suffix-module.conf
}

proc phpdbg {
	setvar pkgdesc = ""Interactive PHP$_suffix debugger""

	install -Dm755 "$builddir"/sapi/phpdbg/phpdbg \
		"$subpkgdir"/usr/bin/phpdbg$_suffix

	if test $_default_php = yes {
		ln -s phpdbg$_suffix "$subpkgdir"/usr/bin/phpdbg
	}
}

proc embed {
	setvar pkgdesc = ""PHP$_suffix Embedded Library""

	_mv "$pkgdir"/usr/lib/libphp*.so "$subpkgdir"/usr/lib/
}

proc litespeed {
	setvar pkgdesc = ""PHP$_suffix LiteSpeed SAPI""

	mkdir -p "$subpkgdir"/usr/bin
	mv "$pkgdir"/usr/bin/lsphp "$subpkgdir"/usr/bin/lsphp$_suffix

	if test $_default_php = yes {
		ln -s lsphp$_suffix "$subpkgdir"/usr/bin/lsphp
	}
}

proc cgi {
	setvar pkgdesc = ""PHP$_suffix Common Gateway Interface""

	_mv "$pkgdir"/usr/bin/php-cgi$_suffix "$subpkgdir"/usr/bin/

	if test $_default_php = yes {
		ln -s php-cgi$_suffix "$subpkgdir"/usr/bin/php-cgi
	}
}

proc fpm {
	setvar pkgdesc = ""PHP$_suffix FastCGI Process Manager""

	cd $pkgdir

	_mv var "$subpkgdir"/
	_mv usr/share/$pkgname/fpm "$subpkgdir"/var/lib/$pkgname/
	_mv usr/sbin "$subpkgdir"/usr/
	_mv etc/$pkgname/php-fpm* "$subpkgdir"/etc/$pkgname/

	local file; for file in php-fpm.conf php-fpm.d/www.conf {
		mv "$subpkgdir"/etc/$pkgname/$file.default \
			"$subpkgdir"/etc/$pkgname/$file
	}

	install -D -m 755 "$srcdir"/$pkgname-fpm.initd \
		"$subpkgdir"/etc/init.d/php-fpm$_suffix

	install -D -m 644 "$srcdir"/$pkgname-fpm.logrotate \
		"$subpkgdir"/etc/logrotate.d/php-fpm$_suffix

	mkdir -p "$subpkgdir"/var/log/$pkgname
}

proc pear {
	setvar pkgdesc = ""PHP$_suffix Extension and Application Repository""
	setvar depends = ""$pkgname $pkgname-xml""

	cd $pkgdir

	# pecl needs xml extension and since we build it as shared, it must be
	# explicitly declared to be loaded.
	sed -i 's/\$INCARG/& -d extension=xml.so/' usr/bin/pecl

	mkdir -p "$subpkgdir"/usr/bin
	local file; for file in pecl pear peardev {
		mv usr/bin/$file "$subpkgdir"/usr/bin/$file$_suffix
		if test $_default_php = yes {
			ln -s $file$_suffix "$subpkgdir"/usr/bin/$file
		}
	}

	_mv etc/$pkgname/pear.conf "$subpkgdir"/etc/$pkgname/
	_mv usr/share "$subpkgdir"/usr/
}

proc common {
	setvar pkgdesc = ""$pkgdesc (common config)""
	setvar depends = """"

	cd $pkgdir

	_mv usr/lib "$subpkgdir"/usr/
	_mv etc "$subpkgdir"/
	mkdir -p "$subpkgdir"/$_extension_confd
}

proc phar {
	_extension

	cd $pkgdir

	mkdir -p "$subpkgdir"/usr/bin
	mv usr/bin/phar.phar "$subpkgdir"/usr/bin/phar.phar$_suffix

	rm usr/bin/phar
	ln -s phar.phar$_suffix "$subpkgdir"/usr/bin/phar$_suffix

	if test $_default_php = yes {
		ln -s phar.phar$_suffix "$subpkgdir"/usr/bin/phar.phar
		ln -s phar.phar$_suffix "$subpkgdir"/usr/bin/phar
	}
}

proc _extension {
	local extname="${subpkgname#$pkgname-}"
	local extdepends="$(eval "echo \$_depends_$extname")"
	local extdesc="$(head -n1 "$builddir"/ext/$extname/CREDITS 2>/dev/null ||:)"
	setvar pkgdesc = ""PHP$_suffix extension: ${extdesc:-$extname}""

	: ${extdepends:=$(_resolve_extension_deps "$extname")}
	setvar depends = ""$depends $extdepends""

	local load_order=$(_extension_load_order "$extname")

	# extension prefix
	local prefix=
	test $extname != "opcache" || setvar prefix = ""zend_""

	_mv "$pkgdir"/$_extension_dir/$extname.so \
		"$subpkgdir"/$_extension_dir/

	mkdir -p "$subpkgdir"/$_extension_confd
	echo "${prefix}extension=$extname.so" \
		> "$subpkgdir"/$_extension_confd/$(printf %02d $load_order)_$extname.ini
}

# Resolves dependencies of the given extension name (without $pkgname- prefix)
# on other extensions in $_extensions and prints them with $pkgname- prefix.
proc _resolve_extension_deps {
	local name="$1"

	# We use config.w32 just because it's more accurate than config.m4.
	local config="$builddir/ext/$name/config.w32"
	test -f $config || return 0

	cat $config \
		| sed -En "s/.*ADD_EXTENSION_DEP\('$name', ([^)]+)\).*/\1/p" \
		| tr -d "'," | tr ' ' '\n' \
		| sort -u \
		| while read dep {
			if echo $_extensions | grep -qw $dep {
				echo "$pkgname-$dep"
			}
		}
}

# Prints a load order (0-based integer) for the given extension name. Extension
# with lower load order should be loaded before exts with higher load order.
# It's based on number of dependencies of the extension (with exception for
# "imap"), which is flawed, but simple and good enough for now.
proc _extension_load_order {
	local name="$1"
	local deps=$(eval "echo \$_depends_$name")

	case (name) {
		# XXX: This must be loaded after recode, even though it does
		# not depend on it. So we must use this hack...
		imap { echo 1}
		* { echo ${deps:=$(_resolve_extension_deps $name)} | wc -w}
	}
}

# Prints $_extensions sorted by load order and name.
proc _extensions_by_load_order {
	local deps list name

	for name in $_extensions {
		setvar list = ""$list $(_extension_load_order $name);$name""
	}
	printf '%s\n' $list | sort -t ';' -k 1 | sed -E 's/\d+;//'
}

proc _mv {
	local destfor dest in @ARGV { true; }  # get last argument
	mkdir -p $dest
	mv $[join(ARGV)]
}

setvar sha512sums = ""b18aaa98f147f77569cf87d5ee42b50ce1b0af56785d584d27b383a0d121c107db4645806028e66a3b8fa6818b50c9ccb2ce882b347ad8753726fc34f2dadd92  php-7.1.10.tar.bz2
1c708de82d1086f272f484faf6cf6d087af7c31750cc2550b0b94ed723961b363f28a947b015b2dfc0765caea185a75f5d2c2f2b099c948b65c290924f606e4f  php7-fpm.initd
cacce7bf789467ff40647b7319e3760c6c587218720538516e8d400baa75651f72165c4e28056cd0c1dc89efecb4d00d0d7823bed80b29136262c825ce816691  php7-fpm.logrotate
274bd7b0b2b7002fa84c779640af37b59258bb37b05cb7dd5c89452977d71807f628d91b523b5039608376d1f760f3425d165242ca75ee5129b2730e71c4e198  php7-module.conf
62f60a1965d8b06eb7f76622cf13b3d91a501bf71acfa08ba13c9558d2205452871c9fc6768d211c22b4e3f2e11aa14e51f63ace628ddfd16008f2fc32e91b68  disabled-tests.list
f1177cbf6b1f44402f421c3d317aab1a2a40d0b1209c11519c1158df337c8945f3a313d689c939768584f3e4edbe52e8bd6103fb6777462326a9d94e8ab1f505  install-pear.patch
199aecdbd3b4035aabf5379c215f82412d3c98b79a1ee186944e7fe1f0ed6f40789ea30e2355149491de6be34fc66c5e486e2a79a7e41ab2ae18706ef3ffe79b  includedir.patch
d93d3fc015580cf5f75c6cbca4cd980e054b61e1068495da81a7e61f1af2c9ae14f09964c04928ad338142de78e4844aed885b1ad1865282072999fb045c8ad7  fix-asm-constraints-in-aarch64-multiply-macro.patch
a4c35446745ab0ac806de801f0651fc5d2c98cf60063c3c2d3963a84f1c71ef78e09b7650c08e7231be0fdb93c0c255de38894d7f0e4f4c5a190d17f1a6bc476  php7-fpm-version-suffix.patch
f8ecae241a90cbc3e98aa4deb3d5d35ef555f51380e29f4e182a8060dffeb84be74f030a14c6b452668471030d78964f52795ca74275db05543ccad20ef1f2cc  allow-build-recode-and-imap-together.patch
01c3c65f153ea92192f2b2694d93a086ffa67c282fe046f877842942692c25666e4154a09aba6c2161f7f2a3b6595f4d79573e9ee74aec774a95f2f9725846f9  fix-tests-devserver.patch""