#!/bin/bash
ulimit -s unlimited
shopt -s extglob

# tigervnc.SlackBuild
# Heavily based on the original Slackware build scripts,
# Modified by Stuart Winter for Slackware ARM.
#
# Copyright 2010, 2011, 2012, 2013, 2014, 2015  Eric Hameleers, Eindhoven. NL
# Copyright 2015, 2016, 2020, 2021  Patrick J. Volkerding, Sebeka, MN, USA
# All rights reserved.
#
# 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.

# Record toolchain & other info for the build log:
slackbuildinfo

# Paths to skeleton port's source & real Slackware source tree:
slackset_var_cwds

# Temporary build locations:
export TMPBUILD=$TMP/build-$PKGNAM
export PKG=$TMP/package-$PKGNAM
mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD

# Add -fPIC to CFLAGS:
case $ARCH in
   arm|aarch64) export SLKCFLAGS+=" -fPIC"
                export LIBDIRSUFFIX="" ;;
   *)           export SLKCFLAGS="-O2" ;;
esac

case "$ARCH" in
    arm*) TARGET=${SLK_ARCH_HOST} ;;
    *)    TARGET=${SLK_ARCH_HOST} ;;
esac

# To save on maintenance, and since we carry the same versions as x86 Slackware,
# let's pull the version numbers from the x86 trunk:
pushd $CWD
XSB=$CWD/$PKGNAM.SlackBuild
[ ! -x $XSB ] && { echo "ERROR: Cannot find x86 SlackBuild for ${PKGNAM}!" ; exit 1; }
for upstreamvar in \
  XORGVER \
  JAVA_APPLET \
  ; do
  eval $( grep -E "^${upstreamvar}=" $XSB  )
  echo "Upstream variable: ${upstreamvar} version $( eval $( echo "echo \$${upstreamvar}" ) )"
done
popd

# Create some build framework:
mkdir -p $TMPBUILD/deps/usr

# Extract source:
tar xvvf $CWD/$PKGNAM-$VERSION.tar.!(*sign|*asc|*sig)
cd $PKGNAM-$VERSION || failextract
# Extract the X server sources:
tar xvf $CWD/xorg-server-$XORGVER.tar.?z --strip-components=1 -C unix/xserver || exit 1
# Patch the X server sources:
( cd unix/xserver
  zcat $CWD/patches/xserver21.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/0001-xfree86-use-modesetting-driver-by-default-on-GeForce.patch.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/06_use-intel-only-on-pre-gen4.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/fix-nouveau-segfault.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/x11.startwithblackscreen.diff.gz | patch -p1 --verbose || exit 1
  zcat $CWD/patches/xorg-server/xorg-server.combo.mouse.keyboard.layout.patch.gz | patch -p1 --verbose || exit 1
  autoreconf -vif || exit 1
) || failpatch

# HACK! Force protocol 3.3 for UVNCSC
zcat $CWD/patches/force_protocol_3.3_for_UVNCSC.patch.gz | patch -p1 || exit 1

# Fix pam.d file:
zcat $CWD/patches/tigervnc.pam.d.diff.gz | patch -p1 --verbose || exit 1

if [ "$JAVA_APPLET" = "ON" ]; then
  # Explicitly put the java applet into a directory named 'tigervnc':
  sed -i -e 's#/vnc/class#/tigervnc/class#'g $(grep -rl vnc/class .)
  sed -i -e 's#DESTINATION vnc/class#DESTINATION share/tigervnc/class#'g $(grep -rl vnc/class .)
fi

slackhousekeeping

# GCC 14 "fix":
SLKCFLAGS+=" -Wno-error=declaration-missing-parameter-type"

echo "*** Building ****"
# Configure:
cmake \
   -G "Unix Makefiles" \
   -Wno-dev \
   -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
   -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
   -DCMAKE_INSTALL_PREFIX=/usr \
   -DSYSCONF_INSTALL_DIR=/etc \
   -DLIB_SUFFIX=${LIBDIRSUFFIX} \
   -DENABLE_PAM:BOOL=ON \
   -DINSTALL_SYSTEMD_UNITS=OFF \
   -DBUILD_JAVA:BOOL=${JAVA_APPLET} \
   . || failconfig

# Build:
make V=1 $NUMJOBS || failmake

# Install into package:
make DESTDIR=$PKG install || failinstall

