]> git.saurik.com Git - bison.git/blobdiff - bootstrap
Fix push parsing memory leak reported by Brandon Lucia at
[bison.git] / bootstrap
index 21f2e0eb5e91fd0c3ee6adbb53dd87a41de0e4eb..b1020421beeeb012ba28314017bd979c314c5ebc 100755 (executable)
--- a/bootstrap
+++ b/bootstrap
@@ -1,8 +1,8 @@
 #! /bin/sh
 
 #! /bin/sh
 
-# Bootstrap this package from CVS.
+# Bootstrap this package from checked-out sources.
 
 
-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -29,22 +29,28 @@ nl='
 LC_ALL=C
 export LC_ALL
 
 LC_ALL=C
 export LC_ALL
 
+# Temporary directory names.
+bt='._bootmp'
+bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
+bt2=${bt}2
+
 usage() {
   echo >&2 "\
 Usage: $0 [OPTION]...
 usage() {
   echo >&2 "\
 Usage: $0 [OPTION]...
-Bootstrap this package from the CVS sources.
+Bootstrap this package from the checked-out sources.
 
 Options:
  --gnulib-srcdir=DIRNAME  Specify the local directory where gnulib
                           sources reside.  Use this if you already
                           have gnulib sources on your machine, and
 
 Options:
  --gnulib-srcdir=DIRNAME  Specify the local directory where gnulib
                           sources reside.  Use this if you already
                           have gnulib sources on your machine, and
-                          do not want to waste your bandwidth dowloading
+                          do not want to waste your bandwidth downloading
                           them again.
  --copy                   Copy files instead of creating symbolic links.
                           them again.
  --copy                   Copy files instead of creating symbolic links.
- --force                  Bootstrap even if the sources didn't come from CVS.
+ --force                  Attempt to bootstrap even if the sources seem
+                          not to have been checked out.
  --skip-po                Do not download po files.
  --skip-po                Do not download po files.
- --cvs-user=USERNAME      Set the CVS username to be used when accessing
-                          the gnulib repository.
+ --cvs-user=USERNAME      Set the username to use when checking out
+                          sources from the gnulib repository.
 
 If the file .bootstrap.conf exists in the current working directory, its
 contents are read as shell variables to configure the bootstrap.
 
 If the file .bootstrap.conf exists in the current working directory, its
 contents are read as shell variables to configure the bootstrap.
@@ -83,18 +89,20 @@ extract_package_name='
   }
 '
 package=`sed -n "$extract_package_name" configure.ac` || exit
   }
 '
 package=`sed -n "$extract_package_name" configure.ac` || exit
+gnulib_name=lib$package
 
 
+build_aux=build-aux
 # Extra files from gnulib, which override files from other sources.
 # Extra files from gnulib, which override files from other sources.
-gnulib_extra_files='
-       build-aux/install-sh
-       build-aux/missing
-       build-aux/mdate-sh
-       build-aux/texinfo.tex
-       build-aux/depcomp
-       build-aux/config.guess
-       build-aux/config.sub
+gnulib_extra_files="
+       $build_aux/install-sh
+       $build_aux/missing
+       $build_aux/mdate-sh
+       $build_aux/texinfo.tex
+       $build_aux/depcomp
+       $build_aux/config.guess
+       $build_aux/config.sub
        doc/INSTALL
        doc/INSTALL
-'
+"
 
 # Other locale categories that need message catalogs.
 EXTRA_LOCALE_CATEGORIES=
 
 # Other locale categories that need message catalogs.
 EXTRA_LOCALE_CATEGORIES=
@@ -109,9 +117,9 @@ XGETTEXT_OPTIONS='\\\
 # Files we don't want to import.
 excluded_files=
 
 # Files we don't want to import.
 excluded_files=
 
-# File that should exist with CVS checkout, but not with
-# the distributed version.
-CVS_only_file=CVS
+# File that should exist in the top directory of a checked out hierarchy,
+# but not in a distribution tarball.
+checkout_only_file=README-hacking
 
 # Whether to use copies instead of symlinks.
 copy=false
 
 # Whether to use copies instead of symlinks.
 copy=false
@@ -136,7 +144,7 @@ do
   --skip-po)
     SKIP_PO=t;;
   --force)
   --skip-po)
     SKIP_PO=t;;
   --force)
-    CVS_only_file=;;
+    checkout_only_file=;;
   --copy)
     copy=true;;
   *)
   --copy)
     copy=true;;
   *)
@@ -145,12 +153,42 @@ do
   esac
 done
 
   esac
 done
 
-if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
-  echo "$0: Bootstrapping from a non-CVS distribution is a bit risky." >&2
+if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
+  echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
   exit 1
 fi
 
   exit 1
 fi
 
