#!/bin/sh # This script is POSIX compliant and comes with no warranty. # Tune it up or otherwise adjust as you see fit. # By Sasha - Jan 22 2010 # My gcc used = 4.3.3 # # PGO (Profile Guided Optimization) Firefox build # for 64bit Slackware 13.0 # Works for me with FF 3.6 (freshly released Jan 22/2010) # Script based on Slackware 13/64 SlackBuild and other # examples from here and there, including mozilla.org. # # This whole build is a multi-stage clobber-build # which takes the better part of 1.5 hours, including # time spent playing with the half-built browser half # way through the build to generate profiling info. # # FF 3.6 build depends on libnotify from Galago and # some junk from your Wireless Tools package (yes, wtf?!) # BEGIN: # First, see that we aren't root, because we _are_ going to # fire up the new browser half-way through the build, to generate # some profiling information. Don't wanna browse as root, and # also, root is not allowed to connect to the X server by # default, so the build will fail when the browser cannot be started. echo "Checking UID and file ownership.." if [ $(id -u) = 0 ]; then echo "You should not do this as root." echo "Please change to another UID before running this script." exit 1 else # ensure everything is our UID:GID or quit # (in case any of it is root owned) if [ "$(chown -R $(id -u):$(id -g) ./* 2>&1 >/dev/null)" ]; then echo "Stuff in here is not chownable to our UID:GID." echo "Please fix it and run this script again." exit 1 fi; fi; # my favorite compiler optimizations: #CFLAGS="-fPIC -O3 -Wall -pipe -march=native -mtune=native -fomit-frame-pointer" #I read O2 is often faster. so... CFLAGS="-fPIC -O2 -Wall -pipe -march=native -mtune=native -fomit-frame-pointer" CXXFLAGS="${CFLAGS}" CPPFLAGS="${CFLAGS} -I/usr/include" MAKEFLAGS="-j4" # FF apparently won't build properly with autoconf != 2.13 so # in case this is still the case, I installed autoconf 2.13 in # /usr/local/bin and this PATH makes it be found first, before # my regular autoconf 2.6: PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:. export PATH CPPFLAGS CXXFLAGS CFLAGS MAKEFLAGS CWD=$(pwd) # where am I now (start base dir) TMP=$CWD/temp # a slackpkg will be constructed in here. LIBDIR=lib64 # slack64 libdir. SRCDIR=$CWD/SOURCE # FF source dir. OBJDIR=$CWD/OBJDIR # build dest dir. PKGDIR=$CWD/PGO_FINISHED_PROD # slack package or tarball ends up in here. PROFIL=$CWD/_PROFILEPROFILE # PGO profile folder # (stick your places.sqlite in there if you want) MOZAPP=browser # in mozconfig, which mozilla component to build APP=firefox # self evident. VERSION=17.0 # self evident. EXTENSION=en-US.linux # FF tarball name includes this piece. # but may change depending on your locale. ARCH=x86_64 # architecture. BUILD=1mps # PYTHON=/usr/bin/python # Download all the parts here? # make sure we have all the necessary pieces for # creating a slackpackage, and the source archive too: for i in firefox.png mimeTypes.rdf.gz firefox.moz_plugin_path.diff.gz \ mozilla-firefox.desktop slack-desc $APP-$VERSION.source.tar.bz2; do if [ ! -f "$CWD/$i" ]; then echo "Error: $CWD/$i missing. Get it somewhere and try again." exit 1 fi; done # clean away old build dirs and make fresh ones: rm -Rf $SRCDIR $OBJDIR $TMP $PKGDIR mkdir -p $SRCDIR $OBJDIR $PROFIL $TMP $PKGDIR # run-script.sh ################################################## # create the app startup script for profile generation: cat << EOF > run-$APP.sh #!/bin/sh NO_EM_RESTART=1 DISPLAY=:0.0 export NO_EM_RESTART DISPLAY $OBJDIR/dist/bin/$APP -no-remote -profile $PROFIL EOF chmod a+x run-$APP.sh # /run-script.sh ################################################## # extract the FF source tar.bz2 into $SRCDIR.. echo "Extracting source.." cd $SRCDIR tar xvf $CWD/$APP-$VERSION.source.tar.bz2 || exit 1 sync SRCDIR=$(pwd)/$(ls) cd $SRCDIR || exit 1 #/usr/local/bin/autoreconf || exit 1 # Enable x86_64 Tracemonkey Support # FIXME: deprecated? there is no ENABLE_JIT anymore... #patch $SRCDIR/js/src/configure.in < $CWD/enable-x86_64-tracemonkey.patch || exit 1 # Pat Volkerding says: # Fix a long standing bug that's prevented staying current on GTK+. # Thanks to the BLFS folks. :-) cat << EOF >> layout/build/Makefile.in ifdef MOZ_ENABLE_CANVAS EXTRA_DSO_LDOPTS += \$(XLDFLAGS) -lX11 -lXrender endif EOF # mozconfig ####################################################### # and create our mozconfig in $SRCDIR: cat << EOF > mozconfig # FF PGO-build mozconfig file # option to say use objdir (build dir): mk_add_options MOZ_OBJDIR=$OBJDIR # startup script, for generating profile info for optimize: #mk_add_options PROFILE_GEN_SCRIPT=$CWD/run-$APP.sh # Automated script; comment this and uncomment the above for a manual script mk_add_options PROFILE_GEN_SCRIPT='${PYTHON} ${OBJDIR}/_profile/pgo/profileserver.py' # which mozilla app to build: ac_add_options --enable-application=$MOZAPP ########################################: Stuff that always worked: ###################### (mostly) stuff from the -current slackbuild: ac_add_options --enable-official-branding ac_add_options --prefix=/usr --libdir=/usr/$LIBDIR ac_add_options --host="x86_64-slackware-linux-gnu" ac_add_options --with-default-mozilla-five-home=/usr/$LIBDIR/$APP-$VERSION ac_add_options --with-system-zlib ac_add_options --enable-default-toolkit=cairo-gtk2 ac_add_options --enable-crypto ac_add_options --enable-svg ac_add_options --enable-canvas ac_add_options --enable-xft ac_add_options --enable-webm ac_add_options --enable-xinerama ac_add_options --enable-optimize="-fPIC -O2 -Wall -pipe -march=native -mtune=native -fomit-frame-pointer" #not needed? cflags etc? was Os...?hmm ac_add_options --enable-reorder ac_add_options --enable-strip #ac_add_options --enable-system-cairo #breaks build (https://bugzilla.mozilla.org/show_bug.cgi?id=722975) ac_add_options --enable-cpp-rtti ac_add_options --enable-single-profile ac_add_options --disable-ldap ac_add_options --disable-accessibility ac_add_options --disable-debug ac_add_options --disable-tests ac_add_options --disable-logging ac_add_options --disable-pedantic ac_add_options --disable-installer ac_add_options --disable-mailnews ac_add_options --disable-composer ac_add_options --disable-profilesharing # End official slackbuild opts ########################################: stuff I'm 98% sure always works: ac_add_options --with-gxx-include-dir=/usr/include/c++/4.7.1 ac_add_options --quiet ac_add_options --with-system-bz2 ac_add_options --with-pthreads ac_add_options --enable-threads=posix ac_add_options --enable-system-lcms ac_add_options --disable-system-sqlite #enable breaks build in packaging state... ac_add_options --enable-pango ac_add_options --enable-install-strip ac_add_options --disable-updater ac_add_options --disable-gnomeui ac_add_options --disable-gnomevfs ########################################: stuff I'm 95% sure works fine: #ac_add_options --enable-libxul #ac_add_options --with-system-jpeg #ac_add_options --with-system-nssac_add_options ac_add_options --disable-crashreporter ac_add_options --disable-help-viewer ac_add_options --disable-debug-modules ac_add_options --disable-debugger-info-modules ac_add_options --disable-parental-controls ac_add_options --disable-safe-browsing ac_add_options --disable-startup-notification ########################################: Completely Experimental below.. ########################################: Questionable/Optional stuff ########################################: that may, or just may not work: #ac_add_options --enable-javaxpcom #ac_add_options --enable-oji #ac_add_options --enable-xpcom-fastload #ac_add_options --enable-plugins #ac_add_options --enable-jemalloc #ac_add_options --enable-mathml #ac_add_options --disable-xpcom-obsolete #ac_add_options --enable-svg-foreignobject # ac_add_options --enable-chrome-format=jar # ac_add_options --enable-native-uconv # not needed/not recommended # ac_add_options --enable-image-encoders=all # should not need # ac_add_options --enable-update-channel=release # needed by moz.org people only? # ac_add_options --enable-prebinding # OSX only? # ac_add_options --enable-reflow-perf # try without.. may slow down FF for non-devel user? ac_add_options --enable-glitz # this thing won't install into lib64 # END of mozconfig file EOF # /mozconfig ####################################################### # configure the sources: cd $OBJDIR echo ; echo "Info: Running configure in 5" ; sleep 5 $SRCDIR/configure || exit 1 # make the sources: cd $SRCDIR #disabled because would not produce a real pgo build! #see bottom: https://groups.google.com/forum/?fromgroups=#!topic/mozilla.dev.builds/VeR2zDtQ0qM #echo ; echo "Info: Starting non-PGO build in 5" ; sleep 5 #make -s -f client.mk build MOZ_MAKE_FLAGS="${MAKEFLAGS}" || exit 1 # make PGO build in same objdir, on top of what's already built: #echo ; echo "Info: Done non-PGO build... Continuing in 5" ; sleep 5 make -s -f client.mk profiledbuild MOZ_MAKE_FLAGS="${MAKEFLAGS}" || exit 1 # Here is when the profiling build should fire up. Use it for a while, # do some browsing, give it a hard time; sometimes a bad build will # run for 5, 10 or 15 minutes until it hits a snag, bug, segfault # or whatever, so you want to make it happen NOW, not when you've # got 25 tabs open tomorrow and the whole thing locks up on you. # When you're done, and confident that the browser is stable, # click File->Quit and the build will resume. # OPTIONS HERE (functions): make_tarball () { # make tarball: This makes a generic tarball of the newly # compiled Firefox and related components, and zips it up # into a bzip2 archive. You can then do what you like with # it, such as install it manually, or just unpack it somewhere # and use it as-is. # Package it into a tarball to fix symlinks & gather all pieces: ( cd $OBJDIR echo ; echo "Info: Packaging tarball in 5" ; sleep 5 make package ) || exit 1 #move tarball to $CWD (start directory) ( cd $PKGDIR cp -fvt . $OBJDIR/dist/$APP-$VERSION.$EXTENSION-$ARCH.tar.bz2 ) || exit 1 cd $CWD # Now do what you want with the finished tarball in $PKGDIR. } # 2) make slackpkg: make_slackpkg () { # make a slackware package according to the general idea # of what happens in the Slack13.0/64 SlackBuild script: ( cd $OBJDIR echo ; echo "Info: Creating slackpkg dir structure in 5" ; sleep 5 make install DESTDIR=$TMP # We don't need these things: rm -Rf $TMP/usr/$LIBDIR/$APP-devel-$VERSION rm -Rf $TMP/usr/include ) #useless #fails mimeTypes, plugin_path useless since 7.x #( cd $TMP/usr/$LIBDIR/$APP-$VERSION # zcat $CWD/mimeTypes.rdf > defaults/profile/mimeTypes.rdf || exit 1 # zcat $CWD/firefox.moz_plugin_path.diff.gz \ # | sed -e "s#usr/lib#usr/$LIBDIR#g" \ # | patch -p1 --verbose --backup --suffix=.orig || exit 1 # # Clean up if the above patch was successful: # # On my system, that patch is successful, but a bit fuzzy :/ # rm -f firefox.orig #) || exit 1 mkdir -p $TMP/usr/$LIBDIR/mozilla/plugins mkdir -p $TMP/usr/share/applications cat $CWD/mozilla-$APP.desktop > $TMP/usr/share/applications/mozilla-$APP.desktop mkdir -p $TMP/usr/share/pixmaps cat $CWD/$APP.png > $TMP/usr/share/pixmaps/$APP.png # These files/directories are usually created if Firefox is run # as root which technically should be never. Anyhow, if we don't # see these items, put stubbies in place (whatever those are) to # prevent startup errors: ( cd $TMP/usr/$LIBDIR/$APP-$VERSION 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 ) # Install icons/imgs/license/slack-desc: mkdir -p $TMP/usr/$LIBDIR/$APP-$VERSION/chrome/icons/default install -m 644 $SRCDIR/browser/branding/official/default16.png $TMP/usr/$LIBDIR/$APP-$VERSION/icons/ install -m 644 $SRCDIR/browser/branding/official/default16.png $TMP/usr/$LIBDIR/$APP-$VERSION/chrome/icons/default/ install -p -c -m 644 $SRCDIR/LICENSE $TMP/usr/$LIBDIR/$APP-$VERSION/ mkdir $TMP/install cat $CWD/slack-desc > $TMP/install/slack-desc if [ -e $TMP/usr/share/idl/$APP-$VERSION/.mkdir.done ]; then rm -f $TMP/usr/share/idl/$APP-$VERSION/.mkdir.done fi cd $TMP # whip up the Slackpackage: echo "Ready to zip up the slackpkg." echo "1) su to root." echo "2) Make sure you are in this folder: $TMP" echo "3) Now, as root, type:" echo "chown -R root:root ." echo "makepkg -l y -c y $PKGDIR/mozilla-$APP-$VERSION-$ARCH-$BUILD.txz" } # end of make_slackpkg() #NOTE: Below here, uncomment whichever function-call you # plan to use: either "make_slackpkg" or "make_tarball" # You can probably do both if you have some reason to do so.. #make_tarball make_slackpkg #EOF