#! /bin/sh

# bootstrap (GNU M4) version 2008-04-15
# Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
# This is free software: you are free to change and redistribute it.
# There is NO WARRANTY, to the extent permitted by law.

# Written by Gary V. Vaughan  <gary@gnu.org>

# This file is part of GNU M4.
#
# GNU M4 is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GNU M4 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Usage: $progname [options]

# -f      --force            bootstrap even when sources are not from git
# -p ARG  --download-po=ARG  whether to download pofiles [yes]
# -v      --version          print version information
# -h,-?   --help             print short or long help message

# For --download-po, ARG can also be `no' to skip pofile downloads,
# `only' to just update pofiles, or a set of locales to add or update.

# You can also set the following variables to help $progname
# locate the right tools:
#   AUTOPOINT, AUTORECONF, AWK, GNULIB_TOOL, LIBTOOLIZE, M4, RM, SED, WGET

# This script bootstraps a git or CVS checkout of GNU M4 by correctly calling
# out to parts of the GNU Build Platform.  Currently this requires GNU
# Gettext 0.16 or better, Autoconf 2.62 or better, GNU M4 1.4.5 or better,
# Automake 1.10.1 or better, Libtool 2.2 or better,
# and the latest git or CVS checkout of Gnulib.
# Libtool must be installed; either with the same --prefix as
# automake, or made accessible to aclocal's search path via
# $AUTOMAKE_prefix/share/aclocal/dirlist.

# Report bugs to <bug-m4@gnu.org>

: ${AUTOPOINT=autopoint}
: ${AUTORECONF=autoreconf}
: ${AWK=awk}
: ${GNULIB_TOOL=gnulib-tool}
: ${LIBTOOLIZE=libtoolize}
: ${M4=m4}
: ${RM=rm -f}
: ${SED=sed}
: ${WGET=wget}
export WGET

: ${DOWNLOAD_PO=yes}

# Ensure file names are sorted consistently across platforms.
# Also, ensure diagnostics are in English, e.g., "wget --help" below.
LC_ALL=C
export LC_ALL

package=m4
ltdldir=ltdl
config_aux_dir=build-aux
config_macro_dir=$ltdldir/m4
bailout_cb=:

# List dependencies here too; we don't extract them, otherwise dependent
# modules could end up being imported to src/ *and* gnu/!
src_modules='getopt version-etc-fsf version-etc xstrtol'

dirname="s,/[^/]*$,,"
basename="s,^.*/,,g"

# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath="$0"

# The name of this program:
progname=`echo "$progpath" | $SED "$basename"`
PROGRAM=bootstrap

# Detect whether this is a version control system checkout or a tarball
vcs_only_file=HACKING

# func_echo arg...
# Echo program name prefixed message.
func_echo ()
{
    echo $progname: ${1+"$@"}
}

# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
    echo $progname: ${1+"$@"} >&2
}

# func_fatal_error arg...
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
    func_error ${1+"$@"}
    exit $EXIT_FAILURE
}

# func_verbose arg...
# Echo program name prefixed message in verbose mode only.
func_verbose ()
{
    $opt_verbose && func_error ${1+"$@"}
}

# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
   func_error "missing argument for $1"
   exit_cmd=exit
}

# func_fatal_help arg...
# Echo program name prefixed message to standard error, followed by
# a help hint, and exit.
func_fatal_help ()
{
    func_error ${1+"$@"}
    func_fatal_error "Try \`$progname --help' for more information."
}

# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
   func_error "missing argument for $1"
   exit_cmd=exit
}

# func_usage
# Echo short help message to standard output and exit.
func_usage ()
{
    $SED '/^# Usage:/,/# -h/ {
	s/^# //; s/^# *$//;
	s/\$progname/'$progname'/;
	p;
    }; d' < "$progpath"
    echo
    echo "run \`$progname --help | more' for full usage"
    exit $EXIT_SUCCESS
}

