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 of the License, or
10 # (at your option) any later version.
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, see <http://www.gnu.org/licenses/>.
20 # Written by Paul Eggert.
25 # Ensure file names are sorted consistently across platforms.
26 # 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 # Name of the Makefile.am
67 # List of gnulib modules needed.
70 # Any gnulib files needed that are not in modules.
73 # Translation Project URL, for the registry of all projects
74 # and for the translation-team master directory.
75 TP_URL="http://translationproject.org/latest/"
77 extract_package_name='
88 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
93 package=`sed -n "$extract_package_name" configure.ac` || exit
94 gnulib_name=lib$package
97 # Extra files from gnulib, which override files from other sources.
102 $build_aux/texinfo.tex
104 $build_aux/config.guess
105 $build_aux/config.sub
109 # Additional gnulib-tool options to use. Use "\newline" to break lines.
110 gnulib_tool_option_extras=
112 # Other locale categories that need message catalogs.
113 EXTRA_LOCALE_CATEGORIES=
115 # Additional xgettext options to use. Use "\\\newline" to break lines.
116 XGETTEXT_OPTIONS='\\\
117 --flag=_:1:pass-c-format\\\
118 --flag=N_:1:pass-c-format\\\
119 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
122 # Files we don't want to import.
125 # File that should exist in the top directory of a checked out hierarchy,
126 # but not in a distribution tarball.
127 checkout_only_file=README-hacking
129 # Whether to use copies instead of symlinks.
132 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
133 # those files to be generated in directories like lib/, m4/, and po/.
134 # Or set it to 'auto' to make this script select which to use based
135 # on which version control system (if any) is used in the source directory.
138 # Override the default configuration, if necessary.
139 test -r bootstrap.conf && . ./bootstrap.conf
141 if test "$vc_ignore" = auto; then
143 test -d .git && vc_ignore=.gitignore
144 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
147 # Translate configuration into internal form.
158 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
160 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
164 checkout_only_file=;;
168 echo >&2 "$0: $option: unknown option"
173 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
174 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
178 # If $STR is not already on a line by itself in $FILE, insert it,
179 # sorting the new contents of the file and replacing $FILE with the result.
180 insert_sorted_if_absent() {
183 test -f $file || touch $file
184 echo "$str" | sort -u - $file | cmp -s - $file \
185 || echo "$str" | sort -u - $file -o $file \
189 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
191 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
192 >/dev/null && found_aux_dir=yes
193 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
194 >/dev/null && found_aux_dir=yes
195 if test $found_aux_dir = no; then
196 echo "$0: expected line not found in configure.ac. Add the following:" >&2
197 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
201 # If $build_aux doesn't exist, create it now, otherwise some bits
202 # below will malfunction. If creating it, also mark it as ignored.
203 if test ! -d $build_aux; then
205 for dot_ig in x $vc_ignore; do
206 test $dot_ig = x && continue
207 insert_sorted_if_absent $dot_ig $build_aux
211 echo "$0: Bootstrapping from checked-out $package sources..."
221 case ${GNULIB_SRCDIR--} in
223 if [ ! -d gnulib ]; then
224 echo "$0: getting gnulib files..."
226 case ${CVS_AUTH-pserver} in
228 CVS_PREFIX=':pserver:anonymous@';;
230 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
232 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
237 '') CVS_RSH=ssh; export CVS_RSH;;
240 trap cleanup_gnulib 1 2 13 15
242 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
250 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
251 <$gnulib_tool || exit
255 download_po_files() {
259 case $WGET_COMMAND in
261 echo "$0: wget not available; skipping translations";;
263 echo "$0: getting translations into $subdir for $domain..." &&
265 (cd $subdir && rm -f dummy `ls | sed -n '/\.po/p'` &&
266 $WGET_COMMAND -r -l1 -nd -np -A.po $TP_URL/$domain)
271 # Download .po files to $po_dir/.reference and copy only the new
272 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
274 # Directory containing primary .po files.
275 # Overwrite them only when we're sure a .po file is new.
279 # Download *.po files into this dir.
280 # Usually contains *.s1 checksum files.
281 ref_po_dir="$po_dir/.reference"
283 test -d $ref_po_dir || mkdir $ref_po_dir || return
284 download_po_files $ref_po_dir $domain \
285 && ls "$ref_po_dir"/*.po 2>/dev/null |
286 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
288 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
289 new_po="$ref_po_dir/$po.po"
290 cksum_file="$ref_po_dir/$po.s1"
291 if ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
292 echo "updated $po_dir/$po.po..."
293 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
301 case `wget --help` in
303 WGET_COMMAND='wget -nv --no-cache';;
305 WGET_COMMAND='wget -nv --cache=off';;
307 WGET_COMMAND='wget -nv';;
313 update_po_files po $package || exit
316 if test -d runtime-po; then
317 update_po_files runtime-po $package-runtime || exit
328 # If the destination directory doesn't exist, create it.
329 # This is required at least for "lib/uniwidth/cjk.h".
330 dst_dir=`dirname "$dst"`
331 if ! test -d "$dst_dir"; then
334 # If we've just created a directory like lib/uniwidth,
335 # tell version control system(s) it's ignorable.
336 # FIXME: for now, this does only one level
337 parent=`dirname "$dst_dir"`
338 for dot_ig in x $vc_ignore; do
339 test $dot_ig = x && continue
341 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
347 test ! -h "$dst" || {
348 echo "$0: rm -f $dst" &&
353 cmp -s "$src" "$dst" || {
354 echo "$0: cp -fp $src $dst" &&
359 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
360 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
361 test "$src_i" = "$dst_i" || {
367 *//* | */../* | */./* | /*/*/*/*/*/)
368 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
370 /*/*/*/*/) dot_dots=../../../;;
371 /*/*/*/) dot_dots=../../;;
372 /*/*/) dot_dots=../;;
376 echo "$0: ln -fs $dot_dots$src $dst" &&
377 ln -fs "$dot_dots$src" "$dst"
383 cp_mark_as_generated()
388 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
389 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
390 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
391 symlink_to_dir $local_gl_dir "$cp_dst"
394 *.[ch]) c1='/* '; c2=' */';;
395 *.texi) c1='@c '; c2= ;;
396 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
400 if test -z "$c1"; then
401 cmp -s "$cp_src" "$cp_dst" || {
402 echo "$0: cp -f $cp_src $cp_dst" &&
404 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
407 # Copy the file first to get proper permissions if it
408 # doesn't already exist. Then overwrite the copy.
409 cp "$cp_src" "$cp_dst-t" &&
411 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
412 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
413 sed "s!$bt_regex/!!g" "$cp_src"
415 if cmp -s "$cp_dst-t" "$cp_dst"; then
418 echo "$0: cp $cp_src $cp_dst # with edits" &&
419 mv -f "$cp_dst-t" "$cp_dst"
425 version_controlled_file() {
430 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
431 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
432 elif test -d .git; then
433 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
435 echo "$0: no version control for $dir/$file?" >&2
441 for dir in . `(cd $1 && find * -type d -print)`; do
444 for file in `ls -a $1/$dir`; do
447 .*) continue;; # FIXME: should all file names starting with "." be ignored?
449 test -d $1/$dir/$file && continue
450 for excluded_file in $excluded_files; do
451 test "$dir/$file" = "$excluded_file" && continue 2
453 if test $file = Makefile.am; then
454 copied=$copied${sep}$gnulib_mk; sep=$nl
455 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
456 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
457 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
458 rm -f $dir/$gnulib_mk &&
459 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
461 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
462 version_controlled_file $dir $file; then
463 echo "$0: $dir/$file overrides $1/$dir/$file"
465 copied=$copied$sep$file; sep=$nl
466 if test $file = gettext.m4; then
467 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
470 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
471 AC_DEFUN([AM_INTL_SUBDIR], [
472 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
473 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
475 AC_DEFUN([gl_LOCK_EARLY], [])
476 ' $1/$dir/$file >$dir/$file
478 cp_mark_as_generated $1/$dir/$file $dir/$file
483 for dot_ig in x $vc_ignore; do
484 test $dot_ig = x && continue
486 if test -n "$copied"; then
487 insert_sorted_if_absent $ig "$copied"
488 # If an ignored file name ends with _.h, then also add
489 # the name with just ".h". Many gnulib headers are generated,
490 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
491 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
492 f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
493 insert_sorted_if_absent $ig "$f"
495 # For files like sys_stat_.h and sys_time_.h, record as
496 # ignorable the directory we might eventually create: sys/.
497 f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
498 insert_sorted_if_absent $ig "$f"
505 # Create boot temporary directories to import from gnulib and gettext.
507 mkdir $bt $bt2 || exit
509 # Import from gnulib.
511 gnulib_tool_options="\
514 --aux-dir $bt/$build_aux\
518 --source-base $bt/lib/\
519 --tests-base $bt/tests\
520 --local-dir $local_gl_dir\
521 $gnulib_tool_option_extras\
523 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
524 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
527 for file in $gnulib_files; do
528 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
532 # Import from gettext.
534 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
537 if test $with_gettext = yes; then
538 echo "$0: (cd $bt2; autopoint) ..."
539 cp configure.ac $bt2 &&
540 (cd $bt2 && autopoint && rm configure.ac) &&
541 slurp $bt2 $bt || exit
543 rm -fr $bt $bt2 || exit
546 # Coreutils is unusual in that it generates some of its test-related
547 # Makefile.am files. That must be done before invoking automake.
548 mam_template=tests/Makefile.am.in
549 if test -f $mam_template; then
551 for tool in cut head join pr sort tac tail test tr uniq wc; do
552 m=tests/$tool/Makefile.am
555 sed -n '1,/^##test-files-begin/p' $mam_template > $t
556 echo "x = $tool" >> $t
558 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
559 sed -n '/^##test-files-end/,$p' $mam_template >> $t
565 # Reconfigure, getting other files.
569 'aclocal --force -I m4' \
571 'autoheader --force' \
572 'automake --add-missing --copy --force-missing';
574 if test "$command" = libtool; then
575 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
577 command='libtoolize -c -f'
579 echo "$0: $command ..."
584 # Get some extra files from gnulib, overriding existing files.
585 for file in $gnulib_extra_files; do
587 */INSTALL) dst=INSTALL;;
588 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
591 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
594 if test $with_gettext = yes; then
595 # Create gettext configuration.
596 echo "$0: Creating po/Makevars from po/Makevars.template ..."
599 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
600 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
601 /^XGETTEXT_OPTIONS *=/{
604 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
606 ' po/Makevars.template >po/Makevars
608 if test -d runtime-po; then
609 # Similarly for runtime-po/Makevars, but not quite the same.
610 rm -f runtime-po/Makevars
612 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
613 /^subdir *=.*/s/=.*/= runtime-po/
614 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
615 /^XGETTEXT_OPTIONS *=/{
618 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
620 ' <po/Makevars.template >runtime-po/Makevars
622 # Copy identical files from po to runtime-po.
623 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
627 echo "$0: done. Now you can run './configure'."