#!/bin/bash
## Version: 1.6 GSB Package SlackBuild - Do not remove this line!
## Copyright (c) 2007, 2008:
##   Darren 'Tadgy' Austin <darren (at) gnomeslackbuild.org>, Coventry, UK.
##   Steve Kennedy <steve (at) gnomeslackbuild.org>, Exeter, UK.
## Licenced under the terms of the GNU General Public Licence version 3.
##
## Some portions are Copyright 2006, 2008  Patrick J. Volkerding, Sebeka, MN, USA
## All rights reserved.


## Package variables.
BUILD=7gsb
VERSION=4.37

## List any packages here that are required to build this package.
## The list is space seperated and case sensitive.
REQUIRED_PACKAGES="alsa-lib dbus glib2 gstreamer gst-plugins-base libsndfile cups"

## Build variables.
ARCH=${ARCH:-i586}
TUNE=${TUNE:-i586}
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
  }

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

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

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

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

## Decompress archive.
cd $TMP &&
rm -rf $PKGNAME-$VERSION &&
tar xzf $CWD/$PKGNAME-$VERSION.tar.gz &&
cd $PKGNAME-$VERSION || exit 1

# Apply ARCH specific patches.
if [ "$ARCH" = "i386" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$ARCH" = "i486" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$ARCH" = "i586" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$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

zcat ${CWD}/patches/bluez-utils-oui-usage.patch.gz | patch -p0 -E || exit 1
zcat ${CWD}/patches/bluez-try-utf8-harder.patch.gz | patch -p1 -E || exit 1
# http://thread.gmane.org/gmane.linux.bluez.kernel/1754
zcat ${CWD}/patches/bluez-activate-wacom-mode2.patch.gz | patch -p1 -E || exit 1

## Fix permissions for building.
chown -R root.root .
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 {} \;

## Configure, Tuning, GCC and Make options.
CONFIGURE_FLAGS=${GSB_CONFIGURE_FLAGS:-""}
if [ "$ARCH" = "i386" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH -mtune=$TUNE"}
elif [ "$ARCH" = "i486" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH -mtune=$TUNE"}
elif [ "$ARCH" = "i586" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O3 -march=$ARCH -mtune=$TUNE -pipe -fomit-frame-pointer"}
elif [ "$ARCH" = "i686" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O3 -march=$ARCH -mtune=$TUNE -pipe -fomit-frame-pointer"}
elif [ "$ARCH" = "x86_64" ]; then
  if [ "$TUNE" = "k8" -o "$TUNE" = "opteron" -o "$TUNE" = "athlon64" -o "$TUNE" = "athlon-fx" ]; then
    TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O3 -march=$TUNE -mtune=$TUNE -pipe -fomit-frame-pointer -fPIC"}
  else
    TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O3 -march=k8 -mtune=k8 -pipe -fomit-frame-pointer -fPIC"}
  fi
  [ -z "$CONFIGURE_FLAGS" ] && {
    CONFIGURE_FLAGS="--libdir=/usr/lib64"
  }
elif [ "$ARCH" = "powerpc" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH"}
else
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2"}
fi
EXTRA_CFLAGS=${GSB_EXTRA_CFLAGS:-""}
MAKE_FLAGS=${GSB_MAKE_FLAGS:-""}

CFLAGS="$TUNE_CFLAGS $EXTRA_CFLAGS" CXXFLAGS="$TUNE_CFLAGS $EXTRA_CFLAGS" \
  ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
  --mandir=/usr/man $CONFIGURE_FLAGS --target=$ARCH-$DISTRO-linux \
  --enable-shared \
  --disable-static \
  --enable-gstreamer \
  --enable-alsa \
  --enable-usb \
  --enable-netlink \
  --enable-tools \
  --enable-bccmd \
  --enable-hid2hci \
  --enable-dfutool \
  --enable-hidd \
  --enable-pand \
  --enable-dund \
  --enable-cups \
  --enable-manpages \
  --enable-configfiles \
  --enable-initscripts \
  --enable-pcmciarules \
  || exit 1

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

mkdir -p $PKG/lib/udev/rules.d
cat scripts/bluetooth.rules > $PKG/lib/udev/rules.d/60-bluetooth.rules
rm -fr $PKG/etc/udev
mkdir -p $PKG/lib/udev &&
mv $PKG/usr/libexec/udev/bluetooth_serial $PKG/lib/udev ;
rm -fr $PKG/usr/libexec ;

## Users now can add themselves to the "netdev" group to use bluetooth.
sed -i "s/at_console=\"true\"/group=\"netdev\"/g" $PKG/etc/dbus-1/system.d/bluetooth.conf

## compatibility for previous bluez-libs 3 package
if [ "$ARCH" = "x86_64" ]; then
  ( cd $PKG/usr/lib64 ; ln -s libbluetooth.so libbluetooth.so.2 ) ;
else
  ( cd $PKG/usr/lib ; ln -s libbluetooth.so libbluetooth.so.2 ) ;
fi

# Move/rename/patch init script:
mv $PKG/etc/init.d $PKG/etc/rc.d
mv $PKG/etc/rc.d/bluetooth $PKG/etc/rc.d/rc.bluetooth
# Replace with our own Slackware version
cp $CWD/rc.bluetooth $PKG/etc/rc.d/rc.bluetooth

# Edit "default" configuration script:
sed -i "s:\(HIDD_ENABLE=\).*:\1false:" $PKG/etc/default/bluetooth || exit 1
sed -i "s:\(HID2HCI_ENABLE=\).*:\1false:" $PKG/etc/default/bluetooth || exit 1

# Install other configuration files:
mkdir -p $PKG/etc/bluetooth
cp -a audio/audio.conf $PKG/etc/bluetooth
cp -a input/input.conf $PKG/etc/bluetooth
cp -a network/network.conf $PKG/etc/bluetooth
cp -a rfcomm/rfcomm.conf $PKG/etc/bluetooth
chmod 644 $PKG/etc/bluetooth/*.conf

# Install Debian's add-passkey program:
if [ "$ARCH" = "x86_64" ]; then
  DEBDEST=/usr/lib64/bluetooth
else
  DEBDEST=/usr/lib/bluetooth
fi
gcc $(pkg-config --libs --cflags dbus-1) -DDBUS_API_SUBJECT_TO_CHANGE \
        $CWD/add-passkey.c -o $PKG/$DEBDEST/add-passkey || exit 1
cp $CWD/register-passkeys $PKG/$DEBDEST
chmod a+x $PKG/$DEBDEST/*

# Default PIN (using "1234" seems insecure, so let's use an empty file instead):
mkdir -p $PKG/etc/bluetooth/passkeys
chmod 700 $PKG/etc/bluetooth/passkeys
#echo "1234" > $PKG/etc/bluetooth/passkeys/default
touch $PKG/etc/bluetooth/passkeys/default

# Do not overwrite configuration
( cd $PKG
  for file in \
    etc/bluetooth/audio.conf \
    etc/bluetooth/input.conf \
    etc/bluetooth/main.conf \
    etc/bluetooth/network.conf \
    etc/bluetooth/rfcomm.conf \
    etc/bluetooth/passkeys/default \
    etc/rc.d/rc.bluetooth \
    etc/default/bluetooth ; do
      mv ${file} ${file}.new
  done
)

## 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/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 \
  AUTHORS COPYING* ChangeLog NEWS README \
  $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.tgz

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