# func_help
# Echo long help message to standard output and exit.
func_help ()
{
    $SED '/^# Usage:/,/# Report bugs to/ {
	s/^# //; s/^# *$//;
	s/\$progname/'$progname'/;
	p;
     }; d' < "$progpath"
    exit $EXIT_SUCCESS
}

# func_version
# Echo version message to standard output and exit.
func_version ()
{
    $SED '/^# '$PROGRAM' (GNU /,/# Written by / {
	s/^# //;
	s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/;
	p;
     }; d' < "$progpath"
     exit $EXIT_SUCCESS
}

# func_update
# Copy $1 to $2 if it is newer.
func_update ()
{
  if test -f "$2" && cmp -s "$1" "$2" ; then
    func_verbose "$2 is up-to-date"
  else
    func_echo "copying $1 -> $2"
    cp "$1" "$2"
  fi
}

# Parse options once, thoroughly.  This comes as soon as possible in
# the script to make things like `bootstrap --version' happen quickly.
{
  # sed scripts:
  my_sed_single_opt='1s/^\(..\).*$/\1/;q'
  my_sed_single_rest='1s/^..\(.*\)$/\1/;q'
  my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
  my_sed_long_arg='1s/^--[^=]*=//'

  # this just eases exit handling
  while test $# -gt 0; do
    opt="$1"
    shift
    case $opt in
      -p|--download-po)
			test $# = 0 && func_missing_arg $opt && break
			case $1 in
			  0|[Nn]*|[Ff]*) DOWNLOAD_PO=no ;;
			  [Oo]*)	 DOWNLOAD_PO=only ;;
			esac
			;;

      # Separate optargs to long options:
      --download-po=*)
			arg=`echo "$opt" | $SED "$my_sed_long_arg"`
			opt=`echo "$opt" | $SED "$my_sed_long_opt"`
			set -- "$opt" "$arg" ${1+"$@"}
			;;

      # Separate optargs to short options:
      -p*)
			arg=`echo "$opt" |$SED "$my_sed_single_rest"`
			opt=`echo "$opt" |$SED "$my_sed_single_opt"`
			set -- "$opt" "$arg" ${1+"$@"}
			;;

      -f|--force)	vcs_only_file=					;;
      -\?|-h)		func_usage					;;
      --help)		func_help					;;
      --version)	func_version					;;
      --)		break						;;
      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
      *)		set -- "$opt" ${1+"$@"};	break		;;
    esac
  done

  # Bail if the options were screwed
  $exit_cmd $EXIT_FAILURE

  if test -n "$vcs_only_file" && test ! -r "$vcs_only_file"; then
    func_fatal_error \
      "Bootstrapping from a non-version-control distribution is risky."
  fi
}

## ------------------------------ ##
## Fetch translations.            ##
## (taken from GNU tar bootstrap) ##
## ------------------------------ ##

