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 3, 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.
34 # Temporary directory names.
36 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
42 Bootstrap this package from the checked-out sources.
45 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
46 sources reside. Use this if you already
47 have gnulib sources on your machine, and
48 do not want to waste your bandwidth downloading
50 --copy Copy files instead of creating symbolic links.
51 --force Attempt to bootstrap even if the sources seem
52 not to have been checked out.
53 --skip-po Do not download po files.
54 --cvs-user=USERNAME Set the username to use when checking out
55 sources from the gnulib repository.
57 If the file bootstrap.conf exists in the current working directory, its
58 contents are read as shell variables to configure the bootstrap.
60 Running without arguments will suffice in most cases.
66 # Name of the Makefile.am
69 # List of gnulib modules needed.
72 # Any gnulib files needed that are not in modules.
75 # Translation Project URL, for the registry of all projects
76 # and for the translation-team master directory.
77 TP_URL="http://translationproject.org/latest/"
79 extract_package_name='
90 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
95 package=`sed -n "$extract_package_name" configure.ac` || exit
96 gnulib_name=lib$package
99 # Extra files from gnulib, which override files from other sources.
101 $build_aux/install-sh
104 $build_aux/texinfo.tex
106 $build_aux/config.guess
107 $build_aux/config.sub
111 # Additional gnulib-tool options to use. Use "\newline" to break lines.
112 gnulib_tool_option_extras=
114 # Other locale categories that need message catalogs.
115 EXTRA_LOCALE_CATEGORIES=
117 # Additional xgettext options to use. Use "\\\newline" to break lines.
118 XGETTEXT_OPTIONS='\\\
119 --flag=_:1:pass-c-format\\\
120 --flag=N_:1:pass-c-format\\\
121 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
124 # Files we don't want to import.
127 # File that should exist in the top directory of a checked out hierarchy,
128 # but not in a distribution tarball.
129 checkout_only_file=README-hacking
131 # Whether to use copies instead of symlinks.
134 # Override the default configuration, if necessary.
135 test -r bootstrap.conf && . ./bootstrap.conf
137 # Translate configuration into internal form.
148 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
150 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
154 checkout_only_file=;;
158 echo >&2 "$0: $option: unknown option"
163 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
164 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
168 # If $STR is not already on a line by itself in $FILE, insert it,
169 # sorting the new contents of the file and replacing $FILE with the result.
170 insert_sorted_if_absent() {
173 echo "$str" | sort -u - $file | cmp -s - $file \
174 || echo "$str" | sort -u - $file -o $file \
178 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
180 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
181 >/dev/null && found_aux_dir=yes
182 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
183 >/dev/null && found_aux_dir=yes
184 if test $found_aux_dir = no; then
185 echo "$0: expected line not found in configure.ac. Add the following:" >&2
186 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
190 # If $build_aux doesn't exist, create it now, otherwise some bits
191 # below will malfunction. If creating it, also mark it as ignored.
192 if test ! -d $build_aux; then
194 for ig in .cvsignore .gitignore; do
195 test -f $ig && insert_sorted_if_absent $ig $build_aux
199 echo "$0: Bootstrapping from checked-out $package sources..."
209 case ${GNULIB_SRCDIR--} in
211 if [ ! -d gnulib ]; then
212 echo "$0: getting gnulib files..."
214 case ${CVS_AUTH-pserver} in
216 CVS_PREFIX=':pserver:anonymous@';;
218 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
220 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
225 '') CVS_RSH=ssh; export CVS_RSH;;
228 trap cleanup_gnulib 1 2 13 15
230 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
238 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
239 <$gnulib_tool || exit
247 case $WGET_COMMAND in
249 echo "$0: wget not available; skipping translations";;
251 echo "$0: getting translations into $subdir for $domain..." &&
253 (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'` &&
254 $WGET_COMMAND -r -l1 -nd -np -A.po $TP_URL/$domain)
257 ls "$subdir"/*.po 2>/dev/null |
258 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS"
263 case `wget --help` in
265 WGET_COMMAND='wget -nv --no-cache';;
267 WGET_COMMAND='wget -nv --cache=off';;
269 WGET_COMMAND='wget -nv';;
275 get_translations po $package || exit
278 if test -d runtime-po; then
279 get_translations runtime-po $package-runtime || exit
290 # If the destination directory doesn't exist, create it.
291 # This is required at least for "lib/uniwidth/cjk.h".
292 dst_dir=`dirname "$dst"`
293 test -d "$dst_dir" || mkdir -p "$dst_dir"
297 test ! -h "$dst" || {
298 echo "$0: rm -f $dst" &&
303 cmp -s "$src" "$dst" || {
304 echo "$0: cp -fp $src $dst" &&
309 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
310 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
311 test "$src_i" = "$dst_i" || {
317 *//* | */../* | */./* | /*/*/*/*/*/)
318 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
320 /*/*/*/*/) dot_dots=../../../;;
321 /*/*/*/) dot_dots=../../;;
322 /*/*/) dot_dots=../;;
326 echo "$0: ln -fs $dot_dots$src $dst" &&
327 ln -fs "$dot_dots$src" "$dst"
333 cp_mark_as_generated()
338 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
339 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
340 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
341 symlink_to_dir $local_gl_dir "$cp_dst"
344 *.[ch]) c1='/* '; c2=' */';;
345 *.texi) c1='@c '; c2= ;;
346 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
350 if test -z "$c1"; then
351 cmp -s "$cp_src" "$cp_dst" || {
352 echo "$0: cp -f $cp_src $cp_dst" &&
354 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
357 # Copy the file first to get proper permissions if it
358 # doesn't already exist. Then overwrite the copy.
359 cp "$cp_src" "$cp_dst-t" &&
361 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
362 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
363 sed "s!$bt_regex/!!g" "$cp_src"
365 if cmp -s "$cp_dst-t" "$cp_dst"; then
368 echo "$0: cp $cp_src $cp_dst # with edits" &&
369 mv -f "$cp_dst-t" "$cp_dst"
375 version_controlled_file() {
380 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
381 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
382 elif test -d .git; then
383 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
385 echo "$0: no version control for $dir/$file?" >&2
391 for dir in . `(cd $1 && find * -type d -print)`; do
394 for file in `ls -a $1/$dir`; do
397 .*) continue;; # FIXME: should all file names starting with "." be ignored?
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\
463 --local-dir $local_gl_dir\
464 $gnulib_tool_option_extras\
466 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
467 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
470 for file in $gnulib_files; do
471 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
475 # Import from gettext.
477 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
480 if test $with_gettext = yes; then
481 echo "$0: (cd $bt2; autopoint) ..."
482 cp configure.ac $bt2 &&
483 (cd $bt2 && autopoint && rm configure.ac) &&
484 slurp $bt2 $bt || exit
486 rm -fr $bt $bt2 || exit
489 # Coreutils is unusual in that it generates some of its test-related
490 # Makefile.am files. That must be done before invoking automake.
491 mam_template=tests/Makefile.am.in
492 if test -f $mam_template; then
494 for tool in cut head join pr sort tac tail test tr uniq wc; do
495 m=tests/$tool/Makefile.am
498 sed -n '1,/^##test-files-begin/p' $mam_template > $t
499 echo "x = $tool" >> $t
501 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
502 sed -n '/^##test-files-end/,$p' $mam_template >> $t
508 # Reconfigure, getting other files.
512 'aclocal --force -I m4' \
514 'autoheader --force' \
515 'automake --add-missing --copy --force-missing';
517 if test "$command" = libtool; then
518 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
520 command='libtoolize -c -f'
522 echo "$0: $command ..."
527 # Get some extra files from gnulib, overriding existing files.
528 for file in $gnulib_extra_files; do
530 */INSTALL) dst=INSTALL;;
531 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
534 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
537 if test $with_gettext = yes; then
538 # Create gettext configuration.
539 echo "$0: Creating po/Makevars from po/Makevars.template ..."
542 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
543 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
544 /^XGETTEXT_OPTIONS *=/{
547 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
549 ' po/Makevars.template >po/Makevars
551 if test -d runtime-po; then
552 # Similarly for runtime-po/Makevars, but not quite the same.
553 rm -f runtime-po/Makevars
555 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
556 /^subdir *=.*/s/=.*/= runtime-po/
557 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
558 /^XGETTEXT_OPTIONS *=/{
561 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
563 ' <po/Makevars.template >runtime-po/Makevars
565 # Copy identical files from po to runtime-po.
566 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
570 echo "$0: done. Now you can run './configure'."