# Build and install the VNC server:
echo "*** Building VNC server ****"
( cd unix/xserver
  # Default font paths to be used by the X server
  DEF_FONTPATH="/usr/share/fonts/local,/usr/share/fonts/TTF,/usr/share/fonts/OTF,/usr/share/fonts/Type1,/usr/share/fonts/misc,/usr/share/fonts/CID,/usr/share/fonts/75dpi/:unscaled,/usr/share/fonts/100dpi/:unscaled,/usr/share/fonts/75dpi,/usr/share/fonts/100dpi,/usr/share/fonts/cyrillic"
  CFLAGS="$SLKCFLAGS" \
  CXXFLAGS="$SLKCFLAGS" \
  ./configure \
    --prefix=/usr \
    --libdir=/usr/lib${LIBDIRSUFFIX} \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --disable-dri --enable-dri2 --disable-dri3 \
    --disable-static \
    --disable-xorg --disable-xnest --disable-xvfb --disable-dmx \
    --disable-xwin --disable-xephyr --disable-kdrive --disable-xwayland \
    --enable-composite \
    --enable-glx --enable-glx-tls \
    --enable-install-libxf86config \
    --enable-xcsecurity \
    --enable-xinerama \
    --with-int10=x86emu \
    --with-default-font-path="${DEF_FONTPATH}" \
    --with-dri-driver-path=/usr/lib${LIBDIRSUFFIX}/xorg/modules/dri \
    --with-module-dir=/usr/lib${LIBDIRSUFFIX}/xorg/modules \
    --with-pic \
    --with-xkb-path=/etc/X11/xkb \
    --with-xkb-output=/var/lib/xkb \
    --disable-config-dbus \
    --disable-config-hal \
    --disable-config-udev \
    --disable-docs --disable-devel-docs \
    --disable-selective-werror \
    --disable-unit-tests \
    --without-dtrace \
    --with-os-name="$(head -1 /etc/slackware-version)" \
    --with-os-vendor="Slackware Linux Project" \
    --with-builderstring="Built by Slackware for xorg-server-$XORGVER" \
    --build=$TARGET || failconfig

  # Build:
  make V=1 TIGERVNC_SRCDIR="$TMPBUILD/${PKGNAM}-${VERSION}/" $NUMJOBS || make V=1 TIGERVNC_SRCDIR="$TMPBUILD/${PKGNAM}-${VERSION}/" || failmake
  # Install into package:
  make TIGERVNC_SRCDIR="$TMPBUILD/${PKGNAM}-${VERSION}/" -C hw/vnc DESTDIR=$PKG install || failinstall
) || failmake

# Relocate the man pages:
mv -fv $PKG/usr/share/man $PKG/usr

# Remove installed docs (we'll install them later):
rm -r $PKG/usr/share/doc

# Provide a sample configuration for the libvnc.so extension of X.Org,
# documentation is available inside the file:
mkdir -p $PKG/etc/X11/xorg.conf.d
install -m644 $CWD/10-libvnc.conf $PKG/etc/X11/xorg.conf.d/10-libvnc.conf.new

# Protect these config files as .new:
mv -fv $PKG/etc/tigervnc/vncserver-config-defaults $PKG/etc/tigervnc/vncserver-config-defaults.new
mv -fv $PKG/etc/tigervnc/vncserver-config-mandatory $PKG/etc/tigervnc/vncserver-config-mandatory.new
mv -fv $PKG/etc/tigervnc/vncserver.users $PKG/etc/tigervnc/vncserver.users.new

# Install icons:
mkdir -p $PKG/usr/share/icons/hicolor/{16x16,24x24,32x32,48x48}/apps
for PSIZE in 16 24 32 48; do
  install -m644 media/icons/tigervnc_${PSIZE}.png \
    $PKG/usr/share/icons/hicolor/${PSIZE}x${PSIZE}/apps/tigervnc.png
done

# Check some additional locations for a suitable startup script, in this order:
# 1. $HOME/.vnc/xstartup
# 2. $HOME/.xinitrc
# 3. /etc/X11/xinit/xinitrc
( cd $PKG/usr/libexec
  zcat $CWD/patches/vncserver.xinitrc.diff.gz | patch -p1 --verbose || exit 1
  rm -f vncserver.orig ) || exit 1

# Make a symlink for vncserver in the old location:
if [ ! -r $PKG/usr/bin/vncserver ]; then
  ( cd $PKG/usr/bin ; ln -sf ../libexec/vncserver . )
fi

# Add a documentation directory:
mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION
cp -fav \
  BUILDING* LICENCE* README* doc/* \
  $PKG/usr/doc/${PKGNAM}-$VERSION
cp -fav \
  unix/xserver/COPYING \
  $PKG/usr/doc/${PKGNAM}-$VERSION/COPYING.xorg-server

# Apply generic Slackware packaging policies:
cd $PKG
slackstripall   # strip all .a archives and all ELFs
#slackstriprpaths     # strip rpaths
slack_delete_lafiles # delete usr/lib{,64}/*.la
slackgzpages -i # compress man & info pages and delete usr/info/dir
slackslack      # chown -R root:root, chmod -R og-w, slackchown, slack644docs
slackdesc       # install slack-desc and doinst.sh
slackmp         # run makepkg -l y -c n

# Perform any final checks on the package:
cd $PKG
slackhlinks     # search for any hard links
