#!/bin/sh
#-- python for Slackware --
# Build script by Phantom X <megaphantomx@bol.com.br>
# Suggested usage: $ python.SlackBuild 2>&1 | tee build.log
#--
# Copyright 2008, 2009, 2010 Phantom X, Goiania, Brazil.
# Copyright 2006 Martijn Dekker, Groningen, Netherlands.
#
# 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.

# http://www.python.org/

PACKAGER_ID=${PACKAGER_ID:-$USER}
PACKAGER=${PACKAGER:-$USER@$HOSTNAME}

# Set YES for native build with gcc >= 4.2
SB_NATIVE=${SB_NATIVE:-NO}

# Set to YES to replicate slackbuild and patches
SB_REP=${SB_REP:-YES}

CWD=$(pwd)
TMP=${TMP:-/tmp}
if [ ! -d ${TMP} ]; then
  mkdir -p ${TMP}
fi

PNAME=Python
NAME=python
PKG=${PKG:-${TMP}/package-${NAME}}

VERSION=${VERSION:-2.7.1}
SVER=$(echo ${VERSION} | cut -d. -f1-2)
PVER=${PVER:-2.7.1}
if [ "${SB_NATIVE}" = "YES" ] ;then
  ARCH=${ARCH:-$(uname -m)}
else
  ARCH=${ARCH:-i686}
fi
if [ "${ARCH}" = "x86_64" ] ;then
  SLKTARGET=${SLKTARGET:-x86_64}
else
  SLKTARGET=${SLKTARGET:-i486}
fi
SLKDTARGET=${SLKDTARGET:-slackware}
BUILD=${BUILD:-1}
NJOBS=${NJOBS:-$(( $(getconf _NPROCESSORS_ONLN) + 1 ))}
DOCDIR=${PKG}/usr/doc/${NAME}-${VERSION}
SBDIR=${PKG}/usr/src/slackbuilds/${NAME}
PKGDEST=${PKGDEST:-${CWD}}
PKGFORMAT=${PKGFORMAT:-txz}
PKGNAME=${NAME}-$(echo ${VERSION} | tr - . )-${ARCH}-${BUILD}${PACKAGER_ID}

DATE=$(LC_ALL=C date +%d-%b-%Y)

SRCDIR=${PNAME}-${VERSION}
SRCARCHIVE=${SRCDIR}.tar.bz2
PDIR=$(echo ${PVER} | cut -d- -f1)
PSRCARCHIVE=${NAME}-gentoo-patches-${PVER}.tar.bz2

DL_PROG=${DL_PROG:-wget}
DL_TO=${DL_TO:-5}
DL_OPTS=${DL_OPTS:-"--timeout=${DL_TO}"}
DL_URL="http://www.python.org/ftp/python/${VERSION}/${SRCARCHIVE}"
GENTOO_MIRROR=${GENTOO_MIRROR:-ftp://ftp.ussg.iu.edu/pub/linux/gentoo}
PDL_URL="${GENTOO_MIRROR}/distfiles/${PSRCARCHIVE}"

# if source is not present, download in source rootdir if possible
test -r ${CWD}/${SRCARCHIVE} || ${DL_PROG} ${DL_OPTS} ${DL_URL} || exit 1
test -r ${CWD}/${PSRCARCHIVE} || ${DL_PROG} ${DL_OPTS} ${PDL_URL} || exit 1

if [ "${SB_NATIVE}" = "YES" ] ;then
  SLKCFLAGS="-O3 -march=native -mtune=native ${SB_ECFLAGS} -pipe"
else
  case "${ARCH}" in
    i[3-6]86)    SLKCFLAGS="-O3 -march=${ARCH} -mtune=i686"
                 ;;
    x86_64)      SLKCFLAGS="-O3 -fPIC"
                 ;;
    s390|*)      SLKCFLAGS="-O3"
                 ;;
  esac
fi
if [ "${ARCH}" = "x86_64" ] ;then
  LIBDIRSUFFIX="64"
  SLKCFLAGS="${SLKCFLAGS} -fPIC"
else
  LIBDIRSUFFIX=""
fi

# Location for Python site-packages:
SITEPK=${PKG}/usr/lib${LIBDIRSUFFIX}/python${SVER}/site-packages
TOOLSDIR=../lib${LIBDIRSUFFIX}/python${SVER}/site-packages

