3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
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)
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.
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
22 # Written by Paul Eggert.
27 # Ensure file names are sorted consistently across platforms.
28 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
32 # Temporary directory names.
34 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
40 Bootstrap this package from the checked-out sources.
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
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.
55 If the file .bootstrap.conf exists in the current working directory, its
56 contents are read as shell variables to configure the bootstrap.
58 Running without arguments will suffice in most cases.
64 # List of gnulib modules needed.
67 # Any gnulib files needed that are not in modules.
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/'
75 extract_package_name='
86 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
91 package=`sed -n "$extract_package_name" configure.ac` || exit
92 gnulib_name=lib$package
95 # Extra files from gnulib, which override files from other sources.
100 $build_aux/texinfo.tex
102 $build_aux/config.guess
103 $build_aux/config.sub
107 # Additional gnulib-tool options to use. Use "\newline" to break lines.
108 gnulib_tool_option_extras=
110 # Other locale categories that need message catalogs.
111 EXTRA_LOCALE_CATEGORIES=
113 # Additional xgettext options to use. Use "\\\newline" to break lines.
114 XGETTEXT_OPTIONS='\\\
115 --flag=_:1:pass-c-format\\\
116 --flag=N_:1:pass-c-format\\\
117 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
120 # Files we don't want to import.
123 # File that should exist in the top directory of a checked out hierarchy,
124 # but not in a distribution tarball.
125 checkout_only_file=README-hacking
127 # Whether to use copies instead of symlinks.
130 # Override the default configuration, if necessary.
131 test -r bootstrap.conf && . ./bootstrap.conf
133 # Translate configuration into internal form.
144 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
146 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
150 checkout_only_file=;;
154 echo >&2 "$0: $option: unknown option"
159 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
160 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
164 # If $STR is not already on a line by itself in $FILE, insert it,
165 # sorting the new contents of the file and replacing $FILE with the result.
166 insert_sorted_if_absent() {
169 echo "$str" | sort -u - $file | cmp -s - $file \
170 || echo "$str" | sort -u - $file -o $file \
174 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
176 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
177 >/dev/null && found_aux_dir=yes
178 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
179 >/dev/null && found_aux_dir=yes
180 if test $found_aux_dir = no; then
181 echo "$0: expected line not found in configure.ac. Add the following:" >&2
182 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
186 # If $build_aux doesn't exist, create it now, otherwise some bits
187 # below will malfunction. If creating it, also mark it as ignored.
188 if test ! -d $build_aux; then
190 for ig in .cvsignore .gitignore; do
191 test -f $ig && insert_sorted_if_absent $ig $build_aux
195 echo "$0: Bootstrapping from checked-out $package sources..."
205 case ${GNULIB_SRCDIR--} in
207 if [ ! -d gnulib ]; then
208 echo "$0: getting gnulib files..."
210 case ${CVS_AUTH-pserver} in
212 CVS_PREFIX=':pserver:anonymous@';;
214 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
216 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
221 '') CVS_RSH=ssh; export CVS_RSH;;
224 trap cleanup_gnulib 1 2 13 15
226 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
234 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
235 <$gnulib_tool || exit
243 case $WGET_COMMAND in
245 echo "$0: wget not available; skipping translations";;
247 echo "$0: getting translations into $subdir for $domain..." &&
249 (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
250 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
252 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
253 sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
255 { if (lang && $1 != lang) print lang, ver }
256 { lang = $1; ver = substr($0, index($0, ".") + 1) }
257 END { if (lang) print lang, ver }
258 ' | awk -v domain="$domain" -v subdir="$subdir" '
263 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
264 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
265 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
266 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
269 ' | WGET_COMMAND="$WGET_COMMAND" sh;;
271 ls "$subdir"/*.po 2>/dev/null |
272 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
273 rm -f "$subdir/$domain.html"
278 case `wget --help` in
280 WGET_COMMAND='wget -nv --no-cache';;
282 WGET_COMMAND='wget -nv --cache=off';;
284 WGET_COMMAND='wget -nv';;
290 get_translations po $package || exit
293 if test -d runtime-po; then
294 get_translations runtime-po $package-runtime || exit
300 src=$GNULIB_SRCDIR/$1
306 test ! -h "$dst" || {
307 echo "$0: rm -f $dst" &&
312 cmp -s "$src" "$dst" || {
313 echo "$0: cp -fp $src $dst" &&
318 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
319 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
320 test "$src_i" = "$dst_i" || {
326 *//* | */../* | */./* | /*/*/*/*/*/)
327 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
329 /*/*/*/*/) dot_dots=../../../;;
330 /*/*/*/) dot_dots=../../;;
331 /*/*/) dot_dots=../;;
335 echo "$0: ln -fs $dot_dots$src $dst" &&
336 ln -fs "$dot_dots$src" "$dst"
342 cp_mark_as_generated()
347 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
348 symlink_to_gnulib "$cp_dst"
351 *.[ch]) c1='/* '; c2=' */';;
352 *.texi) c1='@c '; c2= ;;
353 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
357 if test -z "$c1"; then
358 cmp -s "$cp_src" "$cp_dst" || {
359 echo "$0: cp -f $cp_src $cp_dst" &&
361 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
364 # Copy the file first to get proper permissions if it
365 # doesn't already exist. Then overwrite the copy.
366 cp "$cp_src" "$cp_dst-t" &&
368 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
369 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
370 sed "s!$bt_regex/!!g" "$cp_src"
372 if cmp -s "$cp_dst-t" "$cp_dst"; then
375 echo "$0: cp $cp_src $cp_dst # with edits" &&
376 mv -f "$cp_dst-t" "$cp_dst"
382 version_controlled_file() {
387 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
388 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
389 elif test -d .git; then
390 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
392 echo "$0: no version control for $dir/$file?" >&2
398 for dir in . `(cd $1 && find * -type d -print)`; do
401 for file in `ls $1/$dir`; do
402 test -d $1/$dir/$file && continue
403 for excluded_file in $excluded_files; do
404 test "$dir/$file" = "$excluded_file" && continue 2
406 if test $file = Makefile.am; then
407 copied=$copied${sep}gnulib.mk; sep=$nl
408 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
409 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
410 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
411 rm -f $dir/gnulib.mk &&
412 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
414 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
415 version_controlled_file $dir $file; then
416 echo "$0: $dir/$file overrides $1/$dir/$file"
418 copied=$copied$sep$file; sep=$nl
419 if test $file = gettext.m4; then
420 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
423 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
424 AC_DEFUN([AM_INTL_SUBDIR], [
425 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
426 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
428 AC_DEFUN([gl_LOCK_EARLY], [])
429 ' $1/$dir/$file >$dir/$file
431 cp_mark_as_generated $1/$dir/$file $dir/$file
436 for dot_ig in .cvsignore .gitignore; do
438 if test -n "$copied" && test -f $ig; then
439 insert_sorted_if_absent $ig "$copied"
440 # If an ignored file name ends with _.h, then also add
441 # the name with just ".h". Many gnulib headers are generated,
442 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
443 f=`echo "$copied"|sed 's/_\.h$/.h/'`
444 insert_sorted_if_absent $ig "$f"
451 # Create boot temporary directories to import from gnulib and gettext.
453 mkdir $bt $bt2 || exit
455 # Import from gnulib.
457 gnulib_tool_options="\
460 --aux-dir $bt/$build_aux\
464 --source-base $bt/lib/\
465 --tests-base $bt/tests\
467 $gnulib_tool_option_extras\
469 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
470 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
473 for file in $gnulib_files; do
474 symlink_to_gnulib $file || exit
478 # Import from gettext.
480 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
483 if 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
489 rm -fr $bt $bt2 || exit
493 # Reconfigure, getting other files.
497 'aclocal --force -I m4' \
499 'autoheader --force' \
500 'automake --add-missing --copy --force-missing';
502 if test "$command" = libtool; then
503 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
505 command='libtoolize -c -f'
507 echo "$0: $command ..."
512 # Get some extra files from gnulib, overriding existing files.
513 for file in $gnulib_extra_files; do
515 */INSTALL) dst=INSTALL;;
516 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
519 symlink_to_gnulib $file $dst || exit
522 if test $with_gettext = yes; then
523 # Create gettext configuration.
524 echo "$0: Creating po/Makevars from po/Makevars.template ..."
527 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
528 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
529 /^XGETTEXT_OPTIONS *=/{
532 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
534 ' po/Makevars.template >po/Makevars
536 if test -d runtime-po; then
537 # Similarly for runtime-po/Makevars, but not quite the same.
538 rm -f runtime-po/Makevars
540 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
541 /^subdir *=.*/s/=.*/= runtime-po/
542 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
543 /^XGETTEXT_OPTIONS *=/{
546 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
548 ' <po/Makevars.template >runtime-po/Makevars
550 # Copy identical files from po to runtime-po.
551 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
555 echo "$0: done. Now you can run './configure'."