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 # Other locale categories that need message catalogs.
108 EXTRA_LOCALE_CATEGORIES=
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\\\
117 # Files we don't want to import.
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
124 # Whether to use copies instead of symlinks.
127 # Override the default configuration, if necessary.
128 test -r bootstrap.conf && . ./bootstrap.conf
130 # Translate configuration into internal form.
141 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
143 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
147 checkout_only_file=;;
151 echo >&2 "$0: $option: unknown option"
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
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() {
166 echo "$str" | sort -u - $file | cmp -s - $file \
167 || echo "$str" | sort -u - $file -o $file \
171 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
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
179 echo "$0: expected line not found in configure.ac. Add the following:" >&2
180 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2.
183 # If $build_aux doesn't exist, create it now, otherwise some bits
184 # below will malfunction. If creating it, also mark it as ignored.
185 if test ! -d $build_aux; then
187 for ig in .cvsignore .gitignore; do
188 test -f $ig && insert_sorted_if_absent $ig $build_aux
192 echo "$0: Bootstrapping from checked-out $package sources..."
202 case ${GNULIB_SRCDIR--} in
204 if [ ! -d gnulib ]; then
205 echo "$0: getting gnulib files..."
207 case ${CVS_AUTH-pserver} in
209 CVS_PREFIX=':pserver:anonymous@';;
211 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
213 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
218 '') CVS_RSH=ssh; export CVS_RSH;;
221 trap cleanup_gnulib 1 2 13 15
223 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
231 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
232 <$gnulib_tool || exit
240 case $WGET_COMMAND in
242 echo "$0: wget not available; skipping translations";;
244 echo "$0: getting translations into $subdir for $domain..." &&
246 (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
247 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
249 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
250 sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
252 { if (lang && $1 != lang) print lang, ver }
253 { lang = $1; ver = substr($0, index($0, ".") + 1) }
254 END { if (lang) print lang, ver }
255 ' | awk -v domain="$domain" -v subdir="$subdir" '
260 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
261 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
262 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
263 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
266 ' | WGET_COMMAND="$WGET_COMMAND" sh;;
268 ls "$subdir"/*.po 2>/dev/null |
269 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
270 rm -f "$subdir/$domain.html"
275 case `wget --help` in
277 WGET_COMMAND='wget -nv --no-cache';;
279 WGET_COMMAND='wget -nv --cache=off';;
281 WGET_COMMAND='wget -nv';;
287 get_translations po $package || exit
290 if test -d runtime-po; then
291 get_translations runtime-po $package-runtime || exit
297 src=$GNULIB_SRCDIR/$1
303 test ! -h "$dst" || {
304 echo "$0: rm -f $dst" &&
309 cmp -s "$src" "$dst" || {
310 echo "$0: cp -fp $src $dst" &&
315 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
316 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
317 test "$src_i" = "$dst_i" || {
323 *//* | */../* | */./* | /*/*/*/*/*/)
324 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
326 /*/*/*/*/) dot_dots=../../../;;
327 /*/*/*/) dot_dots=../../;;
328 /*/*/) dot_dots=../;;
332 echo "$0: ln -fs $dot_dots$src $dst" &&
333 ln -fs "$dot_dots$src" "$dst"
339 cp_mark_as_generated()
344 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
345 symlink_to_gnulib "$cp_dst"
348 *.[ch]) c1='/* '; c2=' */';;
349 *.texi) c1='@c '; c2= ;;
350 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
354 if test -z "$c1"; then
355 cmp -s "$cp_src" "$cp_dst" || {
356 echo "$0: cp -f $cp_src $cp_dst" &&
358 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
361 # Copy the file first to get proper permissions if it
362 # doesn't already exist. Then overwrite the copy.
363 cp "$cp_src" "$cp_dst-t" &&
365 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
366 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
367 sed "s!$bt_regex/!!g" "$cp_src"
369 if cmp -s "$cp_dst-t" "$cp_dst"; then
372 echo "$0: cp $cp_src $cp_dst # with edits" &&
373 mv -f "$cp_dst-t" "$cp_dst"
379 version_controlled_file() {
384 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
385 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
386 elif test -d .git; then
387 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
389 echo "$0: no version control for $dir/$file?" >&2
395 for dir in . `(cd $1 && find * -type d -print)`; do
398 for file in `ls $1/$dir`; do
399 test -d $1/$dir/$file && continue
400 for excluded_file in $excluded_files; do
401 test "$dir/$file" = "$excluded_file" && continue 2
403 if test $file = Makefile.am; then
404 copied=$copied${sep}gnulib.mk; sep=$nl
405 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
406 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
407 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
408 rm -f $dir/gnulib.mk &&
409 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
411 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
412 version_controlled_file $dir $file; then
413 echo "$0: $dir/$file overrides $1/$dir/$file"
415 copied=$copied$sep$file; sep=$nl
416 if test $file = gettext.m4; then
417 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
420 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
421 AC_DEFUN([AM_INTL_SUBDIR], [
422 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
423 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
425 AC_DEFUN([gl_LOCK_EARLY], [])
426 ' $1/$dir/$file >$dir/$file
428 cp_mark_as_generated $1/$dir/$file $dir/$file
433 for dot_ig in .cvsignore .gitignore; do
435 if test -n "$copied" && test -f $ig; then
436 insert_sorted_if_absent $ig "$copied"
437 # If an ignored file name ends with _.h, then also add
438 # the name with just ".h". Many gnulib headers are generated,
439 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
440 f=`echo "$copied"|sed 's/_\.h$/.h/'`
441 insert_sorted_if_absent $ig "$f"
448 # Create boot temporary directories to import from gnulib and gettext.
450 mkdir $bt $bt2 || exit
452 # Import from gnulib.
454 gnulib_tool_options="\
457 --aux-dir $bt/$build_aux\
461 --source-base $bt/lib/\
462 --tests-base $bt/tests\
465 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
466 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
469 for file in $gnulib_files; do
470 symlink_to_gnulib $file || exit
474 # Import from gettext.
476 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
479 if test $with_gettext = yes; then
480 echo "$0: (cd $bt2; autopoint) ..."
481 cp configure.ac $bt2 &&
482 (cd $bt2 && autopoint && rm configure.ac) &&
483 slurp $bt2 $bt || exit
485 rm -fr $bt $bt2 || exit
489 # Reconfigure, getting other files.
493 'aclocal --force -I m4' \
495 'autoheader --force' \
496 'automake --add-missing --copy --force-missing';
498 if test "$command" = libtool; then
499 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
501 command='libtoolize -c -f'
503 echo "$0: $command ..."
508 # Get some extra files from gnulib, overriding existing files.
510 for file in $gnulib_extra_files; do
512 */INSTALL) dst=INSTALL;;
515 symlink_to_gnulib $file $dst || exit
518 if test $with_gettext = yes; then
519 # Create gettext configuration.
520 echo "$0: Creating po/Makevars from po/Makevars.template ..."
523 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
524 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
525 /^XGETTEXT_OPTIONS *=/{
528 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
530 ' po/Makevars.template >po/Makevars
532 if test -d runtime-po; then
533 # Similarly for runtime-po/Makevars, but not quite the same.
534 rm -f runtime-po/Makevars
536 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
537 /^subdir *=.*/s/=.*/= runtime-po/
538 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
539 /^XGETTEXT_OPTIONS *=/{
542 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
544 ' <po/Makevars.template >runtime-po/Makevars
546 # Copy identical files from po to runtime-po.
547 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
551 echo "$0: done. Now you can run './configure'."