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 # find_tool ENVVAR NAMES...
152 # -------------------------
153 # Search for a required program. Use the value of ENVVAR, if set,
154 # otherwise find the first of the NAMES that can be run (i.e.,
155 # supports --version). If found, set ENVVAR to the program name,
159 # Find sha1sum, named gsha1sum on MacPorts.
163 eval "find_tool_res=\$$find_tool_envvar"
164 if test x
"$find_tool_res" = x
; then
167 if ($i --version </dev
/null
) >/dev
/null
2>&1; then
173 find_tool_error_prefix
="\$$find_tool_envvar: "
175 if test x
"$find_tool_res" = x
; then
176 echo >&2 "$0: one of these is required: $find_tool_names"
179 ($find_tool_res --version </dev
/null
) >/dev
/null
2>&1 ||
{
180 echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
183 eval "$find_tool_envvar=\$find_tool_res"
184 eval "export $find_tool_envvar"
187 # Find sha1sum, named gsha1sum on MacPorts.
188 find_tool SHA1SUM
sha1sum gsha1sum
190 # Override the default configuration, if necessary.
191 # Make sure that bootstrap.conf is sourced from the current directory
192 # if we were invoked as "sh bootstrap".
194 */*) test -r "$0.conf" && .
"$0.conf" ;;
195 *) test -r "$0.conf" && . .
/"$0.conf" ;;
199 if test "$vc_ignore" = auto
; then
201 test -d .git
&& vc_ignore
=.gitignore
202 test -d CVS
&& vc_ignore
="$vc_ignore .cvsignore"
205 # Translate configuration into internal form.
216 GNULIB_SRCDIR
=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
220 checkout_only_file
=;;
224 echo >&2 "$0: $option: unknown option"
229 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
230 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
234 # If $STR is not already on a line by itself in $FILE, insert it,
235 # sorting the new contents of the file and replacing $FILE with the result.
236 insert_sorted_if_absent
() {
239 test -f $file ||
touch $file
240 echo "$str" |
sort -u - $file |
cmp - $file > /dev
/null \
241 ||
echo "$str" |
sort -u - $file -o $file \
245 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
247 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
248 >/dev
/null
&& found_aux_dir
=yes
249 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
250 >/dev
/null
&& found_aux_dir
=yes
251 if test $found_aux_dir = no
; then
252 echo "$0: expected line not found in configure.ac. Add the following:" >&2
253 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
257 # If $build_aux doesn't exist, create it now, otherwise some bits
258 # below will malfunction. If creating it, also mark it as ignored.
259 if test ! -d $build_aux; then
261 for dot_ig
in x
$vc_ignore; do
262 test $dot_ig = x
&& continue
263 insert_sorted_if_absent
$dot_ig $build_aux
267 # Note this deviates from the version comparison in automake
268 # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
269 # but this should suffice as we won't be specifying old
270 # version formats or redundant trailing .0 in bootstrap.conf.
271 # If we did want full compatibility then we should probably
272 # use m4_version_compare from autoconf.
273 sort_ver
() { # sort -V is not generally available
277 # split on '.' and compare each component
280 p1
=$
(echo "$ver1" | cut
-d.
-f$i)
281 p2
=$
(echo "$ver2" | cut
-d.
-f$i)
285 elif [ ! "$p2" ]; then
288 elif [ ! "$p1" = "$p2" ]; then
289 if [ "$p1" -gt "$p2" ] 2>/dev
/null
; then # numeric comparison
291 elif [ "$p2" -gt "$p1" ] 2>/dev
/null
; then # numeric comparison
293 else # numeric, then lexicographic comparison
294 lp=$
(printf "$p1\n$p2\n" | LANG
=C
sort -n |
tail -n1)
295 if [ "$lp" = "$p2" ]; then
310 $app --version >/dev
/null
2>&1 ||
return 1
312 $app --version 2>&1 |
313 sed -n 's/[^0-9.]*\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/p
323 while read app req_ver
; do
324 # Honor $APP variables ($TAR, $AUTOCONF, etc.)
325 appvar
=`echo $app | tr '[a-z]' '[A-Z]'`
326 test "$appvar" = TAR
&& appvar
=AMTAR
327 eval "app=\${$appvar-$app}"
328 inst_ver
=$
(get_version
$app)
329 if [ ! "$inst_ver" ]; then
330 echo "Error: '$app' not found" >&2
332 elif [ ! "$req_ver" = "-" ]; then
333 latest_ver
=$
(sort_ver
$req_ver $inst_ver | cut
-d' ' -f2)
334 if [ ! "$latest_ver" = "$inst_ver" ]; then
335 echo "Error: '$app' version == $inst_ver is too old" >&2
336 echo " '$app' version >= $req_ver is required" >&2
346 echo "Program Min_version"
347 echo "----------------------"
349 echo "----------------------"
350 # can't depend on column -t
353 if ! printf "$buildreq" | check_versions
; then
354 test -f README-prereq
&&
355 echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
361 echo "$0: Bootstrapping from checked-out $package sources..."
363 # See if we can use gnulib's git-merge-changelog merge driver.
364 if test -d .git
&& (git
--version) >/dev
/null
2>/dev
/null
; then
365 if git config merge.merge-changelog.driver
>/dev
/null
; then
367 elif (git-merge-changelog
--version) >/dev
/null
2>/dev
/null
; then
368 echo "initializing git-merge-changelog driver"
369 git config merge.merge-changelog.name
'GNU-style ChangeLog merge driver'
370 git config merge.merge-changelog.driver
'git-merge-changelog %O %A %B'
372 echo "consider installing git-merge-changelog from gnulib"
383 git_modules_config
() {
384 test -f .gitmodules
&& git config
--file .gitmodules
"$@"
389 case ${GNULIB_SRCDIR--} in
391 if git_modules_config submodule.gnulib.url
>/dev
/null
; then
392 echo "$0: getting gnulib files..."
393 git submodule init ||
exit $?
394 git submodule update ||
exit $?
396 elif [ ! -d gnulib
]; then
397 echo "$0: getting gnulib files..."
399 trap cleanup_gnulib
1 2 13 15
401 git clone
--help|
grep depth
> /dev
/null
&& shallow
='--depth 2' || shallow
=
402 git clone
$shallow git
://git.sv.gnu.org
/gnulib ||
410 # Redirect the gnulib submodule to the directory on the command line
412 if test -d "$GNULIB_SRCDIR"/.git
&& \
413 git_modules_config submodule.gnulib.url
>/dev
/null
; then
415 GNULIB_SRCDIR
=`cd $GNULIB_SRCDIR && pwd`
416 git config
--replace-all submodule.gnulib.url
$GNULIB_SRCDIR
417 echo "$0: getting gnulib files..."
418 git submodule update ||
exit $?
424 gnulib_tool
=$GNULIB_SRCDIR/gnulib-tool
425 <$gnulib_tool ||
exit
429 download_po_files
() {
432 echo "$0: getting translations into $subdir for $domain..."
433 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
437 # Download .po files to $po_dir/.reference and copy only the new
438 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
440 # Directory containing primary .po files.
441 # Overwrite them only when we're sure a .po file is new.
445 # Download *.po files into this dir.
446 # Usually contains *.s1 checksum files.
447 ref_po_dir
="$po_dir/.reference"
449 test -d $ref_po_dir || mkdir
$ref_po_dir ||
return
450 download_po_files
$ref_po_dir $domain \
451 && ls "$ref_po_dir"/*.po
2>/dev
/null |
452 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
454 langs
=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
455 test "$langs" = '*' && langs
=x
457 case $po in x
) continue;; esac
458 new_po
="$ref_po_dir/$po.po"
459 cksum_file
="$ref_po_dir/$po.s1"
460 if ! test -f "$cksum_file" ||
461 ! test -f "$po_dir/$po.po" ||
462 ! $SHA1SUM -c --status "$cksum_file" \
463 < "$new_po" > /dev
/null
; then
464 echo "updated $po_dir/$po.po..."
465 cp "$new_po" "$po_dir/$po.po" \
466 && $SHA1SUM < "$new_po" > "$cksum_file"
474 update_po_files po
$package ||
exit
477 if test -d runtime-po
; then
478 update_po_files runtime-po
$package-runtime ||
exit
489 # If the destination directory doesn't exist, create it.
490 # This is required at least for "lib/uniwidth/cjk.h".
491 dst_dir
=`dirname "$dst"`
492 if ! test -d "$dst_dir"; then
495 # If we've just created a directory like lib/uniwidth,
496 # tell version control system(s) it's ignorable.
497 # FIXME: for now, this does only one level
498 parent
=`dirname "$dst_dir"`
499 for dot_ig
in x
$vc_ignore; do
500 test $dot_ig = x
&& continue
502 insert_sorted_if_absent
$ig `echo "$dst_dir"|sed 's,.*/,,'`
508 test ! -h "$dst" ||
{
509 echo "$0: rm -f $dst" &&
514 cmp -s "$src" "$dst" ||
{
515 echo "$0: cp -fp $src $dst" &&
520 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
521 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
522 test "$src_i" = "$dst_i" ||
{
528 *//* |
*/..
/* |
*/.
/* |
/*/*/*/*/*/)
529 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
531 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
532 /*/*/*/) dot_dots
=..
/..
/;;
533 /*/*/) dot_dots
=..
/;;
537 echo "$0: ln -fs $dot_dots$src $dst" &&
538 ln -fs "$dot_dots$src" "$dst"
544 cp_mark_as_generated
()
549 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
550 symlink_to_dir
"$GNULIB_SRCDIR" "$cp_dst"
551 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
552 symlink_to_dir
$local_gl_dir "$cp_dst"
555 *.
[ch
]) c1
='/* '; c2
=' */';;
556 *.texi
) c1
='@c '; c2
= ;;
557 *.
m4|
*/Make
*|Make
*) c1
='# ' ; c2
= ;;
561 # If the destination directory doesn't exist, create it.
562 # This is required at least for "lib/uniwidth/cjk.h".
563 dst_dir
=`dirname "$cp_dst"`
564 test -d "$dst_dir" || mkdir
-p "$dst_dir"
566 if test -z "$c1"; then
567 cmp -s "$cp_src" "$cp_dst" ||
{
568 # Copy the file first to get proper permissions if it
569 # doesn't already exist. Then overwrite the copy.
570 echo "$0: cp -f $cp_src $cp_dst" &&
572 cp "$cp_src" "$cp_dst-t" &&
573 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
574 mv -f "$cp_dst-t" "$cp_dst"
577 # Copy the file first to get proper permissions if it
578 # doesn't already exist. Then overwrite the copy.
579 cp "$cp_src" "$cp_dst-t" &&
581 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
582 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
583 sed "s!$bt_regex/!!g" "$cp_src"
585 if cmp -s "$cp_dst-t" "$cp_dst"; then
588 echo "$0: cp $cp_src $cp_dst # with edits" &&
589 mv -f "$cp_dst-t" "$cp_dst"
595 version_controlled_file
() {
600 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null |
601 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
602 elif test -d .git
; then
603 git
rm -n "$dir/$file" > /dev
/null
2>&1 && found
=yes
604 elif test -d .svn
; then
605 svn log
-r HEAD
"$dir/$file" > /dev
/null
2>&1 && found
=yes
607 echo "$0: no version control for $dir/$file?" >&2
613 for dir
in .
`(cd $1 && find * -type d -print)`; do
616 for file in `ls -a $1/$dir`; do
619 .
*) continue;; # FIXME: should all file names starting with "." be ignored?
621 test -d $1/$dir/$file && continue
622 for excluded_file
in $excluded_files; do
623 test "$dir/$file" = "$excluded_file" && continue 2
625 if test $file = Makefile.am
; then
626 copied
=$copied${sep}$gnulib_mk; sep
=$nl
627 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
628 sed "$remove_intl" $1/$dir/$file |
cmp - $dir/$gnulib_mk > /dev
/null ||
{
629 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
630 rm -f $dir/$gnulib_mk &&
631 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
633 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
634 version_controlled_file
$dir $file; then
635 echo "$0: $dir/$file overrides $1/$dir/$file"
637 copied
=$copied$sep$file; sep
=$nl
638 if test $file = gettext.
m4; then
639 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
642 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
643 AC_DEFUN([AM_INTL_SUBDIR], [
644 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
645 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
647 AC_DEFUN([gl_LOCK_EARLY], [])
648 ' $1/$dir/$file >$dir/$file
650 cp_mark_as_generated
$1/$dir/$file $dir/$file
655 for dot_ig
in x
$vc_ignore; do
656 test $dot_ig = x
&& continue
658 if test -n "$copied"; then
659 insert_sorted_if_absent
$ig "$copied"
660 # If an ignored file name ends with .in.h, then also add
661 # the name with just ".h". Many gnulib headers are generated,
662 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
663 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
664 f
=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
665 insert_sorted_if_absent
$ig "$f"
667 # For files like sys_stat.in.h and sys_time.in.h, record as
668 # ignorable the directory we might eventually create: sys/.
669 f
=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
670 insert_sorted_if_absent
$ig "$f"
677 # Create boot temporary directories to import from gnulib and gettext.
679 mkdir
$bt $bt2 ||
exit
681 # Import from gnulib.
683 gnulib_tool_options
="\
686 --aux-dir $bt/$build_aux\
687 --doc-base $bt/$doc_base\
689 --m4-base $bt/$m4_base/\
690 --source-base $bt/$source_base/\
691 --tests-base $bt/$tests_base\
692 --local-dir $local_gl_dir\
693 $gnulib_tool_option_extras\
695 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
696 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
699 for file in $gnulib_files; do
700 symlink_to_dir
"$GNULIB_SRCDIR" $file ||
exit
704 # Import from gettext.
706 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac
>/dev
/null || \
709 if test $with_gettext = yes; then
710 echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
711 cp configure.ac
$bt2 &&
712 (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac
) &&
713 slurp
$bt2 $bt ||
exit
715 rm -fr $bt $bt2 ||
exit
717 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
718 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
719 # The following requires GNU find 4.2.3 or newer. Considering the usual
720 # portability constraints of this script, that may seem a very demanding
721 # requirement, but it should be ok. Ignore any failure, which is fine,
722 # since this is only a convenience to help developers avoid the relatively
723 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
724 # between successive runs of this script.
725 find "$m4_base" "$source_base" \
726 -depth \
( -name '*.m4' -o -name '*.[ch]' \
) \
727 -type l
-xtype l
-delete > /dev
/null
2>&1
729 # Reconfigure, getting other files.
733 "${ACLOCAL-aclocal} --force -I m4" \
734 "${AUTOCONF-autoconf} --force" \
735 "${AUTOHEADER-autoheader} --force" \
736 "${AUTOMAKE-automake} --add-missing --copy --force-missing"
738 if test "$command" = libtool
; then
740 # We'd like to use grep -E, to see if any of LT_INIT,
741 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
742 # but that's not portable enough (e.g., for Solaris).
743 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac
>/dev
/null \
745 grep '^[ ]*LT_INIT' configure.ac
>/dev
/null \
747 test $use_libtool = 0 \
749 command="${LIBTOOLIZE-libtoolize} -c -f"
751 echo "$0: $command ..."
756 # Get some extra files from gnulib, overriding existing files.
757 for file in $gnulib_extra_files; do
759 */INSTALL
) dst
=INSTALL
;;
760 build-aux
/*) dst
=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
763 symlink_to_dir
"$GNULIB_SRCDIR" $file $dst ||
exit
766 if test $with_gettext = yes; then
767 # Create gettext configuration.
768 echo "$0: Creating po/Makevars from po/Makevars.template ..."
771 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
772 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
773 /^XGETTEXT_OPTIONS *=/{
776 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
778 ' po
/Makevars.template
>po
/Makevars
780 if test -d runtime-po
; then
781 # Similarly for runtime-po/Makevars, but not quite the same.
782 rm -f runtime-po
/Makevars
784 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
785 /^subdir *=.*/s/=.*/= runtime-po/
786 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
787 /^XGETTEXT_OPTIONS *=/{
790 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
792 ' <po
/Makevars.template
>runtime-po
/Makevars
794 # Copy identical files from po to runtime-po.
795 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime-po
)
799 echo "$0: done. Now you can run './configure'."
802 # indent-tabs-mode: nil