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 comparision
252 elif [ "$p2" -gt "$p1" ] 2>/dev/null; then #numeric comparision
254 else #numeric, then lexographic 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 "Please 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 GIT_CONFIG=.gitmodules git config "$@"
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 && depth='--depth 2' || depth=
363 git clone $depth 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" < "$new_po" > /dev/null; then
424 echo "updated $po_dir/$po.po..."
425 cp "$new_po" "$po_dir/$po.po" && ${SHA1SUM-sha1sum} < "$new_po" > "$cksum_file"
433 update_po_files po $package || exit
436 if test -d runtime-po; then
437 update_po_files runtime-po $package-runtime || exit
448 # If the destination directory doesn't exist, create it.
449 # This is required at least for "lib/uniwidth/cjk.h".
450 dst_dir=`dirname "$dst"`
451 if ! test -d "$dst_dir"; then
454 # If we've just created a directory like lib/uniwidth,
455 # tell version control system(s) it's ignorable.
456 # FIXME: for now, this does only one level
457 parent=`dirname "$dst_dir"`
458 for dot_ig in x $vc_ignore; do
459 test $dot_ig = x && continue
461 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
467 test ! -h "$dst" || {
468 echo "$0: rm -f $dst" &&
473 cmp -s "$src" "$dst" || {
474 echo "$0: cp -fp $src $dst" &&
479 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
480 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
481 test "$src_i" = "$dst_i" || {
487 *//* | */../* | */./* | /*/*/*/*/*/)
488 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
490 /*/*/*/*/) dot_dots=../../../;;
491 /*/*/*/) dot_dots=../../;;
492 /*/*/) dot_dots=../;;
496 echo "$0: ln -fs $dot_dots$src $dst" &&
497 ln -fs "$dot_dots$src" "$dst"
503 cp_mark_as_generated()
508 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
509 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
510 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
511 symlink_to_dir $local_gl_dir "$cp_dst"
514 *.[ch]) c1='/* '; c2=' */';;
515 *.texi) c1='@c '; c2= ;;
516 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
520 # If the destination directory doesn't exist, create it.
521 # This is required at least for "lib/uniwidth/cjk.h".
522 dst_dir=`dirname "$cp_dst"`
523 test -d "$dst_dir" || mkdir -p "$dst_dir"
525 if test -z "$c1"; then
526 cmp -s "$cp_src" "$cp_dst" || {
527 # Copy the file first to get proper permissions if it
528 # doesn't already exist. Then overwrite the copy.
529 echo "$0: cp -f $cp_src $cp_dst" &&
531 cp "$cp_src" "$cp_dst-t" &&
532 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
533 mv -f "$cp_dst-t" "$cp_dst"
536 # Copy the file first to get proper permissions if it
537 # doesn't already exist. Then overwrite the copy.
538 cp "$cp_src" "$cp_dst-t" &&
540 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
541 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
543 sed "s!$bt_regex/!!g" "$cp_src"
545 if cmp -s "$cp_dst-t" "$cp_dst"; then
548 echo "$0: cp $cp_src $cp_dst # with edits" &&
549 mv -f "$cp_dst-t" "$cp_dst"
555 version_controlled_file() {
560 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
561 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
562 elif test -d .git; then
563 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
564 elif test -d .svn; then
565 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
567 echo "$0: no version control for $dir/$file?" >&2
573 for dir in . `(cd $1 && find * -type d -print)`; do
576 for file in `ls -a $1/$dir`; do
579 .*) continue;; # FIXME: should all file names starting with "." be ignored?
581 test -d $1/$dir/$file && continue
582 for excluded_file in $excluded_files; do
583 test "$dir/$file" = "$excluded_file" && continue 2
585 if test $file = Makefile.am; then
586 copied=$copied${sep}$gnulib_mk; sep=$nl
587 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
588 sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
589 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
590 rm -f $dir/$gnulib_mk &&
591 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
593 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
594 version_controlled_file $dir $file; then
595 echo "$0: $dir/$file overrides $1/$dir/$file"
597 copied=$copied$sep$file; sep=$nl
598 if test $file = gettext.m4; then
599 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
602 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
603 AC_DEFUN([AM_INTL_SUBDIR], [
604 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
605 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
607 AC_DEFUN([gl_LOCK_EARLY], [])
608 ' $1/$dir/$file >$dir/$file
610 cp_mark_as_generated $1/$dir/$file $dir/$file
615 for dot_ig in x $vc_ignore; do
616 test $dot_ig = x && continue
618 if test -n "$copied"; then
619 insert_sorted_if_absent $ig "$copied"
620 # If an ignored file name ends with .in.h, then also add
621 # the name with just ".h". Many gnulib headers are generated,
622 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
623 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
624 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
625 insert_sorted_if_absent $ig "$f"
627 # For files like sys_stat.in.h and sys_time.in.h, record as
628 # ignorable the directory we might eventually create: sys/.
629 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
630 insert_sorted_if_absent $ig "$f"
637 # Create boot temporary directories to import from gnulib and gettext.
639 mkdir $bt $bt2 || exit
641 # Import from gnulib.
643 gnulib_tool_options="\
646 --aux-dir $bt/$build_aux\
647 --doc-base $bt/$doc_base\
649 --m4-base $bt/$m4_base/\
650 --source-base $bt/$source_base/\
651 --tests-base $bt/$tests_base\
652 --local-dir $local_gl_dir\
653 $gnulib_tool_option_extras\
655 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
656 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
659 for file in $gnulib_files; do
660 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
664 # Import from gettext.
666 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
669 if test $with_gettext = yes; then
670 echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
671 cp configure.ac $bt2 &&
672 (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
673 slurp $bt2 $bt || exit
675 rm -fr $bt $bt2 || exit
677 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
678 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
679 # The following requires GNU find 4.2.3 or newer. Considering the usual
680 # portability constraints of this script, that may seem a very demanding
681 # requirement, but it should be ok. Ignore any failure, which is fine,
682 # since this is only a convenience to help developers avoid the relatively
683 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
684 # between successive runs of this script.
685 find "$m4_base" "$source_base" \
686 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
687 -type l -xtype l -delete > /dev/null 2>&1
689 # Use automake's --silent-rules option, if possible.
690 automake="${AUTOMAKE-automake} --add-missing --copy --force-missing"
691 (${AUTOMAKE-automake} --help) 2>&1 \
692 | grep -e '^ *--silent-rules' > /dev/null \
693 && automake="$automake --silent-rules"
695 # Reconfigure, getting other files.
699 "${ACLOCAL-aclocal} --force -I m4" \
700 "${AUTOCONF-autoconf} --force" \
701 "${AUTOHEADER-autoheader} --force" \
704 if test "$command" = libtool; then
706 # We'd like to use grep -E, to see if any of LT_INIT,
707 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
708 # but that's not portable enough (e.g., for Solaris).
709 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
711 grep '^[ ]*LT_INIT' configure.ac >/dev/null \
713 test $use_libtool = 0 \
715 command="${LIBTOOLIZE-libtoolize} -c -f"
717 echo "$0: $command ..."
722 # Get some extra files from gnulib, overriding existing files.
723 for file in $gnulib_extra_files; do
725 */INSTALL) dst=INSTALL;;
726 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
729 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
732 if test $with_gettext = yes; then
733 # Create gettext configuration.
734 echo "$0: Creating po/Makevars from po/Makevars.template ..."
737 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
738 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
739 /^XGETTEXT_OPTIONS *=/{
742 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
744 ' po/Makevars.template >po/Makevars
746 if test -d runtime-po; then
747 # Similarly for runtime-po/Makevars, but not quite the same.
748 rm -f runtime-po/Makevars
750 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
751 /^subdir *=.*/s/=.*/= runtime-po/
752 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
753 /^XGETTEXT_OPTIONS *=/{
756 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
758 ' <po/Makevars.template >runtime-po/Makevars
760 # Copy identical files from po to runtime-po.
761 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
765 # Horrible, coreutils-specific kludges.
766 # Change paths in gnulib-tests/gnulib.mk from "../.." to "..".
767 m=gnulib-tests/gnulib.mk
768 sed 's,\.\./\.\.,..,g' $m > $m-t
771 echo "$0: done. Now you can run './configure'."