#!/bin/bash
# Version: 1.7 GSB Package SlackBuild.
# Copyright (c) 2007,2008,2009 Darren 'Tadgy' Austin <darren (at) gnomeslackbuild.org>
# Copyright (c) 2007,2008,2009 Steve Kennedy <steve (at) gnomeslackbuild.org>
# All rights reserved.
#
# Licenced under the terms of the GNU General Public Licence version 3.
#
# 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.

# Package variables. 
BUILD=1
VERSION=r19668

# Make sure we use a set libswscale from mplayer;  the external dependency
# is a trunk revision, and so checking out a set revision of ffmpeg may 
# sometimes cause it to fail building with later changes to libswcale
LIBSWSCALE_VERSION=r29540

# List any packages here that are required to build this package.
# The list is space seperated and case sensitive.
REQUIRED_PACKAGES="freetype sdl zlib x264 libvorbis lame yasm"

# Build variables.
TAG=${TAG:-gsb}
ARCH=${ARCH:-i486}
TUNE=${TUNE:-i486}
DISTRO=${DISTRO:-slackware}
TMP=${TMP:-/tmp}
PKGDEST=${PKGDEST:-$TMP}

# Script variables.
PKGNAME=$(basename $0 .SlackBuild)
PKG=$TMP/package-$PKGNAME
CWD=$(pwd)
NOCLEANUP=0
FORCEBUILD=0

# Usage.
function usage() {
  cat << EOF
Usage: ${0##*/} [options]

Options:  --force       The package will not be built if a package of the same
                        name is already installed, or any of the packages
                        required to build are missing.  This option over-rides
                        these checks and attempts a build anyway.
          --no-cleanup  By default any temporary source, build and package
                        directories will be deleted once the package is built.
                        This option prevents those files from being removed.
          --help        Show this help screen.
EOF
}

# Parse command line arguments.
while [ $# -gt 0 ]; do
  if [ "$1" = "-force" ] || [ "$1" = "--force" ]; then
    FORCEBUILD=1
    shift
  elif [ "$1" = "-no-cleanup" ] || [ "$1" = "--no-cleanup" ]; then
    NOCLEANUP=1
    shift
  elif [ "$1" = "-help" ] || [ "$1" = "--help" ]; then
    usage
    exit 0
  else
    echo "${0##*/}: Unknown option: $1"
    exit 1
  fi
done

# Package requirements and installation checks.
[ "$FORCEBUILD" = "0" ] && {
  function check_installed() {
    ls -1 /var/log/packages | grep "^${1}-[^-]*-[^-]*-[^-]*$" >/dev/null 2>&1
    return $?
  }

  check_installed "$PKGNAME" && {
    echo "${0##*/}: Remove installed '$PKGNAME' package before build."
    exit 1
  }

  for REQ in $REQUIRED_PACKAGES; do
    check_installed "$REQ" || {
      echo "${0##*/}: Required package '$REQ' not installed."
      exit 1
    }
  done
}

# SVN warning
echo
echo "*********************************************************************"
echo "*** Warning: This package is built from a fixed svn source revision."
echo "*********************************************************************"

SOURCE="$CWD/${PKGNAME}-${VERSION}.tar.xz"
# This function has been gratuitously stolen from Eric Hamleers
# MPlayer.SlackBuild.  :^)  
src_checkout() {
  # Determine the tarball extension:
  PEXT=$(echo "${1}" | sed -r -e 's/.*[^.].(tar.xz|tar.gz|tar.bz2|tgz).*/\1/')
  case "$PEXT" in
    "tar.xz") TARCOMP="J" ;;
    "tar.gz") TARCOMP="z" ;;
    "tgz") TARCOMP="z" ;;
    "tar.bz2") TARCOMP="j" ;;
    *) echo "Archive can only have extension 'tar.xz', '.tar.gz' '.tar.bz2' or '.tgz'" ; exit 1 ;;
  esac
  if [ "$(echo ${VERSION}|cut -c1)" == 'r' ]; then # revision instead of date
    REV=$(echo ${VERSION} | cut -c2-)
    SW_REV=$(echo ${LIBSWSCALE_VERSION} | cut -c2-)
  else
    REV="{${VERSION}}"
    SW_REV="{${LIBSWSCALE_VERSION}}"
  fi
  mkdir -p $PKGNAME-${VERSION} \
    && cd $PKGNAME-${VERSION} \
    && svn checkout  --revision $REV svn://svn.mplayerhq.hu/ffmpeg/trunk . \
    && ( rm -fr libswscale ; svn checkout --revision $SW_REV \
         svn://svn.ffmpeg.org/mplayer/trunk/libswscale ./libswscale ) \
    && find . -type d -name '.svn' -depth | xargs rm -rf \
    && chown -R root:root . \
    && cd .. \
    && tar -${TARCOMP}cf ${1} ${PKGNAME}-${VERSION} || {
      rm -fr $PKGNAME-${VERSION}
      exit 1
    }
  rm -rf ${PKGNAME}-${VERSION}
}