if [ -d ${PKG} ]; then
  # Clean up a previous build
  rm -rf ${PKG}
fi
mkdir -p ${PKG}

cd ${TMP}
rm -rf ${SRCDIR}
tar -xvf ${CWD}/${SRCARCHIVE} || exit 1
cd ${SRCDIR} || exit 1
tar -xvf ${CWD}/${PSRCARCHIVE} || exit 1

SB_SROOT="$(pwd)"

chmod -R u+w,go+r-w,a-s .

if [ -r ${CWD}/apply-patches.sh ]; then
  . ${CWD}/apply-patches.sh || exit 1
fi

#   Remove embedded copy of expat:
rm -rf Modules/expat || exit 1

#   Remove embedded copy of libffi:
for SUBDIR in darwin libffi libffi_arm_wince libffi_msvc libffi_osx ; do
  rm -rf Modules/_ctypes/${SUBDIR} || exit 1 ;
done

#   Remove embedded copy of zlib:
rm -rf Modules/zlib || exit 1

find . -name ".cvsignore" |xargs rm -f

export LDFLAGS="-L. ${LDFLAGS}"

OPT="${SLKCFLAGS} -D_GNU_SOURCE -fPIC -fwrapv" \
./configure \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --sysconfdir=/etc \
  --localstatedir=/var/lib \
  --infodir=/usr/info \
  --mandir=/usr/man \
  --docdir=/usr/doc/${NAME}-${VERSION} \
  --enable-shared \
  --with-threads \
  --enable-ipv6 \
  --with-system-expat \
  --with-system-ffi \
  --without-dtrace \
  --build=${SLKTARGET}-${SLKDTARGET}-linux || exit 1

make -j${NJOBS} || make || exit 1

LD_LIBRARY_PATH=${SB_SROOT} ${SB_SROOT}/python Tools/scripts/pathfix.py -i "/usr/bin/env python${SVER}" .
# Rebuild with new python
# We need a link to a versioned python in the build directory
ln -s python python${SVER}
LD_LIBRARY_PATH=${SB_SROOT} PATH=${PATH}:${SB_SROOT} make -j${NJOBS} || make || exit 1

make install DESTDIR=${PKG} || exit 1

# Junk, no point in putting in -test sub-pkg
rm -f ${PKG}/usr/lib${LIBDIRSUFFIX}/python${SVER}/idlelib/testcode.py*

rm -f ${PKG}/usr/lib${LIBDIRSUFFIX}/python${SVER}/email/test/data/audiotest.au \
  ${PKG}/usr/lib${LIBDIRSUFFIX}/python${SVER}/test/audiotest.au

# Remove SLKCFLAGS from modules build Makefile.
# This fix some possible problems.
sed -e "/^OPT=/s|${SLKCFLAGS}||g" \
    -i ${PKG}/usr/lib${LIBDIRSUFFIX}/python${SVER}/config/Makefile || exit 1

unset MARCH
case "${ARCH}" in
  i[3-6]86|s390)  MARCH=32
             ;;
    x86_64)  MARCH=64
             ;;
esac

if [ -n "${MARCH}" ] ;then
  mv ${PKG}/usr/include/python${SVER}/pyconfig.h  \
    ${PKG}/usr/include/python${SVER}/pyconfig-${MARCH}.h || exit 1

cat > ${PKG}/usr/include/python${SVER}/pyconfig.h << EOF
#include <bits/wordsize.h>

#if __WORDSIZE == 32
#include "pyconfig-32.h"
#elif __WORDSIZE == 64
#include "pyconfig-64.h"
#else
#error "Unknown word size"
#endif
EOF
fi
ln -s ../../libpython${SVER}.so \
  ${PKG}/usr/lib${LIBDIRSUFFIX}/python${SVER}/config/libpython${SVER}.so

find ${PKG} | xargs file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null

( cd ${PKG}/usr/bin || exit 1
  rm -f python python-config
  ln -sf python${SVER} python
  ln -sf python${SVER} python2
  ln -sf python${SVER}-config python-config
)

# We'll install the python-tools under site-packages:
mkdir -p ${SITEPK}
( cd Tools ; cp -a * ${SITEPK} )

