#!/bin/sh # $Id$ # Copyright 2017, 2018 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. # ----------------------------------------------------------------------------- # # Inspired by the mozilla-firefox.SlackBuild script written by # Patrick J. Volkerding, Sebeka, Minnesota, USA # # Slackware SlackBuild script # =========================== # By: Eric Hameleers # For: palemoon # Descr: firefox-based web browser with a focus on efficiency # URL: http://www.palemoon.org/ # Build needs: ffmpeg (Slackware <= 14.2) # gcc5 (Slackware > 14.2) # Needs: ffmpeg (Slackware > 14.2 already has ffmpeg) # Changelog: # 27.3.0-1: 28/Apr/2017 by Eric Hameleers # * Initial build. # 27.4.0-1: 12/jul/2017 by Eric Hameleers # * Update. # 27.4.1-1: 06/aug/2017 by Eric Hameleers # * Update. # 27.4.2-1: 23/aug/2017 by Eric Hameleers # * Update. # 27.5.0-1: 30/sep/2017 by Eric Hameleers # * Update. # 27.5.1-1: 11/oct/2017 by Eric Hameleers # * Update. # 27.6.1-1: 20/nov/2017 by Eric Hameleers # * Update. # 27.6.2-1: 07/dec/2017 by Eric Hameleers # * Update. # 27.7.1-1: 18/jan/2018 by Eric Hameleers # * Update. # 27.7.2-1: 02/feb/2018 by Eric Hameleers # * Update. # 27.8.0-1: 04/mar/2018 by Eric Hameleers # * Update. # 27.8.1-1: 06/mar/2018 by Eric Hameleers # * Bugfix release. # 27.8.2-1: 27/mar/2018 by Eric Hameleers # * Security update. # 27.8.3-1: 30/mar/2018 by Eric Hameleers # * Bugfix update. # 27.8.3-2: 01/apr/2018 by Eric Hameleers # * Recompiled for slackware-current. # 27.9.1-1: 08/may/2018 by Eric Hameleers # * Update. # 27.9.2-1: 18/may/2018 by Eric Hameleers # * Update. # 27.9.4-1: 31/jul/2018 by Eric Hameleers # * Update. # # Run 'sh palemoon.SlackBuild' to build a Slackware package. # The package (.t?z) and .txt file as well as build logs are created in /tmp . # Install the package using 'installpkg' or 'upgradepkg --install-new'. # # ----------------------------------------------------------------------------- PRGNAM=palemoon SRCNAM=Pale-Moon VERSION=${VERSION:-27.9.4} BUILD=${BUILD:-1} NUMJOBS=${NUMJOBS:-"-j$(nproc)"} TAG=${TAG:-alien} DOCS="AUTHORS LICENSE README.md" # Some characteristics of the resulting browser can be adjusted build-time. # By default this build enables official 'Pale Moon' branding. Permission # was requested from, and granted by, the developer Moonchild. # The unofficial 'New Moon' branding, required if you want to re-distribute # unapproved self-compiled binaries, can be applied by setting # the value of 'BRANDING' to '0': BRANDING=${BRANDING:-1} if [ $BRANDING -eq 1 ]; then DO_BRANDING="--enable-official-branding" SLDESC="official Pale Moon branding" else DO_BRANDING="--disable-official-branding --with-branding=browser/branding/unofficial" SLDESC="unofficial New Moon branding" fi # The default optimization in the official bulds is "-O2 -msse2 -mfpmath=sse"; # However, I try to be more conservative than that. # You can of course always opt for the official optimization by # setting 'OPTIMIZE' to '1': OPTIMIZE=${OPTIMIZE:-0} if [ $OPTIMIZE -eq 1 ]; then DO_OPTIMIZE="-O2 -msse2 -mfpmath=sse" else DO_OPTIMIZE="-Os" fi # By default this browser uses a GTK+-2 based GUI toolkit. # If you prefer GTK+-3 instead, you should set 'GTK2' to '0': GTK2=${GTK2:-1} if [ $GTK2 -eq 1 ]; then DO_GUI="cairo-gtk2" else DO_GUI="cairo-gtk3" fi # The devtools (in-built web developer tools such as debugging consoles, # networking panel, js debugger, tilt, etc.) are included in this build # by default, but you can exclude these by setting 'DEVTOOLS' to '0': DEVTOOLS=${DEVTOOLS:-1} if [ $DEVTOOLS -eq 1 ]; then DO_DEVTOOLS="--enable-devtools" else DO_DEVTOOLS="--disable-devtools" fi # End build-time adjustments # 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} # This complex string occurs several times: TOPDIR=$TMP/tmp-$PRGNAM/${SRCNAM}-${VERSION}_Release SOURCE[0]="$SRCDIR/${SRCNAM}-${VERSION}_Release.tar.gz" SRCURL[0]="https://github.com/MoonchildProductions/Pale-Moon/archive/${VERSION}_Release.tar.gz" ## ## --- with a little luck, you won't have to edit below this point --- ## ## # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then case "$(uname -m)" in i?86) ARCH=i586 ;; arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; # Unless $ARCH is already set, use uname -m for all other archs: *) ARCH=$(uname -m) ;; esac export ARCH fi # Set CFLAGS/CXXFLAGS and LIBDIRSUFFIX: case "$ARCH" in i?86) SLKCFLAGS="-march=$ARCH -mtune=i686" SLKLDFLAGS="-Wl,--as-needed -latomic"; LIBDIRSUFFIX="" ;; x86_64) SLKCFLAGS="-fPIC" SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64" ;; armv7hl) SLKCFLAGS="-march=armv7-a -mfpu=vfpv3-d16" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; *) SLKCFLAGS=${SLKCFLAGS:-"-O2"} SLKLDFLAGS=${SLKLDFLAGS:-""}; LIBDIRSUFFIX=${LIBDIRSUFFIX:-""} ;; 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/{checkout,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 -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 # We need to use the incredibly ancient autoconf-2.13 for this :/ ( cd $SRCDIR/autoconf ; TMP=$TMP/tmp-$PRGNAM ./autoconf.build ) PATH=$TMP/tmp-$PRGNAM/autoconf-tmp/usr/bin:$PATH echo "Extracting the source archive(s) for $PRGNAM..." tar -xf ${SOURCE[0]} cd ${TOPDIR} # Make this compile with gcc7: touch $OUTPUT/patch-${PRGNAM}.log cat $SRCDIR/patches/palemoon_stl_mozalloc.patch | patch -p1 --verbose \ 2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log # Fix a glibc-2.26 incompatibility: sed -i 's#xlocale#locale#' ./intl/icu/source/i18n/digitlst.cpp chown -R root:root . chmod -R u+w,go+r-w,a+rX-st . echo Building ... # 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)" export LANG=C # Fix for 64bit Slackware: sed -i xpcom/io/nsAppFileLocationProvider.cpp \ -e "s#/usr/lib/mozilla/plugins#/usr/lib${LIBDIRSUFFIX}/mozilla/plugins#g" export CFLAGS="$SLKCFLAGS" export CXXFLAGS="$SLKCFLAGS -std=gnu++98" export LDFLAGS="-lc $SLKLDFLAGS" export MOZBUILD_STATE_PATH="$TOPDIR/mozbuild" export MOZCONFIG="$TOPDIR/.mozconfig" export MOZILLA_OFFICIAL=1 export MOZ_MAKE_FLAGS=$NUMJOBS export PYTHON=/usr/bin/python2 # Our building options, in a configure-like display ;) # Note: no spaces allowed in the options themselves. OPTIONS="\ --prefix=/usr \ --libdir=/usr/lib${LIBDIRSUFFIX} \ --sysconfdir=/etc \ --localstatedir=/var \ --mandir=/usr/man \ --enable-application=browser \ --enable-chrome-format=omni \ --enable-default-toolkit=${DO_GUI} \ --enable-ffmpeg \ --enable-jemalloc \ --enable-release \ --enable-shared-js \ --enable-startup-notification \ --enable-strip \ --disable-installer \ --disable-mochitests \ --disable-debug \ --disable-tests \ --disable-updater \ --with-pthreads \ --with-system-icu \ --with-default-mozilla-five-home=/usr/lib${LIBDIRSUFFIX}/palemoon-$VERSION \ --x-libraries=/usr/lib${LIBDIRSUFFIX} \ ${DO_BRANDING} \ ${DO_DEVTOOLS} \ " # Things to be put into mozconfig: # 1- Common environment flags as noted in mozilla/config/config.mk # 2- Configure options as printed out by mozilla/configure --help rm .mozconfig && touch .mozconfig echo "mk_add_options MOZ_CO_PROJECT=browser" >> .mozconfig echo "mk_add_options MOZ_OBJDIR=$TMP/tmp-$PRGNAM/pmbuild" >> .mozconfig echo "ac_add_options --enable-optimize=\"${DO_OPTIMIZE}\"" >> .mozconfig # Add our OPTIONS to the .mozconfig file: for option in $OPTIONS; do echo "ac_add_options $option" >> .mozconfig done if ! pkg-config --exists libpulse; then echo "ac_add_options --disable-pulseaudio" >> .mozconfig fi # Mach requires Python2 to compile: python2 mach build # Install Pale Moon: mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/mozilla/plugins cd $TMP/tmp-$PRGNAM/pmbuild make install DESTDIR=$PKG # Remove duplicate unused binary: rm -f $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}-${VERSION}/palemoon-bin # Add Google search plugin: install -m0644 $SRCDIR/google.xml \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}-${VERSION}/browser/searchplugins/ # We do not want this in the package (just like with firefox): rm -rf $PKG/usr/include if [ $DEVTOOLS -eq 0 ]; then # Remove devtools if needed: rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}-devel-${VERSION} fi # Install icons: for PX in 16 32 48 ; do mkdir -p $PKG/usr/share/icons/hicolor/${PX}x${PX}/apps ln -s /usr/lib${LIBDIRSUFFIX}/palemoon-$VERSION/browser/chrome/icons/default/default${PX}.png $PKG/usr/share/icons/hicolor/${PX}x${PX}/apps/${PRGNAM}.png done # ... and the 128px icon file too: mkdir -p $PKG/usr/share/icons/hicolor/128x128/apps ln -s /usr/lib${LIBDIRSUFFIX}/palemoon-$VERSION/browser/icons/mozicon128.png $PKG/usr/share/icons/hicolor/128x128/apps/${PRGNAM}.png # And one for old DE's: mkdir -p $PKG/usr/share/pixmaps ln -s /usr/lib${LIBDIRSUFFIX}/palemoon-$VERSION/browser/icons/mozicon128.png $PKG/usr/share/pixmaps/${PRGNAM}.png # Install the .desktop file: mkdir -p $PKG/usr/share/applications install -m644 $TOPDIR/browser/branding/official/palemoon.desktop $PKG/usr/share/applications/$PRGNAM.desktop # Add this to the doinst.sh: mkdir -p $PKG/install cat <> $PKG/install/doinst.sh # Handle the incoming configuration files: # 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: cd $TOPDIR 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 and dependencies file: mkdir -p $PKG/install cat $SRCDIR/slack-desc \ | sed -e "s/@BRANDING@/${SLDESC}/" \ > $PKG/install/slack-desc cat $SRCDIR/slack-required > $PKG/install/slack-required # Build the package: cd $PKG makepkg --prepend --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 cat $PKG/install/slack-required > $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.dep # Restore the original umask: umask ${_UMASK_}