more gnome-common cleanups



One of the other parts of gnome-common that has been slowing down upgrades to newer automakes is the autogen.sh script, which is currently hard coded to call automake-1.4. To help get rid of this impediment, I have rewritten a lot of the autogen.sh script to help make upgrades smoother.

With this new version, you can add a line like the following to your autogen.sh (before sourcing gnome-autogen.sh) to select a different minimum automake version:
  REQUIRED_AUTOMAKE_VERSION = 1.6.3

The new features in this version include:

   * perform version checks on tools, so that it dies early if the
     tools are too old.  Minimum versions of tools are stored in the
     common autogen.sh portion, but can be overridden in a package's
     local autogen.sh.
* when checking for a tool, it can search under multiple names. Currently this is just used to handle automake. For automake, I
     use the following rules to decide which executable names to check:
         o if required version is 1.4, check "automake-1.4"
         o if required version is 1.5.x, check "automake 1.7
           automake-1.6 automake-1.5"
         o if required version is 1.6.x, check "automake 1.7 automake-1.6"
         o if required version is 1.7.x, check "automake 1.7"
   * allow checks to make sure that certain m4 macro files are in the
     aclocal path.  This is done so that we can exit early if some
     macros are missing, rather than continuing until we get a syntax
     error while running configure.  Judging from past experience, this
     should reduce the number of bug reports and requests for help on
     #gnome from people who haven't set up their CVS build environment
     correctly.

Before checking in on the head branch, I will change the default required versions down to automake-1.4, libtool-1.4.2, and an older autoconf (so that nothing breaks straight away), but we should bump the defaults up at some point during 2.3 development to match the standard versions of build tools we decide to use.

Any comments on the shell code?

James.

--
Email: james daa com au
WWW:   http://www.daa.com.au/~james/


#!/bin/sh
# Run this to generate all the initial makefiles, etc.

#name of package
PACKAGE=${PACKAGE:-Program}
srcdir=${srcdir:-.}

# default version requirements ...
REQUIRED_AUTOCONF_VERSION=${REQUIRED_AUTOCONF_VERSION:-2.57}
REQUIRED_AUTOMAKE_VERSION=${REQUIRED_AUTOMAKE_VERSION:-1.7.2}
REQUIRED_LIBTOOL_VERSION=${REQUIRED_LIBTOOL_VERSION:-1.4.3}
REQUIRED_GETTEXT_VERSION=${REQUIRED_GETTEXT_VERSION:-0.10.40}
REQUIRED_GLIB_GETTEXT_VERSION=${REQUIRED_GLIB_GETTEXT_VERSION:-2.2.0}
REQUIRED_INTLTOOL_VERSION=${REQUIRED_INTLTOOL_VERSION:-0.22}
REQUIRED_PKG_CONFIG_VERSION=${REQUIRED_PKG_CONFIG_VERSION:-0.14.0}
REQUIRED_GTK_DOC_VERSION=${REQUIRED_GTK_DOC_VERSION:-1.0}

# a list of required m4 macros.  Package can set an initial value
REQUIRED_M4MACROS=${REQUIRED_M4MACROS:-}

# if GNOME2_DIR set, modify ACLOCAL_FLAGS ...
if [ -n "$GNOME2_DIR" ]; then
    ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS"
    LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH"
    PATH="$GNOME2_DIR/bin:$PATH"
    export PATH
    export LD_LIBRARY_PATH
fi


# some terminal codes ...
boldface="`tput bold 2>/dev/null`"
normal="`tput sgr0 2>/dev/null`"
printbold() {
    echo -n "$boldface"
    echo "$@"
    echo -n "$normal"
}    
printerr() {
    echo "$@" >&2
}

# Usage:
#     compare_versions MIN_VERSION ACTUAL_VERSION
# returns true if ACTUAL_VERSION >= MIN_VERSION
compare_versions() {
    local min_version actual_version status save_IFS cur min
    min_version=$1
    actual_version=$2
    status=0
    IFS="${IFS=         }"; save_IFS="$IFS"; IFS="."
    set $actual_version
    for min in $min_version; do
        cur=`echo $1 | sed 's/[^0-9].*$//'`; shift # remove letter suffixes
        if [ -z "$min" ]; then break; fi
        if [ -z "$cur" ]; then status=1; break; fi
        if [ $cur -gt $min ]; then break; fi
        if [ $cur -lt $min ]; then status=1; break; fi
    done
    IFS="$save_IFS"
    return $status
}

