#!/bin/sh # $Id$ # Copyright 2013, 2014, 2015 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 # 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) # Needs: # Changelog: # 31.0.1650.57-1: # 18/nov/2013 by Eric Hameleers # * Initial build. # 31.0.1650.63-1: # 18/Nov/2013 by Eric Hameleers # 31.0.1650.67-1: # 19/dec/2013 by Eric Hameleers # * Update comes with several security fixes. # 32.0.1700.77-1: # 14/jan/2014 by Eric Hameleers # * Update comes with several security fixes. # 32.0.1700.102-1: # 29/jan/2014 by Eric Hameleers # * Update comes with several security fixes. # 32.0.1700.107-1: # 04/feb/2014 by Eric Hameleers # * Update. # 33.0.1750.117-1: # 21/feb/2014 by Eric Hameleers # * Update comes with several security fixes. # 33.0.1750.146-1: # 04/mar/2014 by Eric Hameleers # * Update comes with several security fixes. # 33.0.1750.149-1: # 11/mar/2014 by Eric Hameleers # * Update comes with several security fixes. # 33.0.1750.152-1: # 18/mar/2014 by Eric Hameleers # * Update comes with several security fixes. # 34.0.1847.116-1: # 09/apr/2014 by Eric Hameleers # * Update comes with several security fixes. # 34.0.1847.132-1: # 25/apr/2014 by Eric Hameleers # * Update. # 34.0.1847.137-1: # 14/may/2014 by Eric Hameleers # * Update. # 35.0.1916.114-1: # 20/may/2014 by Eric Hameleers # * Update comes with several security fixes. # 35.0.1916.153-1: # 10/jun/2014 by Eric Hameleers # * Update comes with several security fixes. # 36.0.1985.125-1: # 16/jun/2014 by Eric Hameleers # * Update comes with several security fixes. # We can no longer download the toolchain binaries in advance, # so the build will now require internet connectivity. # 36.0.1985.143-1: # 12/aug/2014 by Eric Hameleers # * Update comes with security fixes, Chrome also comes with an # updated Flash plugin: 14.0.0.177. # 37.0.2062.94-1: # 27/aug/2014 by Eric Hameleers # * Update comes with security fixes, New: an embedded PDF viewer. # 37.0.2062.120-1: # 09/sep/2014 by Eric Hameleers # * Update comes with security fixes, Chrome also comes with an # updated Flash plugin: 15.0.0.152. # 38.0.2125.101-1: # 08/oct/2014 by Eric Hameleers # * Update comes with security fixes. # 38.0.2125.104-1: # 18/oct/2014 by Eric Hameleers # * Update comes with security fixes. Chrome also updates its # Flash plugin to 15.0.0.189. # 38.0.2125.111-1: # 28/oct/2014 by Eric Hameleers # * Update. # 38.0.2125.122-1: # 11/nov/2014 by Eric Hameleers # * Update comes with security fixes. Chrome also updates its # Flash plugin to 15.0.0.223. # 39.0.2171.65-1: # 17/nov/2014 by Eric Hameleers # * Update comes with security fixes. See # http://googlechromereleases.blogspot.nl/2014/11/stable-channel-update_18.html # 39.0.2171.71-1: # 26/nov/2014 by Eric Hameleers # * Update comes with security fixes. Chrome also updates its # Flash plugin to 15.0.0.239. # 39.0.2171.95-1: # 09/dec/2014 by Eric Hameleers # * Update comes with security fixes. Chrome also updates its # Flash plugin to 16.0.0.235. # 39.0.2171.95-2: # 01/jan/2015 by Eric Hameleers # * Add support for the WIdevine CDM plugin (i.e. Netflix playback) # 39.0.2171.99-1: # 14/jan/2015 by Eric Hameleers # * New release accompanied by pepperflash 16.0.0.257. # 40.0.2214.91-1: # 21/jan/2015 by Eric Hameleers # * New release. # 40.0.2214.111-1: # 06/feb/2015 by Eric Hameleers # 41.0.2272.76-1: # 05/mar/2015 by Eric Hameleers # * First release of Chromium 41 stable. # 41.0.2272.118-1: # 02/apr/2015 by Eric Hameleers # * Security update. # 42.0.2311.90-1: # 15/apr/2015 by Eric Hameleers # * First release of Chromium 42 stable. # 42.0.2311.135-1: # 30/apr/2015 by Eric Hameleers # * Security update. # 43.0.2357.65-1: # 20/may/2015 by Eric Hameleers # * Security update, first 43 version. # # 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'. # # ----------------------------------------------------------------------------- SRCNAM=chromium SRCEXT=${SRCEXT:-""} # could be "-dev" for development build PRGNAM=${SRCNAM}${SRCEXT} # chromium or chromium-dev VERSION=${VERSION:-43.0.2357.65} BUILD=${BUILD:-1} NUMJOBS=${NUMJOBS:" -j4 "} TAG=${TAG:-alien} # Differentiate between stable and development releases: if [ "x$SRCEXT" = "x-dev" ]; then RPMCHAN="unstable" CRFLAGS="CHROMIUM_DEV_FLAGS" CRUSERFLAGS="CHROMIUM_DEV_USER_FLAGS" BINTREE="-unstable" else RPMCHAN="stable" CRFLAGS="CHROMIUM_FLAGS" CRUSERFLAGS="CHROMIUM_USER_FLAGS" BINTREE="" fi # 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:-1} # Use the clang compiler. Results in faster build and smaller binaries. # I default this to "off" because it is untested: USE_CLANG=${USE_CLANG:-0} # If you don't want to enable support for Widevine CDM # (content decryption module) say "0" here. USE_CDM=${USE_CDM:-1} # Find the version of Widevine using this commandline on the chrome binary. # Note that the chrome binary RPM needs to have the same version # as our chromium sources: # rpm2cpio ${SOURCE[1]} | cpio --to-stdout -i ./opt/google/chrome/chrome 2>&1 | strings | grep -C 1 " (version:" | tail -1 RPMSUB=${RPMSUB:-"-1"} WIDEVINE_VERSION="1.4.8.813" DOCS="AUTHORS DEPS 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 <&1 | strings | grep -C 1 ' (version:' | tail -1)" 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 ${SRCNAM}-${VERSION} # Patches: touch $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 # Enable VAAPI hardware decoding on Linux platform: cat $SRCDIR/patches/chromium_vaapi.patch | patch -p1 --verbose \ 2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log if [ "$ARCH" != "x86_64" ]; then # For now, disable NaCl except on x86_64 because the precompiled toolchain is # only available for that architecture at the moment. echo "** Not building NaCL - architecture '$ARCH' is currently unsupported." USE_NACL=0 fi if [ $USE_CDM -eq 1 ]; then # Add support for widevine cdm to this build. # Note that the resulting Slackware package will *not* include the # proprietary Widevine CDM, only the adapter library which is built from OSS: cat $SRCDIR/patches/chromium_widevine.patch \ | sed -e "s/@WIDEVINE_VERSION@/$WIDEVINE_VERSION/" \ | patch -p1 --verbose \ 2>&1 | tee -a $OUTPUT/patch-${PRGNAM}.log mkdir -p third_party/widevine/cdm/linux/${TARGETARCH} cp third_party/widevine/cdm/widevine_cdm_*.h \ third_party/widevine/cdm/linux/${TARGETARCH}/ # Grab the Widevine CDM library from the Chrome .rpm package # (the adapter library will be custom-built): echo "Extracting libwidevinecdm.so from $(basename ${SOURCE[1]})" rpm2cpio ${SOURCE[1]} \ | cpio -i --to-stdout ./opt/google/chrome${BINTREE}/libwidevinecdm.so 2>/dev/null \ > third_party/widevine/cdm/linux/${TARGETARCH}/libwidevinecdm.so chmod 755 third_party/widevine/cdm/linux/${TARGETARCH}/libwidevinecdm.so fi if [ "x$SRCEXT" = "x-dev" ]; then # Save configuration in ~/.config/chromium-dev": sed -e "s|'filename': 'chromium-browser'|'filename': '${PRGNAM}'|" \ -e "s|'confdir': 'chromium'|'confdir': '${PRGNAM}'|" \ -i chrome/chrome_exe.gypi sed -e 's|config_dir.Append("chromium")|config_dir.Append("'${PRGNAM}'")|' \ -e 's|config_dir.Append("chrome-frame")|config_dir.Append("'chrome-frame$SRCEXT}'")|' \ -i chrome/common/chrome_paths_linux.cc fi if [ "$USE_CLANG" = "1" ]; then # clang doesn't support this option yet: sed -e '/-Wno-absolute-value/d' -i build/common.gypi # -Dclang=1 uses clang instead of gcc. # -Dclang_use_chrome_plugins=1 fails with clang 3.5 - disable for now. CLANG_OPTS=" -Dclang=1 -Dclang_use_chrome_plugins=0" export CC="clang" export CXX="clang++" else CLANG_OPTS=" -Dclang=0" fi 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 CXXFLAGS="$SLKCFLAGS" export -n CFLAGS="$SLKCFLAGS -Wno-unused-local-typedefs" _chromium_conf=( ${CLANG_OPTS} -Ddisable_glibc=1 -Denable_pepper_cdms=1 -Denable_webrtc=1 -Dffmpeg_branding=Chrome -Dgoogle_api_key=$_google_api_key -Dgoogle_default_client_id=$_google_default_client_id -Dgoogle_default_client_secret=$_google_default_client_secret -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/hwdata/usb.ids -Duse_allocator=none -Duse_gconf=0 -Duse_kerberos=0 -Duse_pulseaudio=0 -Duse_system_bzip2=1 -Duse_system_flac=1 -Duse_system_ffmpeg=0 -Duse_system_harfbuzz=0 -Duse_system_icu=0 -Duse_system_libevent=1 -Duse_system_libjpeg=0 -Duse_system_libpng=0 -Duse_system_libxml=0 -Duse_system_libxslt=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=1 -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 sync --extract \ 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 # Compile everything: 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}/${PRGNAM} # 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} \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/ if [ -f out/Release/natives_blob.bin ]; then cp -a \ out/Release/{natives_blob.bin,snapshot_blob.bin} \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/ fi if [ ${USE_NACL} -eq 1 ]; then # Native Client files: cp -a \ out/Release/nacl_helper{,_bootstrap,_nonsfi} \ out/Release/nacl_irt_*.nexe \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/ fi if [ $USE_CDM -eq 1 ]; then # Widevine CDM adapter: cp -a \ out/Release/libwidevinecdmadapter.so \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/ fi # Manually strip binaries so that 'nacl_irt_*.nexe' is left intact strip --strip-unneeded \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/{${PRGNAM},chrome-sandbox} \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/chromedriver \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/libffmpegsumo.so if [ ${USE_NACL} -eq 1 ]; then strip --strip-unneeded \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/nacl_helper{,_bootstrap,_nonsfi} fi if [ ${USE_CDM} -eq 1 ]; then strip --strip-unneeded \ $PKG/usr/lib${LIBDIRSUFFIX}/${PRGNAM}/libwidevinecdmadapter.so 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/${PRGNAM}.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/${PRGNAM}.sh $PKG/usr/bin/${PRGNAM} sed \ -e "s/@PRGNAM@/${PRGNAM}/g" \ -e "s/@SRCEXT@/${SRCEXT}/g" \ -e "s/@LIBDIRSUFFIX@/${LIBDIRSUFFIX}/g" \ -e "s/@CRFLAGS@/${CRFLAGS}/g" \ -e "s/@CRUSERFLAGS@/${CRUSERFLAGS}/g" \ -i $PKG/usr/bin/${PRGNAM} # Make the chromedriver available in the $PATH : ln -s ../lib${LIBDIRSUFFIX}/${PRGNAM}/chromedriver $PKG/usr/bin/chromedriver${SRCEXT} # 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/${PRGNAM}.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/${PRGNAM}.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/${PRGNAM}/00-default.conf.new cat $SRCDIR/${PRGNAM}.default | sed \ -e "s/@PRGNAM@/${PRGNAM}/g" \ -e "s/@SRCEXT@/${SRCEXT}/g" \ -e "s/@CRFLAGS@/${CRFLAGS}/g" \ -e "s/@CRUSERFLAGS@/${CRUSERFLAGS}/g" \ -e "s/@LIBDIRSUFFIX@/${LIBDIRSUFFIX}/g" \ > $PKG/etc/${PRGNAM}/00-default.conf.new # Add this to the doinst.sh: mkdir -p $PKG/install cat <> $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/${PRGNAM}/00-default.conf.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${SRCEXT} > $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_}