1#! /bin/sh
2# Print a version string.
3scriptversion=2012-01-21.16; # UTC
4
5# Bootstrap this package from checked-out sources.
6
7# Copyright (C) 2003-2012 Free Software Foundation, Inc.
8
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18
19# You should have received a copy of the GNU General Public License
20# along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22# Originally written by Paul Eggert.  The canonical version of this
23# script is maintained as build-aux/bootstrap in gnulib, however, to
24# be useful to your project, you should place a copy of it under
25# version control in the top-level directory of your project.  The
26# intent is that all customization can be done with a bootstrap.conf
27# file also maintained in your version control; gnulib comes with a
28# template build-aux/bootstrap.conf to get you started.
29
30# Please report bugs or propose patches to bug-gnulib@gnu.org.
31
32nl='
33'
34
35# Ensure file names are sorted consistently across platforms.
36LC_ALL=C
37export LC_ALL
38
39local_gl_dir=gl
40
41me=$0
42
43usage() {
44  cat <<EOF
45Usage: $me [OPTION]...
46Bootstrap this package from the checked-out sources.
47
48Options:
49 --gnulib-srcdir=DIRNAME  specify the local directory where gnulib
50                          sources reside.  Use this if you already
51                          have gnulib sources on your machine, and
52                          do not want to waste your bandwidth downloading
53                          them again.  Defaults to \$GNULIB_SRCDIR
54 --bootstrap-sync         if this bootstrap script is not identical to
55                          the version in the local gnulib sources,
56                          update this script, and then restart it with
57                          /bin/sh or the shell \$CONFIG_SHELL
58 --no-bootstrap-sync      do not check whether bootstrap is out of sync
59 --copy                   copy files instead of creating symbolic links
60 --force                  attempt to bootstrap even if the sources seem
61                          not to have been checked out
62 --no-git                 do not use git to update gnulib.  Requires that
63                          --gnulib-srcdir point to a correct gnulib snapshot
64 --skip-po                do not download po files
65
66If the file $me.conf exists in the same directory as this script, its
67contents are read as shell variables to configure the bootstrap.
68
69For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
70are honored.
71
72Running without arguments will suffice in most cases.
73EOF
74}
75
76# Configuration.
77
78# Name of the Makefile.am
79gnulib_mk=gnulib.mk
80
81# List of gnulib modules needed.
82gnulib_modules=
83
84# Any gnulib files needed that are not in modules.
85gnulib_files=
86
87: ${AUTOPOINT=autopoint}
88: ${AUTORECONF=autoreconf}
89
90# A function to be called right after gnulib-tool is run.
91# Override it via your own definition in bootstrap.conf.
92bootstrap_post_import_hook() { :; }
93
94# A function to be called after everything else in this script.
95# Override it via your own definition in bootstrap.conf.
96bootstrap_epilogue() { :; }
97
98# The command to download all .po files for a specified domain into
99# a specified directory.  Fill in the first %s is the domain name, and
100# the second with the destination directory.  Use rsync's -L and -r
101# options because the latest/%s directory and the .po files within are
102# all symlinks.
103po_download_command_format=\
104"rsync --delete --exclude '*.s1' -Lrtvz \
105 'translationproject.org::tp/latest/%s/' '%s'"
106
107# Fallback for downloading .po files (if rsync fails).
108po_download_command_format2=\
109"wget --mirror -nd -q -np -A.po -P '%s' \
110 http://translationproject.org/latest/%s/"
111
112extract_package_name='
113  /^AC_INIT(/{
114     /.*,.*,.*, */{
115       s///
116       s/[][]//g
117       s/)$//
118       p
119       q
120     }
121     s/AC_INIT(\[*//
122     s/]*,.*//
123     s/^GNU //
124     y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
125     s/[^A-Za-z0-9_]/-/g
126     p
127  }
128'
129package=`sed -n "$extract_package_name" configure.ac` || exit
130gnulib_name=lib$package
131
132build_aux=build-aux
133source_base=lib
134m4_base=m4
135doc_base=doc
136tests_base=tests
137gnulib_extra_files=''
138
139# Additional gnulib-tool options to use.  Use "\newline" to break lines.
140gnulib_tool_option_extras=
141
142# Other locale categories that need message catalogs.
143EXTRA_LOCALE_CATEGORIES=
144
145# Additional xgettext options to use.  Use "\\\newline" to break lines.
146XGETTEXT_OPTIONS='\\\
147 --flag=_:1:pass-c-format\\\
148 --flag=N_:1:pass-c-format\\\
149 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
150'
151
152# Package bug report address and copyright holder for gettext files
153COPYRIGHT_HOLDER='Free Software Foundation, Inc.'
154MSGID_BUGS_ADDRESS=bug-$package@gnu.org
155
156# Files we don't want to import.
157excluded_files=
158
159# File that should exist in the top directory of a checked out hierarchy,
160# but not in a distribution tarball.
161checkout_only_file=README-hacking
162
163# Whether to use copies instead of symlinks.
164copy=false
165
166# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
167# those files to be generated in directories like lib/, m4/, and po/.
168# Or set it to 'auto' to make this script select which to use based
169# on which version control system (if any) is used in the source directory.
170vc_ignore=auto
171
172# Set this to true in bootstrap.conf to enable --bootstrap-sync by
173# default.
174bootstrap_sync=false
175
176# Use git to update gnulib sources
177use_git=true
178
179# find_tool ENVVAR NAMES...
180# -------------------------
181# Search for a required program.  Use the value of ENVVAR, if set,
182# otherwise find the first of the NAMES that can be run (i.e.,
183# supports --version).  If found, set ENVVAR to the program name,
184# die otherwise.
185find_tool ()
186{
187  find_tool_envvar=$1
188  shift
189  find_tool_names=$@
190  eval "find_tool_res=\$$find_tool_envvar"
191  if test x"$find_tool_res" = x; then
192    for i
193    do
194      if ($i --version </dev/null) >/dev/null 2>&1; then
195       find_tool_res=$i
196       break
197      fi
198    done
199  else
200    find_tool_error_prefix="\$$find_tool_envvar: "
201  fi
202  if test x"$find_tool_res" = x; then
203    echo >&2 "$me: one of these is required: $find_tool_names"
204    exit 1
205  fi
206  ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
207    echo >&2 "$me: ${find_tool_error_prefix}cannot run $find_tool_res --version"
208    exit 1
209  }
210  eval "$find_tool_envvar=\$find_tool_res"
211  eval "export $find_tool_envvar"
212}
213
214# Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6.
215find_tool SHA1SUM sha1sum gsha1sum shasum
216
217# Override the default configuration, if necessary.
218# Make sure that bootstrap.conf is sourced from the current directory
219# if we were invoked as "sh bootstrap".
220case "$0" in
221  */*) test -r "$0.conf" && . "$0.conf" ;;
222  *) test -r "$0.conf" && . ./"$0.conf" ;;
223esac
224
225# Extra files from gnulib, which override files from other sources.
226test -z "${gnulib_extra_files}" && \
227  gnulib_extra_files="
228        $build_aux/install-sh
229        $build_aux/missing
230        $build_aux/mdate-sh
231        $build_aux/texinfo.tex
232        $build_aux/depcomp
233        $build_aux/config.guess
234        $build_aux/config.sub
235        doc/INSTALL
236"
237
238if test "$vc_ignore" = auto; then
239  vc_ignore=
240  test -d .git && vc_ignore=.gitignore
241  test -d CVS && vc_ignore="$vc_ignore .cvsignore"
242fi
243
244# Translate configuration into internal form.
245
246# Parse options.
247
248for option
249do
250  case $option in
251  --help)
252    usage
253    exit;;
254  --gnulib-srcdir=*)
255    GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
256  --skip-po)
257    SKIP_PO=t;;
258  --force)
259    checkout_only_file=;;
260  --copy)
261    copy=true;;
262  --bootstrap-sync)
263    bootstrap_sync=true;;
264  --no-bootstrap-sync)
265    bootstrap_sync=false;;
266  --no-git)
267    use_git=false;;
268  *)
269    echo >&2 "$0: $option: unknown option"
270    exit 1;;
271  esac
272done
273
274if $use_git || test -d "$GNULIB_SRCDIR"; then
275  :
276else
277  echo "$0: Error: --no-git requires --gnulib-srcdir" >&2
278  exit 1
279fi
280
281if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
282  echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
283  exit 1
284fi
285
286# Ensure that lines starting with ! sort last, per gitignore conventions
287# for whitelisting exceptions after a more generic blacklist pattern.
288sort_patterns() {
289  sort -u "$@" | sed '/^!/ {
290    H
291    d
292  }
293  $ {
294    P
295    x
296    s/^\n//
297  }' | sed '/^$/d'
298}
299
300# If $STR is not already on a line by itself in $FILE, insert it,
301# sorting the new contents of the file and replacing $FILE with the result.
302insert_sorted_if_absent() {
303  file=$1
304  str=$2
305  test -f $file || touch $file
306  echo "$str" | sort_patterns - $file | cmp - $file > /dev/null \
307    || { echo "$str" | sort_patterns - $file > $file.bak \
308      && mv $file.bak $file; } \
309    || exit 1
310}
311
312# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
313# insert_sorted_if_absent.
314insert_vc_ignore() {
315  vc_ignore_file="$1"
316  pattern="$2"
317  case $vc_ignore_file in
318  *.gitignore)
319    # A .gitignore entry that does not start with '/' applies
320    # recursively to subdirectories, so prepend '/' to every
321    # .gitignore entry.
322    pattern=`echo "$pattern" | sed s,^,/,`;;
323  esac
324  insert_sorted_if_absent "$vc_ignore_file" "$pattern"
325}
326
327# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
328found_aux_dir=no
329grep '^[	 ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
330    >/dev/null && found_aux_dir=yes
331grep '^[	 ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
332    >/dev/null && found_aux_dir=yes
333if test $found_aux_dir = no; then
334  echo "$0: expected line not found in configure.ac. Add the following:" >&2
335  echo "  AC_CONFIG_AUX_DIR([$build_aux])" >&2
336  exit 1
337fi
338
339# If $build_aux doesn't exist, create it now, otherwise some bits
340# below will malfunction.  If creating it, also mark it as ignored.
341if test ! -d $build_aux; then
342  mkdir $build_aux
343  for dot_ig in x $vc_ignore; do
344    test $dot_ig = x && continue
345    insert_vc_ignore $dot_ig $build_aux
346  done
347fi
348
349# Note this deviates from the version comparison in automake
350# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
351# but this should suffice as we won't be specifying old
352# version formats or redundant trailing .0 in bootstrap.conf.
353# If we did want full compatibility then we should probably
354# use m4_version_compare from autoconf.
355sort_ver() { # sort -V is not generally available
356  ver1="$1"
357  ver2="$2"
358
359  # split on '.' and compare each component
360  i=1
361  while : ; do
362    p1=$(echo "$ver1" | cut -d. -f$i)
363    p2=$(echo "$ver2" | cut -d. -f$i)
364    if [ ! "$p1" ]; then
365      echo "$1 $2"
366      break
367    elif [ ! "$p2" ]; then
368      echo "$2 $1"
369      break
370    elif [ ! "$p1" = "$p2" ]; then
371      if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
372        echo "$2 $1"
373      elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
374        echo "$1 $2"
375      else # numeric, then lexicographic comparison
376        lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
377        if [ "$lp" = "$p2" ]; then
378          echo "$1 $2"
379        else
380          echo "$2 $1"
381        fi
382      fi
383      break
384    fi
385    i=$(($i+1))
386  done
387}
388
389get_version() {
390  app=$1
391
392  $app --version >/dev/null 2>&1 || return 1
393
394  $app --version 2>&1 |
395  sed -n '# Move version to start of line.
396          s/.*[v ]\([0-9]\)/\1/
397
398          # Skip lines that do not start with version.
399          /^[0-9]/!d
400
401          # Remove characters after the version.
402          s/[^.a-z0-9-].*//
403
404          # The first component must be digits only.
405          s/^\([0-9]*\)[a-z-].*/\1/
406
407          #the following essentially does s/5.005/5.5/
408          s/\.0*\([1-9]\)/.\1/g
409          p
410          q'
411}
412
413check_versions() {
414  ret=0
415
416  while read app req_ver; do
417    # We only need libtoolize from the libtool package.
418    if test "$app" = libtool; then
419      app=libtoolize
420    fi
421    # Exempt git if --no-git is in effect.
422    if test "$app" = git; then
423      $use_git || continue
424    fi
425    # Honor $APP variables ($TAR, $AUTOCONF, etc.)
426    appvar=`echo $app | tr '[a-z]-' '[A-Z]_'`
427    test "$appvar" = TAR && appvar=AMTAR
428    case $appvar in
429        GZIP) ;; # Do not use $GZIP:  it contains gzip options.
430        *) eval "app=\${$appvar-$app}" ;;
431    esac
432    if [ "$req_ver" = "-" ]; then
433      # Merely require app to exist; not all prereq apps are well-behaved
434      # so we have to rely on $? rather than get_version.
435      $app --version >/dev/null 2>&1
436      if [ 126 -le $? ]; then
437        echo "$me: Error: '$app' not found" >&2
438        ret=1
439      fi
440    else
441      # Require app to produce a new enough version string.
442      inst_ver=$(get_version $app)
443      if [ ! "$inst_ver" ]; then
444        echo "$me: Error: '$app' not found" >&2
445        ret=1
446      else
447        latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
448        if [ ! "$latest_ver" = "$inst_ver" ]; then
449          echo "$me: Error: '$app' version == $inst_ver is too old" >&2
450          echo "       '$app' version >= $req_ver is required" >&2
451          ret=1
452        fi
453      fi
454    fi
455  done
456
457  return $ret
458}
459
460print_versions() {
461  echo "Program    Min_version"
462  echo "----------------------"
463  printf %s "$buildreq"
464  echo "----------------------"
465  # can't depend on column -t
466}
467
468use_libtool=0
469# We'd like to use grep -E, to see if any of LT_INIT,
470# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
471# but that's not portable enough (e.g., for Solaris).
472grep '^[	 ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
473  && use_libtool=1
474grep '^[	 ]*LT_INIT' configure.ac >/dev/null \
475  && use_libtool=1
476if test $use_libtool = 1; then
477  find_tool LIBTOOLIZE glibtoolize libtoolize
478fi
479
480# gnulib-tool requires at least automake and autoconf.
481# If either is not listed, add it (with minimum version) as a prerequisite.
482case $buildreq in
483  *automake*) ;;
484  *) buildreq="automake 1.9
485$buildreq" ;;
486esac
487case $buildreq in
488  *autoconf*) ;;
489  *) buildreq="autoconf 2.59
490$buildreq" ;;
491esac
492
493# When we can deduce that gnulib-tool will require patch,
494# and when patch is not already listed as a prerequisite, add it, too.
495if test ! -d "$local_gl_dir" \
496    || find "$local_gl_dir" -name '*.diff' -exec false {} +; then
497  :
498else
499  case $buildreq in
500    *patch*) ;;
501    *) buildreq="patch -
502$buildreq" ;;
503  esac
504fi
505
506if ! printf "$buildreq" | check_versions; then
507  echo >&2
508  if test -f README-prereq; then
509    echo "$0: See README-prereq for how to get the prerequisite programs" >&2
510  else
511    echo "$0: Please install the prerequisite programs" >&2
512  fi
513  exit 1
514fi
515
516echo "$0: Bootstrapping from checked-out $package sources..."
517
518# See if we can use gnulib's git-merge-changelog merge driver.
519if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
520  if git config merge.merge-changelog.driver >/dev/null ; then
521    :
522  elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
523    echo "$0: initializing git-merge-changelog driver"
524    git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
525    git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
526  else
527    echo "$0: consider installing git-merge-changelog from gnulib"
528  fi
529fi
530
531
532cleanup_gnulib() {
533  status=$?
534  rm -fr "$gnulib_path"
535  exit $status
536}
537
538git_modules_config () {
539  test -f .gitmodules && git config --file .gitmodules "$@"
540}
541
542gnulib_path=`git_modules_config submodule.gnulib.path`
543test -z "$gnulib_path" && gnulib_path=gnulib
544
545# Get gnulib files.
546
547case ${GNULIB_SRCDIR--} in
548-)
549  if git_modules_config submodule.gnulib.url >/dev/null; then
550    echo "$0: getting gnulib files..."
551    git submodule init || exit $?
552    git submodule update || exit $?
553
554  elif [ ! -d "$gnulib_path" ]; then
555    echo "$0: getting gnulib files..."
556
557    trap cleanup_gnulib 1 2 13 15
558
559    shallow=
560    git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
561    git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
562      cleanup_gnulib
563
564    trap - 1 2 13 15
565  fi
566  GNULIB_SRCDIR=$gnulib_path
567  ;;
568*)
569  # Use GNULIB_SRCDIR as a reference.
570  if test -d "$GNULIB_SRCDIR"/.git && \
571        git_modules_config submodule.gnulib.url >/dev/null; then
572    echo "$0: getting gnulib files..."
573    if git submodule -h|grep -- --reference > /dev/null; then
574      # Prefer the one-liner available in git 1.6.4 or newer.
575      git submodule update --init --reference "$GNULIB_SRCDIR" \
576        "$gnulib_path" || exit $?
577    else
578      # This fallback allows at least git 1.5.5.
579      if test -f "$gnulib_path"/gnulib-tool; then
580        # Since file already exists, assume submodule init already complete.
581        git submodule update || exit $?
582      else
583        # Older git can't clone into an empty directory.
584        rmdir "$gnulib_path" 2>/dev/null
585        git clone --reference "$GNULIB_SRCDIR" \
586          "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
587          && git submodule init && git submodule update \
588          || exit $?
589      fi
590    fi
591    GNULIB_SRCDIR=$gnulib_path
592  fi
593  ;;
594esac
595
596if $bootstrap_sync; then
597  cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
598    echo "$0: updating bootstrap and restarting..."
599    exec sh -c \
600      'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
601      -- "$GNULIB_SRCDIR/build-aux/bootstrap" \
602      "$0" "$@" --no-bootstrap-sync
603  }
604fi
605
606gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
607<$gnulib_tool || exit
608
609# Get translations.
610
611download_po_files() {
612  subdir=$1
613  domain=$2
614  echo "$me: getting translations into $subdir for $domain..."
615  cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
616  eval "$cmd" && return
617  # Fallback to HTTP.
618  cmd=`printf "$po_download_command_format2" "$subdir" "$domain"`
619  eval "$cmd"
620}
621
622# Mirror .po files to $po_dir/.reference and copy only the new
623# or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
624# Note po files that exist locally only are left in $po_dir but will
625# not be included in LINGUAS and hence will not be distributed.
626update_po_files() {
627  # Directory containing primary .po files.
628  # Overwrite them only when we're sure a .po file is new.
629  po_dir=$1
630  domain=$2
631
632  # Mirror *.po files into this dir.
633  # Usually contains *.s1 checksum files.
634  ref_po_dir="$po_dir/.reference"
635
636  test -d $ref_po_dir || mkdir $ref_po_dir || return
637  download_po_files $ref_po_dir $domain \
638    && ls "$ref_po_dir"/*.po 2>/dev/null |
639      sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
640
641  langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
642  test "$langs" = '*' && langs=x
643  for po in $langs; do
644    case $po in x) continue;; esac
645    new_po="$ref_po_dir/$po.po"
646    cksum_file="$ref_po_dir/$po.s1"
647    if ! test -f "$cksum_file" ||
648        ! test -f "$po_dir/$po.po" ||
649        ! $SHA1SUM -c --status "$cksum_file" \
650            < "$new_po" > /dev/null; then
651      echo "$me: updated $po_dir/$po.po..."
652      cp "$new_po" "$po_dir/$po.po" \
653          && $SHA1SUM < "$new_po" > "$cksum_file"
654    fi
655  done
656}
657
658case $SKIP_PO in
659'')
660  if test -d po; then
661    update_po_files po $package || exit
662  fi
663
664  if test -d runtime-po; then
665    update_po_files runtime-po $package-runtime || exit
666  fi;;
667esac
668
669symlink_to_dir()
670{
671  src=$1/$2
672  dst=${3-$2}
673
674  test -f "$src" && {
675
676    # If the destination directory doesn't exist, create it.
677    # This is required at least for "lib/uniwidth/cjk.h".
678    dst_dir=`dirname "$dst"`
679    if ! test -d "$dst_dir"; then
680      mkdir -p "$dst_dir"
681
682      # If we've just created a directory like lib/uniwidth,
683      # tell version control system(s) it's ignorable.
684      # FIXME: for now, this does only one level
685      parent=`dirname "$dst_dir"`
686      for dot_ig in x $vc_ignore; do
687        test $dot_ig = x && continue
688        ig=$parent/$dot_ig
689        insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'`
690      done
691    fi
692
693    if $copy; then
694      {
695        test ! -h "$dst" || {
696          echo "$me: rm -f $dst" &&
697          rm -f "$dst"
698        }
699      } &&
700      test -f "$dst" &&
701      cmp -s "$src" "$dst" || {
702        echo "$me: cp -fp $src $dst" &&
703        cp -fp "$src" "$dst"
704      }
705    else
706      # Leave any existing symlink alone, if it already points to the source,
707      # so that broken build tools that care about symlink times
708      # aren't confused into doing unnecessary builds.  Conversely, if the
709      # existing symlink's time stamp is older than the source, make it afresh,
710      # so that broken tools aren't confused into skipping needed builds.  See
711      # <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>.
712      test -h "$dst" &&
713      src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
714      dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
715      test "$src_i" = "$dst_i" &&
716      both_ls=`ls -dt "$src" "$dst"` &&
717      test "X$both_ls" = "X$dst$nl$src" || {
718        dot_dots=
719        case $src in
720        /*) ;;
721        *)
722          case /$dst/ in
723          *//* | */../* | */./* | /*/*/*/*/*/)
724             echo >&2 "$me: invalid symlink calculation: $src -> $dst"
725             exit 1;;
726          /*/*/*/*/)	dot_dots=../../../;;
727          /*/*/*/)	dot_dots=../../;;
728          /*/*/)	dot_dots=../;;
729          esac;;
730        esac
731
732        echo "$me: ln -fs $dot_dots$src $dst" &&
733        ln -fs "$dot_dots$src" "$dst"
734      }
735    fi
736  }
737}
738
739# NOTE: we have to be careful to run both autopoint and libtoolize
740# before gnulib-tool, since gnulib-tool is likely to provide newer
741# versions of files "installed" by these two programs.
742# Then, *after* gnulib-tool (see below), we have to be careful to
743# run autoreconf in such a way that it does not run either of these
744# two just-pre-run programs.
745
746# Import from gettext.
747with_gettext=yes
748grep '^[	 ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
749    with_gettext=no
750
751if test $with_gettext = yes; then
752  # Released autopoint has the tendency to install macros that have been
753  # obsoleted in current gnulib, so run this before gnulib-tool.
754  echo "$0: $AUTOPOINT --force"
755  $AUTOPOINT --force || exit
756fi
757
758# Autoreconf runs aclocal before libtoolize, which causes spurious
759# warnings if the initial aclocal is confused by the libtoolized
760# (or worse out-of-date) macro directory.
761if test $use_libtool = 1; then
762  echo "running: $LIBTOOLIZE --copy --install"
763  $LIBTOOLIZE --copy --install
764fi
765
766version_controlled_file() {
767  dir=$1
768  file=$2
769  found=no
770  if test -d CVS; then
771    grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
772             grep '^/[^/]*/[0-9]' > /dev/null && found=yes
773  elif test -d .git; then
774    git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
775  elif test -d .svn; then
776    svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
777  else
778    echo "$me: no version control for $dir/$file?" >&2
779  fi
780  test $found = yes
781}
782
783# Import from gnulib.
784
785gnulib_tool_options="\
786 --import\
787 --no-changelog\
788 --aux-dir $build_aux\
789 --doc-base $doc_base\
790 --lib $gnulib_name\
791 --m4-base $m4_base/\
792 --source-base $source_base/\
793 --tests-base $tests_base\
794 --local-dir $local_gl_dir\
795 $gnulib_tool_option_extras\
796"
797if test $use_libtool = 1; then
798  case "$gnulib_tool_options " in
799    *' --libtool '*) ;;
800    *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
801  esac
802fi
803echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
804$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
805
806for file in $gnulib_files; do
807  symlink_to_dir "$GNULIB_SRCDIR" $file || exit
808done
809
810bootstrap_post_import_hook \
811  || { echo >&2 "$me: bootstrap_post_import_hook failed"; exit 1; }
812
813# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
814# gnulib-populated directories.  Such .m4 files would cause aclocal to fail.
815# The following requires GNU find 4.2.3 or newer.  Considering the usual
816# portability constraints of this script, that may seem a very demanding
817# requirement, but it should be ok.  Ignore any failure, which is fine,
818# since this is only a convenience to help developers avoid the relatively
819# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
820# between successive runs of this script.
821find "$m4_base" "$source_base" \
822  -depth \( -name '*.m4' -o -name '*.[ch]' \) \
823  -type l -xtype l -delete > /dev/null 2>&1
824
825# Some systems (RHEL 5) are using ancient autotools, for which the
826# --no-recursive option had not been invented.  Detect that lack and
827# omit the option when it's not supported.  FIXME in 2017: remove this
828# hack when RHEL 5 autotools are updated, or when they become irrelevant.
829no_recursive=
830case $($AUTORECONF --help) in
831  *--no-recursive*) no_recursive=--no-recursive;;
832esac
833
834# Tell autoreconf not to invoke autopoint or libtoolize; they were run above.
835echo "running: AUTOPOINT=true LIBTOOLIZE=true " \
836    "$AUTORECONF --verbose --install $no_recursive -I $m4_base $ACLOCAL_FLAGS"
837AUTOPOINT=true LIBTOOLIZE=true \
838    $AUTORECONF --verbose --install $no_recursive -I $m4_base $ACLOCAL_FLAGS \
839  || exit 1
840
841# Get some extra files from gnulib, overriding existing files.
842for file in $gnulib_extra_files; do
843  case $file in
844  */INSTALL) dst=INSTALL;;
845  build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
846  *) dst=$file;;
847  esac
848  symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
849done
850
851if test $with_gettext = yes; then
852  # Create gettext configuration.
853  echo "$0: Creating po/Makevars from po/Makevars.template ..."
854  rm -f po/Makevars
855  sed '
856    /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
857    /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
858    /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
859    /^XGETTEXT_OPTIONS *=/{
860      s/$/ \\/
861      a\
862          '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
863    }
864  ' po/Makevars.template >po/Makevars || exit 1
865
866  if test -d runtime-po; then
867    # Similarly for runtime-po/Makevars, but not quite the same.
868    rm -f runtime-po/Makevars
869    sed '
870      /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
871      /^subdir *=.*/s/=.*/= runtime-po/
872      /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
873      /^XGETTEXT_OPTIONS *=/{
874        s/$/ \\/
875        a\
876            '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
877      }
878    ' po/Makevars.template >runtime-po/Makevars || exit 1
879
880    # Copy identical files from po to runtime-po.
881    (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
882  fi
883fi
884
885bootstrap_epilogue
886
887echo "$0: done.  Now you can run './configure'."
888
889# Local variables:
890# eval: (add-hook 'write-file-hooks 'time-stamp)
891# time-stamp-start: "scriptversion="
892# time-stamp-format: "%:y-%02m-%02d.%02H"
893# time-stamp-time-zone: "UTC"
894# time-stamp-end: "; # UTC"
895# End:
896