#!/bin/sh #- # Copyright (c) 2004-2005 FreeBSD GNOME Team # Copyright (c) 2011 FreeBSD Gecko Team # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR 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. # # Heh. "Tort." # # $Gecko$ # $MCom: portstools/gnomelogalyzer.sh.in,v 1.12 2005/06/28 05:47:54 adamw Exp $ # $FreeBSD: www/en/gnome/gnomelogalyzer.sh,v 1.9 2007/02/05 01:37:28 pav Exp $ # # This script uses some simple yet effective heuristics to analyse # the output of a port's build failure, and spit out what is most # likely the problem and the solution. (Hint: the solution is invariably # to run portmaster -a, except for when it isn't.) # You can set the environment variable VERBOSE to something non-null # to see debugging messages. They're probably not all that exciting. help(){ echo "Usage: `basename $0` [BUILDLOG]" echo echo "Where BUILDLOG is an optional log of stdout and stderr" echo "from a failed Gecko ports build. For example," echo "\"make 2>&1 | tee /path/to/BUILDLOG\" (for sh/ksh/bash/zsh) or" echo "\"make |& tee /path/to/BUILDLOG\" (for csh/tcsh)." echo echo "You can also just run `basename $0` and it will take care" echo "of the buildlog-generating business." } debug(){ if [ -n "${VERBOSE}" ]; then if [ "$1" = "-n" ]; then echo -n "$2" else echo "$1" fi fi } # Are we blue in the face yet? soln_portmaster(){ if echo "$1" | grep -q "^-f" ; then echo echo "To correct this problem, make sure that ports-mgmt/portmaster is installed, and then run the command \"portmaster $1\"." | fmt 75 79 else if [ -n "$1" ]; then specific="either run \"portmaster $1\", or " fi echo echo "To correct this problem, make sure that ports-mgmt/portmaster is installed, and then ${specific}upgrade all out-of-date ports with the command \"portmaster -a\"." | fmt 75 79 fi } get_tmpdir() { if [ -n "${MC_TMPDIR}" -a -d "${MC_TMPDIR}" ]; then tmpdir="${MC_TMPDIR}" elif [ -n "${TMPDIR}" -a -d "${TMPDIR}" ]; then tmpdir="${TMPDIR}" elif [ -d "/var/tmp" ]; then tmpdir="/var/tmp" elif [ -d "/tmp" ]; then tmpdir="/tmp" elif [ -d "/usr/tmp" ]; then tmpdir="/usr/tmp" else return 1 fi echo ${tmpdir} return 0 } get_tmpfile() { template=$1 tmpfile="" tmpfile="`get_tmpdir`/${template}.XXXXXX" tmpfile=`mktemp -q ${tmpfile}` echo ${tmpfile} return 0 } ########### # # main() debug -n "geckologalyzer ($0), ver. " debug `echo '$Gecko$' | cut -f3 -d' '` echo; # for good measure. # check if ident is available if [ ! -f /usr/bin/ident ]; then echo "Error: ident not available". help exit 1 fi # check to make sure that the build log has been specified if [ ! -z "$1" ]; then if [ ! -f "$1" ]; then echo "Error: Please supply a valid build log." help exit 1 fi buildlog="$1" else if [ ! -f ./Makefile ]; then echo "Error: You must run `basename $0` from within the" echo "directory of the failed port, or you must supply a" echo "valid build log." help exit 1 fi buildlog=`get_tmpfile logalyze` echo -n "Generating build log. Please wait... " if [ -n "${VERBOSE}" ]; then /bin/sh -c "/usr/bin/make 2>&1" | tee ${buildlog} else /bin/sh -c "/usr/bin/make 2>&1" >> ${buildlog} fi echo "done." echo "" fi PORTSDIR=`make -V PORTSDIR` ###### # # TEST: Old bsd.port.mk version # # SOLUTION: Update ports tree debug -n "Checking bsd.port.mk version... " if [ `ident ${PORTSDIR}/Mk/bsd.port.mk | grep FreeBSD | awk '{ print $3 }' | sed 's/\.//'` -lt 1673 ] ; then echo "You have an outdated ports tree. Update your ports tree." exit else debug "OK" fi ###### # # TEST: Old bsd.gecko.mk version # # SOLUTION: Update ports tree debug -n "Checking bsd.gecko.mk version... " if [ `ident ${PORTSDIR}/Mk/bsd.gecko.mk | grep FreeBSD | awk '{ print $3 }' | sed 's/\.//'` -lt 126 ] ; then echo "You have an outdated ports tree. Update your ports tree." exit else debug "OK" fi ###### # # TEST: Invalid nspr version # # SOLUTION: portmaster nspr debug -n "Checking nspr version... " if grep -q 'error: --with-system-nspr and --with-nspr-libs/cflags are mutually exclusive.' ${buildlog} ; then echo "You have an outdated version of nspr installed." soln_portmaster "nspr" exit else debug "OK" fi ###### # # TEST: Invalid cairo version # # SOLUTION: portmaster cairo debug -n "Checking cairo version... " if grep -q 'Package cairo-tee was not found in the pkg-config search path' ${buildlog} ; then echo "You have an outdated version of cairo installed." soln_portmaster "cairo" exit else debug "OK" fi ##### # # Catch-all # debug "Giving up..." echo "The cause of your build failure is not known to `basename $0`. Before e-mailing the build log to the FreeBSD Gecko team at gecko@FreeBSD.org, TRY EACH OF THE FOLLOWING:" | fmt 75 79 echo echo " * If you are generating your own logfile, make sure to generate it with" echo " something similar to:" echo " \"make 2>&1 | tee /path/to/logfile\" (sh/bash/ksh/zsh) or" echo " \"make |& tee /path/to/logfile\" (csh/tcsh)" echo " * c(v)sup users: Make sure your cvsup(1) configuration file specifies" echo " the 'ports-all' collection" echo " * Run cvsup(1)/csup(1) or portsnap(8) and attempt the build again" echo " * Check /usr/ports/UPDATING for information pertinent to your build" echo " failure" echo " * 99% of the commonly reported build failures can be solved by" echo " running \"portmaster -a\"" echo " * Search the archives of freebsd-gecko@FreeBSD.org" echo echo "If you have not performed each of the above suggestions, don't bother asking for help. The chances are good that you'll simply be told to perform one of the aforementioned steps." | fmt 75 79 exit # Here there be tacos.