]> git.saurik.com Git - bison.git/blob - bootstrap
Don't depend on C99 features.
[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 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
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301, USA.
21
22 # Written by Paul Eggert.
23
24 nl='
25 '
26
27 # Ensure file names are sorted consistently across platforms.
28 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
29 LC_ALL=C
30 export LC_ALL
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 # List of gnulib modules needed.
65 gnulib_modules=
66
67 # Any gnulib files needed that are not in modules.
68 gnulib_files=
69
70 # Translation Project URL, for the registry of all projects
71 # and for the translation-team master directory.
72 TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
73 TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
74
75 extract_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 '
91 package=`sed -n "$extract_package_name" configure.ac` || exit
92 gnulib_name=lib$package
93
94 build_aux=build-aux
95 # Extra files from gnulib, which override files from other sources.
96 gnulib_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
104 doc/INSTALL
105 "
106
107 # Other locale categories that need message catalogs.
108 EXTRA_LOCALE_CATEGORIES=
109
110 # Additional xgettext options to use. Use "\\\newline" to break lines.
111 XGETTEXT_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.
118 excluded_files=
119
120 # File that should exist in the top directory of a checked out hierarchy,
121 # but not in a distribution tarball.
122 checkout_only_file=README-hacking
123
124 # Whether to use copies instead of symlinks.
125 copy=false
126
127 # Override the default configuration, if necessary.
128 test -r bootstrap.conf && . ./bootstrap.conf
129
130 # Translate configuration into internal form.
131
132 # Parse options.
133
134 for option
135 do
136 case $option in
137 --help)
138 usage
139 exit;;
140 --gnulib-srcdir=*)
141 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
142 --cvs-user=*)
143 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
144 --skip-po)
145 SKIP_PO=t;;
146 --force)
147 checkout_only_file=;;
148 --copy)
149 copy=true;;
150 *)
151 echo >&2 "$0: $option: unknown option"
152 exit 1;;
153 esac
154 done
155
156 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
157 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
158 exit 1
159 fi
160
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.
163 insert_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.
172 found_aux_dir=no
173 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
174 >/dev/null && found_aux_dir=yes
175 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
176 >/dev/null && found_aux_dir=yes
177 if 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.
180 fi
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.
184 if 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
189 fi
190
191 echo "$0: Bootstrapping from checked-out $package sources..."
192
193 cleanup_gnulib() {
194 status=$?
195 rm -fr gnulib
196 exit $status
197 }
198
199 # Get gnulib files.
200
201 case ${GNULIB_SRCDIR--} in
202 -)
203 if [ ! -d gnulib ]; then
204 echo "$0: getting gnulib files..."
205
206 case ${CVS_AUTH-pserver} in
207 pserver)
208 CVS_PREFIX=':pserver:anonymous@';;
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
217 '') CVS_RSH=ssh; export CVS_RSH;;
218 esac
219
220 trap cleanup_gnulib 1 2 13 15
221
222 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
223 cleanup_gnulib
224
225 trap - 1 2 13 15
226 fi
227 GNULIB_SRCDIR=gnulib
228 esac
229
230 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
231 <$gnulib_tool || exit
232
233 # Get translations.
234
235 get_translations() {
236 subdir=$1
237 domain=$2
238
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"
270 }
271
272 case $SKIP_PO in
273 '')
274 case `wget --help` in
275 *'--no-cache'*)
276 WGET_COMMAND='wget -nv --no-cache';;
277 *'--cache=on/off'*)
278 WGET_COMMAND='wget -nv --cache=off';;
279 *'--non-verbose'*)
280 WGET_COMMAND='wget -nv';;
281 *)
282 WGET_COMMAND='';;
283 esac
284
285 if test -d po; then
286 get_translations po $package || exit
287 fi
288
289 if test -d runtime-po; then
290 get_translations runtime-po $package-runtime || exit
291 fi;;
292 esac
293
294 symlink_to_gnulib()
295 {
296 src=$GNULIB_SRCDIR/$1
297 dst=${2-$1}
298
299 test -f "$src" && {
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
335 }
336 }
337
338 cp_mark_as_generated()
339 {
340 cp_src=$1
341 cp_dst=$2
342
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
352
353 if test -z "$c1"; then
354 cmp -s "$cp_src" "$cp_dst" || {
355 echo "$0: cp -f $cp_src $cp_dst" &&
356 rm -f "$cp_dst" &&
357 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
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" &&
366 sed "s!$bt_regex/!!g" "$cp_src"
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
376 }
377
378 version_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
393 slurp() {
394 for dir in . `(cd $1 && find * -type d -print)`; do
395 copied=
396 sep=
397 for file in `ls $1/$dir`; do
398 test -d $1/$dir/$file && continue
399 for excluded_file in $excluded_files; do
400 test "$dir/$file" = "$excluded_file" && continue 2
401 done
402 if test $file = Makefile.am; then
403 copied=$copied${sep}gnulib.mk; sep=$nl
404 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
405 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
406 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
407 rm -f $dir/gnulib.mk &&
408 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
409 }
410 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
411 version_controlled_file $dir $file; then
412 echo "$0: $dir/$file overrides $1/$dir/$file"
413 else
414 copied=$copied$sep$file; sep=$nl
415 if test $file = gettext.m4; then
416 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
417 rm -f $dir/$file
418 sed '
419 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
420 AC_DEFUN([AM_INTL_SUBDIR], [
421 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
422 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
423 $a\
424 AC_DEFUN([gl_LOCK_EARLY], [])
425 ' $1/$dir/$file >$dir/$file
426 else
427 cp_mark_as_generated $1/$dir/$file $dir/$file
428 fi
429 fi || exit
430 done
431
432 for dot_ig in .cvsignore .gitignore; do
433 ig=$dir/$dot_ig
434 if test -n "$copied" && test -f $ig; then
435 insert_sorted_if_absent $ig "$copied"
436 # If an ignored file name ends with _.h, then also add
437 # the name with just ".h". Many gnulib headers are generated,
438 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
439 f=`echo "$copied"|sed 's/_\.h$/.h/'`
440 insert_sorted_if_absent $ig "$f"
441 fi
442 done
443 done
444 }
445
446
447 # Create boot temporary directories to import from gnulib and gettext.
448 rm -fr $bt $bt2 &&
449 mkdir $bt $bt2 || exit
450
451 # Import from gnulib.
452
453 gnulib_tool_options="\
454 --import\
455 --no-changelog\
456 --aux-dir $bt/$build_aux\
457 --doc-base $bt/doc\
458 --lib $gnulib_name\
459 --m4-base $bt/m4/\
460 --source-base $bt/lib/\
461 --tests-base $bt/tests\
462 --local-dir gl\
463 "
464 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
465 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
466 slurp $bt || exit
467
468 for file in $gnulib_files; do
469 symlink_to_gnulib $file || exit
470 done
471
472
473 # Import from gettext.
474 with_gettext=yes
475 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
476 with_gettext=no
477
478 if test $with_gettext = yes; then
479 echo "$0: (cd $bt2; autopoint) ..."
480 cp configure.ac $bt2 &&
481 (cd $bt2 && autopoint && rm configure.ac) &&
482 slurp $bt2 $bt || exit
483
484 rm -fr $bt $bt2 || exit
485 fi
486
487
488 # Reconfigure, getting other files.
489
490 for command in \
491 libtool \
492 'aclocal --force -I m4' \
493 'autoconf --force' \
494 'autoheader --force' \
495 'automake --add-missing --copy --force-missing';
496 do
497 if test "$command" = libtool; then
498 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
499 continue
500 command='libtoolize -c -f'
501 fi
502 echo "$0: $command ..."
503 $command || exit
504 done
505
506
507 # Get some extra files from gnulib, overriding existing files.
508
509 for file in $gnulib_extra_files; do
510 case $file in
511 */INSTALL) dst=INSTALL;;
512 *) dst=$file;;
513 esac
514 symlink_to_gnulib $file $dst || exit
515 done
516
517 if test $with_gettext = yes; then
518 # Create gettext configuration.
519 echo "$0: Creating po/Makevars from po/Makevars.template ..."
520 rm -f po/Makevars
521 sed '
522 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
523 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
524 /^XGETTEXT_OPTIONS *=/{
525 s/$/ \\/
526 a\
527 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
528 }
529 ' po/Makevars.template >po/Makevars
530
531 if test -d runtime-po; then
532 # Similarly for runtime-po/Makevars, but not quite the same.
533 rm -f runtime-po/Makevars
534 sed '
535 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
536 /^subdir *=.*/s/=.*/= runtime-po/
537 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
538 /^XGETTEXT_OPTIONS *=/{
539 s/$/ \\/
540 a\
541 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
542 }
543 ' <po/Makevars.template >runtime-po/Makevars
544
545 # Copy identical files from po to runtime-po.
546 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
547 fi
548 fi
549
550 echo "$0: done. Now you can run './configure'."