]> git.saurik.com Git - bison.git/blob - bootstrap
Update to GPLv3.
[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 # Temporary directory names.
31 bt='._bootmp'
32 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
33 bt2=${bt}2
34
35 usage() {
36 echo >&2 "\
37 Usage: $0 [OPTION]...
38 Bootstrap this package from the checked-out sources.
39
40 Options:
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
44 do not want to waste your bandwidth downloading
45 them again.
46 --copy Copy files instead of creating symbolic links.
47 --force Attempt to bootstrap even if the sources seem
48 not to have been checked out.
49 --skip-po Do not download po files.
50 --cvs-user=USERNAME Set the username to use when checking out
51 sources from the gnulib repository.
52
53 If the file .bootstrap.conf exists in the current working directory, its
54 contents are read as shell variables to configure the bootstrap.
55
56 Running without arguments will suffice in most cases.
57 "
58 }
59
60 # Configuration.
61
62 # List of gnulib modules needed.
63 gnulib_modules=
64
65 # Any gnulib files needed that are not in modules.
66 gnulib_files=
67
68 # Translation Project URL, for the registry of all projects
69 # and for the translation-team master directory.
70 TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
71 TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
72
73 extract_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 '
89 package=`sed -n "$extract_package_name" configure.ac` || exit
90 gnulib_name=lib$package
91
92 build_aux=build-aux
93 # Extra files from gnulib, which override files from other sources.
94 gnulib_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
102 doc/INSTALL
103 "
104
105 # Other locale categories that need message catalogs.
106 EXTRA_LOCALE_CATEGORIES=
107
108 # Additional xgettext options to use. Use "\\\newline" to break lines.
109 XGETTEXT_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.
116 excluded_files=
117
118 # File that should exist in the top directory of a checked out hierarchy,
119 # but not in a distribution tarball.
120 checkout_only_file=README-hacking
121
122 # Whether to use copies instead of symlinks.
123 copy=false
124
125 # Override the default configuration, if necessary.
126 test -r bootstrap.conf && . ./bootstrap.conf
127
128 # Translate configuration into internal form.
129
130 # Parse options.
131
132 for option
133 do
134 case $option in
135 --help)
136 usage
137 exit;;
138 --gnulib-srcdir=*)
139 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
140 --cvs-user=*)
141 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
142 --skip-po)
143 SKIP_PO=t;;
144 --force)
145 checkout_only_file=;;
146 --copy)
147 copy=true;;
148 *)
149 echo >&2 "$0: $option: unknown option"
150 exit 1;;
151 esac
152 done
153
154 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
155 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
156 exit 1
157 fi
158
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.
161 insert_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.
170 found_aux_dir=no
171 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
172 >/dev/null && found_aux_dir=yes
173 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
174 >/dev/null && found_aux_dir=yes
175 if 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.
178 fi
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.
182 if 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
187 fi
188
189 echo "$0: Bootstrapping from checked-out $package sources..."
190
191 cleanup_gnulib() {
192 status=$?
193 rm -fr gnulib
194 exit $status
195 }
196
197 # Get gnulib files.
198
199 case ${GNULIB_SRCDIR--} in
200 -)
201 if [ ! -d gnulib ]; then
202 echo "$0: getting gnulib files..."
203
204 case ${CVS_AUTH-pserver} in
205 pserver)
206 CVS_PREFIX=':pserver:anonymous@';;
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
215 '') CVS_RSH=ssh; export CVS_RSH;;
216 esac
217
218 trap cleanup_gnulib 1 2 13 15
219
220 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
221 cleanup_gnulib
222
223 trap - 1 2 13 15
224 fi
225 GNULIB_SRCDIR=gnulib
226 esac
227
228 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
229 <$gnulib_tool || exit
230
231 # Get translations.
232
233 get_translations() {
234 subdir=$1
235 domain=$2
236
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"
268 }
269
270 case $SKIP_PO in
271 '')
272 case `wget --help` in
273 *'--no-cache'*)
274 WGET_COMMAND='wget -nv --no-cache';;
275 *'--cache=on/off'*)
276 WGET_COMMAND='wget -nv --cache=off';;
277 *'--non-verbose'*)
278 WGET_COMMAND='wget -nv';;
279 *)
280 WGET_COMMAND='';;
281 esac
282
283 if test -d po; then
284 get_translations po $package || exit
285 fi
286
287 if test -d runtime-po; then
288 get_translations runtime-po $package-runtime || exit
289 fi;;
290 esac
291
292 symlink_to_gnulib()
293 {
294 src=$GNULIB_SRCDIR/$1
295 dst=${2-$1}
296
297 test -f "$src" && {
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
333 }
334 }
335
336 cp_mark_as_generated()
337 {
338 cp_src=$1
339 cp_dst=$2
340
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
350
351 if test -z "$c1"; then
352 cmp -s "$cp_src" "$cp_dst" || {
353 echo "$0: cp -f $cp_src $cp_dst" &&
354 rm -f "$cp_dst" &&
355 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
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" &&
364 sed "s!$bt_regex/!!g" "$cp_src"
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
374 }
375
376 version_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
391 slurp() {
392 for dir in . `(cd $1 && find * -type d -print)`; do
393 copied=
394 sep=
395 for file in `ls $1/$dir`; do
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
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
406 copied=$copied${sep}gnulib.mk; sep=$nl
407 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
408 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
409 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
410 rm -f $dir/gnulib.mk &&
411 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
412 }
413 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
414 version_controlled_file $dir $file; then
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
430 cp_mark_as_generated $1/$dir/$file $dir/$file
431 fi
432 fi || exit
433 done
434
435 for dot_ig in .cvsignore .gitignore; do
436 ig=$dir/$dot_ig
437 if test -n "$copied" && test -f $ig; then
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"
444 fi
445 done
446 done
447 }
448
449
450 # Create boot temporary directories to import from gnulib and gettext.
451 rm -fr $bt $bt2 &&
452 mkdir $bt $bt2 || exit
453
454 # Import from gnulib.
455
456 gnulib_tool_options="\
457 --import\
458 --no-changelog\
459 --aux-dir $bt/$build_aux\
460 --doc-base $bt/doc\
461 --lib $gnulib_name\
462 --m4-base $bt/m4/\
463 --source-base $bt/lib/\
464 --tests-base $bt/tests\
465 --local-dir gl\
466 "
467 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
468 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
469 slurp $bt || exit
470
471 for file in $gnulib_files; do
472 symlink_to_gnulib $file || exit
473 done
474
475
476 # Import from gettext.
477 with_gettext=yes
478 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
479 with_gettext=no
480
481 if 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
486
487 rm -fr $bt $bt2 || exit
488 fi
489
490
491 # Reconfigure, getting other files.
492
493 for command in \
494 libtool \
495 'aclocal --force -I m4' \
496 'autoconf --force' \
497 'autoheader --force' \
498 'automake --add-missing --copy --force-missing';
499 do
500 if test "$command" = libtool; then
501 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
502 continue
503 command='libtoolize -c -f'
504 fi
505 echo "$0: $command ..."
506 $command || exit
507 done
508
509
510 # Get some extra files from gnulib, overriding existing files.
511
512 for file in $gnulib_extra_files; do
513 case $file in
514 */INSTALL) dst=INSTALL;;
515 *) dst=$file;;
516 esac
517 symlink_to_gnulib $file $dst || exit
518 done
519
520 if test $with_gettext = yes; then
521 # Create gettext configuration.
522 echo "$0: Creating po/Makevars from po/Makevars.template ..."
523 rm -f po/Makevars
524 sed '
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
533
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
551 fi
552
553 echo "$0: done. Now you can run './configure'."