]> git.saurik.com Git - bison.git/blob - bootstrap
Fix some .gitignore and .cvsignore problems.
[bison.git] / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from checked-out sources.
4
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation,
6 # Inc.
7
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.
12
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.
17
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/>.
20
21 # Written by Paul Eggert.
22
23 nl='
24 '
25
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
30
31 local_gl_dir=gl
32
33 # Temporary directory names.
34 bt='._bootmp'
35 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
36 bt2=${bt}2
37
38 usage() {
39 echo >&2 "\
40 Usage: $0 [OPTION]...
41 Bootstrap this package from the checked-out sources.
42
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.
55
56 If the file bootstrap.conf exists in the current working directory, its
57 contents are read as shell variables to configure the bootstrap.
58
59 Running without arguments will suffice in most cases.
60 "
61 }
62
63 # Configuration.
64
65 # Name of the Makefile.am
66 gnulib_mk=gnulib.mk
67
68 # List of gnulib modules needed.
69 gnulib_modules=
70
71 # Any gnulib files needed that are not in modules.
72 gnulib_files=
73
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'"
81
82 extract_package_name='
83 /^AC_INIT(/{
84 /.*,.*,.*,/{
85 s///
86 s/[][]//g
87 p
88 q
89 }
90 s/AC_INIT(\[*//
91 s/]*,.*//
92 s/^GNU //
93 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
94 s/[^A-Za-z0-9_]/-/g
95 p
96 }
97 '
98 package=`sed -n "$extract_package_name" configure.ac` || exit
99 gnulib_name=lib$package
100
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
112 "
113
114 # Additional gnulib-tool options to use. Use "\newline" to break lines.
115 gnulib_tool_option_extras=
116
117 # Other locale categories that need message catalogs.
118 EXTRA_LOCALE_CATEGORIES=
119
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\\\
125 '
126
127 # Files we don't want to import.
128 excluded_files=
129
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=README-hacking
133
134 # Whether to use copies instead of symlinks.
135 copy=false
136
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
142
143 # find_tool ENVVAR NAMES...
144 # -------------------------
145 find_tool ()
146 {
147 # Find sha1sum, named gsha1sum on MacPorts.
148 find_tool_envvar=$1
149 shift
150 if eval test x"\$$find_tool_envvar" = x; then
151 for i
152 do
153 if ($i --version </dev/null) >/dev/null 2>&1; then
154 find_tool_res=$i
155 break
156 fi
157 done
158 fi
159 if test x"$find_tool_res" = x; then
160 echo >&2 "$0: $find_tool_name is required"
161 exit 1
162 fi
163 ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
164 echo >&2 "$0: cannot run $find_tool_res --version"
165 exit 1
166 }
167 eval "$find_tool_envvar=\"$find_tool_res\""
168 eval "export $find_tool_envvar"
169 }
170
171 # Find sha1sum, named gsha1sum on MacPorts.
172 find_tool SHA1SUM sha1sum gsha1sum
173
174 # Override the default configuration, if necessary.
175 test -r bootstrap.conf && . ./bootstrap.conf
176
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"
181 fi
182
183 # Translate configuration into internal form.
184
185 # Parse options.
186
187 for option
188 do
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;;
203 *)
204 echo >&2 "$0: $option: unknown option"
205 exit 1;;
206 esac
207 done
208
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
212 fi
213
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
223 }
224
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,^,/,`;;
234 *)
235 pattern="$2";;
236 esac
237 insert_sorted_if_absent "$vc_ignore_file" "$pattern"
238 }
239
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
250 fi
251
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
260 fi
261
262 echo "$0: Bootstrapping from checked-out $package sources..."
263
264 cleanup_gnulib() {
265 status=$?
266 rm -fr gnulib
267 exit $status
268 }
269
270 # Get gnulib files.
271
272 case ${GNULIB_SRCDIR--} in
273 -)
274 if [ ! -d gnulib ]; then
275 echo "$0: getting gnulib files..."
276
277 case ${CVS_AUTH-pserver} in
278 pserver)
279 CVS_PREFIX=':pserver:anonymous@';;
280 ssh)
281 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
282 *)
283 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
284 exit 1;;
285 esac
286
287 case $CVS_RSH in
288 '') CVS_RSH=ssh; export CVS_RSH;;
289 esac
290
291 trap cleanup_gnulib 1 2 13 15
292
293 cvs -z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org:/gnulib.git co -d gnulib HEAD ||
294 cleanup_gnulib
295
296 trap - 1 2 13 15
297 fi
298 GNULIB_SRCDIR=gnulib
299 esac
300
301 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
302 <$gnulib_tool || exit
303
304 # Get translations.
305
306 download_po_files() {
307 subdir=$1
308 domain=$2
309 echo "$0: getting translations into $subdir for $domain..."
310 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
311 eval "$cmd"
312 }
313
314 # Download .po files to $po_dir/.reference and copy only the new
315 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
316 update_po_files() {
317 # Directory containing primary .po files.
318 # Overwrite them only when we're sure a .po file is new.
319 po_dir=$1
320 domain=$2
321
322 # Download *.po files into this dir.
323 # Usually contains *.s1 checksum files.
324 ref_po_dir="$po_dir/.reference"
325
326 test -d $ref_po_dir || mkdir $ref_po_dir || return
327 download_po_files $ref_po_dir $domain \
328 && ls "$ref_po_dir"/*.po 2>/dev/null |
329 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
330
331 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
332 new_po="$ref_po_dir/$po.po"
333 cksum_file="$ref_po_dir/$po.s1"
334 if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev/null; then
335 echo "updated $po_dir/$po.po..."
336 cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file"
337 fi
338 done
339 }
340
341 case $SKIP_PO in
342 '')
343 if test -d po; then
344 update_po_files po $package || exit
345 fi
346
347 if test -d runtime-po; then
348 update_po_files runtime-po $package-runtime || exit
349 fi;;
350 esac
351
352 check_dst_dir()
353 {
354 dst=$1
355 # If the destination directory doesn't exist, create it.
356 # This is required at least for "lib/uniwidth/cjk.h".
357 dst_dir=`dirname "$dst"`
358 if ! test -d "$dst_dir"; then
359 mkdir -p "$dst_dir"
360
361 # If we've just created a directory like lib/uniwidth,
362 # tell version control system(s) it's ignorable.
363 # FIXME: for now, this does only one level
364 parent=`dirname "$dst_dir"`
365 for dot_ig in x $vc_ignore; do
366 test $dot_ig = x && continue
367 ig=$parent/$dot_ig
368 insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'`
369 done
370 fi
371 }
372
373 symlink_to_dir()
374 {
375 src=$1/$2
376 dst=${3-$2}
377
378 test -f "$src" && {
379
380 check_dst_dir "$dst"
381
382 if $copy; then
383 {
384 test ! -h "$dst" || {
385 echo "$0: rm -f $dst" &&
386 rm -f "$dst"
387 }
388 } &&
389 test -f "$dst" &&
390 cmp -s "$src" "$dst" || {
391 echo "$0: cp -fp $src $dst" &&
392 cp -fp "$src" "$dst"
393 }
394 else
395 test -h "$dst" &&
396 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
397 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
398 test "$src_i" = "$dst_i" || {
399 dot_dots=
400 case $src in
401 /*) ;;
402 *)
403 case /$dst/ in
404 *//* | */../* | */./* | /*/*/*/*/*/)
405 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
406 exit 1;;
407 /*/*/*/*/) dot_dots=../../../;;
408 /*/*/*/) dot_dots=../../;;
409 /*/*/) dot_dots=../;;
410 esac;;
411 esac
412
413 echo "$0: ln -fs $dot_dots$src $dst" &&
414 ln -fs "$dot_dots$src" "$dst"
415 }
416 fi
417 }
418 }
419
420 cp_mark_as_generated()
421 {
422 cp_src=$1
423 cp_dst=$2
424
425 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
426 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
427 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
428 symlink_to_dir $local_gl_dir "$cp_dst"
429 else
430 case $cp_dst in
431 *.[ch]) c1='/* '; c2=' */';;
432 *.texi) c1='@c '; c2= ;;
433 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
434 *) c1= ; c2= ;;
435 esac
436
437 if test -z "$c1"; then
438 cmp -s "$cp_src" "$cp_dst" || {
439 echo "$0: cp -f $cp_src $cp_dst" &&
440 rm -f "$cp_dst" &&
441 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
442 }
443 else
444 check_dst_dir "$cp_dst"
445 # Copy the file first to get proper permissions if it
446 # doesn't already exist. Then overwrite the copy.
447 cp "$cp_src" "$cp_dst-t" &&
448 (
449 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
450 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
451 sed "s!$bt_regex/!!g" "$cp_src"
452 ) > $cp_dst-t &&
453 if cmp -s "$cp_dst-t" "$cp_dst"; then
454 rm -f "$cp_dst-t"
455 else
456 echo "$0: cp $cp_src $cp_dst # with edits" &&
457 mv -f "$cp_dst-t" "$cp_dst"
458 fi
459 fi
460 fi
461 }
462
463 version_controlled_file() {
464 dir=$1
465 file=$2
466 found=no
467 if test -d CVS; then
468 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
469 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
470 elif test -d .git; then
471 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
472 else
473 echo "$0: no version control for $dir/$file?" >&2
474 fi
475 test $found = yes
476 }
477
478 slurp() {
479 for dir in . `(cd $1 && find * -type d -print)`; do
480 copied=
481 sep=
482 for file in `ls -a $1/$dir`; do
483 case $file in
484 .|..) continue;;
485 .*) continue;; # FIXME: should all file names starting with "." be ignored?
486 esac
487 test -d $1/$dir/$file && continue
488 for excluded_file in $excluded_files; do
489 test "$dir/$file" = "$excluded_file" && continue 2
490 done
491 if test $file = Makefile.am; then
492 copied=$copied${sep}$gnulib_mk; sep=$nl
493 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
494 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
495 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
496 rm -f $dir/$gnulib_mk &&
497 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
498 }
499 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
500 version_controlled_file $dir $file; then
501 echo "$0: $dir/$file overrides $1/$dir/$file"
502 else
503 copied=$copied$sep$file; sep=$nl
504 if test $file = gettext.m4; then
505 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
506 rm -f $dir/$file
507 sed '
508 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
509 AC_DEFUN([AM_INTL_SUBDIR], [
510 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
511 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
512 $a\
513 AC_DEFUN([gl_LOCK_EARLY], [])
514 ' $1/$dir/$file >$dir/$file
515 else
516 cp_mark_as_generated $1/$dir/$file $dir/$file
517 fi
518 fi || exit
519 done
520
521 for dot_ig in x $vc_ignore; do
522 test $dot_ig = x && continue
523 ig=$dir/$dot_ig
524 if test -n "$copied"; then
525 insert_vc_ignore $ig "$copied"
526 # If an ignored file name ends with _.h, then also add
527 # the name with just ".h". Many gnulib headers are generated,
528 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
529 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
530 f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
531 insert_vc_ignore $ig "$f"
532
533 # For files like sys_stat_.h and sys_time_.h, record as
534 # ignorable the directory we might eventually create: sys/.
535 f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
536 insert_vc_ignore $ig "$f"
537 fi
538 done
539 done
540 }
541
542
543 # Create boot temporary directories to import from gnulib and gettext.
544 rm -fr $bt $bt2 &&
545 mkdir $bt $bt2 || exit
546
547 # Import from gnulib.
548
549 gnulib_tool_options="\
550 --import\
551 --no-changelog\
552 --aux-dir $bt/$build_aux\
553 --doc-base $bt/doc\
554 --lib $gnulib_name\
555 --m4-base $bt/m4/\
556 --source-base $bt/lib/\
557 --tests-base $bt/tests\
558 --local-dir $local_gl_dir\
559 $gnulib_tool_option_extras\
560 "
561 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
562 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
563 slurp $bt || exit
564
565 for file in $gnulib_files; do
566 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
567 done
568
569
570 # Import from gettext.
571 with_gettext=yes
572 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
573 with_gettext=no
574
575 if test $with_gettext = yes; then
576 echo "$0: (cd $bt2; autopoint) ..."
577 cp configure.ac $bt2 &&
578 (cd $bt2 && autopoint && rm configure.ac) &&
579 slurp $bt2 $bt || exit
580
581 rm -fr $bt $bt2 || exit
582 fi
583
584 # Coreutils is unusual in that it generates some of its test-related
585 # Makefile.am files. That must be done before invoking automake.
586 mam_template=tests/Makefile.am.in
587 if test -f $mam_template; then
588 PERL=perl
589 for tool in cut head join pr sort tac tail test tr uniq wc; do
590 m=tests/$tool/Makefile.am
591 t=${m}t
592 rm -f $m $t
593 sed -n '1,/^##test-files-begin/p' $mam_template > $t
594 echo "x = $tool" >> $t
595 srcdir=tests/$tool
596 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
597 sed -n '/^##test-files-end/,$p' $mam_template >> $t
598 chmod -w $t
599 mv $t $m
600 done
601 fi
602
603 # Reconfigure, getting other files.
604
605 for command in \
606 libtool \
607 'aclocal --force -I m4' \
608 'autoconf --force' \
609 'autoheader --force' \
610 'automake --add-missing --copy --force-missing';
611 do
612 if test "$command" = libtool; then
613 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
614 continue
615 command='libtoolize -c -f'
616 fi
617 echo "$0: $command ..."
618 $command || exit
619 done
620
621
622 # Get some extra files from gnulib, overriding existing files.
623 for file in $gnulib_extra_files; do
624 case $file in
625 */INSTALL) dst=INSTALL;;
626 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
627 *) dst=$file;;
628 esac
629 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
630 done
631
632 if test $with_gettext = yes; then
633 # Create gettext configuration.
634 echo "$0: Creating po/Makevars from po/Makevars.template ..."
635 rm -f po/Makevars
636 sed '
637 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
638 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
639 /^XGETTEXT_OPTIONS *=/{
640 s/$/ \\/
641 a\
642 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
643 }
644 ' po/Makevars.template >po/Makevars
645
646 if test -d runtime-po; then
647 # Similarly for runtime-po/Makevars, but not quite the same.
648 rm -f runtime-po/Makevars
649 sed '
650 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
651 /^subdir *=.*/s/=.*/= runtime-po/
652 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
653 /^XGETTEXT_OPTIONS *=/{
654 s/$/ \\/
655 a\
656 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
657 }
658 ' <po/Makevars.template >runtime-po/Makevars
659
660 # Copy identical files from po to runtime-po.
661 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
662 fi
663 fi
664
665 echo "$0: done. Now you can run './configure'."