func_get_translations()
{
  subdir=$1
  domain=$2
  po_file=$3

  url=http://translationproject.org/domain/$2.html
  baseurl=`expr "$url" : '\(.*\)/.*'`

  func_echo "getting translations into $subdir for $domain..."

  case $po_file in
    '') (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`);;
  esac &&

  $WGET -nv --cache=off -O "$subdir/$domain.html" "$url" &&

  sed -n 's|.*href="\(.*\)/\([^/][^/]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\2:\3:\1|p' <"$subdir/$domain.html" |
  sort -t: -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
  $AWK -F: '
    { if (lang && $1 != lang) print lang, ver, subdir }
    { lang = $1; ver = $2; subdir = $3 }
    END { if (lang) print lang, ver, subdir }
  ' | $AWK -v domain="$domain" -v po_file="$po_file" -v baseurl="$baseurl" -v subdir="$subdir" '
    {
      lang = $1
      if (po_file == (lang ".po")) next

      ver = $2
      urlfmt = ""
      printf "$WGET -nv --cache=off -O %s/%s.po %s/%s/%s/%s-%s.%s.po &&\n", subdir, lang, baseurl, $3, lang, domain, ver, lang
    }
    END { print ":" }
  ' |
  sh &&
  ls "$subdir"/*.po | sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
  rm "$subdir/$domain.html"
}

## ------------------------------ ##
## Update translations.           ##
## (taken from GNU tar bootstrap) ##
## ------------------------------ ##

func_update_po ()
{
    if test $# = 1; then
      case $1 in
	*.po)  POFILE=$1    ;;
	*)     POFILE=$1.po ;;
      esac
      func_get_translations ./po $package "$POFILE" &&
      LANG=`expr $POFILE : '\(.*\)\.po'` &&
      { grep -q $LANG po/LINGUAS ||
	(echo $LANG; cat po/LINGUAS) | sort -o po/LINGUAS; }
    else
      func_get_translations ./po $package
    fi
}

case $DOWNLOAD_PO in
  no)   ;;
  only) func_update_po; exit 0 ;;
  yes)  func_update_po ;;
  *)    func_update_po $DOWNLOAD_PO ;;
esac

## ---------------- ##
## Version control. ##
## ---------------- ##

# gnulib-tool updates ltdl/m4/.{git,cvs}ignore and gnu/.{git,cvs}ignore, and
# keeping generated files under version control does not make sense.  Since
# gnu is entirely ignored, we only need to prepopulate the ltdl/m4 ignore
# files with generated files not tracked by gnulib-tool.
if test -f $config_macro_dir/.gitignore ; then
  :
else
  func_echo "creating initial $config_macro_dir/.cvsignore"
  cat > $config_macro_dir/.cvsignore <<\EOF
# files created by gnulib, but that gnulib doesn't track
*~
.cvsignore
.gitignore
gnulib-comp.m4
# files manually imported, rather than using gnulib-tool
getopt.m4
xstrtol.m4
# files created by autopoint
codeset.m4
gettext.m4
glibc2.m4
glibc21.m4
iconv.m4
intdiv0.m4
intl.m4
intldir.m4
intmax.m4
inttypes-pri.m4
inttypes_h.m4
lcmessage.m4
lib-ld.m4
lib-link.m4
lib-prefix.m4
lock.m4
longdouble.m4
longlong.m4
nls.m4
po.m4
printf-posix.m4
progtest.m4
size_max.m4
stdint_h.m4
uintmax_t.m4
ulonglong.m4
visibility.m4
wchar_t.m4
wint_t.m4
xsize.m4
# files created by libtoolize
argz.m4
libtool.m4
ltdl.m4
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4
# gnulib-tool edits below here
EOF
  func_echo "creating initial $config_macro_dir/.gitignore"
  cp $config_macro_dir/.cvsignore $config_macro_dir/.gitignore
fi

# See if we can use gnulib's git-merge-changelog merge driver.
if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
  if git config merge.merge-changelog.driver >/dev/null ; then
    :
  elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
    func_echo "initializing git-merge-changelog driver"
    git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
    git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
  else
    func_echo "consider installing git-merge-changelog from gnulib"
  fi
fi

## ---------- ##
## Autopoint. ##
## ---------- ##

# Released autopoint has the tendency to install macros that have been
# obsoleted in current gnulib, so run this before gnulib-tool.
func_echo "running: $AUTOPOINT --force"
$AUTOPOINT --force

## ----------- ##
## Libtoolize. ##
## ----------- ##

# Autoreconf runs aclocal before libtoolize, which causes spurious
# warnings if the initial aclocal is confused by the libtoolized
# (or worse out-of-date) macro directory.
func_echo "running: $LIBTOOLIZE --force --copy --install"
${LIBTOOLIZE} --force --copy --install

## ---------------------------- ##
## Find the gnulib module tree. ##
## ---------------------------- ##

case $GNULIB_TOOL in
    /*  )  gnulibdir=$GNULIB_TOOL ;;		# absolute
    */* )  gnulibdir=`pwd`/$GNULIB_TOOL ;;	# relative
    *   )  gnulibdir=`which "$GNULIB_TOOL"` ;;	# PATH search
esac

# Follow symlinks
while test -h "$gnulibdir"; do

    # Resolve symbolic link.
    sedexpr1='s, -> ,#%%#,'
    sedexpr2='s,^.*#%%#\(.*\)$,\1,p'
    linkval=`ls -l "$gnulibdir" | $SED "$sedexpr1" | $SED -n "$sedexpr2"`
    test -n "$linkval" || break

    case "$linkval" in
	/* ) gnulibdir="$linkval" ;;
	* )  gnulibdir=`echo "$gnulibdir" | sed -e 's,/[^/]*$,,'`/"$linkval" ;;
    esac

done

gnulibdir=`echo "$gnulibdir" | $SED "$dirname"`


## ---------------------- ##
## Import Gnulib modules. ##
## ---------------------- ##

func_echo "running: ${GNULIB_TOOL} --update"
${GNULIB_TOOL} --update


## --------------------------------- ##
## Copy additional src only modules. ##
## --------------------------------- ##

func_echo "fetching modules for src directory"

for file in `${GNULIB_TOOL} --extract-filelist $src_modules`; do

    dest=`echo $file | $SED "$basename"`
    case $file in
	lib/*) dest=src/$dest ;;
	m4/*)  dest=$config_macro_dir/$dest ;;
	*)     func_echo "Unknown file: $file"
	       exit 1
	       ;;
    esac

    # Be sure to show all copying errors before bailing out
    if test -f $gnulibdir/$file; then
	func_echo "copying file \`$dest'"
	cp $gnulibdir/$file $dest
    else
	func_error "$gnulibdir/$file does not exist"
	bailout_cb="exit 1"
    fi
done
$bailout_cb


## ----------- ##
## Autoreconf. ##
## ----------- ##

# Disable autopoint and libtoolize, since they were already done above.
func_echo "running: AUTOPOINT=true LIBTOOLIZE=true " \
    "$AUTORECONF --force --verbose --install --no-recursive"
AUTOPOINT=true LIBTOOLIZE=true \
  $AUTORECONF --force --verbose --install --no-recursive


## ---------------------------------------- ##
## Gnulib is more up-to-date than automake. ##
## ---------------------------------------- ##

func_update "$gnulibdir"/build-aux/config.guess $config_aux_dir/config.guess
func_update "$gnulibdir"/build-aux/config.sub $config_aux_dir/config.sub
func_update "$gnulibdir"/build-aux/depcomp $config_aux_dir/depcomp
func_update "$gnulibdir"/build-aux/install-sh $config_aux_dir/install-sh
func_update "$gnulibdir"/build-aux/mdate-sh $config_aux_dir/mdate-sh
func_update "$gnulibdir"/build-aux/missing $config_aux_dir/missing
func_update "$gnulibdir"/build-aux/texinfo.tex $config_aux_dir/texinfo.tex
func_update "$gnulibdir"/build-aux/po/Makefile.in.in po/Makefile.in.in
func_update "$gnulibdir"/build-aux/po/remove-potcdate.sin po/remove-potcdate.sin
func_update "$gnulibdir"/doc/COPYINGv3 COPYING
func_update "$gnulibdir"/doc/INSTALL INSTALL


## ------- ##
## Wrapup. ##
## ------- ##

if test x"$DOWNLOAD_PO" != xno; then
  func_echo "If your pofiles are up-to-date, you can rerun bootstrap"
  func_echo "as \`DOWNLOAD_PO=no $progname' to avoid redownloading."
fi

exit 0

# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "# bootstrap (GNU M4) version "
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "$"
# End:
