#!/bin/bash
shopt -s extglob
set +o posix
ulimit -s unlimited

# mozilla-thunderbird.SlackBuild
# by Stuart Winter <mozes@slackware.com>
# 26-Apr-2005
#
# Copyright 2008-2021  Patrick J. Volkerding, Sebeka, Minnesota, 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

RELEASEVER=$(echo $VERSION | cut -f 1 -d e | cut -f 1 -d b)
echo "Release version: $RELEASEVER"

# 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

# If there is a private Google API key available at compile time, use
# it to enable support for Google Safe Browsing. For Slackware builds,
# we use a private key issued for the Slackware project. If you are
# rebuilding and need this support, or you are producing your own
# distribution, you may obtain your own Google API key at no charge by
# following these instructions:
# https://bugzilla.mozilla.org/show_bug.cgi?id=1377987#c0
if [ -f "$PORTCWD/.GoogleSafeBrowsingAPI_Key" ]; then
   GOOGLE_API_KEY="--with-google-safebrowsing-api-keyfile=$PORTCWD/.GoogleSafeBrowsingAPI_Key"
fi

# Figure out if this is a beta, or a release:
MOZLOCALIZE=${MOZLOCALIZE:-}

# Without LANG=C, building the Python environment may fail with:
# "UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 36: ordinal not in range(128)"
LANG=C

# Add a shell script to start the thunderbird binary with MOZ_ALLOW_DOWNGRADE=1
# to avoid backing up (and disabling) the user profile if a browser downgrade
# is detected. If you want to build with the stock default behavior, set
# this to something other than "YES":
MOZ_ALLOW_DOWNGRADE=${MOZ_ALLOW_DOWNGRADE:-YES}

# Tune down numjobs to avoid build system overload:
#export NUMJOBS="-j$(( $(nproc) -1 ))"
# TB fails with >1 parallel job:
export NUMJOBS="-j1"


# Much builds with distcc but it fails eventually, so we'll retry without it.
# There's some code to rm /tmp/DISTCC if the variable ! null, but any errors
# won't be trapped, so /tmp/DISTCC will no longer invoke distcc.
# I need to fix this bug using trap to a cleanup function.
function disable_distcc() {
  if [ -d /tmp/DISTCC ]; then
      DISTCCDISABLED=yes
      export PATH=$( echo $PATH | sed -e 's?/tmp/DISTCC:??g' )
      unset NUMJOBS
      # And since some paths get harded coded from configuration time, point them back
      # to local:
      pushd /tmp/DISTCC
      find . -name '*g++' | while read line ; do ln -vfs /usr/bin/g++ ${line} ; done
      find . -name '*c++' | while read line ; do ln -vfs /usr/bin/g++ ${line} ; done
      find . -name '*cc' | while read line ; do ln -vfs /usr/bin/gcc ${line} ; done
      find . -name '*gcc' | while read line ; do ln -vfs /usr/bin/gcc ${line} ; done
      popd
      echo "*** WARNING: distcc is now disabled"
  fi
}
function distcc_cleanup() {
# Remove distcc if we had to disable it:
  if [ ! -z "$DISTCCDISABLED" ]; then
     rm -rfv /tmp/DISTCC
  fi
}

##### Build time deps ###########################
##### This is copied from mozilla-firefox.SlackBuild
##### Nasty.  One step closer to packaging this in /extra

# Note this is going into (on the Slackware ARM build machines at least) /root/tmp so it'll
# be outside of the Mozilla temp build dir.
mkdir -vpm755 $TMP/mozilla-firefox-build-deps/usr/bin
export PATH=$TMP/mozilla-firefox-build-deps/usr/bin:$HOME/.cargo/bin:$PATH
# Do we need to install "cbindgen" ?
cargo install --list | grep -qi cbindgen
if [ $? -eq 1 ]; then
   echo "Building cbindgen"
   ( unset VERSION
     # This is contained within Slackware64 (our upstream source)'s Firefox package
     # I know, this is nasty, hacky.
     cd $CWD/../mozilla-firefox/build-deps/cbindgen || exit 1
     ./cbindgen.build ) || exit 1
 else
   echo "*** cbindgen is already installed - not building"
fi

