3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2010 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
46 them again. Defaults to \$GNULIB_SRCDIR.
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 # A function to be called after everything else in this script.
74 # Override it via your own definition in bootstrap.conf.
75 bootstrap_epilogue() { :; }
77 # The command to download all .po files for a specified domain into
78 # a specified directory. Fill in the first %s is the domain name, and
79 # the second with the destination directory. Use rsync's -L and -r
80 # options because the latest/%s directory and the .po files within are
82 po_download_command_format=\
83 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
85 extract_package_name='
97 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
102 package=`sed -n "$extract_package_name" configure.ac` || exit
103 gnulib_name=lib$package
111 # Extra files from gnulib, which override files from other sources.
113 $build_aux/install-sh
116 $build_aux/texinfo.tex
118 $build_aux/config.guess
119 $build_aux/config.sub
123 # Additional gnulib-tool options to use. Use "\newline" to break lines.
124 gnulib_tool_option_extras=
126 # Other locale categories that need message catalogs.
127 EXTRA_LOCALE_CATEGORIES=
129 # Additional xgettext options to use. Use "\\\newline" to break lines.
130 XGETTEXT_OPTIONS='\\\
131 --flag=_:1:pass-c-format\\\
132 --flag=N_:1:pass-c-format\\\
133 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
136 # Package bug report address for gettext files
137 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
139 # Files we don't want to import.
142 # File that should exist in the top directory of a checked out hierarchy,
143 # but not in a distribution tarball.
144 checkout_only_file=README-hacking
146 # Whether to use copies instead of symlinks.
149 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
150 # those files to be generated in directories like lib/, m4/, and po/.
151 # Or set it to 'auto' to make this script select which to use based
152 # on which version control system (if any) is used in the source directory.
155 # find_tool ENVVAR NAMES...
156 # -------------------------
157 # Search for a required program. Use the value of ENVVAR, if set,
158 # otherwise find the first of the NAMES that can be run (i.e.,
159 # supports --version). If found, set ENVVAR to the program name,
163 # Find sha1sum, named gsha1sum on MacPorts.
167 eval "find_tool_res=\$$find_tool_envvar"
168 if test x"$find_tool_res" = x; then
171 if ($i --version </dev/null) >/dev/null 2>&1; then
177 find_tool_error_prefix="\$$find_tool_envvar: "
179 if test x"$find_tool_res" = x; then
180 echo >&2 "$0: one of these is required: $find_tool_names"
183 ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
184 echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
187 eval "$find_tool_envvar=\$find_tool_res"
188 eval "export $find_tool_envvar"
191 # Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6.
192 find_tool SHA1SUM sha1sum gsha1sum shasum
194 # Override the default configuration, if necessary.
195 # Make sure that bootstrap.conf is sourced from the current directory
196 # if we were invoked as "sh bootstrap".
198 */*) test -r "$0.conf" && . "$0.conf" ;;
199 *) test -r "$0.conf" && . ./"$0.conf" ;;
203 if test "$vc_ignore" = auto; then
205 test -d .git && vc_ignore=.gitignore
206 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
209 # Translate configuration into internal form.
220 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
224 checkout_only_file=;;
228 echo >&2 "$0: $option: unknown option"
233 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
234 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
238 # If $STR is not already on a line by itself in $FILE, insert it,
239 # sorting the new contents of the file and replacing $FILE with the result.
240 insert_sorted_if_absent() {
243 test -f $file || touch $file
244 echo "$str" | sort -u - $file | cmp - $file > /dev/null \
245 || echo "$str" | sort -u - $file -o $file \
249 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
251 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
252 >/dev/null && found_aux_dir=yes
253 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
254 >/dev/null && found_aux_dir=yes
255 if test $found_aux_dir = no; then
256 echo "$0: expected line not found in configure.ac. Add the following:" >&2
257 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
261 # If $build_aux doesn't exist, create it now, otherwise some bits
262 # below will malfunction. If creating it, also mark it as ignored.
263 if test ! -d $build_aux; then
265 for dot_ig in x $vc_ignore; do
266 test $dot_ig = x && continue
267 insert_sorted_if_absent $dot_ig $build_aux
271 # Note this deviates from the version comparison in automake
272 # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
273 # but this should suffice as we won't be specifying old
274 # version formats or redundant trailing .0 in bootstrap.conf.
275 # If we did want full compatibility then we should probably
276 # use m4_version_compare from autoconf.
277 sort_ver() { # sort -V is not generally available
281 # split on '.' and compare each component
284 p1=$(echo "$ver1" | cut -d. -f$i)
285 p2=$(echo "$ver2" | cut -d. -f$i)
289 elif [ ! "$p2" ]; then
292 elif [ ! "$p1" = "$p2" ]; then
293 if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
295 elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
297 else # numeric, then lexicographic comparison
298 lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
299 if [ "$lp" = "$p2" ]; then
314 $app --version >/dev/null 2>&1 || return 1
316 $app --version 2>&1 |
317 sed -n '# extract version within line
318 s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
321 # extract version at start of line
322 s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
328 #the following essentially does s/5.005/5.5/
329 s/\.0*\([1-9]\)/.\1/g
337 while read app req_ver; do
338 # Honor $APP variables ($TAR, $AUTOCONF, etc.)
339 appvar=`echo $app | tr '[a-z]' '[A-Z]'`
340 test "$appvar" = TAR && appvar=AMTAR
341 eval "app=\${$appvar-$app}"
342 inst_ver=$(get_version $app)
343 if [ ! "$inst_ver" ]; then
344 echo "Error: '$app' not found" >&2
346 elif [ ! "$req_ver" = "-" ]; then
347 latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
348 if [ ! "$latest_ver" = "$inst_ver" ]; then
349 echo "Error: '$app' version == $inst_ver is too old" >&2
350 echo " '$app' version >= $req_ver is required" >&2
360 echo "Program Min_version"
361 echo "----------------------"
363 echo "----------------------"
364 # can't depend on column -t
367 if ! printf "$buildreq" | check_versions; then
368 test -f README-prereq &&
369 echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
375 echo "$0: Bootstrapping from checked-out $package sources..."
377 # See if we can use gnulib's git-merge-changelog merge driver.
378 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
379 if git config merge.merge-changelog.driver >/dev/null ; then
381 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
382 echo "initializing git-merge-changelog driver"
383 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
384 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
386 echo "consider installing git-merge-changelog from gnulib"
393 rm -fr "$gnulib_path"
397 git_modules_config () {
398 test -f .gitmodules && git config --file .gitmodules "$@"
401 gnulib_path=`git_modules_config submodule.gnulib.path`
405 case ${GNULIB_SRCDIR--} in
407 if git_modules_config submodule.gnulib.url >/dev/null; then
408 echo "$0: getting gnulib files..."
409 git submodule init || exit $?
410 git submodule update || exit $?
412 elif [ ! -d "$gnulib_path" ]; then
413 echo "$0: getting gnulib files..."
415 trap cleanup_gnulib 1 2 13 15
417 git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
418 git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
423 GNULIB_SRCDIR=$gnulib_path
426 # Use GNULIB_SRCDIR as a reference. Assumes git 1.6.4 or newer.
427 if test -d "$GNULIB_SRCDIR"/.git && \
428 git_modules_config submodule.gnulib.url >/dev/null; then
429 echo "$0: getting gnulib files..."
430 git submodule update --init --reference "$GNULIB_SRCDIR" \
431 "$gnulib_path" || exit $?
432 GNULIB_SRCDIR=$gnulib_path
437 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
438 <$gnulib_tool || exit
442 download_po_files() {
445 echo "$0: getting translations into $subdir for $domain..."
446 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
450 # Download .po files to $po_dir/.reference and copy only the new
451 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
453 # Directory containing primary .po files.
454 # Overwrite them only when we're sure a .po file is new.
458 # Download *.po files into this dir.
459 # Usually contains *.s1 checksum files.
460 ref_po_dir="$po_dir/.reference"
462 test -d $ref_po_dir || mkdir $ref_po_dir || return
463 download_po_files $ref_po_dir $domain \
464 && ls "$ref_po_dir"/*.po 2>/dev/null |
465 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
467 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
468 test "$langs" = '*' && langs=x
470 case $po in x) continue;; esac
471 new_po="$ref_po_dir/$po.po"
472 cksum_file="$ref_po_dir/$po.s1"
473 if ! test -f "$cksum_file" ||
474 ! test -f "$po_dir/$po.po" ||
475 ! $SHA1SUM -c --status "$cksum_file" \
476 < "$new_po" > /dev/null; then
477 echo "updated $po_dir/$po.po..."
478 cp "$new_po" "$po_dir/$po.po" \
479 && $SHA1SUM < "$new_po" > "$cksum_file"
487 update_po_files po $package || exit
490 if test -d runtime-po; then
491 update_po_files runtime-po $package-runtime || exit
502 # If the destination directory doesn't exist, create it.
503 # This is required at least for "lib/uniwidth/cjk.h".
504 dst_dir=`dirname "$dst"`
505 if ! test -d "$dst_dir"; then
508 # If we've just created a directory like lib/uniwidth,
509 # tell version control system(s) it's ignorable.
510 # FIXME: for now, this does only one level
511 parent=`dirname "$dst_dir"`
512 for dot_ig in x $vc_ignore; do
513 test $dot_ig = x && continue
515 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
521 test ! -h "$dst" || {
522 echo "$0: rm -f $dst" &&
527 cmp -s "$src" "$dst" || {
528 echo "$0: cp -fp $src $dst" &&
533 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
534 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
535 test "$src_i" = "$dst_i" || {
541 *//* | */../* | */./* | /*/*/*/*/*/)
542 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
544 /*/*/*/*/) dot_dots=../../../;;
545 /*/*/*/) dot_dots=../../;;
546 /*/*/) dot_dots=../;;
550 echo "$0: ln -fs $dot_dots$src $dst" &&
551 ln -fs "$dot_dots$src" "$dst"
557 cp_mark_as_generated()
562 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
563 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
564 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
565 symlink_to_dir $local_gl_dir "$cp_dst"
568 *.[ch]) c1='/* '; c2=' */';;
569 *.texi) c1='@c '; c2= ;;
570 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
574 # If the destination directory doesn't exist, create it.
575 # This is required at least for "lib/uniwidth/cjk.h".
576 dst_dir=`dirname "$cp_dst"`
577 test -d "$dst_dir" || mkdir -p "$dst_dir"
579 if test -z "$c1"; then
580 cmp -s "$cp_src" "$cp_dst" || {
581 # Copy the file first to get proper permissions if it
582 # doesn't already exist. Then overwrite the copy.
583 echo "$0: cp -f $cp_src $cp_dst" &&
585 cp "$cp_src" "$cp_dst-t" &&
586 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
587 mv -f "$cp_dst-t" "$cp_dst"
590 # Copy the file first to get proper permissions if it
591 # doesn't already exist. Then overwrite the copy.
592 cp "$cp_src" "$cp_dst-t" &&
594 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
595 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
596 sed "s!$bt_regex/!!g" "$cp_src"
598 if cmp -s "$cp_dst-t" "$cp_dst"; then
601 echo "$0: cp $cp_src $cp_dst # with edits" &&
602 mv -f "$cp_dst-t" "$cp_dst"
608 version_controlled_file() {
613 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
614 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
615 elif test -d .git; then
616 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
617 elif test -d .svn; then
618 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
620 echo "$0: no version control for $dir/$file?" >&2
626 for dir in . `(cd $1 && find * -type d -print)`; do
629 for file in `ls -a $1/$dir`; do
632 .*) continue;; # FIXME: should all file names starting with "." be ignored?
634 test -d $1/$dir/$file && continue
635 for excluded_file in $excluded_files; do
636 test "$dir/$file" = "$excluded_file" && continue 2
638 if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then
639 copied=$copied${sep}$gnulib_mk; sep=$nl
640 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
641 sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
642 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
643 rm -f $dir/$gnulib_mk &&
644 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
646 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
647 version_controlled_file $dir $file; then
648 echo "$0: $dir/$file overrides $1/$dir/$file"
650 copied=$copied$sep$file; sep=$nl
651 if test $file = gettext.m4; then
652 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
655 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
656 AC_DEFUN([AM_INTL_SUBDIR], [
657 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
658 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
660 AC_DEFUN([gl_LOCK_EARLY], [])
661 ' $1/$dir/$file >$dir/$file
663 cp_mark_as_generated $1/$dir/$file $dir/$file
668 for dot_ig in x $vc_ignore; do
669 test $dot_ig = x && continue
671 if test -n "$copied"; then
672 insert_sorted_if_absent $ig "$copied"
673 # If an ignored file name ends with .in.h, then also add
674 # the name with just ".h". Many gnulib headers are generated,
675 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
676 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
677 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
678 insert_sorted_if_absent $ig "$f"
680 # For files like sys_stat.in.h and sys_time.in.h, record as
681 # ignorable the directory we might eventually create: sys/.
682 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
683 insert_sorted_if_absent $ig "$f"
690 # Create boot temporary directories to import from gnulib and gettext.
692 mkdir $bt $bt2 || exit
694 # Import from gnulib.
696 gnulib_tool_options="\
699 --aux-dir $bt/$build_aux\
700 --doc-base $bt/$doc_base\
702 --m4-base $bt/$m4_base/\
703 --source-base $bt/$source_base/\
704 --tests-base $bt/$tests_base\
705 --local-dir $local_gl_dir\
706 $gnulib_tool_option_extras\
708 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
709 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
712 for file in $gnulib_files; do
713 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
717 # Import from gettext.
719 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
722 if test $with_gettext = yes; then
723 echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
724 cp configure.ac $bt2 &&
725 (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
726 slurp $bt2 $bt || exit
728 rm -fr $bt $bt2 || exit
730 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
731 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
732 # The following requires GNU find 4.2.3 or newer. Considering the usual
733 # portability constraints of this script, that may seem a very demanding
734 # requirement, but it should be ok. Ignore any failure, which is fine,
735 # since this is only a convenience to help developers avoid the relatively
736 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
737 # between successive runs of this script.
738 find "$m4_base" "$source_base" \
739 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
740 -type l -xtype l -delete > /dev/null 2>&1
742 # Reconfigure, getting other files.
744 # Skip autoheader if it's not needed.
745 grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
750 "${ACLOCAL-aclocal} --force -I m4" \
751 "${AUTOCONF-autoconf} --force" \
752 "${AUTOHEADER-autoheader} --force" \
753 "${AUTOMAKE-automake} --add-missing --copy --force-missing"
755 if test "$command" = libtool; then
757 # We'd like to use grep -E, to see if any of LT_INIT,
758 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
759 # but that's not portable enough (e.g., for Solaris).
760 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
762 grep '^[ ]*LT_INIT' configure.ac >/dev/null \
764 test $use_libtool = 0 \
766 command="${LIBTOOLIZE-libtoolize} -c -f"
768 echo "$0: $command ..."
773 # Get some extra files from gnulib, overriding existing files.
774 for file in $gnulib_extra_files; do
776 */INSTALL) dst=INSTALL;;
777 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
780 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
783 if test $with_gettext = yes; then
784 # Create gettext configuration.
785 echo "$0: Creating po/Makevars from po/Makevars.template ..."
788 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
789 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
790 /^XGETTEXT_OPTIONS *=/{
793 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
795 ' po/Makevars.template >po/Makevars
797 if test -d runtime-po; then
798 # Similarly for runtime-po/Makevars, but not quite the same.
799 rm -f runtime-po/Makevars
801 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
802 /^subdir *=.*/s/=.*/= runtime-po/
803 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
804 /^XGETTEXT_OPTIONS *=/{
807 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
809 ' <po/Makevars.template >runtime-po/Makevars
811 # Copy identical files from po to runtime-po.
812 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
818 echo "$0: done. Now you can run './configure'."
821 # indent-tabs-mode: nil