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