3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2009 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 $0.conf exists in the same directory as this script, its
53 contents are read as shell variables to configure the bootstrap.
55 For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
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='
93 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
98 package=`sed -n "$extract_package_name" configure.ac` || exit
99 gnulib_name=lib$package
107 # Extra files from gnulib, which override files from other sources.
109 $build_aux/install-sh
112 $build_aux/texinfo.tex
114 $build_aux/config.guess
115 $build_aux/config.sub
119 # Additional gnulib-tool options to use. Use "\newline" to break lines.
120 gnulib_tool_option_extras=
122 # Other locale categories that need message catalogs.
123 EXTRA_LOCALE_CATEGORIES=
125 # Additional xgettext options to use. Use "\\\newline" to break lines.
126 XGETTEXT_OPTIONS='\\\
127 --flag=_:1:pass-c-format\\\
128 --flag=N_:1:pass-c-format\\\
129 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
132 # Package bug report address for gettext files
133 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
135 # Files we don't want to import.
138 # File that should exist in the top directory of a checked out hierarchy,
139 # but not in a distribution tarball.
140 checkout_only_file=README-hacking
142 # Whether to use copies instead of symlinks.
145 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
146 # those files to be generated in directories like lib/, m4/, and po/.
147 # Or set it to 'auto' to make this script select which to use based
148 # on which version control system (if any) is used in the source directory.
151 # Override the default configuration, if necessary.
152 # Make sure that bootstrap.conf is sourced from the current directory
153 # if we were invoked as "sh bootstrap".
155 */*) test -r "$0.conf" && . "$0.conf" ;;
156 *) test -r "$0.conf" && . ./"$0.conf" ;;
160 if test "$vc_ignore" = auto; then
162 test -d .git && vc_ignore=.gitignore
163 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
166 # Translate configuration into internal form.
177 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
181 checkout_only_file=;;
185 echo >&2 "$0: $option: unknown option"
190 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
191 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
195 # If $STR is not already on a line by itself in $FILE, insert it,
196 # sorting the new contents of the file and replacing $FILE with the result.
197 insert_sorted_if_absent() {
200 test -f $file || touch $file
201 echo "$str" | sort -u - $file | cmp - $file > /dev/null \
202 || echo "$str" | sort -u - $file -o $file \
206 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
208 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
209 >/dev/null && found_aux_dir=yes
210 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
211 >/dev/null && found_aux_dir=yes
212 if test $found_aux_dir = no; then
213 echo "$0: expected line not found in configure.ac. Add the following:" >&2
214 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
218 # If $build_aux doesn't exist, create it now, otherwise some bits
219 # below will malfunction. If creating it, also mark it as ignored.
220 if test ! -d $build_aux; then
222 for dot_ig in x $vc_ignore; do
223 test $dot_ig = x && continue
224 insert_sorted_if_absent $dot_ig $build_aux
228 # Note this deviates from the version comparison in automake
229 # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
230 # but this should suffice as we won't be specifying old
231 # version formats or redundant trailing .0 in bootstrap.conf.
232 # If we did want full compatibility then we should probably
233 # use m4_version_compare from autoconf.
234 sort_ver() { # sort -V is not generally available
238 # split on '.' and compare each component
241 p1=$(echo "$ver1" | cut -d. -f$i)
242 p2=$(echo "$ver2" | cut -d. -f$i)
246 elif [ ! "$p2" ]; then
249 elif [ ! "$p1" = "$p2" ]; then
250 if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
252 elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
254 else # numeric, then lexicographic comparison
255 lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
256 if [ "$lp" = "$p2" ]; then
271 $app --version >/dev/null 2>&1 || return 1
273 $app --version 2>&1 |
274 sed -n 's/[^0-9.]*\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/p
284 while read app req_ver; do
285 # Honor $APP variables ($TAR, $AUTOCONF, etc.)
286 appvar=`echo $app | tr '[a-z]' '[A-Z]'`
287 test "$appvar" = TAR && appvar=AMTAR
288 eval "app=\${$appvar-$app}"
289 inst_ver=$(get_version $app)
290 if [ ! "$inst_ver" ]; then
291 echo "Error: '$app' not found" >&2
293 elif [ ! "$req_ver" = "-" ]; then
294 latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
295 if [ ! "$latest_ver" = "$inst_ver" ]; then
296 echo "Error: '$app' version == $inst_ver is too old" >&2
297 echo " '$app' version >= $req_ver is required" >&2
307 echo "Program Min_version"
308 echo "----------------------"
310 echo "----------------------"
311 # can't depend on column -t
314 if ! printf "$buildreq" | check_versions; then
315 test -f README-prereq &&
316 echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
322 echo "$0: Bootstrapping from checked-out $package sources..."
324 # See if we can use gnulib's git-merge-changelog merge driver.
325 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
326 if git config merge.merge-changelog.driver >/dev/null ; then
328 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
329 echo "initializing git-merge-changelog driver"
330 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
331 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
333 echo "consider installing git-merge-changelog from gnulib"
344 git_modules_config () {
345 test -f .gitmodules && git config --file .gitmodules "$@"
350 case ${GNULIB_SRCDIR--} in
352 if git_modules_config submodule.gnulib.url >/dev/null; then
353 echo "$0: getting gnulib files..."
354 git submodule init || exit $?
355 git submodule update || exit $?
357 elif [ ! -d gnulib ]; then
358 echo "$0: getting gnulib files..."
360 trap cleanup_gnulib 1 2 13 15
362 git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
363 git clone $shallow git://git.sv.gnu.org/gnulib ||
371 # Redirect the gnulib submodule to the directory on the command line
373 if test -d "$GNULIB_SRCDIR"/.git && \
374 git_modules_config submodule.gnulib.url >/dev/null; then
376 GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
377 git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
378 echo "$0: getting gnulib files..."
379 git submodule update || exit $?
385 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
386 <$gnulib_tool || exit
390 download_po_files() {
393 echo "$0: getting translations into $subdir for $domain..."
394 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
398 # Download .po files to $po_dir/.reference and copy only the new
399 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
401 # Directory containing primary .po files.
402 # Overwrite them only when we're sure a .po file is new.
406 # Download *.po files into this dir.
407 # Usually contains *.s1 checksum files.
408 ref_po_dir="$po_dir/.reference"
410 test -d $ref_po_dir || mkdir $ref_po_dir || return
411 download_po_files $ref_po_dir $domain \
412 && ls "$ref_po_dir"/*.po 2>/dev/null |
413 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
415 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
416 test "$langs" = '*' && langs=x
418 case $po in x) continue;; esac
419 new_po="$ref_po_dir/$po.po"
420 cksum_file="$ref_po_dir/$po.s1"
421 if ! test -f "$cksum_file" ||
422 ! test -f "$po_dir/$po.po" ||
423 ! ${SHA1SUM-sha1sum} -c --status "$cksum_file" \
424 < "$new_po" > /dev/null; then
425 echo "updated $po_dir/$po.po..."
426 cp "$new_po" "$po_dir/$po.po" \
427 && ${SHA1SUM-sha1sum} < "$new_po" > "$cksum_file"
435 update_po_files po $package || exit
438 if test -d runtime-po; then
439 update_po_files runtime-po $package-runtime || exit
450 # If the destination directory doesn't exist, create it.
451 # This is required at least for "lib/uniwidth/cjk.h".
452 dst_dir=`dirname "$dst"`
453 if ! test -d "$dst_dir"; then
456 # If we've just created a directory like lib/uniwidth,
457 # tell version control system(s) it's ignorable.
458 # FIXME: for now, this does only one level
459 parent=`dirname "$dst_dir"`
460 for dot_ig in x $vc_ignore; do
461 test $dot_ig = x && continue
463 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
469 test ! -h "$dst" || {
470 echo "$0: rm -f $dst" &&
475 cmp -s "$src" "$dst" || {
476 echo "$0: cp -fp $src $dst" &&
481 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
482 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
483 test "$src_i" = "$dst_i" || {
489 *//* | */../* | */./* | /*/*/*/*/*/)
490 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
492 /*/*/*/*/) dot_dots=../../../;;
493 /*/*/*/) dot_dots=../../;;
494 /*/*/) dot_dots=../;;
498 echo "$0: ln -fs $dot_dots$src $dst" &&
499 ln -fs "$dot_dots$src" "$dst"
505 cp_mark_as_generated()
510 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
511 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
512 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
513 symlink_to_dir $local_gl_dir "$cp_dst"
516 *.[ch]) c1='/* '; c2=' */';;
517 *.texi) c1='@c '; c2= ;;
518 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
522 # If the destination directory doesn't exist, create it.
523 # This is required at least for "lib/uniwidth/cjk.h".
524 dst_dir=`dirname "$cp_dst"`
525 test -d "$dst_dir" || mkdir -p "$dst_dir"
527 if test -z "$c1"; then
528 cmp -s "$cp_src" "$cp_dst" || {
529 # Copy the file first to get proper permissions if it
530 # doesn't already exist. Then overwrite the copy.
531 echo "$0: cp -f $cp_src $cp_dst" &&
533 cp "$cp_src" "$cp_dst-t" &&
534 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
535 mv -f "$cp_dst-t" "$cp_dst"
538 # Copy the file first to get proper permissions if it
539 # doesn't already exist. Then overwrite the copy.
540 cp "$cp_src" "$cp_dst-t" &&
542 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
543 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
545 sed "s!$bt_regex/!!g" "$cp_src"
547 if cmp -s "$cp_dst-t" "$cp_dst"; then
550 echo "$0: cp $cp_src $cp_dst # with edits" &&
551 mv -f "$cp_dst-t" "$cp_dst"
557 version_controlled_file() {
562 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
563 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
564 elif test -d .git; then
565 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
566 elif test -d .svn; then
567 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
569 echo "$0: no version control for $dir/$file?" >&2
575 for dir in . `(cd $1 && find * -type d -print)`; do
578 for file in `ls -a $1/$dir`; do
581 .*) continue;; # FIXME: should all file names starting with "." be ignored?
583 test -d $1/$dir/$file && continue
584 for excluded_file in $excluded_files; do
585 test "$dir/$file" = "$excluded_file" && continue 2
587 if test $file = Makefile.am; then
588 copied=$copied${sep}$gnulib_mk; sep=$nl
589 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
590 sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
591 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
592 rm -f $dir/$gnulib_mk &&
593 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
595 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
596 version_controlled_file $dir $file; then
597 echo "$0: $dir/$file overrides $1/$dir/$file"
599 copied=$copied$sep$file; sep=$nl
600 if test $file = gettext.m4; then
601 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
604 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
605 AC_DEFUN([AM_INTL_SUBDIR], [
606 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
607 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
609 AC_DEFUN([gl_LOCK_EARLY], [])
610 ' $1/$dir/$file >$dir/$file
612 cp_mark_as_generated $1/$dir/$file $dir/$file
617 for dot_ig in x $vc_ignore; do
618 test $dot_ig = x && continue
620 if test -n "$copied"; then
621 insert_sorted_if_absent $ig "$copied"
622 # If an ignored file name ends with .in.h, then also add
623 # the name with just ".h". Many gnulib headers are generated,
624 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
625 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
626 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
627 insert_sorted_if_absent $ig "$f"
629 # For files like sys_stat.in.h and sys_time.in.h, record as
630 # ignorable the directory we might eventually create: sys/.
631 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
632 insert_sorted_if_absent $ig "$f"
639 # Create boot temporary directories to import from gnulib and gettext.
641 mkdir $bt $bt2 || exit
643 # Import from gnulib.
645 gnulib_tool_options="\
648 --aux-dir $bt/$build_aux\
649 --doc-base $bt/$doc_base\
651 --m4-base $bt/$m4_base/\
652 --source-base $bt/$source_base/\
653 --tests-base $bt/$tests_base\
654 --local-dir $local_gl_dir\
655 $gnulib_tool_option_extras\
657 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
658 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
661 for file in $gnulib_files; do
662 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
666 # Import from gettext.
668 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
671 if test $with_gettext = yes; then
672 echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
673 cp configure.ac $bt2 &&
674 (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
675 slurp $bt2 $bt || exit
677 rm -fr $bt $bt2 || exit
679 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
680 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
681 # The following requires GNU find 4.2.3 or newer. Considering the usual
682 # portability constraints of this script, that may seem a very demanding
683 # requirement, but it should be ok. Ignore any failure, which is fine,
684 # since this is only a convenience to help developers avoid the relatively
685 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
686 # between successive runs of this script.
687 find "$m4_base" "$source_base" \
688 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
689 -type l -xtype l -delete > /dev/null 2>&1
691 # Reconfigure, getting other files.
695 "${ACLOCAL-aclocal} --force -I m4" \
696 "${AUTOCONF-autoconf} --force" \
697 "${AUTOHEADER-autoheader} --force" \
698 "${AUTOMAKE-automake} --add-missing --copy --force-missing"
700 if test "$command" = libtool; then
702 # We'd like to use grep -E, to see if any of LT_INIT,
703 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
704 # but that's not portable enough (e.g., for Solaris).
705 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
707 grep '^[ ]*LT_INIT' configure.ac >/dev/null \
709 test $use_libtool = 0 \
711 command="${LIBTOOLIZE-libtoolize} -c -f"
713 echo "$0: $command ..."
718 # Get some extra files from gnulib, overriding existing files.
719 for file in $gnulib_extra_files; do
721 */INSTALL) dst=INSTALL;;
722 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
725 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
728 if test $with_gettext = yes; then
729 # Create gettext configuration.
730 echo "$0: Creating po/Makevars from po/Makevars.template ..."
733 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
734 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
735 /^XGETTEXT_OPTIONS *=/{
738 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
740 ' po/Makevars.template >po/Makevars
742 if test -d runtime-po; then
743 # Similarly for runtime-po/Makevars, but not quite the same.
744 rm -f runtime-po/Makevars
746 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
747 /^subdir *=.*/s/=.*/= runtime-po/
748 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
749 /^XGETTEXT_OPTIONS *=/{
752 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
754 ' <po/Makevars.template >runtime-po/Makevars
756 # Copy identical files from po to runtime-po.
757 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
761 # Horrible, coreutils-specific kludges.
762 # Change paths in gnulib-tests/gnulib.mk from "../.." to "..".
763 m=gnulib-tests/gnulib.mk
764 sed 's,\.\./\.\.,..,g' $m > $m-t
767 echo "$0: done. Now you can run './configure'."