#!/bin/sh #-- python for Slackware -- # Build script by Phantom X # 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 #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