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