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.
172 grep '^[ ]*AC_CONFIG_AUX_DIR('$build_aux')' configure.ac >/dev/null ||
174 echo "$0: expected line not found in configure.ac. Add the following:" >&2
175 echo " AC_CONFIG_AUX_DIR($build_aux)" >&2.
178 # If $build_aux doesn't exist, create it now, otherwise some bits
179 # below will malfunction. If creating it, also mark it as ignored.
180 if test ! -d $build_aux; then
182 for ig in .cvsignore .gitignore; do
183 test -f $ig && insert_sorted_if_absent $ig $build_aux
187 echo "$0: Bootstrapping from checked-out $package sources..."
197 case ${GNULIB_SRCDIR--} in
199 if [ ! -d gnulib ]; then
200 echo "$0: getting gnulib files..."
202 case ${CVS_AUTH-pserver} in
204 CVS_PREFIX=':pserver:anonymous@';;
206 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
208 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
213 '') CVS_RSH=ssh; export CVS_RSH;;
216 trap cleanup_gnulib 1 2 13 15
218 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
226 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
227 <$gnulib_tool || exit
235 case $WGET_COMMAND in
237 echo "$0: wget not available; skipping translations";;
239 echo "$0: getting translations into $subdir for $domain..." &&
241 (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
242 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
244 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
245 sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
247 { if (lang && $1 != lang) print lang, ver }
248 { lang = $1; ver = substr($0, index($0, ".") + 1) }
249 END { if (lang) print lang, ver }
250 ' | awk -v domain="$domain" -v subdir="$subdir" '
255 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
256 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
257 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
258 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
261 ' | WGET_COMMAND="$WGET_COMMAND" sh;;
263 ls "$subdir"/*.po 2>/dev/null |
264 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
265 rm -f "$subdir/$domain.html"
270 case `wget --help` in
272 WGET_COMMAND='wget -nv --no-cache';;
274 WGET_COMMAND='wget -nv --cache=off';;
276 WGET_COMMAND='wget -nv';;
282 get_translations po $package || exit
285 if test -d runtime-po; then
286 get_translations runtime-po $package-runtime || exit
292 src=$GNULIB_SRCDIR/$1
298 test ! -h "$dst" || {
299 echo "$0: rm -f $dst" &&
304 cmp -s "$src" "$dst" || {
305 echo "$0: cp -fp $src $dst" &&
310 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
311 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
312 test "$src_i" = "$dst_i" || {
318 *//* | */../* | */./* | /*/*/*/*/*/)
319 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
321 /*/*/*/*/) dot_dots=../../../;;
322 /*/*/*/) dot_dots=../../;;
323 /*/*/) dot_dots=../;;
327 echo "$0: ln -fs $dot_dots$src $dst" &&
328 ln -fs "$dot_dots$src" "$dst"
334 cp_mark_as_generated()
339 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
340 symlink_to_gnulib "$cp_dst"
343 *.[ch]) c1='/* '; c2=' */';;
344 *.texi) c1='@c '; c2= ;;
345 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
349 if test -z "$c1"; then
350 cmp -s "$cp_src" "$cp_dst" || {
351 echo "$0: cp -f $cp_src $cp_dst" &&
353 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
356 # Copy the file first to get proper permissions if it
357 # doesn't already exist. Then overwrite the copy.
358 cp "$cp_src" "$cp_dst-t" &&
360 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
361 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
362 sed "s!$bt_regex/!!g" "$cp_src"
364 if cmp -s "$cp_dst-t" "$cp_dst"; then
367 echo "$0: cp $cp_src $cp_dst # with edits" &&
368 mv -f "$cp_dst-t" "$cp_dst"
374 version_controlled_file() {
379 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
380 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
381 elif test -d .git; then
382 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
384 echo "$0: no version control for $dir/$file?" >&2
390 for dir in . `(cd $1 && find * -type d -print)`; do
393 for file in `ls $1/$dir`; do
394 test -d $1/$dir/$file && continue
395 for excluded_file in $excluded_files; do
396 test "$dir/$file" = "$excluded_file" && continue 2
398 if test $file = Makefile.am; then
399 copied=$copied${sep}gnulib.mk; sep=$nl
400 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
401 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
402 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
403 rm -f $dir/gnulib.mk &&
404 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
406 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
407 version_controlled_file $dir $file; then
408 echo "$0: $dir/$file overrides $1/$dir/$file"
410 copied=$copied$sep$file; sep=$nl
411 if test $file = gettext.m4; then
412 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
415 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
416 AC_DEFUN([AM_INTL_SUBDIR], [
417 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
418 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
420 AC_DEFUN([gl_LOCK_EARLY], [])
421 ' $1/$dir/$file >$dir/$file
423 cp_mark_as_generated $1/$dir/$file $dir/$file
428 for dot_ig in .cvsignore .gitignore; do
430 if test -n "$copied" && test -f $ig; then
431 insert_sorted_if_absent $ig "$copied"
432 # If an ignored file name ends with _.h, then also add
433 # the name with just ".h". Many gnulib headers are generated,
434 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
435 f=`echo "$copied"|sed 's/_\.h$/.h/'`
436 insert_sorted_if_absent $ig "$f"
443 # Create boot temporary directories to import from gnulib and gettext.
445 mkdir $bt $bt2 || exit
447 # Import from gnulib.
449 gnulib_tool_options="\
452 --aux-dir $bt/$build_aux\
456 --source-base $bt/lib/\
457 --tests-base $bt/tests\
460 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
461 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
464 for file in $gnulib_files; do
465 symlink_to_gnulib $file || exit
469 # Import from gettext.
471 echo "$0: (cd $bt2; autopoint) ..."
472 cp configure.ac $bt2 &&
473 (cd $bt2 && autopoint && rm configure.ac) &&
474 slurp $bt2 $bt || exit
476 rm -fr $bt $bt2 || exit
479 # Reconfigure, getting other files.
483 'aclocal --force -I m4' \
485 'autoheader --force' \
486 'automake --add-missing --copy --force-missing';
488 if test "$command" = libtool; then
489 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
491 command='libtoolize -c -f'
493 echo "$0: $command ..."
498 # Get some extra files from gnulib, overriding existing files.
500 for file in $gnulib_extra_files; do
502 */INSTALL) dst=INSTALL;;
505 symlink_to_gnulib $file $dst || exit
509 # Create gettext configuration.
510 echo "$0: Creating po/Makevars from po/Makevars.template ..."
513 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
514 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
515 /^XGETTEXT_OPTIONS *=/{
518 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
520 ' po/Makevars.template >po/Makevars
522 if test -d runtime-po; then
523 # Similarly for runtime-po/Makevars, but not quite the same.
524 rm -f runtime-po/Makevars
526 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
527 /^subdir *=.*/s/=.*/= runtime-po/
528 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
529 /^XGETTEXT_OPTIONS *=/{
532 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
534 ' <po/Makevars.template >runtime-po/Makevars
536 # Copy identical files from po to runtime-po.
537 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
540 echo "$0: done. Now you can run './configure'."