# Usage:
#     version_check PACKAGE VARIABLE CHECKPROGS MIN_VERSION SOURCE
# checks to see if the package is available
version_check() {
    local package variable checkprogs min_version source status checkprog actual_version
    package=$1
    variable=$2
    checkprogs=$3
    min_version=$4
    source=$5
    status=1

    printbold "checking for $package >= $min_version..."
    for checkprog in $checkprogs; do
	echo -n "  testing $checkprog... "
	if $checkprog --version < /dev/null > /dev/null 2>&1; then
	    actual_version=`$checkprog --version | head -1 | \
                               sed 's/^.*[ 	]\([0-9.]*[a-z]*\).*$/\1/'`
	    if compare_versions $min_version $actual_version; then
		echo "found."
		# set variable
		eval "$variable=$checkprog"
		status=0
		break
	    else
		echo "too old (found version $actual_version)"
	    fi
	else
	    echo "not found."
	fi
    done
    if [ "$status" != 0 ]; then
	printerr "***Error***: You must have $package >= $min_version installed"
	printerr "  to build $PKG_NAME.  Download the appropriate package for"
	printerr "  from your distribution or get the source tarball at"
        printerr "    $source"
	printerr
    fi
    return $status
}

# Usage:
#     require_m4macro filename.m4
# adds filename.m4 to the list of required macros
require_m4macro() {
    case "$REQUIRED_M4MACROS" in
	$1\ * | *\ $1\ * | *\ $1) ;;
	*) REQUIRED_M4MACROS="$REQUIRED_M4MACROS $1" ;;
    esac
}

# Usage:
#     check_m4macros
# Checks that all the requested macro files are in the aclocal macro path
# Uses REQUIRED_M4MACROS and ACLOCAL variables.
check_m4macros() {
    local macrodirs status macro dir macrofound

    if [ -z "$REQUIRED_M4MACROS" ]; then
	return 0
    fi
    # construct list of macro directories
    macrodirs="`$ACLOCAL --print-ac-dir`"
    set - $ACLOCAL_FLAGS
    while [ $# -gt 0 ]; do
	if [ "$1" = "-I" ]; then
	    macrodirs="$macrodirs $2"
	    shift
	fi
	shift
    done

    status=0
    printbold "Checking for required M4 macros..."
    # check that each macro file is in one of the macro dirs
    for macro in $REQUIRED_M4MACROS; do
	macrofound=false
	for dir in $macrodirs; do
	    if [ -f "$dir/$macro" ]; then
		macrofound=true
		break
	    fi
	done
	if $macrofound; then
	    :
	else
	    printerr "  $macro not found"
	    status=1
	fi
    done
    if [ "$status" != 0 ]; then
	printerr "***Error***: some autoconf macros required to build $PKG_NAME"
	printerr "  were not found in your aclocal path.  Perhaps you need to"
	printerr "  adjust your ACLOCAL_PATH?"
        printerr "    $source"
	printerr
    fi
    return $status
}

want_autoconf=true
want_automake=true
want_libtool=false
want_gettext=false
want_glib_gettext=false
want_intltool=false
want_pkg_config=false
want_gtk_doc=false

configure_files="`find $srcdir -name configure.ac -print -or -name configure.in -print`"
for configure_ac in $configure_files; do
    if grep "^A[CM]_PROG_LIBTOOL" $configure_ac >/dev/null; then
	want_libtool=true
    fi
    if grep "^AM_GNU_GETTEXT" $configure_ac >/dev/null; then
	want_gettext=true
    fi
    if grep "^AM_GLIB_GNU_GETTEXT" $configure_ac >/dev/null; then
	want_glib_gettext=true
    fi
    if grep "^AC_PROG_INTLTOOL" $configure_ac >/dev/null; then
	want_intltool=true
    fi
    if grep "^PKG_CHECK_MODULES" $configure_ac >/dev/null; then
	want_pkg_config=true
    fi
    if grep "^GTK_DOC_CHECK" $configure_ac >/dev/null; then
	want_gtk_doc=true
    fi
done

DIE=0

if $want_autoconf; then
    version_check autoconf AUTOCONF 'autoconf autoconf-2.53' $REQUIRED_AUTOCONF_VERSION \
        "http://ftp.gnu.org/pub/gnu/autoconf/autoconf-$REQUIRED_AUTOCONF_VERSION.tar.gz"; || DIE=1
    AUTOHEADER=`echo $AUTOCONF | sed s/autoconf/autoheader/`
fi
if $want_automake; then
    case $REQUIRED_AUTOMAKE_VERSION in
	1.4*) automake_progs="automake-1.4" ;;
	1.5*) automake_progs="automake-1.7 automake-1.6 automake-1.5" ;;
	1.6*) automake_progs="automake-1.7 automake-1.6" ;;
	1.7*) automake_progs="automake-1.7" ;;
    esac
    version_check automake AUTOMAKE "$automake_progs" $REQUIRED_AUTOMAKE_VERSION \
        "http://ftp.gnu.org/pub/gnu/automake/automake-$REQUIRED_AUTOMAKE_VERSION.tar.gz"; || DIE=1
    ACLOCAL=`echo $AUTOMAKE | sed s/automake/aclocal/`
fi
if $want_libtool; then
    version_check libtool LIBTOOLIZE libtoolize $REQUIRED_LIBTOOL_VERSION \
        "http://ftp.gnu.org/pub/gnu/libtool/libtool-$REQUIRED_LIBTOOL_VERSION.tar.gz"; || DIE=1
    require_m4macro libtool.m4
fi
if $want_gettext; then
    version_check gettext GETTEXTIZE gettextize $REQUIRED_GETTEXT_VERSION \
        "http://ftp.gnu.org/pub/gnu/gettext/gettext-$REQUIRED_GETTEXT_VERSION.tar.gz"; || DIE=1
    require_m4macro gettext.m4
fi
if $want_glib_gettextize; then
    version_check glib-gettext GLIB_GETTEXTIZE glib-gettextize $REQUIRED_GLIB_GETTEXT_VERSION \
        "ftp://ftp.gtk.org/pub/gtk/v2.2/glib-$REQUIRED_GLIB_GETTEXT_VERSION.tar.gz"; || DIE=1
    require_m4macro glib-gettext.m4
fi
if $want_intltool; then
    version_check intltool INTLTOOLIZE intltoolize $REQUIRED_INTLTOOL_VERSION \
        "http://ftp.gnome.org/pub/GNOME/sources/intltool/"; || DIE=1
    require_m4macro intltool.m4
fi
if $want_pkg_config; then
    version_check pkg-config PKG_CONFIG pkg-config $REQUIRED_PKG_CONFIG_VERSION \
        "'http://www.freedesktop.org/software/pkgconfig/releases/pkgconfig-$REQUIRED_PKG_CONFIG_VERSION.tar.gz"; || DIE=1
    require_m4macro pkg.m4
fi
if $want_gtk_doc; then
    version_check gtk-doc GTKDOCIZE gtkdocize $REQUIRED_GTK_DOC_VERSION \
        "http://ftp.gnome.org/pub/GNOME/sources/gtk-doc/"; || DIE=1
    require_m4macro gtk-doc.m4
fi

check_m4macros || DIE=1

if [ "$DIE" -eq 1 ]; then
  exit 1
fi

if test -z "$*"; then
  printerr "**Warning**: I am going to run \`configure' with no arguments."
  printerr "If you wish to pass any to it, please specify them on the"
  printerr \`$0\'" command line."
  printerr
fi

for configure_ac in $configure_files; do 
    dirname=`dirname $configure_ac`
    basename=`basename $configure_ac`
    if test -f $dirname/NO-AUTO-GEN; then
	echo skipping $dirname -- flagged as no auto-gen
    else
	printbold "Processing $dirname"
	(   cd $dirname

	    aclocalinclude="$ACLOCAL_FLAGS"
	    printbold "Running $ACLOCAL..."
	    $ACLOCAL $aclocalinclude || exit 1

	    if grep "^A[CM]_PROG_LIBTOOL" $basename >/dev/null; then
		printbold "Running $LIBTOOLIZE..."
		$LIBTOOLIZE --force || exit 1
	    fi
	    if grep "^AM_GLIB_GNU_GETTEXT" $basename >/dev/null; then
		printbold "Running $GLIB_GETTEXTIZE... Ignore non-fatal messages."
		echo "no" | $GLIB_GETTEXTIZE --force --copy || exit 1
	    elif grep "^AM_GNU_GETTEXT" $basename >/dev/null; then
		printbold "Running $GETTEXTIZE... Ignore non-fatal messages."
		echo "no" | $GETTEXTIZE --force --copy || exit 1
	    fi
	    if grep "^AC_PROG_INTLTOOL" $basename >/dev/null; then
		printbold "Running $INTLTOOLIZE..."
		$INTLTOOLIZE --force --automake || exit 1
	    fi
	    if grep "^GTK_DOC_CHECK" $basename >/dev/null; then
		printbold "Running $GTKDOCIZE..."
		$GTKDOCIZE || exit 1
	    fi
	    if grep "^A[CM]_CONFIG_HEADER" $basename >/dev/null; then
		printbold "Running $AUTOHEADER..."
		$AUTOHEADER || exit 1
	    fi

	    printbold "Running $AUTOMAKE..."
	    $AUTOMAKE --gnu --add-missing || exit 1

	    printbold "Running $AUTOCONF..."
	    $AUTOCONF -W obsolete || exit 1
	)
    fi
done

conf_flags="--enable-maintainer-mode --enable-compile-warnings"

if test x$NOCONFIGURE = x; then
    printbold Running $srcdir/configure $conf_flags "$@" ...
    $srcdir/configure $conf_flags "$@" \
	&& echo Now type \`make\' to compile $PKG_NAME || exit 1
else
    echo Skipping configure process.
fi


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]