# Temporary space and package storage.
mkdir -p $TMP
rm -rf $PKG
mkdir -p $PKG
mkdir -p $PKG/install
mkdir -p $PKGDEST

# Grab from svn if file doesn't exist
if [ ! -f ${SOURCE} ]; then
 echo "Source '$(basename ${SOURCE})' not available yet..."
 echo "Will checkout sources to $(dirname $SOURCE)"
 src_checkout ${SOURCE} || exit 1
fi;
cd $TMP &&
rm -rf $PKGNAME-$VERSION &&
tar xf $CWD/$PKGNAME-$VERSION.tar.xz &&
cd $PKGNAME-$VERSION || exit 1

# Apply ARCH specific patches.
if [ "$ARCH" = "i486" -o "$ARCH" = "i586" -o "$ARCH" = "i686" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$ARCH" = "x86_64" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$ARCH" = "powerpc" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
fi

# Fix permissions for building.
chown -R root:root .
find . \
  \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
  -exec chmod 755 {} \; -o \
  \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
  -exec chmod 644 {} \;

# Configure, Tuning, GCC and Make options.
CONFIGURE_FLAGS=${GSB_CONFIGURE_FLAGS:-""}
if [ "$ARCH" = "i486" -o "$ARCH" = "i586" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH -mtune=$TUNE"}
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  TUNE_CFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "s390" ]; then
  TUNE_CFLAGS="-O2"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
    TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -fPIC"}
    LIBDIRSUFFIX="64"
elif [ "$ARCH" = "powerpc" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH"}
fi
EXTRA_CFLAGS=${GSB_EXTRA_CFLAGS:-""}
MAKE_FLAGS=${GSB_MAKE_FLAGS:-""}

# Configure.
CFLAGS="$TUNE_CFLAGS $EXTRA_CFLAGS" CXXFLAGS="$TUNE_CFLAGS $EXTRA_CFLAGS" \
  ./configure --prefix=/usr $CONFIGURE_FLAGS --arch=$ARCH \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --shlibdir=/usr/lib${LIBDIRSUFFIX} \
  --mandir=/usr/man \
  --enable-postproc \
  --enable-pthreads \
  --target-os=linux \
  --enable-runtime-cpudetect \
  --enable-shared \
  --disable-static \
  --enable-gpl \
  --enable-libx264 \
  --enable-libmp3lame \
  --enable-libvorbis \
  || exit 1

# Build and install.
echo $VERSION > VERSION
make $MAKE_FLAGS &&
make $MAKE_FLAGS DESTDIR=$PKG install || exit 1

# Fix x86_64 pkg-config files
if [ "$ARCH" = "x86_64" ]; then
  for i in $PKG/usr/lib64/pkgconfig/*.pc ;
  do 
    sed -i "s:/lib$:/lib64:g" $i ;
  done;
fi;

# For header compatibility
(cd $PKG/usr/include ;
ln -s libavcodec ffmpeg)

# Strip debugging symbols.
{ find $PKG | xargs file | egrep "executable|shared object" | grep "ELF" | \
  cut -d: -f1 | xargs strip --strip-unneeded ; } 2>/dev/null

# Compress and fix manpage links.
[ -e $PKG/usr/man ] && {
  find $PKG/usr/man -type f -name \*.? -exec gzip -9f {} \;
  find $PKG/usr/man -type l -name \*.? -printf \
    "( cd '%h'; [ -e '%l.gz' ] &&
     { rm -f '%f'; ln -sf '%l.gz' '%f.gz'; } );\n" | bash
}

# Deal with .info files.
[ -e $PKG/usr/share/info ] && {
  mkdir -p $PKG/usr && mv $PKG/usr/share/info $PKG/usr || exit 1;
  rmdir -p $PKG/usr/share
  }
[ -e $PKG/usr/info ] && {
  rm -f $PKG/usr/info/dir
  gzip -9 $PKG/usr/info/*.info
}

# Copy extra documentation into package.
mkdir -p $PKG/usr/doc/$PKGNAME-$VERSION
cp -a COPYING* CREDITS Changelog README MAINTAINERS ./doc/*.txt \
  $PKG/usr/doc/$PKGNAME-$VERSION ;
find $PKG/usr/doc/$PKGNAME-$VERSION/ -type f -exec chmod 644 {} \;
chown -R root:root $PKG/usr/doc/$PKGNAME-$VERSION

# Package meta files
for FILE in doinst.sh slack-desc slack-required slack-conflicts slack-suggests
do
  [ -e $CWD/$FILE ] && {
    cat $CWD/$FILE >>$PKG/install/$FILE
  }
done

# Create the package
cd $PKG
makepkg -p -l y -c n $PKGDEST/$PKGNAME-${VERSION//-/_}-$ARCH-${BUILD}${TAG}.txz

# Cleanup
[ "$NOCLEANUP" = "0" ] && {
  rm -rf $PKG $TMP/$PKGNAME-$VERSION
}
