]> sjero.net Git - wget/blob - bootstrap
Fix openssl detection under Windows.
[wget] / bootstrap
1 #! /bin/sh
2 # Print a version string.
3 scriptversion=2011-03-03.12; # 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     eval "app=\${$appvar-$app}"
409     inst_ver=$(get_version $app)
410     if [ ! "$inst_ver" ]; then
411       echo "$me: Error: '$app' not found" >&2
412       ret=1
413     elif [ ! "$req_ver" = "-" ]; then
414       latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
415       if [ ! "$latest_ver" = "$inst_ver" ]; then
416         echo "$me: Error: '$app' version == $inst_ver is too old" >&2
417         echo "       '$app' version >= $req_ver is required" >&2
418         ret=1
419       fi
420     fi
421   done
422
423   return $ret
424 }
425
426 print_versions() {
427   echo "Program    Min_version"
428   echo "----------------------"
429   printf %s "$buildreq"
430   echo "----------------------"
431   # can't depend on column -t
432 }
433
434 use_libtool=0
435 # We'd like to use grep -E, to see if any of LT_INIT,
436 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
437 # but that's not portable enough (e.g., for Solaris).
438 grep '^[         ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
439   && use_libtool=1
440 grep '^[         ]*LT_INIT' configure.ac >/dev/null \
441   && use_libtool=1
442 if test $use_libtool = 1; then
443   find_tool LIBTOOLIZE glibtoolize libtoolize
444 fi
445
446 if ! printf "$buildreq" | check_versions; then
447   echo >&2
448   if test -f README-prereq; then
449     echo "$0: See README-prereq for how to get the prerequisite programs" >&2
450   else
451     echo "$0: Please install the prerequisite programs" >&2
452   fi
453   exit 1
454 fi
455
456 echo "$0: Bootstrapping from checked-out $package sources..."
457
458 # See if we can use gnulib's git-merge-changelog merge driver.
459 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
460   if git config merge.merge-changelog.driver >/dev/null ; then
461     :
462   elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
463     echo "$0: initializing git-merge-changelog driver"
464     git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
465     git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
466   else
467     echo "$0: consider installing git-merge-changelog from gnulib"
468   fi
469 fi
470
471
472 cleanup_gnulib() {
473   status=$?
474   rm -fr "$gnulib_path"
475   exit $status
476 }
477
478 git_modules_config () {
479   test -f .gitmodules && git config --file .gitmodules "$@"
480 }
481
482 gnulib_path=`git_modules_config submodule.gnulib.path`
483 test -z "$gnulib_path" && gnulib_path=gnulib
484
485 # Get gnulib files.
486
487 case ${GNULIB_SRCDIR--} in
488 -)
489   if git_modules_config submodule.gnulib.url >/dev/null; then
490     echo "$0: getting gnulib files..."
491     git submodule init || exit $?
492     git submodule update || exit $?
493
494   elif [ ! -d "$gnulib_path" ]; then
495     echo "$0: getting gnulib files..."
496
497     trap cleanup_gnulib 1 2 13 15
498
499     shallow=
500     git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
501     git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
502       cleanup_gnulib
503
504     trap - 1 2 13 15
505   fi
506   GNULIB_SRCDIR=$gnulib_path
507   ;;
508 *)
509   # Use GNULIB_SRCDIR as a reference.
510   if test -d "$GNULIB_SRCDIR"/.git && \
511         git_modules_config submodule.gnulib.url >/dev/null; then
512     echo "$0: getting gnulib files..."
513     if git submodule -h|grep -- --reference > /dev/null; then
514       # Prefer the one-liner available in git 1.6.4 or newer.
515       git submodule update --init --reference "$GNULIB_SRCDIR" \
516         "$gnulib_path" || exit $?
517     else
518       # This fallback allows at least git 1.5.5.
519       if test -f "$gnulib_path"/gnulib-tool; then
520         # Since file already exists, assume submodule init already complete.
521         git submodule update || exit $?
522       else
523         # Older git can't clone into an empty directory.
524         rmdir "$gnulib_path" 2>/dev/null
525         git clone --reference "$GNULIB_SRCDIR" \
526           "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
527           && git submodule init && git submodule update \
528           || exit $?
529       fi
530     fi
531     GNULIB_SRCDIR=$gnulib_path
532   fi
533   ;;
534 esac
535
536 if $bootstrap_sync; then
537   cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
538     echo "$0: updating bootstrap and restarting..."
539     exec sh -c \
540       'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
541       -- "$GNULIB_SRCDIR/build-aux/bootstrap" \
542       "$0" "$@" --no-bootstrap-sync
543   }
544 fi
545
546 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
547 <$gnulib_tool || exit
548
549 # Get translations.
550
551 download_po_files() {
552   subdir=$1
553   domain=$2
554   echo "$me: getting translations into $subdir for $domain..."
555   cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
556   eval "$cmd"
557 }
558
559 # Mirror .po files to $po_dir/.reference and copy only the new
560 # or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
561 # Note po files that exist locally only are left in $po_dir but will
562 # not be included in LINGUAS and hence will not be distributed.
563 update_po_files() {
564   # Directory containing primary .po files.
565   # Overwrite them only when we're sure a .po file is new.
566   po_dir=$1
567   domain=$2
568
569   # Mirror *.po files into this dir.
570   # Usually contains *.s1 checksum files.
571   ref_po_dir="$po_dir/.reference"
572
573   test -d $ref_po_dir || mkdir $ref_po_dir || return
574   download_po_files $ref_po_dir $domain \
575     && ls "$ref_po_dir"/*.po 2>/dev/null |
576       sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
577
578   langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
579   test "$langs" = '*' && langs=x
580   for po in $langs; do
581     case $po in x) continue;; esac
582     new_po="$ref_po_dir/$po.po"
583     cksum_file="$ref_po_dir/$po.s1"
584     if ! test -f "$cksum_file" ||
585         ! test -f "$po_dir/$po.po" ||
586         ! $SHA1SUM -c --status "$cksum_file" \
587             < "$new_po" > /dev/null; then
588       echo "$me: updated $po_dir/$po.po..."
589       cp "$new_po" "$po_dir/$po.po" \
590           && $SHA1SUM < "$new_po" > "$cksum_file"
591     fi
592   done
593 }
594
595 case $SKIP_PO in
596 '')
597   if test -d po; then
598     update_po_files po $package || exit
599   fi
600
601   if test -d runtime-po; then
602     update_po_files runtime-po $package-runtime || exit
603   fi;;
604 esac
605
606 symlink_to_dir()
607 {
608   src=$1/$2
609   dst=${3-$2}
610
611   test -f "$src" && {
612
613     # If the destination directory doesn't exist, create it.
614     # This is required at least for "lib/uniwidth/cjk.h".
615     dst_dir=`dirname "$dst"`
616     if ! test -d "$dst_dir"; then
617       mkdir -p "$dst_dir"
618
619       # If we've just created a directory like lib/uniwidth,
620       # tell version control system(s) it's ignorable.
621       # FIXME: for now, this does only one level
622       parent=`dirname "$dst_dir"`
623       for dot_ig in x $vc_ignore; do
624         test $dot_ig = x && continue
625         ig=$parent/$dot_ig
626         insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'`
627       done
628     fi
629
630     if $copy; then
631       {
632         test ! -h "$dst" || {
633           echo "$me: rm -f $dst" &&
634           rm -f "$dst"
635         }
636       } &&
637       test -f "$dst" &&
638       cmp -s "$src" "$dst" || {
639         echo "$me: cp -fp $src $dst" &&
640         cp -fp "$src" "$dst"
641       }
642     else
643       test -h "$dst" &&
644       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
645       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
646       test "$src_i" = "$dst_i" || {
647         dot_dots=
648         case $src in
649         /*) ;;
650         *)
651           case /$dst/ in
652           *//* | */../* | */./* | /*/*/*/*/*/)
653              echo >&2 "$me: invalid symlink calculation: $src -> $dst"
654              exit 1;;
655           /*/*/*/*/)    dot_dots=../../../;;
656           /*/*/*/)      dot_dots=../../;;
657           /*/*/)        dot_dots=../;;
658           esac;;
659         esac
660
661         echo "$me: ln -fs $dot_dots$src $dst" &&
662         ln -fs "$dot_dots$src" "$dst"
663       }
664     fi
665   }
666 }
667
668 cp_mark_as_generated()
669 {
670   cp_src=$1
671   cp_dst=$2
672
673   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
674     symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
675   elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
676     symlink_to_dir $local_gl_dir "$cp_dst"
677   else
678     case $cp_dst in
679       *.[ch])             c1='/* '; c2=' */';;
680       *.texi)             c1='@c '; c2=     ;;
681       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
682       *)                  c1=     ; c2=     ;;
683     esac
684
685     # If the destination directory doesn't exist, create it.
686     # This is required at least for "lib/uniwidth/cjk.h".
687     dst_dir=`dirname "$cp_dst"`
688     test -d "$dst_dir" || mkdir -p "$dst_dir"
689
690     if test -z "$c1"; then
691       cmp -s "$cp_src" "$cp_dst" || {
692         # Copy the file first to get proper permissions if it
693         # doesn't already exist.  Then overwrite the copy.
694         echo "$me: cp -f $cp_src $cp_dst" &&
695         rm -f "$cp_dst" &&
696         cp "$cp_src" "$cp_dst-t" &&
697         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
698         mv -f "$cp_dst-t" "$cp_dst"
699       }
700     else
701       # Copy the file first to get proper permissions if it
702       # doesn't already exist.  Then overwrite the copy.
703       cp "$cp_src" "$cp_dst-t" &&
704       (
705         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
706         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
707         sed "s!$bt_regex/!!g" "$cp_src"
708       ) > $cp_dst-t &&
709       if cmp -s "$cp_dst-t" "$cp_dst"; then
710         rm -f "$cp_dst-t"
711       else
712         echo "$me: cp $cp_src $cp_dst # with edits" &&
713         mv -f "$cp_dst-t" "$cp_dst"
714       fi
715     fi
716   fi
717 }
718
719 version_controlled_file() {
720   dir=$1
721   file=$2
722   found=no
723   if test -d CVS; then
724     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
725              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
726   elif test -d .git; then
727     git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
728   elif test -d .svn; then
729     svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
730   else
731     echo "$me: no version control for $dir/$file?" >&2
732   fi
733   test $found = yes
734 }
735
736 slurp() {
737   for dir in . `(cd $1 && find * -type d -print)`; do
738     copied=
739     sep=
740     for file in `ls -a $1/$dir`; do
741       case $file in
742       .|..) continue;;
743       # FIXME: should all file names starting with "." be ignored?
744       .*) continue;;
745       esac
746       test -d $1/$dir/$file && continue
747       for excluded_file in $excluded_files; do
748         test "$dir/$file" = "$excluded_file" && continue 2
749       done
750       if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then
751         copied=$copied${sep}$gnulib_mk; sep=$nl
752         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
753         sed "$remove_intl" $1/$dir/$file |
754         cmp - $dir/$gnulib_mk > /dev/null || {
755           echo "$me: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
756           rm -f $dir/$gnulib_mk &&
757           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk &&
758           gnulib_mk_hook $dir/$gnulib_mk
759         }
760       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
761            version_controlled_file $dir $file; then
762         echo "$me: $dir/$file overrides $1/$dir/$file"
763       else
764         copied=$copied$sep$file; sep=$nl
765         if test $file = gettext.m4; then
766           echo "$me: patching m4/gettext.m4 to remove need for intl/* ..."
767           rm -f $dir/$file
768           sed '
769             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
770               AC_DEFUN([AM_INTL_SUBDIR], [])
771             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
772               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
773             $a\
774               AC_DEFUN([gl_LOCK_EARLY], [])
775           ' $1/$dir/$file >$dir/$file
776         else
777           cp_mark_as_generated $1/$dir/$file $dir/$file
778         fi
779       fi || exit
780     done
781
782     for dot_ig in x $vc_ignore; do
783       test $dot_ig = x && continue
784       ig=$dir/$dot_ig
785       if test -n "$copied"; then
786         insert_vc_ignore $ig "$copied"
787         # If an ignored file name ends with .in.h, then also add
788         # the name with just ".h".  Many gnulib headers are generated,
789         # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
790         # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
791         f=`echo "$copied" |
792           sed '
793             s/\.in\.h$/.h/
794             s/\.sin$/.sed/
795             s/\.y$/.c/
796             s/\.gperf$/.h/
797           '
798         `
799         insert_vc_ignore $ig "$f"
800
801         # For files like sys_stat.in.h and sys_time.in.h, record as
802         # ignorable the directory we might eventually create: sys/.
803         f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
804         insert_vc_ignore $ig "$f"
805       fi
806     done
807   done
808 }
809
810
811 # Create boot temporary directories to import from gnulib and gettext.
812 rm -fr $bt $bt2 &&
813 mkdir $bt $bt2 || exit
814
815 # Import from gnulib.
816
817 gnulib_tool_options="\
818  --import\
819  --no-changelog\
820  --aux-dir $bt/$build_aux\
821  --doc-base $bt/$doc_base\
822  --lib $gnulib_name\
823  --m4-base $bt/$m4_base/\
824  --source-base $bt/$source_base/\
825  --tests-base $bt/$tests_base\
826  --local-dir $local_gl_dir\
827  $gnulib_tool_option_extras\
828 "
829 if test $use_libtool = 1; then
830   case "$gnulib_tool_options " in
831     *' --libtool '*) ;;
832     *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
833   esac
834 fi
835 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
836 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
837 slurp $bt || exit
838
839 for file in $gnulib_files; do
840   symlink_to_dir "$GNULIB_SRCDIR" $file || exit
841 done
842
843
844 # Import from gettext.
845 with_gettext=yes
846 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
847     with_gettext=no
848
849 if test $with_gettext = yes; then
850   echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
851   cp configure.ac $bt2 &&
852   (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
853   slurp $bt2 $bt || exit
854 fi
855 rm -fr $bt $bt2 || exit
856
857 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
858 # gnulib-populated directories.  Such .m4 files would cause aclocal to fail.
859 # The following requires GNU find 4.2.3 or newer.  Considering the usual
860 # portability constraints of this script, that may seem a very demanding
861 # requirement, but it should be ok.  Ignore any failure, which is fine,
862 # since this is only a convenience to help developers avoid the relatively
863 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
864 # between successive runs of this script.
865 find "$m4_base" "$source_base" \
866   -depth \( -name '*.m4' -o -name '*.[ch]' \) \
867   -type l -xtype l -delete > /dev/null 2>&1
868
869 # Reconfigure, getting other files.
870
871 # Skip autoheader if it's not needed.
872 grep -E '^[      ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
873   AUTOHEADER=true
874
875 for command in \
876   libtool \
877   "${ACLOCAL-aclocal} --force -I '$m4_base' $ACLOCAL_FLAGS" \
878   "${AUTOCONF-autoconf} --force" \
879   "${AUTOHEADER-autoheader} --force" \
880   "${AUTOMAKE-automake} --add-missing --copy --force-missing"
881 do
882   if test "$command" = libtool; then
883     test $use_libtool = 0 \
884       && continue
885     command="${LIBTOOLIZE-libtoolize} -c -f"
886   fi
887   echo "$0: $command ..."
888   eval "$command" || exit
889 done
890
891
892 # Get some extra files from gnulib, overriding existing files.
893 for file in $gnulib_extra_files; do
894   case $file in
895   */INSTALL) dst=INSTALL;;
896   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
897   *) dst=$file;;
898   esac
899   symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
900 done
901
902 if test $with_gettext = yes; then
903   # Create gettext configuration.
904   echo "$0: Creating po/Makevars from po/Makevars.template ..."
905   rm -f po/Makevars
906   sed '
907     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
908     /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
909     /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
910     /^XGETTEXT_OPTIONS *=/{
911       s/$/ \\/
912       a\
913           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
914     }
915   ' po/Makevars.template >po/Makevars || exit 1
916
917   if test -d runtime-po; then
918     # Similarly for runtime-po/Makevars, but not quite the same.
919     rm -f runtime-po/Makevars
920     sed '
921       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
922       /^subdir *=.*/s/=.*/= runtime-po/
923       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
924       /^XGETTEXT_OPTIONS *=/{
925         s/$/ \\/
926         a\
927             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
928       }
929     ' po/Makevars.template >runtime-po/Makevars || exit 1
930
931     # Copy identical files from po to runtime-po.
932     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
933   fi
934 fi
935
936 bootstrap_epilogue
937
938 echo "$0: done.  Now you can run './configure'."
939
940 # Local variables:
941 # eval: (add-hook 'write-file-hooks 'time-stamp)
942 # time-stamp-start: "scriptversion="
943 # time-stamp-format: "%:y-%02m-%02d.%02H"
944 # time-stamp-time-zone: "UTC"
945 # time-stamp-end: "; # UTC"
946 # End: