3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2008 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.
31 # Temporary directory names.
33 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
39 Bootstrap this package from the checked-out sources.
42 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
43 sources reside. Use this if you already
44 have gnulib sources on your machine, and
45 do not want to waste your bandwidth downloading
47 --copy Copy files instead of creating symbolic links.
48 --force Attempt to bootstrap even if the sources seem
49 not to have been checked out.
50 --skip-po Do not download po files.
52 If the file bootstrap.conf exists in the current working directory, its
53 contents are read as shell variables to configure the bootstrap.
55 Running without arguments will suffice in most cases.
61 # Name of the Makefile.am
64 # List of gnulib modules needed.
67 # Any gnulib files needed that are not in modules.
70 # The command to download all .po files for a specified domain into
71 # a specified directory. Fill in the first %s is the domain name, and
72 # the second with the destination directory. Use rsync's -L and -r
73 # options because the latest/%s directory and the .po files within are
75 po_download_command_format=\
76 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
78 extract_package_name='
90 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
95 package=`sed -n "$extract_package_name" configure.ac` || exit
96 gnulib_name=lib$package
104 # Extra files from gnulib, which override files from other sources.
106 $build_aux/install-sh
109 $build_aux/texinfo.tex
111 $build_aux/config.guess
112 $build_aux/config.sub
116 # Additional gnulib-tool options to use. Use "\newline" to break lines.
117 gnulib_tool_option_extras=
119 # Other locale categories that need message catalogs.
120 EXTRA_LOCALE_CATEGORIES=
122 # Additional xgettext options to use. Use "\\\newline" to break lines.
123 XGETTEXT_OPTIONS='\\\
124 --flag=_:1:pass-c-format\\\
125 --flag=N_:1:pass-c-format\\\
126 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
129 # Package bug report address for gettext files
130 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
132 # Files we don't want to import.
135 # File that should exist in the top directory of a checked out hierarchy,
136 # but not in a distribution tarball.
137 checkout_only_file=README-hacking
139 # Whether to use copies instead of symlinks.
142 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
143 # those files to be generated in directories like lib/, m4/, and po/.
144 # Or set it to 'auto' to make this script select which to use based
145 # on which version control system (if any) is used in the source directory.
148 # Override the default configuration, if necessary.
149 test -r bootstrap.conf && . ./bootstrap.conf
151 if test "$vc_ignore" = auto; then
153 test -d .git && vc_ignore=.gitignore
154 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
157 # Translate configuration into internal form.
168 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
172 checkout_only_file=;;
176 echo >&2 "$0: $option: unknown option"
181 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
182 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
186 # If $STR is not already on a line by itself in $FILE, insert it,
187 # sorting the new contents of the file and replacing $FILE with the result.
188 insert_sorted_if_absent() {
191 test -f $file || touch $file
192 echo "$str" | sort -u - $file | cmp -s - $file \
193 || echo "$str" | sort -u - $file -o $file \
197 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
199 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
200 >/dev/null && found_aux_dir=yes
201 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
202 >/dev/null && found_aux_dir=yes
203 if test $found_aux_dir = no; then
204 echo "$0: expected line not found in configure.ac. Add the following:" >&2
205 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
209 # If $build_aux doesn't exist, create it now, otherwise some bits
210 # below will malfunction. If creating it, also mark it as ignored.
211 if test ! -d $build_aux; then
213 for dot_ig in x $vc_ignore; do
214 test $dot_ig = x && continue
215 insert_sorted_if_absent $dot_ig $build_aux
219 echo "$0: Bootstrapping from checked-out $package sources..."
229 case ${GNULIB_SRCDIR--} in
231 if [ ! -d gnulib ]; then
232 echo "$0: getting gnulib files..."
234 trap cleanup_gnulib 1 2 13 15
236 git clone --depth 2 git://git.sv.gnu.org/gnulib ||
244 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
245 <$gnulib_tool || exit
249 download_po_files() {
252 echo "$0: getting translations into $subdir for $domain..."
253 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
257 # Download .po files to $po_dir/.reference and copy only the new
258 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
260 # Directory containing primary .po files.
261 # Overwrite them only when we're sure a .po file is new.
265 # Download *.po files into this dir.
266 # Usually contains *.s1 checksum files.
267 ref_po_dir="$po_dir/.reference"
269 test -d $ref_po_dir || mkdir $ref_po_dir || return
270 download_po_files $ref_po_dir $domain \
271 && ls "$ref_po_dir"/*.po 2>/dev/null |
272 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
274 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
275 test "$langs" = '*' && langs=x
276 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
277 case $po in x) continue;; esac
278 new_po="$ref_po_dir/$po.po"
279 cksum_file="$ref_po_dir/$po.s1"
280 if ! test -f "$cksum_file" ||
281 ! test -f "$po_dir/$po.po" ||
282 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
283 echo "updated $po_dir/$po.po..."
284 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
292 update_po_files po $package || exit
295 if test -d runtime-po; then
296 update_po_files runtime-po $package-runtime || exit
307 # If the destination directory doesn't exist, create it.
308 # This is required at least for "lib/uniwidth/cjk.h".
309 dst_dir=`dirname "$dst"`
310 if ! test -d "$dst_dir"; then
313 # If we've just created a directory like lib/uniwidth,
314 # tell version control system(s) it's ignorable.
315 # FIXME: for now, this does only one level
316 parent=`dirname "$dst_dir"`
317 for dot_ig in x $vc_ignore; do
318 test $dot_ig = x && continue
320 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
326 test ! -h "$dst" || {
327 echo "$0: rm -f $dst" &&
332 cmp -s "$src" "$dst" || {
333 echo "$0: cp -fp $src $dst" &&
338 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
339 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
340 test "$src_i" = "$dst_i" || {
346 *//* | */../* | */./* | /*/*/*/*/*/)
347 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
349 /*/*/*/*/) dot_dots=../../../;;
350 /*/*/*/) dot_dots=../../;;
351 /*/*/) dot_dots=../;;
355 echo "$0: ln -fs $dot_dots$src $dst" &&
356 ln -fs "$dot_dots$src" "$dst"
362 cp_mark_as_generated()
367 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
368 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
369 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
370 symlink_to_dir $local_gl_dir "$cp_dst"
373 *.[ch]) c1='/* '; c2=' */';;
374 *.texi) c1='@c '; c2= ;;
375 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
379 # If the destination directory doesn't exist, create it.
380 # This is required at least for "lib/uniwidth/cjk.h".
381 dst_dir=`dirname "$cp_dst"`
382 test -d "$dst_dir" || mkdir -p "$dst_dir"
384 if test -z "$c1"; then
385 cmp -s "$cp_src" "$cp_dst" || {
386 echo "$0: cp -f $cp_src $cp_dst" &&
388 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
391 # Copy the file first to get proper permissions if it
392 # doesn't already exist. Then overwrite the copy.
393 cp "$cp_src" "$cp_dst-t" &&
395 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
396 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
397 sed "s!$bt_regex/!!g" "$cp_src"
399 if cmp -s "$cp_dst-t" "$cp_dst"; then
402 echo "$0: cp $cp_src $cp_dst # with edits" &&
403 mv -f "$cp_dst-t" "$cp_dst"
409 version_controlled_file() {
414 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
415 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
416 elif test -d .git; then
417 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
418 elif test -d .svn; then
419 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
421 echo "$0: no version control for $dir/$file?" >&2
427 for dir in . `(cd $1 && find * -type d -print)`; do
430 for file in `ls -a $1/$dir`; do
433 .*) continue;; # FIXME: should all file names starting with "." be ignored?
435 test -d $1/$dir/$file && continue
436 for excluded_file in $excluded_files; do
437 test "$dir/$file" = "$excluded_file" && continue 2
439 if test $file = Makefile.am; then
440 copied=$copied${sep}$gnulib_mk; sep=$nl
441 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
442 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
443 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
444 rm -f $dir/$gnulib_mk &&
445 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
447 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
448 version_controlled_file $dir $file; then
449 echo "$0: $dir/$file overrides $1/$dir/$file"
451 copied=$copied$sep$file; sep=$nl
452 if test $file = gettext.m4; then
453 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
456 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
457 AC_DEFUN([AM_INTL_SUBDIR], [
458 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
459 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
461 AC_DEFUN([gl_LOCK_EARLY], [])
462 ' $1/$dir/$file >$dir/$file
464 cp_mark_as_generated $1/$dir/$file $dir/$file
469 for dot_ig in x $vc_ignore; do
470 test $dot_ig = x && continue
472 if test -n "$copied"; then
473 insert_sorted_if_absent $ig "$copied"
474 # If an ignored file name ends with .in.h, then also add
475 # the name with just ".h". Many gnulib headers are generated,
476 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
477 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
478 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
479 insert_sorted_if_absent $ig "$f"
481 # For files like sys_stat.in.h and sys_time.in.h, record as
482 # ignorable the directory we might eventually create: sys/.
483 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
484 insert_sorted_if_absent $ig "$f"
491 # Create boot temporary directories to import from gnulib and gettext.
493 mkdir $bt $bt2 || exit
495 # Import from gnulib.
497 gnulib_tool_options="\
500 --aux-dir $bt/$build_aux\
501 --doc-base $bt/$doc_base\
503 --m4-base $bt/$m4_base/\
504 --source-base $bt/$source_base/\
505 --tests-base $bt/$tests_base\
506 --local-dir $local_gl_dir\
507 $gnulib_tool_option_extras\
509 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
510 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
513 for file in $gnulib_files; do
514 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
518 # Import from gettext.
520 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
523 if test $with_gettext = yes; then
524 echo "$0: (cd $bt2; autopoint) ..."
525 cp configure.ac $bt2 &&
526 (cd $bt2 && autopoint && rm configure.ac) &&
527 slurp $bt2 $bt || exit
529 rm -fr $bt $bt2 || exit
532 # Coreutils is unusual in that it generates some of its test-related
533 # Makefile.am files. That must be done before invoking automake.
534 mam_template=tests/Makefile.am.in
535 if test -f $mam_template; then
537 for tool in cut head join pr sort tac tail test tr uniq wc; do
538 m=tests/$tool/Makefile.am
541 sed -n '1,/^##test-files-begin/p' $mam_template > $t
542 echo "x = $tool" >> $t
544 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
545 sed -n '/^##test-files-end/,$p' $mam_template >> $t
551 # Remove any dangling symlink matching "*.m4" in the gnulib-populated
552 # $m4_base directory, since such a file would cause aclocal to fail.
553 # The following requires GNU find 4.2.3 or newer. Considering the usual
554 # portability constraints of this script, that may seem a very demanding
555 # requirement, but it should be ok. Ignore any failure, which is fine,
556 # since this is only a convenience to help developers avoid the relatively
557 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
558 # between successive runs of this script.
559 find "$m4_base" -name '*.m4' -depth -type l -xtype l -delete > /dev/null 2>&1
561 # Reconfigure, getting other files.
565 'aclocal --force -I m4' \
567 'autoheader --force' \
568 'automake --add-missing --copy --force-missing';
570 if test "$command" = libtool; then
571 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
573 command='libtoolize -c -f'
575 echo "$0: $command ..."
580 # Get some extra files from gnulib, overriding existing files.
581 for file in $gnulib_extra_files; do
583 */INSTALL) dst=INSTALL;;
584 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
587 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
590 if test $with_gettext = yes; then
591 # Create gettext configuration.
592 echo "$0: Creating po/Makevars from po/Makevars.template ..."
595 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
596 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
597 /^XGETTEXT_OPTIONS *=/{
600 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
602 ' po/Makevars.template >po/Makevars
604 if test -d runtime-po; then
605 # Similarly for runtime-po/Makevars, but not quite the same.
606 rm -f runtime-po/Makevars
608 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
609 /^subdir *=.*/s/=.*/= runtime-po/
610 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
611 /^XGETTEXT_OPTIONS *=/{
614 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
616 ' <po/Makevars.template >runtime-po/Makevars
618 # Copy identical files from po to runtime-po.
619 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
623 # Horrible, coreutils-specific kludges.
624 # Change paths in gnulib-tests/gnulib.mk from "../.." to "..".
625 m=gnulib-tests/gnulib.mk
626 sed 's,\.\./\.\.,..,g' $m > $m-t
629 echo "$0: done. Now you can run './configure'."