# Build node.js.
# We'll modify the upstream Slackware build script to save maintaining our own:
# grr.  This is now entirely stupid because it's a small script.  I'll put this into its own package
# in /extra after this.
# This installs into a temporary dir, so we need to rebuild it every time.
# Use the Slackware ARM temporary location:
if [ ! -x $TMP/mozilla-firefox-build-deps/usr/bin/node ]; then
   cp -fa $CWD/../mozilla-firefox/build-deps/nodejs/ $TMPBUILD/
   sed -i 's?/tmp?'"$TMP"'?g'  $TMPBUILD/nodejs/nodejs.build
   # Install not to $PKG (then delete later), but into a temp folder outside of
   # Firefox, so we can use it for subsequent builds of FF.
   sed -i 's?$PKG?'"$TMP"/mozilla-firefox-build-deps/'?g' $TMPBUILD/nodejs/nodejs.build
   sed -i 's?=$TMP/mozilla-firefox-build-deps/usr?=/usr?g' $TMPBUILD/nodejs/nodejs.build
   # Adjust to ARM and aarch64 so that the libdir is set correctly:
   sed -i 's?armv7hl?arm?g'  $TMPBUILD/nodejs/nodejs.build
   sed -i 's?x86_64?aarch64?g'  $TMPBUILD/nodejs/nodejs.build
   # ARM uses -O2 by default:
   sed -i 's?-O3?-O2?g' $TMPBUILD/nodejs/nodejs.build
   sed -i 's?\$VERSION?*?g' $TMPBUILD/nodejs/nodejs.build
   ( unset VERSION
     cd $TMPBUILD/nodejs
     ./nodejs.build || exit 1) || exit 1
 else
   echo "*** nodejs already installed - not building"
fi

################################################################################################
# Extract source and apply patch set
################################################################################################

echo "[**] Extracting source [**]"
tar xf $CWD/thunderbird-*source.tar.!(*sign|*asc|*sig)
#tar xf $PORTCWD/sources/thunderbird-*source.tar.!(*sign|*asc|*sig)
#tar xf $PORTCWD/sources/thunderbird-*source.tar.!(*sign|*asc|*sig)
cd thunderbird*/ || exit 1
slackhousekeeping

# Refresh libtool to support latest architectures:
slackupdatelibtool

# Delete object directory if it was mistakenly included in the tarball:
rm -rf obj-x86_64-pc-linux-gnu

# Apply patches from Slackware x86:
#
# Retain GTK+ v2 scrolling behavior:
zcat $CWD/tb.ui.scrollToClick.diff.gz | patch -p1 --verbose || exit 1

# Bypass a test that fails the build:
zcat $CWD/gkrust.a.no.networking.check.diff.gz | patch -p1 --verbose || exit 1

# Fix build with wayland >= 1.20.0:
zcat $CWD/d30c921928a12fccd5085888011f899ff1c788cd.patch | patch -p1 --verbose || exit 1

# Apply patches for Slackware ARM:

ln -vfs comm mozilla-release # just a hack to avoid editing the patches
ln -vfs comm mozilla # just a hack to avoid editing the patches
#
# Apply patches:
#for pf in \
#    \
#   mozilla-build-arm.patch.xz  \
#   mozilla-1245783.patch.xz  \
#   mozilla-1512162.patch.xz  \
#   mozilla-526293.patch.xz  \
#   mozilla-1170092.patch.xz  \
#    \
# ; do
#    # Some patches only apply when pwd is "mozilla", so re-try once:
#     auto_apply_patch $PORTCWD/sources/fedorapatches/${pf} || ( cd mozilla ; auto_apply_patch $PORTCWD/sources/fedorapatches/$pf || exit 1 ) || exit 1
#done

################################################################################################
# Determine configuration options & toolchain settings
################################################################################################

# Put Rust objects on a diet to keep the linker from running into memory
# issues (especially on 32-bit):
export RUSTFLAGS="-Cdebuginfo=0 -Copt-level=0"

# Determine the CFLAGS for the known architectures:
case $ARCH in
   arm|aarch64) 
                #SLKCFLAGS="-g0 --param ggc-min-expand=10 ${SLKCFLAGS/-O2/-O} -fstack-protector-strong -Wformat -Wformat-security -fno-schedule-insns2 -fno-lifetime-dse -fno-delete-null-pointer-checks -fno-schedule-insns"
                SLKCFLAGS="-g0 ${SLKCFLAGS/-O2/-O} -fstack-clash-protection -fpermissive -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -mbranch-protection=standard"
                SLKCXXFLAGS="$SLKCFLAGS"
                SLKCPPFLAGS="$SLKCXXFLAGS"
                # Linker flags for ld.bfd
                #SLKLDFLAGS="-Wl,-z,relro -Wl,--as-needed -Wl,--compress-debug-sections=zlib -Wl,--reduce-memory-overheads -Wl,--no-keep-memory -Wl,--stats"
                SLKLDFLAGS="-Wl,--no-keep-memory -Wl,--reduce-memory-overheads"
                # Linker flags for ld.gold
                #SLKLDFLAGS="-Wl,--no-keep-memory -Wl,--no-keep-files-mapped -Wl,--no-map-whole-files -Wl,--no-mmap-output-file -Wl,--stats"
                # For aarch64, add --disable-ion ??
                export SLKCONFARGS="$SLKCONFARGS \
                                    \
                                     --disable-crashreporter \
                                     --disable-necko-wifi \
                                     --disable-jemalloc \
                                     --disable-jit \
                                     --disable-webrtc \
                                     \
                                     --enable-system-ffi \
                                     --with-system-jpeg \
                                     --without-system-libvpx \
                                     --with-system-libevent" ;;
   *)    export SLKCFLAGS="-O" ;;
esac

# Use gcc rather than clang:
export CC="gcc"
export CXX="g++"
export AR="gcc-ar"
export NM="gcc-nm"
export RANLIB="gcc-ranlib"

# Set linker to use:
LINKER=bfd

# Standard set of configure options from Slackware x86 upstream:
OPTIONS=" $SLKCONFARGS \
   --enable-official-branding \
   --prefix=/usr \
   --libdir=/usr/lib${LIBDIRSUFFIX} \
   --with-system-zlib \
   --with-system-nss \
   --with-system-nspr \
   --enable-linker=$LINKER \
   --enable-application=comm/mail \
   --enable-default-toolkit=cairo-gtk3-wayland \
   $GOOGLE_API_KEY \
   --disable-debug \
   --disable-strip \
   --disable-install-strip \
   --without-system-icu \
   --enable-cpp-rtti \
   --enable-optimize \
   --enable-accessibility \
   --enable-alsa \
   --disable-debug-symbols \
   --disable-updater \
   --disable-tests"

if [ ! -z $MOZLOCALIZE ]; then
  OPTIONS=$OPTIONS" \
  --enable-ui-locale=$MOZLOCALIZE
  --with-l10n-base=.."
  # There are no dictionaries in localized builds
  sed -i \
    -e "/@BINPATH@\/dictionaries\/\*/d" \
    -e "/@RESPATH@\/dictionaries\/\*/d" \
    mail/installer/package-manifest.in || exit 1
fi

################################################################################################
# Configure thunderbird
################################################################################################

echo "[**] Building thunderbird [**]"
#find . -name configure.in | while read line ; do touch ${line%.*}; done
#find . -name configure.in | while read line ; do touch ${line%%configure.in}/config.status; done
# Disable debuginfo being compiled in. Helps reduce RAM use at build time.
export MOZ_DEBUG_FLAGS="-g0"
export MACH_USE_SYSTEM_PYTHON="1"
export BUILD_OFFICIAL=1
export MOZILLA_OFFICIAL=1
export MOZ_SMP_FLAGS="$NUMJOBS"
export MOZ_MAKE_FLAGS="$MOZ_SMP_FLAGS"
export CFLAGS="$SLKCFLAGS"
export CXXFLAGS="$SLKCXXFLAGS"
export MOZ_OPT_FLAGS="$SLKCFLAGS"
export MOZ_LINK_FLAGS="$SLKLDFLAGS"
export LDFLAGS="$SLKLDFLAGS"
export MOZ_LINK_FLAGS="$SLKLDFLAGS"
# Set the following variable to empty. =0 does not work.
export MOZ_REQUIRE_SIGNING=
export MOZBUILD_STATE_PATH="$TMPBUILD/thunderbird-$RELEASEVER/.mozbuild"

# Clear some variables that could break the build
unset DBUS_SESSION_BUS_ADDRESS ORBIT_SOCKETDIR SESSION_MANAGER \
  XDG_SESSION_COOKIE XAUTHORITY MAKEFLAGS

# Assemble our .mozconfig:
echo > .mozconfig

# Tell .mozconfig about the selected compiler:
#echo "ac_add_options CC=\"${CC}\"" >> .mozconfig
#echo "ac_add_options CXX=\"${CXX}\"" >> .mozconfig

# Added for ARM (not sure if we need it though):
#echo "mk_add_options MOZ_CO_PROJECT=mail" >> .mozconfig

# Mozilla devs enforce using an objdir for building
# https://developer.mozilla.org/en/Configuring_Build_Options#Building_with_an_objdir
mkdir obj
echo "mk_add_options MOZ_OBJDIR=$(pwd)/obj" >> .mozconfig
# This directory is also needed or the build will fail:
mkdir -p mozilla/obj

# Write in it the options above
for option in $OPTIONS; do echo "ac_add_options $option" >> .mozconfig; done

################################################################################################
# Build thunderbird
################################################################################################
echo "@@@@@ Running 'mach build' @@@@@@"
./mach build -v || { disable_distcc ; ./mach build -v ;} || { distcc_cleanup ; exit 1 ;}
echo "@@@@@@ Running 'mach buildsymbols' @@@@@@"
./mach buildsymbols || { disable_distcc ; ./mach buildsymbols ;} || { distcc_cleanup ; exit 1 ;}

################################################################################################
# Install thunderbird in to package
################################################################################################
echo "**** Running DESTDIR=$PKG ./mach install ***"
echo "**** Disabling distcc for the package installation ***"
disable_distcc
DESTDIR=$PKG ./mach install || { distcc_cleanup ; exit 1 ;}

# We don't need these (just symlinks anyway):
rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-devel-$RELEASEVER

# Nor these:
rm -rf $PKG/usr/include

mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/mozilla/plugins
mkdir -p $PKG/usr/share/applications
cat $CWD/mozilla-thunderbird.desktop > $PKG/usr/share/applications/mozilla-thunderbird.desktop
mkdir -p $PKG/usr/share/pixmaps

# These files/directories are usually created if Thunderbird is run as root,
# which on many systems might (and possibly should) be never.  Therefore, if we
# don't see them we'll put stubs in place to prevent startup errors.
( cd $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$RELEASEVER
  if [ -d extensions/talkback\@mozilla.org ]; then
    if [ ! -r extensions/talkback\@mozilla.org/chrome.manifest ]; then
      echo > extensions/talkback\@mozilla.org/chrome.manifest
    fi
  fi
  if [ ! -d updates ]; then
    mkdir -p updates/0
  fi
)

# Need some default icons in the right place:
for i in 16 22 24 32 48 256; do
  install -m 0644 -D comm/mail/branding/thunderbird/default${i}.png \
           $PKG/usr/share/icons/hicolor/${i}x${i}/apps/thunderbird.png
done
mkdir -p $PKG/usr/share/pixmaps
( cd $PKG/usr/share/pixmaps ; ln -sf /usr/share/icons/hicolor/256x256/apps/thunderbird.png . )
mkdir -p $PKG/usr/lib$LIBDIRSUFFIX/thunderbird-$RELEASEVER/chrome/icons/default
install -m 644 other-licenses/branding/thunderbird/mailicon16.png \
  $PKG/usr/lib$LIBDIRSUFFIX/thunderbird-$RELEASEVER/icons/
install -m 644 other-licenses/branding/thunderbird/mailicon16.png \
  $PKG/usr/lib$LIBDIRSUFFIX/thunderbird-$RELEASEVER/chrome/icons/default/

# Copy over the LICENSE
install -p -c -m 644 LICENSE $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$RELEASEVER/

# If MOZ_ALLOW_DOWNGRADE=YES, replace the /usr/bin/thunderbird symlink with a
# shell script that sets the MOZ_ALLOW_DOWNGRADE=1 environment variable so
# that a detected downgrade does not reset the user profile:
if [ "$MOZ_ALLOW_DOWNGRADE" = "YES" ]; then
  rm -fv $PKG/usr/bin/thunderbird
  cat << EOF > $PKG/usr/bin/thunderbird
#!/bin/sh
#
# Shell script to start Mozilla Thunderbird.
#
# Don't reset the user profile on a detected downgrade:
export MOZ_ALLOW_DOWNGRADE=1

# Start Thunderbird:
exec /usr/lib${LIBDIRSUFFIX}/thunderbird/thunderbird "\$@"
EOF
  chown root:root $PKG/usr/bin/thunderbird
  chmod 755 $PKG/usr/bin/thunderbird
fi

# Fix duplicate binary, https://bugzilla.mozilla.org/show_bug.cgi?id=658850
( cd $PKG/usr/lib$LIBDIRSUFFIX/thunderbird
  if cmp thunderbird thunderbird-bin ; then
    ln -sf thunderbird-bin thunderbird
  fi )

################################################################################################
# Package thunderbird
################################################################################################

# 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

# Clean up the residue for this hack:
rm -rf /tmp/pkg-libvpx
