maint: move two small functions, so we can remove a fwd decl
[coreutils.git] / bootstrap
blobf004ad326005988e01985192accdbb8a3816b200
1 #! /bin/sh
2 # Print a version string.
3 scriptversion=2011-03-03.12; # UTC
5 # Bootstrap this package from checked-out sources.
7 # Copyright (C) 2003-2011 Free Software Foundation, Inc.
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.
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.
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/>.
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.
30 # Please report bugs or propose patches to bug-gnulib@gnu.org.
32 nl='
35 # Ensure file names are sorted consistently across platforms.
36 LC_ALL=C
37 export LC_ALL
39 local_gl_dir=gl
41 # Temporary directory names.
42 bt='._bootmp'
43 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
44 bt2=${bt}2
45 me=$0
47 usage() {
48 cat <<EOF
49 Usage: $me [OPTION]...
50 Bootstrap this package from the checked-out sources.
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
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.
73 For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
74 are honored.
76 Running without arguments will suffice in most cases.
77 EOF
80 # Configuration.
82 # Name of the Makefile.am
83 gnulib_mk=gnulib.mk
85 # List of gnulib modules needed.
86 gnulib_modules=
88 # Any gnulib files needed that are not in modules.
89 gnulib_files=
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() { :; }
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() { :; }
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'"
108 extract_package_name='
109 /^AC_INIT(/{
110 /.*,.*,.*, */{
111 s///
112 s/[][]//g
113 s/)$//
117 s/AC_INIT(\[*//
118 s/]*,.*//
119 s/^GNU //
120 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
121 s/[^A-Za-z0-9_]/-/g
125 package=`sed -n "$extract_package_name" configure.ac` || exit
126 gnulib_name=lib$package
128 build_aux=build-aux
129 source_base=lib
130 m4_base=m4
131 doc_base=doc
132 tests_base=tests
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
146 # Additional gnulib-tool options to use. Use "\newline" to break lines.
147 gnulib_tool_option_extras=
149 # Other locale categories that need message catalogs.
150 EXTRA_LOCALE_CATEGORIES=
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\\\
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
163 # Files we don't want to import.
164 excluded_files=
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
170 # Whether to use copies instead of symlinks.
171 copy=false
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
179 # Set this to true in bootstrap.conf to enable --bootstrap-sync by
180 # default.
181 bootstrap_sync=false
183 # Use git to update gnulib sources
184 use_git=true
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 ()
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
201 if ($i --version </dev/null) >/dev/null 2>&1; then
202 find_tool_res=$i
203 break
205 done
206 else
207 find_tool_error_prefix="\$$find_tool_envvar: "
209 if test x"$find_tool_res" = x; then
210 echo >&2 "$me: one of these is required: $find_tool_names"
211 exit 1
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
217 eval "$find_tool_envvar=\$find_tool_res"
218 eval "export $find_tool_envvar"
221 # Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6.
222 find_tool SHA1SUM sha1sum gsha1sum shasum
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
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"
239 # Translate configuration into internal form.
241 # Parse options.
243 for option
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;;
264 echo >&2 "$0: $option: unknown option"
265 exit 1;;
266 esac
267 done
269 if $use_git || test -d "$GNULIB_SRCDIR"; then
271 else
272 echo "$0: Error: --no-git requires --gnulib-srcdir" >&2
273 exit 1
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
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
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"
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
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
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"
339 # split on '.' and compare each component
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"
363 break
365 i=$(($i+1))
366 done
369 get_version() {
370 app=$1
372 $app --version >/dev/null 2>&1 || return 1
374 $app --version 2>&1 |
375 sed -n '# Move version to start of line.
376 s/.*[v ]\([0-9]\)/\1/
378 # Skip lines that do not start with version.
379 /^[0-9]/!d
381 # Remove characters after the version.
382 s/[^.a-z0-9-].*//
384 # The first component must be digits only.
385 s/^\([0-9]*\)[a-z-].*/\1/
387 #the following essentially does s/5.005/5.5/
388 s/\.0*\([1-9]\)/.\1/g
393 check_versions() {
394 ret=0
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
401 # Exempt git if --no-git is in effect.
402 if test "$app" = git; then
403 $use_git || continue
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
421 done
423 return $ret
426 print_versions() {
427 echo "Program Min_version"
428 echo "----------------------"
429 printf %s "$buildreq"
430 echo "----------------------"
431 # can't depend on column -t
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
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
453 exit 1
456 echo "$0: Bootstrapping from checked-out $package sources..."
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
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"
472 cleanup_gnulib() {
473 status=$?
474 rm -fr "$gnulib_path"
475 exit $status
478 git_modules_config () {
479 test -f .gitmodules && git config --file .gitmodules "$@"
482 gnulib_path=`git_modules_config submodule.gnulib.path`
483 test -z "$gnulib_path" && gnulib_path=gnulib
485 # Get gnulib files.
487 case ${GNULIB_SRCDIR--} in
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 $?
494 elif [ ! -d "$gnulib_path" ]; then
495 echo "$0: getting gnulib files..."
497 trap cleanup_gnulib 1 2 13 15
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
504 trap - 1 2 13 15
506 GNULIB_SRCDIR=$gnulib_path
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 $?
531 GNULIB_SRCDIR=$gnulib_path
534 esac
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
546 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
547 <$gnulib_tool || exit
549 # Get translations.
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"
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
569 # Mirror *.po files into this dir.
570 # Usually contains *.s1 checksum files.
571 ref_po_dir="$po_dir/.reference"
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
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"
592 done
595 case $SKIP_PO in
597 if test -d po; then
598 update_po_files po $package || exit
601 if test -d runtime-po; then
602 update_po_files runtime-po $package-runtime || exit
603 fi;;
604 esac
606 symlink_to_dir()
608 src=$1/$2
609 dst=${3-$2}
611 test -f "$src" && {
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"
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
630 if $copy; then
632 test ! -h "$dst" || {
633 echo "$me: rm -f $dst" &&
634 rm -f "$dst"
636 } &&
637 test -f "$dst" &&
638 cmp -s "$src" "$dst" || {
639 echo "$me: cp -fp $src $dst" &&
640 cp -fp "$src" "$dst"
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 /*) ;;
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
661 echo "$me: ln -fs $dot_dots$src $dst" &&
662 ln -fs "$dot_dots$src" "$dst"
668 cp_mark_as_generated()
670 cp_src=$1
671 cp_dst=$2
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
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"
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"
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" &&
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"
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
733 test $found = yes
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
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], [])
774 AC_DEFUN([gl_LOCK_EARLY], [])
775 ' $1/$dir/$file >$dir/$file
776 else
777 cp_mark_as_generated $1/$dir/$file $dir/$file
779 fi || exit
780 done
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/
799 insert_vc_ignore $ig "$f"
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"
806 done
807 done
811 # Create boot temporary directories to import from gnulib and gettext.
812 rm -fr $bt $bt2 &&
813 mkdir $bt $bt2 || exit
815 # Import from gnulib.
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\
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
835 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
836 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
837 slurp $bt || exit
839 for file in $gnulib_files; do
840 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
841 done
844 # Import from gettext.
845 with_gettext=yes
846 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
847 with_gettext=no
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
855 rm -fr $bt $bt2 || exit
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
869 # Reconfigure, getting other files.
871 # Skip autoheader if it's not needed.
872 grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
873 AUTOHEADER=true
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"
882 if test "$command" = libtool; then
883 test $use_libtool = 0 \
884 && continue
885 command="${LIBTOOLIZE-libtoolize} -c -f"
887 echo "$0: $command ..."
888 eval "$command" || exit
889 done
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
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/$/ \\/
913 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
915 ' po/Makevars.template >po/Makevars || exit 1
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/$/ \\/
927 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
929 ' po/Makevars.template >runtime-po/Makevars || exit 1
931 # Copy identical files from po to runtime-po.
932 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
936 bootstrap_epilogue
938 echo "$0: done. Now you can run './configure'."
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: