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