#!/bin/bash # # Build and package mod_php on Slackware. # by: David Cantrell # Modified for PHP 4-5 by volkerdi@slackware.com # Copyright 2007 Patrick Volkerding, Sebeka, MN, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Changed by rhatto at riseup.net to fit slack.sarava.org needs # # needs a function from simplepkg function default_version { # get version from /etc/slackware-version if [ -f "$1/etc/slackware-version" ]; then cat $1/etc/slackware-version | awk '{ print $2 }' | sed -e 's/.0$//' elif [ -f "$1/etc/slamd64-version" ]; then cat $1/etc/slamd64-version | awk '{ print $2 }' | sed -e 's/.0$//' elif [ -f "$1/etc/bluewhite64-version" ]; then cat $1/etc/bluewhite64-version | awk '{ print $2 }' | sed -e 's/.0$//' elif [ -f "$1/etc/sflack-version" ]; then cat $1/etc/sflack-version | awk '{ print $2 }' | sed -e 's/.0$//' else aaa_base="`basename $(ls $1/var/log/packages/aaa_base-[0-9]* 2> /dev/null)`" echo `package_version $aaa_base` fi } function distro_version { default_version | tr -d . } if [ -s "slack-required" ]; then echo Recomended and required packages for building php are: cat slack-required | sed -e 's/^/\t/' if [ "$INTERACT" != "no" ]; then echo If you dont have those installed, press Ctrl-C. Otherwise, hit ENTER. read crap # else # echo Sleeping 3 seconds... # sleep 3 fi fi CWD="`pwd`" if [ -f ~/.slackbuildrc ]; then source ~/.slackbuildrc elif [ -f /etc/slackbuildrc ]; then source /etc/slackbuildrc fi PACKAGE="php" PHP_SERIES=${PHP_SERIES:=5} VERSION=${VERSION:=5.2.6} PINE=${PINE:=4.64} ARCH=${ARCH:=i486} BUILD=${BUILD:=1rha} TMP=${TMP:=/tmp} SRC_DIR=${SRC:=$CWD} REPOS=${REPOS:=$TMP} # ------- error codes for createpkg -------------- ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 ERROR_TAR=37; ERROR_MKPKG=38; ERROR_GPG=39 ERROR_PATCH=40 RTOOL="wget" SRC="$PACKAGE-$VERSION.tar.bz2" #URL="http://mirror.pacific.net.au/linux/slackware/slackware-10.2/patches/source/php/$SRC" URL="http://br.php.net/distributions/$SRC" # pear modules DB="DB-1.7.13.tgz" HTTP="HTTP-1.4.0.tgz" MAIL="Mail-1.1.14.tgz" SMTP="Net_SMTP-1.3.1.tgz" SOCKET="Net_Socket-1.0.9.tgz" PARSER="XML_Parser-1.2.8.tgz" RPC="XML_RPC-1.5.1.tgz" TAR="Archive_Tar-1.3.2.tgz" GETOPT="Console_Getopt-1.2.3.tgz" TEMPLATE="HTML_Template_IT-1.2.1.tgz" PEAR="http://pear.php.net/get" SRC_DIR="$SRC_DIR/$PACKAGE" mkdir -p $SRC_DIR if [ "$RTOOL" == "wget" ]; then if [ ! -f "$SRC_DIR/$SRC" ]; then wget "$URL" -O "$SRC_DIR/$SRC" fi # rm -rf $SRC_DIR/pear* mkdir -p $SRC_DIR/pear if [ "$PHP_SERIES" == "5" ]; then pearlist="$PARSER" elif [ "$VERSION" == "4.4.2" ]; then pearlist="$DB $HTTP $MAIL $SMTP $SOCKET $PARSER $RPC" mkdir -p $SRC_DIR/pear-4.4.2-bad-md5sums for pear in $TAR $GETOPT $TEMPLATE; do if [ ! -f "$SRC_DIR/pear-4.4.2-bad-md5sums/$pear" ]; then wget "$PEAR/$pear" -O "$SRC_DIR/pear-4.4.2-bad-md5sums/$pear" || exit $ERROR_WGET fi done else pearlist="$DB $HTTP $MAIL $SMTP $SOCKET $PARSER $RPC $TAR $GETOPT $TEMPLATE" fi for pear in $pearlist; do if [ ! -f "$SRC_DIR/pear/$pear" ]; then wget "$PEAR/$pear" -O "$SRC_DIR/pear/$pear" || exit $ERROR_WGET fi done fi if [ "$ARCH" = "i386" ]; then SLKCFLAGS="-O2 -march=i386 -mcpu=i686" elif [ "$ARCH" = "i486" ]; then SLKCFLAGS="-O2 -march=i486 -mcpu=i686" elif [ "$ARCH" = "s390" ]; then SLKCFLAGS="-O2" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -fPIC" fi # we need to compile Pine to get c-client.a for IMAP support: if [ "$ARCH" == "x86_64" ]; then IMAPLIBDIR=/usr/local/lib64/c-client LIBDIR="/usr/lib64" LIB="lib64" else IMAPLIBDIR=/usr/local/lib/c-client LIBDIR="/usr/lib" LIB="lib" ADD_FLAGS="--with-db3 --enable-yp" fi if [ -r $IMAPLIBDIR/$LIB/c-client.a ]; then echo "Using IMAP library:" ls -l $IMAPLIBDIR/$LIB/c-client.a sleep 5 else if which createpkg &> /dev/null; then ( CLEANUP=no createpkg pine ) else ( cd $CWD/../pine ; CLEANUP=no SRC=$SRC_DIR/../ ./pine.SlackBuild ) fi ( cd $TMP/pine/pine${PINE}/imap/c-client strip -g c-client.a mkdir -p $IMAPLIBDIR/$LIB cp c-client.a $IMAPLIBDIR/$LIB mkdir -p $IMAPLIBDIR/include cp *.h $IMAPLIBDIR/include ) fi TMP="$TMP/$PACKAGE" PKG="$TMP/package-php" rm -rf $TMP mkdir -p $TMP cd $TMP # changed since slackware 12.0 if (( `distro_version` >= 120 )); then mkdir -p $PKG/etc/httpd mkdir -p $PKG/etc/php # A trick from DaMouse to enable building php into $PKG. # We'll remove this later on. cat /etc/httpd/original/httpd.conf > $PKG/etc/httpd/httpd.conf if [ ! -e /etc/httpd/original/httpd.conf ]; then echo "FATAL: no /etc/httpd/original/httpd.conf found." exit 1 fi else mkdir -p $PKG/etc/apache # A trick from DaMouse to enable building php into $PKG. # We'll remove this later on. cat /etc/apache/httpd.conf.default > $PKG/etc/apache/httpd.conf fi # Add missing(?) PEAR modules back: ( cd php-$VERSION/pear/packages cp -a $SRC_DIR/pear/* . bzip2 -d *.bz2 &> /dev/null gunzip -d -f *.tgz &> /dev/null ) if [ "$ARCH" = "s390" ]; then if [ -f "$CWD/patches/php.configure.s390.diff.gz" ]; then zcat $CWD/patches/php.configure.s390.diff.gz | patch -p1 || exit fi fi cd $TMP rm -rf php-$VERSION tar xvf $SRC_DIR/$SRC || exit $ERROR_TAR # Replace PEAR packages for which the 4.4.2 release contained incorrect md5sums: if [ $VERSION = 4.4.2 ]; then ( cd php-$VERSION/pear/packages rm -f HTML_Template_IT-1.1.tar cp -a $SRC_DIR/pear-4.4.2-bad-md5sums/* . bzip2 -d --force *.bz2 &> /dev/null gunzip -d -f *.tgz &> /dev/null ) fi cd php-$VERSION if [ "$ARCH" == "x86_64" ]; then if [ "$PHP_SERIES" == "4" ]; then # Fix lib64 - thanks SuSE echo patching with $CWD/patches/php-with-_lib-$VERSION.diff.gz... zcat $CWD/patches/php-with-_lib-$VERSION.diff.gz | patch -p1 --verbose || exit $ERROR_PATCH autoconf fi fi # Fixup perms/owners: chown -R root:root . find . -perm 666 -exec chmod 644 {} \; find . -perm 664 -exec chmod 644 {} \; find . -perm 600 -exec chmod 644 {} \; find . -perm 444 -exec chmod 644 {} \; find . -perm 400 -exec chmod 644 {} \; find . -perm 440 -exec chmod 644 {} \; find . -perm 777 -exec chmod 755 {} \; find . -perm 775 -exec chmod 755 {} \; find . -perm 511 -exec chmod 755 {} \; find . -perm 711 -exec chmod 755 {} \; find . -perm 555 -exec chmod 755 {} \; find . -name "*.h" -exec chmod 644 {} \; # Sometimes they ship a few of these: find . -name "*.orig" -exec rm {} \; # Fix a UTF-8 parsing overflow: FULL_VERSION="`echo $VERSION | tr -dc '[[:digit:]]'`" if [[ $FULL_VERSION -lt 445 ]]; then zcat $CWD/patches/php4.utf8.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit $ERROR_PATCH elif [ "$FULL_VERSION" == "441" ]; then # Fix an issue introduced in PHP 4.4.1 that breaks SquirrelMail and # probably some other PHP applications: zcat $CWD/patches/php.squirrel.diff.gz | patch -p1 --verbose || exit fi # Patch ini files: if [ "$ARCH" == "x86_64" ]; then zcat $CWD/patches/php.ini-x86_64.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit $ERROR_PATCH zcat $CWD/patches/php.recommended-x86_64.ini.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit $ERROR_PATCH else zcat $CWD/patches/php.ini.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit $ERROR_PATCH zcat $CWD/patches/php.recommended.ini.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit $ERROR_PATCH fi # Generic "kitchen sink" configure function, with as many things as possible (and # maybe then some ;-) compiled as shared extensions: php_configure() { if [ "$PHP_SERIES" == "5" ]; then if (( `distro_version` >= 120 )); then $CONFIG_FILES="--with-config-file-scan-dir=/etc/php --with-config-file-path=/etc/httpd" $SNMP="--with-snmp=shared,/usr" $MBSTRING="--enable-mbstring=shared" else $CONFIG_FILES="--with-config-file-path=/etc/apache" $MBSTRING="--enable-mbstring" fi EXTENSION_DIR=/usr/$LIB/php/extensions \ CFLAGS="$SLKCFLAGS" \ ./configure \ $* \ --prefix=/usr \ -libdir=$LIBDIR \ --with-libdir=$LIB \ --prefix=/usr \ --sysconfdir=/etc \ --disable-safe-mode \ --enable-apc \ --enable-apc-mmap \ --enable-memory-limit \ --enable-suhosin \ --disable-magic-quotes \ --enable-zend-multibyte \ --enable-mbregex \ --enable-tokenizer=shared \ $CONFIG_FILES \ --with-mod_charset \ --with-layout=PHP \ --enable-sigchild \ --enable-xml \ --with-libxml-dir=/usr \ --enable-simplexml \ --enable-spl \ --enable-filter \ --disable-debug \ --with-openssl=shared \ --with-pcre-regex=/usr \ --with-zlib=shared,/usr \ --enable-bcmath=shared \ --with-bz2=shared,/usr \ --enable-calendar=shared \ --enable-ctype=shared \ --with-curl=shared \ --with-curlwrappers \ --enable-dba=shared \ --with-gdbm=/usr \ --with-db4=/usr \ --enable-dbase=shared \ --enable-exif=shared \ --enable-ftp=shared \ --with-gd=shared \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-xpm-dir=/usr \ --with-freetype-dir=/usr \ --with-t1lib=/usr \ --enable-gd-native-ttf \ --enable-gd-jis-conv \ --with-gettext=shared,/usr \ --with-gmp=shared,/usr \ --with-iconv=shared \ --with-imap-ssl=/usr \ --with-imap=$IMAPLIBDIR \ --with-ldap=shared \ $MBSTRING \ --with-hash \ --with-mhash=shared,/usr \ --with-mysql=shared,/usr \ --with-mysqli=shared,/usr/bin/mysql_config \ --enable-pdo=shared \ --with-pdo-mysql=shared,/usr \ --with-pdo-sqlite=shared \ --with-pspell=shared,/usr \ --with-mm=/usr \ --enable-shmop=shared \ $SNMP \ --enable-soap=shared \ --enable-sockets \ --with-sqlite=shared \ --enable-sqlite-utf8 \ --with-regex=php \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx=shared \ --with-xsl=shared,/usr \ --enable-zip=shared \ --with-tsrm-pthreads \ --enable-shared=yes \ --enable-static=no \ --with-gnu-ld \ --with-pic \ --build=$ARCH-slackware-linux # TODO else EXTENSION_DIR=/usr/$LIB/php/extensions \ CFLAGS="$SLKCFLAGS" \ ./configure --prefix=/usr \ $* \ --with-_lib=$LIB \ --libdir=$LIBDIR \ --sysconfdir=/etc \ --with-config-file-path=/etc/apache \ --enable-safe-mode \ --with-openssl \ --with-mhash \ --enable-bcmath \ --with-bz2 \ --with-pic \ --enable-calendar \ --enable-ctype \ --with-gdbm \ --with-db4 \ --with-imap-ssl=$IMAPLIBDIR \ --with-imap=$IMAPLIBDIR \ --enable-dbase \ --enable-ftp \ --with-iconv \ --with-dom \ --with-exif \ --enable-exif \ --with-gd \ --enable-gd-native-ttf \ --with-jpeg-dir=/usr \ --with-png \ --with-ttf \ --with-freetype-dir=/usr \ --with-gmp \ --enable-mbstring \ --with-curl=/usr \ --with-pcre-regex=/usr \ --with-mysql=shared,/usr \ --with-gettext=shared,/usr \ --with-expat-dir=/usr \ --with-xml \ --enable-wddx \ --with-mm=/usr \ --enable-trans-sid \ --enable-shmop \ --enable-sockets \ --with-regex=php \ --enable-sysvsem \ --enable-sysvshm \ --enable-yp \ --enable-memory-limit \ --with-tsrm-pthreads \ --enable-shared \ --disable-debug \ --with-zlib=/usr $ADD_FLAGS || exit $ERROR_CONF # --with-mod_charset # only for Russian patched Apache # --with-readline=/usr # this is only for the CGI version # --with-ttf # this links with the shlib, need X for that # --with-java # no thanks # TODO: check if it still happens # strange bug, http://bugs.php.net/bug.php?id=31193 sed -e 's/^EXTRA_LIBS\(.*\)/EXTRA_LIBS\1 -liconv/' Makefile > Makefile.new mv Makefile.new Makefile fi } # I am told this option is worse than nothing. :-) # --enable-safe-mode # # I would recommend *against* and will take no responbility for turning on "safe" mode. # Make the Apache module version of PHP: echo "***START APACHE MODULE***" if (( `distro_version` >= 120 )); then php_configure --with-apxs2=/usr/sbin/apxs || exit $ERROR_CONF else php_configure --disable-static --with-apxs=/usr/sbin/apxs --enable-discard-path || exit $ERROR_CONF fi make -j3 || exit $ERROR_MAKE make install INSTALL_ROOT=$PKG || exit $ERROR_INSTALL make distclean echo "***END APACHE MODULE***" if [ "$PHP_SERIES" == "5" ]; then # Make the CLI version of PHP: php_configure \ --enable-force-cgi-redirect \ --enable-fastcgi \ --enable-pcntl \ --enable-readline \ --enable-sigchild make -j3 || exit $ERROR_MAKE mkdir -p $PKG/usr/bin cat ./sapi/cli/php > $PKG/usr/bin/php chmod 755 $PKG/usr/bin/php else # Make the standalone interpreter: php_configure --enable-force-cgi-redirect --enable-fastcgi --enable-pcntl --enable-sigchild || exit $ERROR_CONF make -j3 || exit $ERROR_MAKE make install-cli INSTALL_ROOT=$PKG || exit $ERROR_INSTALL chmod 755 $PKG/usr/bin/php chown root.bin $PKG/usr/bin/php fi if [ "$PHP_SERIES" == "5" ]; then # Make the FastCGI interpreter: make distclean php_configure \ --enable-force-cgi-redirect \ --enable-fastcgi \ --enable-pcntl \ --enable-readline \ --enable-sigchild make -j3 || exit 1 mkdir -p $PKG/usr/bin cat sapi/cgi/php-cgi > $PKG/usr/bin/php-cgi chmod 755 $PKG/usr/bin/php-cgi else # Install the CGI/FastCGI interpreter: cat sapi/cgi/php > $PKG/usr/bin/php-cgi chmod 755 $PKG/usr/bin/php-cgi fi # PHP likes to install Pear with some strange permissions. chmod 755 $PKG/usr/bin/pear # PHP 4.4.2 seems to be throwing some junk in the root directory: ( cd $PKG rm -rf .channels .depdb .depdblock .filemap .lock .registry ) # Fix $PKG/$LIBDIR/php perms: ( cd $PKG/$LIBDIR/php find . -perm 666 -exec chmod 644 {} \; find . -perm 664 -exec chmod 644 {} \; find . -perm 600 -exec chmod 644 {} \; find . -perm 444 -exec chmod 644 {} \; find . -perm 400 -exec chmod 644 {} \; find . -perm 440 -exec chmod 644 {} \; find . -perm 777 -exec chmod 755 {} \; find . -perm 775 -exec chmod 755 {} \; find . -perm 511 -exec chmod 755 {} \; find . -perm 711 -exec chmod 755 {} \; find . -perm 555 -exec chmod 755 {} \; ) mkdir -p $PKG/usr/doc/php-$VERSION cp -a \ CODING_STANDARDS CREDITS EXTENSIONS INSTALL LICENSE NEWS README* TODO* \ sapi/cgi/README.FastCGI \ $PKG/usr/doc/php-$VERSION chown -R root:root $PKG/usr/doc/php-$VERSION if [ -f "$PKG/etc/pear.conf" ]; then mv $PKG/etc/pear.conf $PKG/etc/pear.conf.example fi mkdir -p $PKG/etc/apache cp -a php.ini-dist php.ini-recommended $PKG/etc/apache if [ "$PHP_SERIES" == "5" ]; then if (( `distro_version` >= 120 )); then cp -a $CWD/mod_php$PHP_SERIES-apache2.conf.example $PKG/etc/apache/mod_php.conf.example else cp -a $CWD/mod_php$PHP_SERIES-apache1.3.conf.example $PKG/etc/apache/mod_php.conf.example fi else cp -a $CWD/mod_php$PHP_SERIES-apache1.3.conf.example $PKG/etc/apache/mod_php.conf.example fi chmod 644 $PKG/etc/apache/* chown root:root $PKG/etc/apache/* # This can go now. rm -f $PKG/etc/apache/httpd* if (( `distro_version` >= 120 )); then # Session directory for PHP: mkdir -p $PKG/var/lib/php chmod 770 $PKG/var/lib/php chown root:apache $PKG/var/lib/php fi # Strip ELF objects. ( cd $PKG find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null ) gzip -9 $PKG/usr/man/man?/*.? mkdir -p $PKG/install zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh cat $CWD/slack-desc > $PKG/install/slack-desc if [ -d "$IMAPLIBDIR" ]; then ( cd $IMAPLIBDIR && rm -rf * ) rmdir $IMAPLIBDIR fi cd $PKG makepkg -l y -c n $REPOS/php-$VERSION-$ARCH-$BUILD.tgz || exit $ERROR_MKPKG if [ "$CLEANUP" == "yes" ]; then rm -rf $TMP fi