#!/bin/bash

# Slackware build script for ufoai

# Written by Joze Zobec <email removed>
# Now maintained by B. Watson <urchlay@slackware.uk>

# 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.

# 20220430 bkw: BUILD=4: strip game.so.

# 20211017 bkw: BUILD=3
# - fix build on -current again:
# -   disable building with BFD.
# -   -std=c++11
# - new-style icons.
# - make .desktop files validate.
# - get rid of useless 'memory' binary.
# - document missing optional dep, gtkglext.
# - patches from Debian that (hopefully) prevent segfaults.
# - make the game default to running in a window, as there are
#   issues with fullscreen on -current with (at least) intel video.
# - disable uforadiant by default, it segfaults on startup and
#   I haven't figured out why yet.
# - slack-desc reflects builds options (sdl 1/2, uforadiant).

# 20170706 bkw: fix build on -current

# 20151126 bkw:
# - fix build on systems that have SDL2 but not SDL2_ttf
# - add SDL2 environment variable
# - move binaries to /usr/games

# 20140826 bkw:
# - took over maintenance
# - update for 2.5
# - get rid of --enable-profiling, all it seems to do is leave a
#   gmon.out file in the dir where the game was run
# - allow disabling sse with environment variable
# - allow building the radiant editor. I have no idea if it's working
#   correctly, since I have no idea how to use it.

cd $(dirname $0) ; CWD=$(pwd)

PRGNAM=ufoai
VERSION=${VERSION:-2.5}
BUILD=${BUILD:-4}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
  exit 0
fi

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

# If gtksourceview and gtkglext are installed and RADIANT=yes, build
# the uforadiant editor.
radiant="--disable-uforadiant"

[ "${RADIANT:-no}" = "yes" ] && \
  pkg-config --exists gtksourceview-2.0 && \
  pkg-config --exists gtkglext-1.0 && \
    radiant="--enable-uforadiant"

if [ "${SSE:-yes}" = "no" ]; then
  sseopt="--disable-sse"
else
  sseopt="--enable-sse"
fi

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION-source.tar.bz2
mv $PRGNAM-$VERSION-source $PRGNAM-$VERSION
cd $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION-data.tar
chown -R root:root .
find -L .  -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
        \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+

# 20170706 bkw: fix build with gcc7
echo 'CXXFLAGS += -Wno-narrowing' >> build/flags.mk

# 20211017 bkw: apply patches from Debian's build 6.
for i in $( cat $CWD/patches/series ); do
  patch -p1 < $CWD/patches/$i
done

# 20211017 bkw: change the default from fullscreen to windowed. This
# is helpful because on my hardware, at least, the game crashes when
# it tries to to fullscreen... and takes the whole X server with it.
# This is just the default; users can switch to fullscreen from
# within the game if they want.
sed -i '/"vid_fullscreen"/s,"1","0",' src/client/cl_video.cpp

# 20211017 bkw: bfd gratuitous API changes. This disables bfd, which
# means the game can't print a backtrace if it crashes. Since we
# install the binaries stripped, the backtrace wouldn't have been
# all that useful anyway.
sed -i '/check_header.*bfd\.h/d' configure

# 20211017 bkw: it ignores environment CXXFLAGS, and we need this, so:
echo 'CXXFLAGS += -std=c++11' >> build/flags.mk

# 20211017 bkw: leave this here, but default to yes.
[ "${SDL2:-yes}" = "no" ] && EXTRAOPT="--disable-sdl2"

CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
   --prefix=/usr \
   --libdir=/usr/lib$LIBDIRSUFFIX \
   --datadir=/usr/share/games/$PRGNAM \
   --enable-release \
   $sseopt \
   --disable-memory \
   --disable-testall \
   --enable-ufo \
   --enable-ufoded \
   --enable-ufoslicer \
   $EXTRAOPT \
   $radiant

# Normally it's "make V=1" for verbose build, but here it's different.
make Q=''
make lang

# We get "make: nothing to be done for..." for these 2.
# make maps
# make pk3

# Manual install: first the data...
mkdir -p $PKG/usr/share/games/$PRGNAM $PKG/usr/games
strip base/game.so
cp -a base $PKG/usr/share/games/$PRGNAM/

# ...then the binaries
if [ -x radiant/uforadiant ]; then
  cp -a radiant $PKG/usr/share/games/$PRGNAM/
  rm -f $PKG/usr/share/games/$PRGNAM/radiant/uforadiant
  BINARIES="radiant/uforadiant"
fi

BINARIES="$BINARIES ufo ufoded ufo2map ufomodel ufoslicer"
install -s -m0755 $BINARIES $PKG/usr/games/

# 20211017 bkw: make the .desktop files validate
sed -i -e 's,Application;,,' \
       -e '/^Encoding/d' \
       -e '/^Icon/s,\.xpm,,' \
       debian/*.desktop
sed -i '/^StartupNotify=false/d' debian/uforadiant.desktop

# .desktop files, old-style icons
mkdir -p $PKG/usr/share/applications $PKG/usr/share/pixmaps $PKG/usr/man/man6
install -m 0644 debian/*.desktop $PKG/usr/share/applications/
install -m 0644 debian/*.xpm $PKG/usr/share/pixmaps/

# man pages taken from more recent debian (ufoai_2.5-6.debian.tar.xz) and
# modified for this SlackBuild. For one thing, I made them all section 6.
install -m 0644 $CWD/man/*.6 $PKG/usr/man/man6/
gzip $PKG/usr/man/man6/*.6
ln -s ufo.6.gz $PKG/usr/man/man6/$PRGNAM.6.gz

# new-style icons, created by mkicons.sh, q.v.
for i in $CWD/icons/*; do
  app="$( basename $i )"
  if [ -e $PKG/usr/games/$app ]; then
    for png in $CWD/icons/$app/*.png; do
      px="$( basename "$png" .png )"
      size=${px}x${px}
      dir=$PKG/usr/share/icons/hicolor/$size/apps
      mkdir -p $dir
      cat $png > $dir/$app.png
    done
  fi
done

# Get rid of uforadiant stuff if we don't have uforadiant
if [ -x radiant/uforadiant ]; then
  INCLUDES="includes"
  # This looks like it doesn't belong
  rm -f $PKG/usr/share/games/$PRGNAM/radiant/prefabs/pipes.map
else
  INCLUDES="does NOT include"
  rm $PKG/usr/share/applications/uforadiant.desktop \
     $PKG/usr/man/man6/uforadiant.6.gz \
     $PKG/usr/share/pixmaps/uforadiant.xpm
fi

SDLVER="1.2"
ldd $PKG/usr/games/ufo | grep -q SDL2 && SDLVER="2.0"

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a LICENSES README COPYING $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

mkdir -p $PKG/install
sed -e "s,@INCLUDES@,$INCLUDES," \
    -e "s,@SDLVER@,$SDLVER," \
    $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE