#!/bin/sh
# $Id: chromium_1337.SlackBuild,v 1.5 2014/10/11 17:54:06 root Exp root $
# Copyright 2013, 2014  Eric Hameleers, Eindhoven, NL
# All rights reserved.
#
#   Permission to use, copy, modify, and distribute this software for
#   any purpose with or without fee is hereby granted, provided that
#   the above copyright notice and this permission notice appear in all
#   copies.
#
#   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
#   CONTRIBUTORS 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.
#
# -----------------------------------------------------------------------------
#
# Slackware SlackBuild script 
# ===========================
# By:          Eric Hameleers <alien@slackware.com>
# For:         chromium
# Descr:       Open Source version of Chrome Web Browser
# URL:         http://www.chromium.org/
# Build needs: - multilib gcc & glibc for compiling the Native Client (64-bit);
#              - libelf with '-D_FILE_OFFSET_BITS=64' added to CFLAGS (32-bit);
#              - ninja.
#              - Internet access (for downloading the nacl/pnacl toolchain bins)
#              - On Slackware 13.37 additionally: mozilla-nss, python27.
# Needs:       
# Changelog:   
# 31.0.1650.57-1:
#              18/nov/2013 by Eric Hameleers <alien@slackware.com>
#              * Initial build.
# 31.0.1650.63-1:
#              18/Nov/2013 by Eric Hameleers <alien@slackware.com>
# 31.0.1650.67-1:
#              19/dec/2013 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 32.0.1700.77-1:
#              14/jan/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 32.0.1700.102-1:
#              29/jan/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 32.0.1700.107-1:
#              04/feb/2014 by Eric Hameleers <alien@slackware.com>
#              * Update.
# 33.0.1750.117-1:
#              21/feb/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 33.0.1750.146-1:
#              04/mar/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 33.0.1750.149-1:
#              11/mar/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 33.0.1750.152-1:
#              18/mar/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 34.0.1847.116-1:
#              09/apr/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 34.0.1847.132-1:
#              25/apr/2014 by Eric Hameleers <alien@slackware.com>
#              * Update.
# 34.0.1847.137-1:
#              14/may/2014 by Eric Hameleers <alien@slackware.com>
#              * Update.
# 35.0.1916.114-1:
#              20/may/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 35.0.1916.153-1:
#              16/jun/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with several security fixes.
# 37.0.2062.94-1:
#              05/sep/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with security fixes, New: an embedded PDF viewer.
# 38.0.2125.101-1:
#              11/oct/2014 by Eric Hameleers <alien@slackware.com>
#              * Update comes with security fixes.
# 
# Run 'sh chromium.SlackBuild' to build a Slackware package.
# The package (.txz) and .txt file as well as build logs are created in /tmp .
# Install it using 'installpkg'. 
#
# -----------------------------------------------------------------------------

PRGNAM=chromium
VERSION=${VERSION:-38.0.2125.101}
BUILD=${BUILD:-1}
NUMJOBS=${NUMJOBS:" -j4 "}
TAG=${TAG:-alien}

# You can build without NaCl (native client) if you set USE_NACL to "0",
# but you'll lose some Chrome functionality like using in-browser applications:
USE_NACL=${USE_NACL:-0}

DOCS="AUTHORS LICENSE README*"

# Where do we look for sources?
SRCDIR=$(cd $(dirname $0); pwd)

# Place to build (TMP) package (PKG) and output (OUTPUT) the program:
TMP=${TMP:-/tmp/build}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

# Visible directory listing of anything Chrome related is:
#   http://gsdview.appspot.com/
# Official location (non-browsable) of the above is:
#   https://commondatastorage.googleapis.com/

# This package is built with Alien's Google API keys for Chromium.
# The keys are contained in the file "chromium_apikeys".
# If you want to rebuild this package, you can use my API keys, however:
# you are not allowed to re-distribute these keys!!
# You can also obtain your own, see:
#   http://www.chromium.org/developers/how-tos/api-keys
# Or else you can simply compile without API keys. This will disable stuff like
# browser sync and other functionality which accesses Google APIs. 
# The following variables must be set:
#   _google_api_key
#   _google_default_client_id
#   _google_default_client_secret
if [ -f ${HOME}/.chromium_apikeys ]; then
  . ${HOME}/.chromium_apikeys
