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 # The command to download all .po files for a specified domain into
74 # a specified directory. Fill in the first %s is the domain name, and
75 # the second with the destination directory. Use rsync's -L and -r
76 # options because the latest/%s directory and the .po files within are
78 po_download_command_format=\
79 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
81 extract_package_name='
92 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
97 package=`sed -n "$extract_package_name" configure.ac` || exit
98 gnulib_name=lib$package
101 # Extra files from gnulib, which override files from other sources.
103 $build_aux/install-sh
106 $build_aux/texinfo.tex
108 $build_aux/config.guess
109 $build_aux/config.sub
113 # Additional gnulib-tool options to use. Use "\newline" to break lines.
114 gnulib_tool_option_extras=
116 # Other locale categories that need message catalogs.
117 EXTRA_LOCALE_CATEGORIES=
119 # Additional xgettext options to use. Use "\\\newline" to break lines.
120 XGETTEXT_OPTIONS='\\\
121 --flag=_:1:pass-c-format\\\
122 --flag=N_:1:pass-c-format\\\
123 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
126 # Files we don't want to import.
129 # File that should exist in the top directory of a checked out hierarchy,
130 # but not in a distribution tarball.
131 checkout_only_file=README-hacking
133 # Whether to use copies instead of symlinks.
136 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
137 # those files to be generated in directories like lib/, m4/, and po/.
138 # Or set it to 'auto' to make this script select which to use based
139 # on which version control system (if any) is used in the source directory.
142 # Override the default configuration, if necessary.
143 test -r bootstrap.conf && . ./bootstrap.conf
145 if test "$vc_ignore" = auto; then
147 test -d .git && vc_ignore=.gitignore
148 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
151 # Translate configuration into internal form.
162 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
164 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
168 checkout_only_file=;;
172 echo >&2 "$0: $option: unknown option"
177 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
178 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
182 # If $STR is not already on a line by itself in $FILE, insert it,
183 # sorting the new contents of the file and replacing $FILE with the result.
184 insert_sorted_if_absent() {
187 test -f $file || touch $file
188 echo "$str" | sort -u - $file | cmp -s - $file \
189 || echo "$str" | sort -u - $file -o $file \
193 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
195 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
196 >/dev/null && found_aux_dir=yes
197 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
198 >/dev/null && found_aux_dir=yes
199 if test $found_aux_dir = no; then
200 echo "$0: expected line not found in configure.ac. Add the following:" >&2
201 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
205 # If $build_aux doesn't exist, create it now, otherwise some bits
206 # below will malfunction. If creating it, also mark it as ignored.
207 if test ! -d $build_aux; then
209 for dot_ig in x $vc_ignore; do
210 test $dot_ig = x && continue
211 insert_sorted_if_absent $dot_ig $build_aux
215 echo "$0: Bootstrapping from checked-out $package sources..."
225 case ${GNULIB_SRCDIR--} in
227 if [ ! -d gnulib ]; then
228 echo "$0: getting gnulib files..."
230 case ${CVS_AUTH-pserver} in
232 CVS_PREFIX=':pserver:anonymous@';;
234 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
236 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
241 '') CVS_RSH=ssh; export CVS_RSH;;
244 trap cleanup_gnulib 1 2 13 15
246 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
254 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
255 <$gnulib_tool || exit
259 download_po_files() {
262 echo "$0: getting translations into $subdir for $domain..."
263 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
267 # Download .po files to $po_dir/.reference and copy only the new
268 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
270 # Directory containing primary .po files.
271 # Overwrite them only when we're sure a .po file is new.
275 # Download *.po files into this dir.
276 # Usually contains *.s1 checksum files.
277 ref_po_dir="$po_dir/.reference"
279 test -d $ref_po_dir || mkdir $ref_po_dir || return
280 download_po_files $ref_po_dir $domain \
281 && ls "$ref_po_dir"/*.po 2>/dev/null |
282 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
284 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
285 new_po="$ref_po_dir/$po.po"
286 cksum_file="$ref_po_dir/$po.s1"
287 if ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
288 echo "updated $po_dir/$po.po..."
289 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
296 case `wget --help` in
298 WGET_COMMAND='wget -nv --no-cache';;
300 WGET_COMMAND='wget -nv --cache=off';;
302 WGET_COMMAND='wget -nv';;
308 update_po_files po $package || exit
311 if test -d runtime-po; then
312 update_po_files runtime-po $package-runtime || exit
323 # If the destination directory doesn't exist, create it.
324 # This is required at least for "lib/uniwidth/cjk.h".
325 dst_dir=`dirname "$dst"`
326 if ! test -d "$dst_dir"; then
329 # If we've just created a directory like lib/uniwidth,
330 # tell version control system(s) it's ignorable.
331 # FIXME: for now, this does only one level
332 parent=`dirname "$dst_dir"`
333 for dot_ig in x $vc_ignore; do
334 test $dot_ig = x && continue
336 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
342 test ! -h "$dst" || {
343 echo "$0: rm -f $dst" &&
348 cmp -s "$src" "$dst" || {
349 echo "$0: cp -fp $src $dst" &&
354 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
355 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
356 test "$src_i" = "$dst_i" || {
362 *//* | */../* | */./* | /*/*/*/*/*/)
363 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
365 /*/*/*/*/) dot_dots=../../../;;
366 /*/*/*/) dot_dots=../../;;
367 /*/*/) dot_dots=../;;
371 echo "$0: ln -fs $dot_dots$src $dst" &&
372 ln -fs "$dot_dots$src" "$dst"
378 cp_mark_as_generated()
383 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
384 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
385 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
386 symlink_to_dir $local_gl_dir "$cp_dst"
389 *.[ch]) c1='/* '; c2=' */';;
390 *.texi) c1='@c '; c2= ;;
391 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
395 if test -z "$c1"; then
396 cmp -s "$cp_src" "$cp_dst" || {
397 echo "$0: cp -f $cp_src $cp_dst" &&
399 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
402 # Copy the file first to get proper permissions if it
403 # doesn't already exist. Then overwrite the copy.
404 cp "$cp_src" "$cp_dst-t" &&
406 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
407 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
408 sed "s!$bt_regex/!!g" "$cp_src"
410 if cmp -s "$cp_dst-t" "$cp_dst"; then
413 echo "$0: cp $cp_src $cp_dst # with edits" &&
414 mv -f "$cp_dst-t" "$cp_dst"
420 version_controlled_file() {
425 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
426 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
427 elif test -d .git; then
428 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
430 echo "$0: no version control for $dir/$file?" >&2
436 for dir in . `(cd $1 && find * -type d -print)`; do
439 for file in `ls -a $1/$dir`; do
442 .*) continue;; # FIXME: should all file names starting with "." be ignored?
444 test -d $1/$dir/$file && continue
445 for excluded_file in $excluded_files; do
446 test "$dir/$file" = "$excluded_file" && continue 2
448 if test $file = Makefile.am; then
449 copied=$copied${sep}$gnulib_mk; sep=$nl
450 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
451 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
452 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
453 rm -f $dir/$gnulib_mk &&
454 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
456 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
457 version_controlled_file $dir $file; then
458 echo "$0: $dir/$file overrides $1/$dir/$file"
460 copied=$copied$sep$file; sep=$nl
461 if test $file = gettext.m4; then
462 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
465 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
466 AC_DEFUN([AM_INTL_SUBDIR], [
467 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
468 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
470 AC_DEFUN([gl_LOCK_EARLY], [])
471 ' $1/$dir/$file >$dir/$file
473 cp_mark_as_generated $1/$dir/$file $dir/$file
478 for dot_ig in x $vc_ignore; do
479 test $dot_ig = x && continue
481 if test -n "$copied"; then
482 insert_sorted_if_absent $ig "$copied"
483 # If an ignored file name ends with _.h, then also add
484 # the name with just ".h". Many gnulib headers are generated,
485 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
486 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
487 f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
488 insert_sorted_if_absent $ig "$f"
490 # For files like sys_stat_.h and sys_time_.h, record as
491 # ignorable the directory we might eventually create: sys/.
492 f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
493 insert_sorted_if_absent $ig "$f"
500 # Create boot temporary directories to import from gnulib and gettext.
502 mkdir $bt $bt2 || exit
504 # Import from gnulib.
506 gnulib_tool_options="\
509 --aux-dir $bt/$build_aux\
513 --source-base $bt/lib/\
514 --tests-base $bt/tests\
515 --local-dir $local_gl_dir\
516 $gnulib_tool_option_extras\
518 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
519 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
522 for file in $gnulib_files; do
523 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
527 # Import from gettext.
529 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
532 if test $with_gettext = yes; then
533 echo "$0: (cd $bt2; autopoint) ..."
534 cp configure.ac $bt2 &&
535 (cd $bt2 && autopoint && rm configure.ac) &&
536 slurp $bt2 $bt || exit
538 rm -fr $bt $bt2 || exit
541 # Coreutils is unusual in that it generates some of its test-related
542 # Makefile.am files. That must be done before invoking automake.
543 mam_template=tests/Makefile.am.in
544 if test -f $mam_template; then
546 for tool in cut head join pr sort tac tail test tr uniq wc; do
547 m=tests/$tool/Makefile.am
550 sed -n '1,/^##test-files-begin/p' $mam_template > $t
551 echo "x = $tool" >> $t
553 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
554 sed -n '/^##test-files-end/,$p' $mam_template >> $t
560 # Reconfigure, getting other files.
564 'aclocal --force -I m4' \
566 'autoheader --force' \
567 'automake --add-missing --copy --force-missing';
569 if test "$command" = libtool; then
570 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
572 command='libtoolize -c -f'
574 echo "$0: $command ..."
579 # Get some extra files from gnulib, overriding existing files.
580 for file in $gnulib_extra_files; do
582 */INSTALL) dst=INSTALL;;
583 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
586 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
589 if test $with_gettext = yes; then
590 # Create gettext configuration.
591 echo "$0: Creating po/Makevars from po/Makevars.template ..."
594 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
595 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
596 /^XGETTEXT_OPTIONS *=/{
599 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
601 ' po/Makevars.template >po/Makevars
603 if test -d runtime-po; then
604 # Similarly for runtime-po/Makevars, but not quite the same.
605 rm -f runtime-po/Makevars
607 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
608 /^subdir *=.*/s/=.*/= runtime-po/
609 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
610 /^XGETTEXT_OPTIONS *=/{
613 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
615 ' <po/Makevars.template >runtime-po/Makevars
617 # Copy identical files from po to runtime-po.
618 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
622 echo "$0: done. Now you can run './configure'."