Regen.
[bison/ericb.git] / bootstrap
blob031ecf75540599ef353c7a1cad3e69725f2166b3
1 #! /bin/sh
3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
6 # Free Software Foundation, Inc.
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 # Written by Paul Eggert.
23 nl='
26 # Ensure file names are sorted consistently across platforms.
27 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
28 LC_ALL=C
29 export LC_ALL
31 local_gl_dir=gl
33 # Temporary directory names.
34 bt='._bootmp'
35 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
36 bt2=${bt}2
38 usage() {
39 cat <<EOF
40 Usage: $0 [OPTION]...
41 Bootstrap this package from the checked-out sources.
43 Options:
44 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
45 sources reside. Use this if you already
46 have gnulib sources on your machine, and
47 do not want to waste your bandwidth downloading
48 them again.
49 --copy Copy files instead of creating symbolic links.
50 --force Attempt to bootstrap even if the sources seem
51 not to have been checked out.
52 --skip-po Do not download po files.
53 --cvs-user=USERNAME Set the username to use when checking out
54 sources from the gnulib repository.
56 If the file bootstrap.conf exists in the current working directory, its
57 contents are read as shell variables to configure the bootstrap.
59 Running without arguments will suffice in most cases.
60 EOF
63 # Configuration.
65 # Name of the Makefile.am
66 gnulib_mk=gnulib.mk
68 # List of gnulib modules needed.
69 gnulib_modules=
71 # Any gnulib files needed that are not in modules.
72 gnulib_files=
74 # The command to download all .po files for a specified domain into
75 # a specified directory. Fill in the first %s is the domain name, and
76 # the second with the destination directory. Use rsync's -L and -r
77 # options because the latest/%s directory and the .po files within are
78 # all symlinks.
79 po_download_command_format=\
80 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
82 extract_package_name='
83 /^AC_INIT(/{
84 /.*,.*,.*,/{
85 s///
86 s/[][]//g
90 s/AC_INIT(\[*//
91 s/]*,.*//
92 s/^GNU //
93 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
94 s/[^A-Za-z0-9_]/-/g
98 package=`sed -n "$extract_package_name" configure.ac` || exit
99 gnulib_name=lib$package
101 build_aux=build-aux
102 # Extra files from gnulib, which override files from other sources.
103 gnulib_extra_files="
104 $build_aux/install-sh
105 $build_aux/missing
106 $build_aux/mdate-sh
107 $build_aux/texinfo.tex
108 $build_aux/depcomp
109 $build_aux/config.guess
110 $build_aux/config.sub
111 doc/INSTALL
114 # Additional gnulib-tool options to use. Use "\newline" to break lines.
115 gnulib_tool_option_extras=
117 # Other locale categories that need message catalogs.
118 EXTRA_LOCALE_CATEGORIES=
120 # Additional xgettext options to use. Use "\\\newline" to break lines.
121 XGETTEXT_OPTIONS='\\\
122 --flag=_:1:pass-c-format\\\
123 --flag=N_:1:pass-c-format\\\
124 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
127 # Files we don't want to import.
128 excluded_files=
130 # File that should exist in the top directory of a checked out hierarchy,
131 # but not in a distribution tarball.
132 checkout_only_file=HACKING
134 # Whether to use copies instead of symlinks.
135 copy=false
137 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
138 # those files to be generated in directories like lib/, m4/, and po/.
139 # Or set it to 'auto' to make this script select which to use based
140 # on which version control system (if any) is used in the source directory.
141 vc_ignore=auto
143 # find_tool ENVVAR NAMES...
144 # -------------------------
145 find_tool ()
147 find_tool_envvar=$1
148 shift
149 find_tool_name=$@
150 if eval test x"\$$find_tool_envvar" = x; then
151 for i
153 if ($i --version </dev/null) >/dev/null 2>&1; then
154 find_tool_res=$i
155 break
157 done
159 if test x"$find_tool_res" = x; then
160 echo >&2 "$0: one of these is required: $find_tool_names"
161 exit 1
163 ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
164 echo >&2 "$0: cannot run $find_tool_res --version"
165 exit 1
167 eval "$find_tool_envvar=\"$find_tool_res\""
168 eval "export $find_tool_envvar"
171 # Find sha1sum, named gsha1sum on MacPorts.
172 find_tool SHA1SUM sha1sum gsha1sum
174 # Override the default configuration, if necessary.
175 test -r bootstrap.conf && . ./bootstrap.conf
177 if test "$vc_ignore" = auto; then
178 vc_ignore=
179 test -d .git && vc_ignore=.gitignore
180 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
183 # Translate configuration into internal form.
185 # Parse options.
187 for option
189 case $option in
190 --help)
191 usage
192 exit;;
193 --gnulib-srcdir=*)
194 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
195 --cvs-user=*)
196 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
197 --skip-po)
198 SKIP_PO=t;;
199 --force)
200 checkout_only_file=;;
201 --copy)
202 copy=true;;
204 echo >&2 "$0: $option: unknown option"
205 exit 1;;
206 esac
207 done
209 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
210 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
211 exit 1
214 # If each line in $STR is not already on a line by itself in $FILE, insert it,
215 # sorting the new contents of the file and replacing $FILE with the result.
216 insert_sorted_if_absent() {
217 file=$1
218 str=$2
219 test -f $file || touch $file
220 echo "$str" | sort -u - $file | cmp -s - $file \
221 || echo "$str" | sort -u - $file -o $file \
222 || exit 1
225 # Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
226 # insert_sorted_if_absent.
227 insert_vc_ignore() {
228 vc_ignore_file="$1"
229 case $vc_ignore_file in
230 *.gitignore)
231 # A .gitignore entry that does not start with `/' applies recursively to
232 # subdirectories, so prepend `/' to every .gitignore entry.
233 pattern=`echo "$2" | sed s,^,/,`;;
235 pattern="$2";;
236 esac
237 insert_sorted_if_absent "$vc_ignore_file" "$pattern"
240 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
241 found_aux_dir=no
242 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
243 >/dev/null && found_aux_dir=yes
244 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
245 >/dev/null && found_aux_dir=yes
246 if test $found_aux_dir = no; then
247 echo "$0: expected line not found in configure.ac. Add the following:" >&2
248 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
249 exit 1
252 # If $build_aux doesn't exist, create it now, otherwise some bits
253 # below will malfunction. If creating it, also mark it as ignored.
254 if test ! -d $build_aux; then
255 mkdir $build_aux
256 for dot_ig in x $vc_ignore; do
257 test $dot_ig = x && continue
258 insert_vc_ignore $dot_ig $build_aux
259 done
262 echo "$0: Bootstrapping from checked-out $package sources..."
264 cleanup_gnulib() {
265 status=$?
266 rm -fr gnulib
267 exit $status
270 # See if we can use gnulib's git-merge-changelog merge driver.
272 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
273 if git config merge.merge-changelog.driver >/dev/null ; then
275 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
276 echo "initializing git-merge-changelog driver"
277 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
278 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
279 else
280 echo "consider installing git-merge-changelog from gnulib"
284 # Get gnulib files.
286 case ${GNULIB_SRCDIR--} in
288 if [ ! -d gnulib ]; then
289 echo "$0: getting gnulib files..."
291 case ${CVS_AUTH-pserver} in
292 pserver)
293 CVS_PREFIX=':pserver:anonymous@';;
294 ssh)
295 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
297 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
298 exit 1;;
299 esac
301 case $CVS_RSH in
302 '') CVS_RSH=ssh; export CVS_RSH;;
303 esac
305 trap cleanup_gnulib 1 2 13 15
307 cvs -z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org:/gnulib.git co -d gnulib HEAD ||
308 cleanup_gnulib
310 trap - 1 2 13 15
312 GNULIB_SRCDIR=gnulib
313 esac
315 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
316 <$gnulib_tool || exit
318 # Get translations.
320 download_po_files() {
321 subdir=$1
322 domain=$2
323 echo "$0: getting translations into $subdir for $domain..."
324 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
325 eval "$cmd"
328 # Download .po files to $po_dir/.reference and copy only the new
329 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
330 update_po_files() {
331 # Directory containing primary .po files.
332 # Overwrite them only when we're sure a .po file is new.
333 po_dir=$1
334 domain=$2
336 # Download *.po files into this dir.
337 # Usually contains *.s1 checksum files.
338 ref_po_dir="$po_dir/.reference"
340 test -d $ref_po_dir || mkdir $ref_po_dir || return
341 download_po_files $ref_po_dir $domain \
342 && ls "$ref_po_dir"/*.po 2>/dev/null |
343 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
345 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
346 new_po="$ref_po_dir/$po.po"
347 cksum_file="$ref_po_dir/$po.s1"
348 if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev/null; then
349 echo "updated $po_dir/$po.po..."
350 cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file"
352 done
355 case $SKIP_PO in
357 if test -d po; then
358 update_po_files po $package || exit
361 if test -d runtime-po; then
362 update_po_files runtime-po $package-runtime || exit
363 fi;;
364 esac
366 check_dst_dir()
368 dst=$1
369 # If the destination directory doesn't exist, create it.
370 # This is required at least for "lib/uniwidth/cjk.h".
371 dst_dir=`dirname "$dst"`
372 if ! test -d "$dst_dir"; then
373 mkdir -p "$dst_dir"
375 # If we've just created a directory like lib/uniwidth,
376 # tell version control system(s) it's ignorable.
377 # FIXME: for now, this does only one level
378 parent=`dirname "$dst_dir"`
379 for dot_ig in x $vc_ignore; do
380 test $dot_ig = x && continue
381 ig=$parent/$dot_ig
382 insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'`
383 done
387 symlink_to_dir()
389 src=$1/$2
390 dst=${3-$2}
392 test -f "$src" && {
394 check_dst_dir "$dst"
396 if $copy; then
398 test ! -h "$dst" || {
399 echo "$0: rm -f $dst" &&
400 rm -f "$dst"
402 } &&
403 test -f "$dst" &&
404 cmp -s "$src" "$dst" || {
405 echo "$0: cp -fp $src $dst" &&
406 cp -fp "$src" "$dst"
408 else
409 test -h "$dst" &&
410 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
411 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
412 test "$src_i" = "$dst_i" || {
413 dot_dots=
414 case $src in
415 /*) ;;
417 case /$dst/ in
418 *//* | */../* | */./* | /*/*/*/*/*/)
419 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
420 exit 1;;
421 /*/*/*/*/) dot_dots=../../../;;
422 /*/*/*/) dot_dots=../../;;
423 /*/*/) dot_dots=../;;
424 esac;;
425 esac
427 echo "$0: ln -fs $dot_dots$src $dst" &&
428 ln -fs "$dot_dots$src" "$dst"
434 cp_mark_as_generated()
436 cp_src=$1
437 cp_dst=$2
439 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
440 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
441 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
442 symlink_to_dir $local_gl_dir "$cp_dst"
443 else
444 case $cp_dst in
445 *.[ch]) c1='/* '; c2=' */';;
446 *.texi) c1='@c '; c2= ;;
447 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
448 *) c1= ; c2= ;;
449 esac
451 if test -z "$c1"; then
452 cmp -s "$cp_src" "$cp_dst" || {
453 echo "$0: cp -f $cp_src $cp_dst" &&
454 rm -f "$cp_dst" &&
455 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
457 else
458 check_dst_dir "$cp_dst"
459 # Copy the file first to get proper permissions if it
460 # doesn't already exist. Then overwrite the copy.
461 cp "$cp_src" "$cp_dst-t" &&
463 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
464 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
465 sed "s!$bt_regex/!!g" "$cp_src"
466 ) > $cp_dst-t &&
467 if cmp -s "$cp_dst-t" "$cp_dst"; then
468 rm -f "$cp_dst-t"
469 else
470 echo "$0: cp $cp_src $cp_dst # with edits" &&
471 mv -f "$cp_dst-t" "$cp_dst"
477 version_controlled_file() {
478 dir=$1
479 file=$2
480 found=no
481 if test -d CVS; then
482 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
483 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
484 elif test -d .git; then
485 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
486 else
487 echo "$0: no version control for $dir/$file?" >&2
489 test $found = yes
492 slurp() {
493 for dir in . `(cd $1 && find * -type d -print)`; do
494 copied=
495 sep=
496 for file in `ls -a $1/$dir`; do
497 case $file in
498 .|..) continue;;
499 .*) continue;; # FIXME: should all file names starting with "." be ignored?
500 esac
501 test -d $1/$dir/$file && continue
502 for excluded_file in $excluded_files; do
503 test "$dir/$file" = "$excluded_file" && continue 2
504 done
505 if test $file = Makefile.am; then
506 copied=$copied${sep}$gnulib_mk; sep=$nl
507 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
508 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..."
509 rm -f $dir/$gnulib_mk
510 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
511 etc/prefix-gnulib-mk $dir/$gnulib_mk
512 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
513 version_controlled_file $dir $file; then
514 echo "$0: $dir/$file overrides $1/$dir/$file"
515 else
516 copied=$copied$sep$file; sep=$nl
517 if test $file = gettext.m4; then
518 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
519 rm -f $dir/$file
520 sed '
521 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
522 AC_DEFUN([AM_INTL_SUBDIR], [
523 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
524 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
526 AC_DEFUN([gl_LOCK_EARLY], [])
527 ' $1/$dir/$file >$dir/$file
528 else
529 cp_mark_as_generated $1/$dir/$file $dir/$file
531 fi || exit
532 done
534 for dot_ig in x $vc_ignore; do
535 test $dot_ig = x && continue
536 ig=$dir/$dot_ig
537 if test -n "$copied"; then
538 insert_vc_ignore $ig "$copied"
539 # If an ignored file name ends with _.h, then also add
540 # the name with just ".h". Many gnulib headers are generated,
541 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
542 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
543 f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
544 insert_vc_ignore $ig "$f"
546 # For files like sys_stat_.h and sys_time_.h, record as
547 # ignorable the directory we might eventually create: sys/.
548 f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
549 insert_vc_ignore $ig "$f"
551 done
552 done
556 # Create boot temporary directories to import from gnulib and gettext.
557 rm -fr $bt $bt2 &&
558 mkdir $bt $bt2 || exit
560 # Import from gnulib.
562 gnulib_tool_options="\
563 --import\
564 --no-changelog\
565 --aux-dir $bt/$build_aux\
566 --doc-base $bt/doc\
567 --lib $gnulib_name\
568 --m4-base $bt/m4/\
569 --source-base $bt/lib/\
570 --tests-base $bt/tests\
571 --local-dir $local_gl_dir\
572 $gnulib_tool_option_extras\
574 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
575 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
576 slurp $bt || exit
578 for file in $gnulib_files; do
579 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
580 done
583 # Import from gettext.
584 with_gettext=yes
585 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
586 with_gettext=no
588 if test $with_gettext = yes; then
589 echo "$0: (cd $bt2; autopoint) ..."
590 cp configure.ac $bt2 &&
591 (cd $bt2 && autopoint && rm configure.ac) &&
592 slurp $bt2 $bt || exit
594 rm -fr $bt $bt2 || exit
597 # Coreutils is unusual in that it generates some of its test-related
598 # Makefile.am files. That must be done before invoking automake.
599 mam_template=tests/Makefile.am.in
600 if test -f $mam_template; then
601 PERL=perl
602 for tool in cut head join pr sort tac tail test tr uniq wc; do
603 m=tests/$tool/Makefile.am
604 t=${m}t
605 rm -f $m $t
606 sed -n '1,/^##test-files-begin/p' $mam_template > $t
607 echo "x = $tool" >> $t
608 srcdir=tests/$tool
609 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
610 sed -n '/^##test-files-end/,$p' $mam_template >> $t
611 chmod -w $t
612 mv $t $m
613 done
616 # Reconfigure, getting other files.
618 for command in \
619 libtool \
620 'aclocal --force -I m4' \
621 'autoconf --force' \
622 'autoheader --force' \
623 'automake --add-missing --copy --force-missing';
625 if test "$command" = libtool; then
626 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
627 continue
628 command='libtoolize -c -f'
630 echo "$0: $command ..."
631 $command || exit
632 done
635 # Get some extra files from gnulib, overriding existing files.
636 for file in $gnulib_extra_files; do
637 case $file in
638 */INSTALL) dst=INSTALL;;
639 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
640 *) dst=$file;;
641 esac
642 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
643 done
645 if test $with_gettext = yes; then
646 # Create gettext configuration.
647 echo "$0: Creating po/Makevars from po/Makevars.template ..."
648 rm -f po/Makevars
649 sed '
650 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
651 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
652 /^XGETTEXT_OPTIONS *=/{
653 s/$/ \\/
655 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
657 ' po/Makevars.template >po/Makevars
659 if test -d runtime-po; then
660 # Similarly for runtime-po/Makevars, but not quite the same.
661 rm -f runtime-po/Makevars
662 sed '
663 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
664 /^subdir *=.*/s/=.*/= runtime-po/
665 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
666 /^XGETTEXT_OPTIONS *=/{
667 s/$/ \\/
669 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
671 ' <po/Makevars.template >runtime-po/Makevars
673 # Copy identical files from po to runtime-po.
674 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
678 echo "$0: done. Now you can run './configure'."