elif [ -f ${SRCDIR}/chromium_apikeys ]; then
  . ${SRCDIR}/chromium_apikeys
else
  _google_api_key=" "
  _google_default_client_id=" "
  _google_default_client_secret=" "
  cat <<EOT
No values were defined for the following variables:
   _google_api_key
   _google_default_client_id
   _google_default_client_secret
Please supply your own Google API keys for Chromium!
Press Ctrl-C to abort this script or wait 10 seconds to continue anyway.
EOT
sleep 10
fi

SOURCE[0]="$SRCDIR/${PRGNAM}-${VERSION}.tar.xz"
SRCURL[0]="https://commondatastorage.googleapis.com/${PRGNAM}-browser-official/${PRGNAM}-${VERSION}.tar.xz"

##
## --- with a little luck, you won't have to edit below this point --- ##
##

# Automatically determine the architecture we're building on:
MARCH=$( uname -m )
if [ -z "$ARCH" ]; then
  case "$MARCH" in
    i?86)    export ARCH=i486 ;;
    armv7hl) export ARCH=$MARCH ;;
    armv6hl) export ARCH=$MARCH ;;
    arm*)    export ARCH=arm ;;
    # Unless $ARCH is already set, use uname -m for all other archs:
    *)       export ARCH=$MARCH ;;
  esac
fi

case "$ARCH" in
  i486)      SLKCFLAGS="-O2 -march=i486 -mtune=i686"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             TARGETARCH="ia32"
             DSSE="1"
             ;;
  x86_64)    SLKCFLAGS="-O2 -fPIC"
             SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64"
             TARGETARCH="x64"
             #DSSE="0"
             DSSE="1"
             ;;
  armv7hl)   SLKCFLAGS="-O2 -march=armv7-a -mfpu=vfpv3-d16"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             TARGETARCH="arm"
             DSSE="1"
             ;;
  armv6hl)   SLKCFLAGS="-O2 -march=armv6 -mfpu=vfp -mfloat-abi=hard"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             TARGETARCH="arm"
             DSSE="1"
             ;;
  *)         SLKCFLAGS=${SLKCFLAGS:-"O2"}
             SLKLDFLAGS=${SLKLDFLAGS:-""}; LIBDIRSUFFIX=${LIBDIRSUFFIX:-""}
             TARGETARCH="ia32"
             DSSE="1"
             ;;
esac

case "$ARCH" in
    arm*)    TARGET=$ARCH-slackware-linux-gnueabi ;;
    *)       TARGET=$ARCH-slackware-linux ;;
esac

# Exit the script on errors:
set -e
trap 'echo "$0 FAILED at line ${LINENO}" | tee $OUTPUT/error-${PRGNAM}.log' ERR
# Catch unitialized variables:
set -u
P1=${1:-1}

# Save old umask and set to 0022:
_UMASK_=$(umask)
umask 0022

