]> git.saurik.com Git - bison.git/blame - bootstrap
* data/yacc.c (yyexhaustedlab): Define it when YYERROR_VERBOSE is
[bison.git] / bootstrap
CommitLineData
01c56de4
AD
1#! /bin/sh
2
bbb44d83 3# Bootstrap this package from checked-out sources.
01c56de4 4
a7867f53 5# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
1f65350a
PE
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 2, or (at your option)
10# 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, write to the Free Software
0fb669f9
PE
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20# 02110-1301, USA.
1f65350a
PE
21
22# Written by Paul Eggert.
23
3b2942e6
PE
24nl='
25'
5a2baae7 26
62a9592d 27# Ensure file names are sorted consistently across platforms.
b5240ba5 28# Also, ensure diagnostics are in English, e.g., "wget --help" below.
a9f027b9
PE
29LC_ALL=C
30export LC_ALL
31
bbb44d83
PE
32# Temporary directory names.
33bt='._bootmp'
34bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
35bt2=${bt}2
36
e3ddc1e3
PE
37usage() {
38 echo >&2 "\
39Usage: $0 [OPTION]...
10f429ef 40Bootstrap this package from the checked-out sources.
e3ddc1e3
PE
41
42Options:
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
bbb44d83 46 do not want to waste your bandwidth downloading
e3ddc1e3 47 them again.
46356ea4 48 --copy Copy files instead of creating symbolic links.
10f429ef
PE
49 --force Attempt to bootstrap even if the sources seem
50 not to have been checked out.
e3ddc1e3 51 --skip-po Do not download po files.
bbb44d83
PE
52 --cvs-user=USERNAME Set the username to use when checking out
53 sources from the gnulib repository.
e3ddc1e3
PE
54
55If the file .bootstrap.conf exists in the current working directory, its
56contents are read as shell variables to configure the bootstrap.
57
58Running without arguments will suffice in most cases.
59"
60}
3b2942e6
PE
61
62# Configuration.
63
64# List of gnulib modules needed.
65gnulib_modules=
66
67# Any gnulib files needed that are not in modules.
68gnulib_files=
69
70# Translation Project URL, for the registry of all projects
71# and for the translation-team master directory.
72TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
73TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
74
75extract_package_name='
76 /^AC_INIT(/{
77 /.*,.*,.*,/{
78 s///
79 s/[][]//g
80 p
81 q
82 }
83 s/AC_INIT(\[*//
84 s/]*,.*//
85 s/^GNU //
86 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
87 s/[^A-Za-z0-9_]/-/g
88 p
89 }
90'
91package=`sed -n "$extract_package_name" configure.ac` || exit
bbb44d83 92gnulib_name=lib$package
3b2942e6 93
bbb44d83 94build_aux=build-aux
3b2942e6 95# Extra files from gnulib, which override files from other sources.
bbb44d83
PE
96gnulib_extra_files="
97 $build_aux/install-sh
98 $build_aux/missing
99 $build_aux/mdate-sh
100 $build_aux/texinfo.tex
101 $build_aux/depcomp
102 $build_aux/config.guess
103 $build_aux/config.sub
3b2942e6 104 doc/INSTALL
bbb44d83 105"
3b2942e6
PE
106
107# Other locale categories that need message catalogs.
108EXTRA_LOCALE_CATEGORIES=
109
110# Additional xgettext options to use. Use "\\\newline" to break lines.
111XGETTEXT_OPTIONS='\\\
112 --flag=_:1:pass-c-format\\\
113 --flag=N_:1:pass-c-format\\\
114 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
115'
116
117# Files we don't want to import.
118excluded_files=
119
10f429ef
PE
120# File that should exist in the top directory of a checked out hierarchy,
121# but not in a distribution tarball.
bbb44d83 122checkout_only_file=README-hacking
e3ddc1e3 123
46356ea4
PE
124# Whether to use copies instead of symlinks.
125copy=false
126
3b2942e6
PE
127# Override the default configuration, if necessary.
128test -r bootstrap.conf && . ./bootstrap.conf
129
130# Translate configuration into internal form.
131
1f65350a
PE
132# Parse options.
133
134for option
135do
136 case $option in
137 --help)
e3ddc1e3 138 usage
1f65350a
PE
139 exit;;
140 --gnulib-srcdir=*)
e23d0dd7 141 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
1f65350a 142 --cvs-user=*)
e23d0dd7 143 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
1f65350a
PE
144 --skip-po)
145 SKIP_PO=t;;
e3ddc1e3 146 --force)
bbb44d83 147 checkout_only_file=;;
46356ea4
PE
148 --copy)
149 copy=true;;
1f65350a
PE
150 *)
151 echo >&2 "$0: $option: unknown option"
152 exit 1;;
153 esac
154done
155
bbb44d83 156if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
10f429ef 157 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
e3ddc1e3
PE
158 exit 1
159fi
160
bbb44d83
PE
161# If $STR is not already on a line by itself in $FILE, insert it,
162# sorting the new contents of the file and replacing $FILE with the result.
163insert_sorted_if_absent() {
164 file=$1
165 str=$2
166 echo "$str" | sort -u - $file | cmp -s - $file \
167 || echo "$str" | sort -u - $file -o $file \
168 || exit 1
169}
170
171# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
172found_aux_dir=no
173grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
174 >/dev/null && found_aux_dir=yes
175grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
176 >/dev/null && found_aux_dir=yes
177if test $found_aux_dir = no; then
178 echo "$0: expected line not found in configure.ac. Add the following:" >&2
179 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2.
180fi
181
182# If $build_aux doesn't exist, create it now, otherwise some bits
183# below will malfunction. If creating it, also mark it as ignored.
184if test ! -d $build_aux; then
185 mkdir $build_aux
186 for ig in .cvsignore .gitignore; do
187 test -f $ig && insert_sorted_if_absent $ig $build_aux
188 done
189fi
190
191echo "$0: Bootstrapping from checked-out $package sources..."
1f65350a 192
e10a80ee
PE
193cleanup_gnulib() {
194 status=$?
195 rm -fr gnulib
196 exit $status
197}
198
1f65350a
PE
199# Get gnulib files.
200
201case ${GNULIB_SRCDIR--} in
202-)
203 if [ ! -d gnulib ]; then
204 echo "$0: getting gnulib files..."
205
26546b42
PE
206 case ${CVS_AUTH-pserver} in
207 pserver)
208 CVS_PREFIX=':pserver:anonymous@';;
1f65350a
PE
209 ssh)
210 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
211 *)
212 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
213 exit 1;;
214 esac
215
216 case $CVS_RSH in
3b2942e6 217 '') CVS_RSH=ssh; export CVS_RSH;;
1f65350a
PE
218 esac
219
e10a80ee
PE
220 trap cleanup_gnulib 1 2 13 15
221
26546b42 222 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
e10a80ee 223 cleanup_gnulib
1f65350a 224
e10a80ee 225 trap - 1 2 13 15
1f65350a
PE
226 fi
227 GNULIB_SRCDIR=gnulib
228esac
229
284d8a13
PE
230gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
231<$gnulib_tool || exit
1f65350a 232
1f65350a
PE
233# Get translations.
234
5a2baae7
PE
235get_translations() {
236 subdir=$1
237 domain=$2
238
3b2942e6
PE
239 case $WGET_COMMAND in
240 '')
241 echo "$0: wget not available; skipping translations";;
242 ?*)
243 echo "$0: getting translations into $subdir for $domain..." &&
244
245 (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
246 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
247
248 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
249 sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
250 awk -F. '
251 { if (lang && $1 != lang) print lang, ver }
252 { lang = $1; ver = substr($0, index($0, ".") + 1) }
253 END { if (lang) print lang, ver }
254 ' | awk -v domain="$domain" -v subdir="$subdir" '
255 {
256 lang = $1
257 ver = $2
258 urlfmt = ""
259 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
260 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
261 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
262 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
263 }
264 END { print ":" }
265 ' | WGET_COMMAND="$WGET_COMMAND" sh;;
266 esac &&
267 ls "$subdir"/*.po 2>/dev/null |
268 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
269 rm -f "$subdir/$domain.html"
5a2baae7
PE
270}
271
1f65350a
PE
272case $SKIP_PO in
273'')
b5240ba5
PE
274 case `wget --help` in
275 *'--no-cache'*)
3b2942e6 276 WGET_COMMAND='wget -nv --no-cache';;
b5240ba5 277 *'--cache=on/off'*)
3b2942e6
PE
278 WGET_COMMAND='wget -nv --cache=off';;
279 *'--non-verbose'*)
280 WGET_COMMAND='wget -nv';;
b5240ba5 281 *)
3b2942e6 282 WGET_COMMAND='';;
b5240ba5
PE
283 esac
284
bbb44d83
PE
285 if test -d po; then
286 get_translations po $package || exit
287 fi
f7ab6a50 288
3b2942e6 289 if test -d runtime-po; then
5a2baae7 290 get_translations runtime-po $package-runtime || exit
3b2942e6 291 fi;;
1f65350a
PE
292esac
293
e70f46d1
PE
294symlink_to_gnulib()
295{
296 src=$GNULIB_SRCDIR/$1
297 dst=${2-$1}
e70f46d1
PE
298
299 test -f "$src" && {
46356ea4
PE
300 if $copy; then
301 {
302 test ! -h "$dst" || {
303 echo "$0: rm -f $dst" &&
304 rm -f "$dst"
305 }
306 } &&
307 test -f "$dst" &&
308 cmp -s "$src" "$dst" || {
309 echo "$0: cp -fp $src $dst" &&
310 cp -fp "$src" "$dst"
311 }
312 else
313 test -h "$dst" &&
314 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
315 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
316 test "$src_i" = "$dst_i" || {
317 dot_dots=
318 case $src in
319 /*) ;;
320 *)
321 case /$dst/ in
322 *//* | */../* | */./* | /*/*/*/*/*/)
323 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
324 exit 1;;
325 /*/*/*/*/) dot_dots=../../../;;
326 /*/*/*/) dot_dots=../../;;
327 /*/*/) dot_dots=../;;
328 esac;;
329 esac
330
331 echo "$0: ln -fs $dot_dots$src $dst" &&
332 ln -fs "$dot_dots$src" "$dst"
333 }
334 fi
e70f46d1
PE
335 }
336}
337
3b2942e6
PE
338cp_mark_as_generated()
339{
340 cp_src=$1
341 cp_dst=$2
1f65350a 342
e70f46d1
PE
343 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
344 symlink_to_gnulib "$cp_dst"
345 else
346 case $cp_dst in
347 *.[ch]) c1='/* '; c2=' */';;
348 *.texi) c1='@c '; c2= ;;
349 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
350 *) c1= ; c2= ;;
351 esac
1f65350a 352
e70f46d1
PE
353 if test -z "$c1"; then
354 cmp -s "$cp_src" "$cp_dst" || {
355 echo "$0: cp -f $cp_src $cp_dst" &&
bbb44d83
PE
356 rm -f "$cp_dst" &&
357 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
e70f46d1
PE
358 }
359 else
360 # Copy the file first to get proper permissions if it
361 # doesn't already exist. Then overwrite the copy.
362 cp "$cp_src" "$cp_dst-t" &&
363 (
364 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
365 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
bbb44d83 366 sed "s!$bt_regex/!!g" "$cp_src"
e70f46d1
PE
367 ) > $cp_dst-t &&
368 if cmp -s "$cp_dst-t" "$cp_dst"; then
369 rm -f "$cp_dst-t"
370 else
371 echo "$0: cp $cp_src $cp_dst # with edits" &&
372 mv -f "$cp_dst-t" "$cp_dst"
373 fi
374 fi
375 fi
3b2942e6 376}
1f65350a 377
10f429ef
PE
378version_controlled_file() {
379 dir=$1
380 file=$2
381 found=no
382 if test -d CVS; then
383 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
384 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
385 elif test -d .git; then
386 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
387 else
388 echo "$0: no version control for $dir/$file?" >&2
389 fi
390 test $found = yes
391}
392
3b2942e6
PE
393slurp() {
394 for dir in . `(cd $1 && find * -type d -print)`; do
395 copied=
396 sep=
397 for file in `ls $1/$dir`; do
953b3935
JD
398 if test -d $1/$dir/$file; then
399 if test ! -d $dir/$file; then
400 echo "$0: mkdir $dir/$file" && mkdir $dir/$file || exit
401 fi
402 continue
403 fi
3b2942e6
PE
404 for excluded_file in $excluded_files; do
405 test "$dir/$file" = "$excluded_file" && continue 2
406 done
407 if test $file = Makefile.am; then
e70f46d1 408 copied=$copied${sep}gnulib.mk; sep=$nl
bbb44d83 409 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
46356ea4 410 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
e70f46d1
PE
411 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
412 rm -f $dir/gnulib.mk &&
46356ea4 413 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
e70f46d1
PE
414 }
415 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
10f429ef 416 version_controlled_file $dir $file; then
3b2942e6
PE
417 echo "$0: $dir/$file overrides $1/$dir/$file"
418 else
419 copied=$copied$sep$file; sep=$nl
420 if test $file = gettext.m4; then
421 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
422 rm -f $dir/$file
423 sed '
424 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
425 AC_DEFUN([AM_INTL_SUBDIR], [
426 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
427 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
428 $a\
429 AC_DEFUN([gl_LOCK_EARLY], [])
430 ' $1/$dir/$file >$dir/$file
431 else
3b2942e6
PE
432 cp_mark_as_generated $1/$dir/$file $dir/$file
433 fi
434 fi || exit
435 done
436
5691bf57
PE
437 for dot_ig in .cvsignore .gitignore; do
438 ig=$dir/$dot_ig
439 if test -n "$copied" && test -f $ig; then
bbb44d83
PE
440 insert_sorted_if_absent $ig "$copied"
441 # If an ignored file name ends with _.h, then also add
442 # the name with just ".h". Many gnulib headers are generated,
443 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
444 f=`echo "$copied"|sed 's/_\.h$/.h/'`
445 insert_sorted_if_absent $ig "$f"
5691bf57
PE
446 fi
447 done
3b2942e6
PE
448 done
449}
1f65350a
PE
450
451
3b2942e6 452# Create boot temporary directories to import from gnulib and gettext.
3b2942e6
PE
453rm -fr $bt $bt2 &&
454mkdir $bt $bt2 || exit
455
456# Import from gnulib.
457
458gnulib_tool_options="\
459 --import\
460 --no-changelog\
bbb44d83 461 --aux-dir $bt/$build_aux\
3b2942e6 462 --doc-base $bt/doc\
bbb44d83 463 --lib $gnulib_name\
3b2942e6
PE
464 --m4-base $bt/m4/\
465 --source-base $bt/lib/\
466 --tests-base $bt/tests\
e3ddc1e3 467 --local-dir gl\
3b2942e6
PE
468"
469echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
470$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
471slurp $bt || exit
472
473for file in $gnulib_files; do
e70f46d1 474 symlink_to_gnulib $file || exit
3b2942e6 475done
1f65350a 476
e23d0dd7 477
3b2942e6 478# Import from gettext.
bbb44d83
PE
479with_gettext=yes
480grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
481 with_gettext=no
62a9592d 482
bbb44d83
PE
483if test $with_gettext = yes; then
484 echo "$0: (cd $bt2; autopoint) ..."
485 cp configure.ac $bt2 &&
486 (cd $bt2 && autopoint && rm configure.ac) &&
487 slurp $bt2 $bt || exit
b4068c7c 488
bbb44d83
PE
489 rm -fr $bt $bt2 || exit
490fi
3b2942e6
PE
491
492
493# Reconfigure, getting other files.
62a9592d
PE
494
495for command in \
bbb44d83 496 libtool \
62a9592d
PE
497 'aclocal --force -I m4' \
498 'autoconf --force' \
499 'autoheader --force' \
500 'automake --add-missing --copy --force-missing';
501do
bbb44d83
PE
502 if test "$command" = libtool; then
503 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
504 continue
505 command='libtoolize -c -f'
506 fi
62a9592d
PE
507 echo "$0: $command ..."
508 $command || exit
509done
510
511
3b2942e6
PE
512# Get some extra files from gnulib, overriding existing files.
513
514for file in $gnulib_extra_files; do
3b2942e6 515 case $file in
e70f46d1
PE
516 */INSTALL) dst=INSTALL;;
517 *) dst=$file;;
3b2942e6 518 esac
e70f46d1 519 symlink_to_gnulib $file $dst || exit
3b2942e6
PE
520done
521
bbb44d83
PE
522if test $with_gettext = yes; then
523 # Create gettext configuration.
524 echo "$0: Creating po/Makevars from po/Makevars.template ..."
525 rm -f po/Makevars
3b2942e6 526 sed '
bbb44d83
PE
527 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
528 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
529 /^XGETTEXT_OPTIONS *=/{
530 s/$/ \\/
531 a\
532 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
533 }
534 ' po/Makevars.template >po/Makevars
3b2942e6 535
bbb44d83
PE
536 if test -d runtime-po; then
537 # Similarly for runtime-po/Makevars, but not quite the same.
538 rm -f runtime-po/Makevars
539 sed '
540 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
541 /^subdir *=.*/s/=.*/= runtime-po/
542 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
543 /^XGETTEXT_OPTIONS *=/{
544 s/$/ \\/
545 a\
546 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
547 }
548 ' <po/Makevars.template >runtime-po/Makevars
549
550 # Copy identical files from po to runtime-po.
551 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
552 fi
3b2942e6 553fi
1f65350a
PE
554
555echo "$0: done. Now you can run './configure'."