-echo "$0: Bootstrapping CVS $package..."
+# If $STR is not already on a line by itself in $FILE, insert it,
+# sorting the new contents of the file and replacing $FILE with the result.
+insert_sorted_if_absent() {
+  file=$1
+  str=$2
+  echo "$str" | sort -u - $file | cmp -s - $file \
+    || echo "$str" | sort -u - $file -o $file \
+    || exit 1
+}
+
+# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
+found_aux_dir=no
+grep '^[        ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
+    >/dev/null && found_aux_dir=yes
+grep '^[        ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
+    >/dev/null && found_aux_dir=yes
+if test $found_aux_dir = no; then
+  echo "$0: expected line not found in configure.ac. Add the following:" >&2
+  echo "  AC_CONFIG_AUX_DIR([$build_aux])" >&2.
+fi
+
+# If $build_aux doesn't exist, create it now, otherwise some bits
+# below will malfunction.  If creating it, also mark it as ignored.
+if test ! -d $build_aux; then
+  mkdir $build_aux
+  for ig in .cvsignore .gitignore; do
+    test -f $ig && insert_sorted_if_absent $ig $build_aux
+  done
+fi
+
+echo "$0: Bootstrapping from checked-out $package sources..."
 
 cleanup_gnulib() {
   status=$?
 
 cleanup_gnulib() {
   status=$?
@@ -244,7 +282,9 @@ case $SKIP_PO in
     WGET_COMMAND='';;
   esac
 
     WGET_COMMAND='';;
   esac
 
-  get_translations po $package || exit
+  if test -d po; then
+    get_translations po $package || exit
+  fi
 
   if test -d runtime-po; then
     get_translations runtime-po $package-runtime || exit
 
   if test -d runtime-po; then
     get_translations runtime-po $package-runtime || exit
@@ -313,7 +353,8 @@ cp_mark_as_generated()
     if test -z "$c1"; then
       cmp -s "$cp_src" "$cp_dst" || {
        echo "$0: cp -f $cp_src $cp_dst" &&
     if test -z "$c1"; then
       cmp -s "$cp_src" "$cp_dst" || {
        echo "$0: cp -f $cp_src $cp_dst" &&
-       cp -f "$cp_src" "$cp_dst"
+       rm -f "$cp_dst" &&
+       sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
       }
     else
       # Copy the file first to get proper permissions if it
       }
     else
       # Copy the file first to get proper permissions if it
@@ -322,7 +363,7 @@ cp_mark_as_generated()
       (
        echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
        echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
       (
        echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
        echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
-       cat "$cp_src"
+       sed "s!$bt_regex/!!g" "$cp_src"
       ) > $cp_dst-t &&
       if cmp -s "$cp_dst-t" "$cp_dst"; then
        rm -f "$cp_dst-t"
       ) > $cp_dst-t &&
       if cmp -s "$cp_dst-t" "$cp_dst"; then
        rm -f "$cp_dst-t"
@@ -334,26 +375,45 @@ cp_mark_as_generated()
   fi
 }
 
   fi
 }
 
+version_controlled_file() {
+  dir=$1
+  file=$2
+  found=no
+  if test -d CVS; then
+    grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
+            grep '^/[^/]*/[0-9]' > /dev/null && found=yes
+  elif test -d .git; then
+    git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
+  else
+    echo "$0: no version control for $dir/$file?" >&2
+  fi
+  test $found = yes
+}
+
 slurp() {
   for dir in . `(cd $1 && find * -type d -print)`; do
     copied=
     sep=
     for file in `ls $1/$dir`; do
 slurp() {
   for dir in . `(cd $1 && find * -type d -print)`; do
     copied=
     sep=
     for file in `ls $1/$dir`; do
-      test -d $1/$dir/$file && continue
+      if test -d $1/$dir/$file; then
+        if test ! -d $dir/$file; then
+          echo "$0: mkdir $dir/$file" && mkdir $dir/$file || exit
+        fi
+        continue
+      fi
       for excluded_file in $excluded_files; do
        test "$dir/$file" = "$excluded_file" && continue 2
       done
       if test $file = Makefile.am; then
         copied=$copied${sep}gnulib.mk; sep=$nl
       for excluded_file in $excluded_files; do
        test "$dir/$file" = "$excluded_file" && continue 2
       done
       if test $file = Makefile.am; then
         copied=$copied${sep}gnulib.mk; sep=$nl
-       remove_intl='/^[^#].*\/intl/s/^/#/'
+       remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
          echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
          rm -f $dir/gnulib.mk &&
          sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
        }
       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
          echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
          rm -f $dir/gnulib.mk &&
          sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
        }
       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
-          grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
-            grep -q '^/[^/]*/[0-9]'; then
+          version_controlled_file $dir $file; then
        echo "$0: $dir/$file overrides $1/$dir/$file"
       else
        copied=$copied$sep$file; sep=$nl
        echo "$0: $dir/$file overrides $1/$dir/$file"
       else
        copied=$copied$sep$file; sep=$nl