# Create working directories:
mkdir -p $OUTPUT          # place for the package to be saved
mkdir -p $TMP/tmp-$PRGNAM # location to build the source
mkdir -p $PKG             # place for the package to be built
rm -rf $PKG/*             # always erase old package's contents
rm -rf $TMP/tmp-$PRGNAM/* # remove the remnants of previous build
rm -rf $OUTPUT/{configure,make,install,error,makepkg,patch}-$PRGNAM.log
                          # remove old log files

# Source file availability:
for (( i = 0; i < ${#SOURCE[*]}; i++ )) ; do
  if ! [ -f ${SOURCE[$i]} ]; then
    echo "Source '$(basename ${SOURCE[$i]})' not available yet..."
    # Check if the $SRCDIR is writable at all - if not, download to $OUTPUT
    [ -w "$SRCDIR" ] || SOURCE[$i]="$OUTPUT/$(basename ${SOURCE[$i]})"
    if [ -f ${SOURCE[$i]} ]; then echo "Ah, found it!"; continue; fi
    if ! [ "x${SRCURL[$i]}" == "x" ]; then
      echo "Will download file to $(dirname $SOURCE[$i])"
      wget --no-check-certificate -nv -T 20 -O "${SOURCE[$i]}" "${SRCURL[$i]}" || true
      if [ $? -ne 0 -o ! -s "${SOURCE[$i]}" ]; then
        echo "Fail to download '$(basename ${SOURCE[$i]})'. Aborting the build."
        mv -f "${SOURCE[$i]}" "${SOURCE[$i]}".FAIL
        exit 1
      fi
    else
      echo "File '$(basename ${SOURCE[$i]})' not available. Aborting the build."
      exit 1
    fi
  fi
done

if [ "$P1" == "--download" ]; then
  echo "Download complete."
  exit 0
fi

# --- PACKAGE BUILDING ---

echo "++"
echo "|| $PRGNAM-$VERSION"
echo "++"

cd $TMP/tmp-$PRGNAM
echo "Extracting the source archive(s) for $PRGNAM..."
tar -xf ${SOURCE[0]}
cd ${PRGNAM}-${VERSION}

# Patches:
touch $OUTPUT/patch-${PRGNAM}.log
## Adapt for Slackware's libelf include file location:
#cat $SRCDIR/patches/chromium_libelf_includes.patch | patch -p0 --verbose \
#  2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log
# Prevent crashes when accessing google.com and youtube.com just because
# this is not an official build:
cat $SRCDIR/patches/chromium_secure_referrer.patch | patch -p1 --verbose \
  2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log
# Adapt for Slackware 13.37 older X.Org without multitouch:
cat $SRCDIR/patches/chromium_xi2_mt.patch | patch -p0 --verbose \
  2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log
# Adapt for Slackware 13.37 older glibc
cat $SRCDIR/patches/chromium_glibc213.patch | patch -p1 --verbose \
  2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log

# Use Python 2.7:
find . -type f -exec sed -i -r \
  -e 's|/usr/bin/python$|&2.7|g' \
  -e 's|(/usr/bin/python2)\.4$|\1.7|g' \
  {} +

# There are still a lot of relative calls which need a workaround
mkdir $TMP/tmp-$PRGNAM/python27-path
ln -s /usr/bin/python2.7 $TMP/tmp-$PRGNAM/python27-path/python

# Care for the old gcc-4.6 we use:
sed -i -e "s/define HAVE_PRAGMA_DEPRECATED 1/define HAVE_PRAGMA_DEPRECATED 0/g" $(grep -rl "define HAVE_PRAGMA_DEPRECATED 1" third_party/)

chown -R root:root .
chmod -R u+w,go+r-w,a+X-s .

echo Building ...

if [ ${USE_NACL} -eq 1 ]; then
  DNACL=0
else
  DNACL=1
fi

export -n LDFLAGS="$SLKLDFLAGS"
export -n CFLAGS="$SLKCFLAGS"
export CXXFLAGS="$SLKCFLAGS -fpermissive"

export PATH="$TMP/tmp-$PRGNAM/python27-path:$PATH"

_chromium_conf=(
    -Dgoogle_api_key=$_google_api_key
    -Dgoogle_default_client_id=$_google_default_client_id
    -Dgoogle_default_client_secret=$_google_default_client_secret
    -Dclang=0
    -Ddisable_glibc=1
    -Dffmpeg_branding=Chrome
    -Dicu_use_data_file_flag=0
    -Dlinux_sandbox_path=/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/chrome_sandbox
    -Dlinux_strip_binary=1
    -Dlinux_use_bundled_binutils=0
    -Dlinux_use_bundled_gold=0
    -Dlinux_use_gold_binary=0
    -Dlinux_use_gold_flags=0
    -Dlogging_like_official_build=1
    -Dproprietary_codecs=1
    -Dremove_webcore_debug_symbols=1
    -Dusb_ids_path=/usr/share/usb.ids
    -Duse_allocator=none
    -Duse_gconf=0
    -Duse_gnome_keyring=0
    -Duse_kerberos=0
    -Duse_pulseaudio=0
    -Duse_xi2_mt=0
    -Duse_system_bzip2=0
    -Duse_system_flac=0
    -Duse_system_ffmpeg=0
    -Duse_system_harfbuzz=0
    -Duse_system_icu=0
    -Duse_system_libevent=0
    -Duse_system_libjpeg=0
    -Duse_system_libpng=0
    -Duse_system_libxml=0
    -Duse_system_libxstl=0
    -Duse_system_nspr=1
    -Duse_system_opus=0
    -Duse_system_snappy=0
    -Duse_system_openssl=1
    -Duse_system_xdg_utils=1
    -Duse_system_yasm=0
    -Duse_system_zlib=0
    -Dwerror=
    -Drelease_extra_cflags="$CFLAGS"
    -Dtarget_arch=${TARGETARCH}
    -Ddisable_nacl=${DNACL}
    -Ddisable_sse2=${DSSE}
)
    #-Dlinux_link_gsettings=1
    #-Dlinux_link_libpci=1
    #-Dlinux_link_pulseaudio=0

# Download the NaCL toolchains:
if [ ${USE_NACL} -eq 1 ]; then
  # We do not need arm_trusted on x86:
  build/download_nacl_toolchains.py --packages nacl_x86_newlib,pnacl_newlib,pnacl_translator \
  2>&1 | tee $OUTPUT/nacl_dl-${PRGNAM}.log
fi

# Do not make the build fail, see Chromium issue #386097:
third_party/libaddressinput/chromium/tools/update-strings.py \
  2>&1 | tee $OUTPUT/update_strings-${PRGNAM}.log

# Unbundle the libraries which we use from the system:
build/linux/unbundle/replace_gyp_files.py "${_chromium_conf[@]}" \
  2>&1 | tee $OUTPUT/configure-${PRGNAM}.log
# Generate the ninja build files:
build/gyp_chromium --depth=. "${_chromium_conf[@]}" \
  2>&1 | tee $OUTPUT/gyp-${PRGNAM}.log

ninja $NUMJOBS  -C out/Release chrome chrome_sandbox chromedriver
  2>&1 | tee $OUTPUT/ninja-${PRGNAM}.log

# Manually install everything:

# The main binary:
install -D out/Release/chrome $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/chromium

# The sandbox:
install -D -m4755 -o root -g root out/Release/chrome_sandbox \
  $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/chrome-sandbox

# The Chromium implementation of the WebDriver wire protocol
# (automated testing of web apps):
install -D out/Release/chromedriver $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/chromedriver

# Copy over the remaining binaries:
cp -a \
  out/Release/{*.pak,libffmpegsumo.so,libpdf.so} \
  $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/
if [ ${USE_NACL} -eq 1 ]; then
  # Native Client files:
  cp -a \
    out/Release/nacl_helper{,_bootstrap} \
    out/Release/{nacl_irt_*.nexe} \
    $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/
  if [ -f out/Release/libppGoogleNaClPluginChrome.so ]
  then
    cp -a \
      out/Release/libppGoogleNaClPluginChrome.so \
      $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/
  fi
fi

# Manually strip binaries so that 'nacl_irt_*.nexe' is left intact
strip  --strip-unneeded \
  $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/{chromium,chrome-sandbox} \
  $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/chromedriver \
  $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/libffmpegsumo.so \
  $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/libpdf.so
if [ ${USE_NACL} -eq 1 ]; then
  strip  --strip-unneeded \
    $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/nacl_helper{,_bootstrap}
  if [ -f $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/libppGoogleNaClPluginChrome.so ]
  then
    strip  --strip-unneeded \
      $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/libppGoogleNaClPluginChrome.so
  fi
fi

# Add locales:
cp -a out/Release/locales $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/

# Add resource files:
cp -a out/Release/resources $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/

# Install a man page:
install -D -m0644 out/Release/chrome.1 $PKG/usr/man/man1/chromium.1

# Without this file, chromium refuses to start:
cp -a third_party/icu/source/data/in/icudtl.dat $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/

# Install a wrapper script:
install -D -m0755 $SRCDIR/chromium.sh $PKG/usr/bin/chromium
sed -i -e "s/@LIBDIRSUFFIX@/${LIBDIRSUFFIX}/g" $PKG/usr/bin/chromium

# Make the chromedriver available in the $PATH :
ln -s ../lib${LIBDIRSUFFIX}/${PRGNAM}/chromedriver $PKG/usr/bin/

# Install desktop icons:
for size in 16 32; do
  install -D -m0644 \
    chrome/app/theme/default_100_percent/chromium/product_logo_$size.png \
    $PKG/usr/share/icons/hicolor/${size}x${size}/apps/chromium.png
done
for size in 22 24 48 64 128 256; do
  install -D -m0644 \
    chrome/app/theme/chromium/product_logo_$size.png \
    $PKG/usr/share/icons/hicolor/${size}x${size}/apps/chromium.png
done

# Add a desktop file:
install -D -m0644 \
  $SRCDIR/${PRGNAM}.desktop $PKG/usr/share/applications/${PRGNAM}.desktop

# Move the 'default' file into place,
# this allows users to override command-line options:
install -D -m0644 $SRCDIR/${PRGNAM}.default $PKG/etc/default/${PRGNAM}.new

# Add this to the doinst.sh:
mkdir -p $PKG/install
cat <<EOINS >> $PKG/install/doinst.sh
# Handle the incoming configuration files:
config() {
  for infile in \$1; do
    NEW="\$infile"
    OLD="\`dirname \$NEW\`/\`basename \$NEW .new\`"
    # If there's no config file by that name, mv it over:
    if [ ! -r \$OLD ]; then
      mv \$NEW \$OLD
    elif [ "\`cat \$OLD | md5sum\`" = "\`cat \$NEW | md5sum\`" ]; then
      # toss the redundant copy
      rm \$NEW
    fi
    # Otherwise, we leave the .new copy for the admin to consider...
  done
}

config etc/default/${PRGNAM}.new

# Update the desktop database:
if [ -x usr/bin/update-desktop-database ]; then
  chroot . /usr/bin/update-desktop-database usr/share/applications > /dev/null 2>&1
fi

# Update hicolor theme cache:
if [ -d usr/share/icons/hicolor ]; then
  if [ -x /usr/bin/gtk-update-icon-cache ]; then
    chroot . /usr/bin/gtk-update-icon-cache -f -t usr/share/icons/hicolor 1> /dev/null 2> /dev/null
  fi
fi

# Update the mime database:
if [ -x usr/bin/update-mime-database ]; then
  chroot . /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
fi

EOINS

# Add documentation:
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION || true
cat $SRCDIR/$(basename $0) > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
chown -R root:root $PKG/usr/doc/$PRGNAM-$VERSION
find $PKG/usr/doc -type f -exec chmod 644 {} \;

# Compress the man page(s):
if [ -d $PKG/usr/man ]; then
  find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \;
  for i in $(find $PKG/usr/man -type l -name "*.?") ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
fi

# Add a package description:
mkdir -p $PKG/install
cat $SRCDIR/slack-desc > $PKG/install/slack-desc

# Build the package:
cd $PKG
makepkg --linkadd y --chown n $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.${PKGTYPE:-txz} 2>&1 | tee $OUTPUT/makepkg-${PRGNAM}.log
cd $OUTPUT
md5sum ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.${PKGTYPE:-txz} > ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.${PKGTYPE:-txz}.md5
cd -
cat $PKG/install/slack-desc | grep "^${PRGNAM}" > $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.txt

# Restore the original umask:
umask ${_UMASK_}

