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