# Make a few useful symlinks:
mkdir -p ${PKG}/usr/bin
( cd ${PKG}/usr/bin
  ln -sf ${TOOLSDIR}/modulator/modulator.py modulator
  ln -sf ${TOOLSDIR}/pynche/pynche pynche
  ln -sf ${TOOLSDIR}/i18n/msgfmt.py .
  ln -sf ${TOOLSDIR}/i18n/pygettext.py .
)

rm -f ${SITEPK}/pynche/pynche.pyw

mv Tools/modulator/README Tools/modulator/README.modulator
mv Tools/pynche/README Tools/pynche/README.pynche

# Add a documentation directory:
mkdir -p ${DOCDIR}
cp -a \
  README Misc Demo html ${CWD}/ChangeLog.SB \
  ${DOCDIR}/
mv ${SITEPK}/README ${DOCDIR}/README.python-tools
( cd ${DOCDIR}
  ln -sf ../${TOOLSDIR} Tools
)
find ${DOCDIR}/ -type d -print0 | xargs -0 chmod 0755
find ${DOCDIR}/ -type f -print0 | xargs -0 chmod 0644

find ${PKG} \( -name '*~' -o -name '*.orig' -o -name '*.lib64' \) -exec rm -f {} ';'

# Compress and link manpages, if any:
if [ -d ${PKG}/usr/share/man ]; then
  mv ${PKG}/usr/share/man ${PKG}/usr/man
  rmdir ${PKG}/usr/share
fi
if [ -d ${PKG}/usr/man ]; then
  ( cd ${PKG}/usr/man
    for manpagedir in $(find . -type d -name "man*") ; do
      ( cd ${manpagedir}
        for eachpage in $( find . -type l -maxdepth 1) ; do
          ln -s $( readlink ${eachpage} ).gz ${eachpage}.gz
          rm -f ${eachpage}
        done
        gzip -9 *.?
        # Prevent errors
        rm -f *.gz.gz
      )
    done
  )
fi

mkdir -p ${PKG}/install
cat ${CWD}/slack-desc > ${PKG}/install/slack-desc
cat ${CWD}/slack-required > ${PKG}/install/slack-required

sed -i "s|_PACKAGER|${PACKAGER}|g; s|_BUILD_DATE|${DATE}|g" \
       ${PKG}/install/slack-desc

if [ "${SB_REP}" = "YES" ] ;then
  # Replicate slackbuild and patches
  mkdir -p ${SBDIR}/patches
  install -m0644 ${CWD}/slack-desc ${CWD}/slack-required ${CWD}/ChangeLog.SB \
                 ${CWD}/apply-patches.sh ${SBDIR}/
  install -m0755 ${CWD}/${NAME}.SlackBuild \
                 ${SBDIR}/${NAME}.SlackBuild
  install -m0644 ${CWD}/patches/*.* \
                 ${SBDIR}/patches/
fi

# Build package:
set +o xtrace        # no longer print commands upon execution

ROOTCOMMANDS="set -o errexit -o xtrace ; cd ${PKG} ;
  /bin/chown --recursive root:root .  ;"

ROOTCOMMANDS="${ROOTCOMMANDS}
  /sbin/makepkg --linkadd y --chown n ${PKGDEST}/${PKGNAME}.${PKGFORMAT} "

if test ${UID} = 0; then
  eval ${ROOTCOMMANDS}
  set +o xtrace
elif test "$(type -t fakeroot)" = 'file'; then
  echo -e "\e[1mEntering fakeroot environment.\e[0m"
  echo ${ROOTCOMMANDS} | fakeroot
else
  echo -e "\e[1mPlease enter your root password.\e[0m (Consider installing fakeroot.)"
  /bin/su -c "${ROOTCOMMANDS}"
fi

# Clean up the extra stuff:
if [ "$1" = "--cleanup" ]; then
  echo "Cleaning..."
  if [ -d ${TMP}/${SRCDIR} ]; then
    rm -rf ${TMP}/${SRCDIR} && echo "${TMP}/${SRCDIR} cleanup completed"
  fi
  if [ -d ${PKG} ]; then
    rm -rf ${PKG} && echo "${PKG} cleanup completed"
  fi
  rmdir ${TMP} && echo "${TMP} cleanup completed"
fi
exit 0