@@ -374,19 +434,22 @@ slurp() {
       fi || exit
     done
 
       fi || exit
     done
 
-    ig=$dir/.cvsignore
-    if test -n "$copied" && test -f $ig; then
-      echo "$copied" | sort -u - $ig | cmp -s - $ig ||
-      echo "$copied" | sort -u - $ig -o $ig || exit
-    fi
+    for dot_ig in .cvsignore .gitignore; do
+      ig=$dir/$dot_ig
+      if test -n "$copied" && test -f $ig; then
+       insert_sorted_if_absent $ig "$copied"
+       # If an ignored file name ends with _.h, then also add
+       # the name with just ".h".  Many gnulib headers are generated,
+       # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
+       f=`echo "$copied"|sed 's/_\.h$/.h/'`
+       insert_sorted_if_absent $ig "$f"
+      fi
+    done
   done
 }
 
 
 # Create boot temporary directories to import from gnulib and gettext.
   done
 }
 
 
 # Create boot temporary directories to import from gnulib and gettext.
-
-bt='.#bootmp'
-bt2=${bt}2
 rm -fr $bt $bt2 &&
 mkdir $bt $bt2 || exit
 
 rm -fr $bt $bt2 &&
 mkdir $bt $bt2 || exit
 
@@ -395,9 +458,9 @@ mkdir $bt $bt2 || exit
 gnulib_tool_options="\
  --import\
  --no-changelog\
 gnulib_tool_options="\
  --import\
  --no-changelog\
- --aux-dir $bt/build-aux\
+ --aux-dir $bt/$build_aux\
  --doc-base $bt/doc\
  --doc-base $bt/doc\
- --lib lib$package\
+ --lib $gnulib_name\
  --m4-base $bt/m4/\
  --source-base $bt/lib/\
  --tests-base $bt/tests\
  --m4-base $bt/m4/\
  --source-base $bt/lib/\
  --tests-base $bt/tests\
@@ -413,23 +476,34 @@ done
 
 
 # Import from gettext.
 
 
 # Import from gettext.
+with_gettext=yes
+grep '^[        ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
+    with_gettext=no
 
 
-echo "$0: (cd $bt2; autopoint) ..."
-cp configure.ac $bt2 &&
-(cd $bt2 && autopoint && rm configure.ac) &&
-slurp $bt2 $bt || exit
+if test $with_gettext = yes; then
+  echo "$0: (cd $bt2; autopoint) ..."
+  cp configure.ac $bt2 &&
+  (cd $bt2 && autopoint && rm configure.ac) &&
+  slurp $bt2 $bt || exit
 
 
-rm -fr $bt $bt2 || exit
+  rm -fr $bt $bt2 || exit
+fi
 
 
 # Reconfigure, getting other files.
 
 for command in \
 
 
 # Reconfigure, getting other files.
 
 for command in \
+  libtool \
   'aclocal --force -I m4' \
   'autoconf --force' \
   'autoheader --force' \
   'automake --add-missing --copy --force-missing';
 do
   'aclocal --force -I m4' \
   'autoconf --force' \
   'autoheader --force' \
   'automake --add-missing --copy --force-missing';
 do
+  if test "$command" = libtool; then
+    grep '^[    ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
+      continue
+    command='libtoolize -c -f'
+  fi
   echo "$0: $command ..."
   $command || exit
 done
   echo "$0: $command ..."
   $command || exit
 done
@@ -445,36 +519,37 @@ for file in $gnulib_extra_files; do
   symlink_to_gnulib $file $dst || exit
 done
 
   symlink_to_gnulib $file $dst || exit
 done
 
-
-# Create gettext configuration.
-echo "$0: Creating po/Makevars from po/Makevars.template ..."
-rm -f po/Makevars
-sed '
-  /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
-  /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
-  /^XGETTEXT_OPTIONS *=/{
-    s/$/ \\/
-    a\
-       '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
-  }
-' po/Makevars.template >po/Makevars
-
-if test -d runtime-po; then
-  # Similarly for runtime-po/Makevars, but not quite the same.
-  rm -f runtime-po/Makevars
+if test $with_gettext = yes; then
+  # Create gettext configuration.
+  echo "$0: Creating po/Makevars from po/Makevars.template ..."
+  rm -f po/Makevars
   sed '
   sed '
-    /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
-    /^subdir *=.*/s/=.*/= runtime-po/
+    /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
     /^XGETTEXT_OPTIONS *=/{
       s/$/ \\/
       a\
     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
     /^XGETTEXT_OPTIONS *=/{
       s/$/ \\/
       a\
-         '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
+         '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
     }
     }
-  ' <po/Makevars.template >runtime-po/Makevars
+  ' po/Makevars.template >po/Makevars
 
 
-  # Copy identical files from po to runtime-po.
-  (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
+  if test -d runtime-po; then
+    # Similarly for runtime-po/Makevars, but not quite the same.
+    rm -f runtime-po/Makevars
+    sed '
+      /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
+      /^subdir *=.*/s/=.*/= runtime-po/
+      /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
+      /^XGETTEXT_OPTIONS *=/{
+       s/$/ \\/
+       a\
+           '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
+      }
+    ' <po/Makevars.template >runtime-po/Makevars
+
+    # Copy identical files from po to runtime-po.
+    (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
+  fi
 fi
 
 echo "$0: done.  Now you can run './configure'."
 fi
 
 echo "$0: done.  Now you can run './configure'."