3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2008, 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 and Sergey Poznyakoff.
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 --paxutils-srcdir=DIRNAME Specify the local directory where paxutils
43 sources reside. Use this if you already
44 have paxutils sources on your machine, and
45 do not want to waste your bandwidth dowloading
47 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
48 sources reside. Use this if you already
49 have gnulib sources on your machine, and
50 do not want to waste your bandwidth downloading
52 --copy Copy files instead of creating symbolic links.
53 --force Attempt to bootstrap even if the sources seem
54 not to have been checked out.
55 --skip-po Do not download po files.
57 If the file $0.conf exists in the same directory as this script, its
58 contents are read as shell variables to configure the bootstrap.
60 Running without arguments will suffice in most cases.
66 # Name of the Makefile.am
69 # List of gnulib modules needed.
72 # Any gnulib files needed that are not in modules.
75 # The command to download all .po files for a specified domain into
76 # a specified directory. Fill in the first %s is the domain name, and
77 # the second with the destination directory. Use rsync's -L and -r
78 # options because the latest/%s directory and the .po files within are
80 po_download_command_format=\
81 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
83 extract_package_name='
95 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
100 package=`sed -n "$extract_package_name" configure.ac` || exit
101 gnulib_name=lib$package
109 # Extra files from gnulib, which override files from other sources.
111 $build_aux/install-sh
114 $build_aux/texinfo.tex
116 $build_aux/config.guess
117 $build_aux/config.sub
121 # Additional gnulib-tool options to use. Use "\newline" to break lines.
122 gnulib_tool_option_extras=
124 # Other locale categories that need message catalogs.
125 EXTRA_LOCALE_CATEGORIES=
127 # Additional xgettext options to use. Use "\\\newline" to break lines.
128 XGETTEXT_OPTIONS='\\\
129 --flag=_:1:pass-c-format\\\
130 --flag=N_:1:pass-c-format\\\
131 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
134 # Package bug report address for gettext files
135 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
137 # Files we don't want to import.
140 # File that should exist in the top directory of a checked out hierarchy,
141 # but not in a distribution tarball.
142 checkout_only_file=README-hacking
144 # Whether to use copies instead of symlinks.
147 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
148 # those files to be generated in directories like lib/, m4/, and po/.
149 # Or set it to 'auto' to make this script select which to use based
150 # on which version control system (if any) is used in the source directory.
153 # Override the default configuration, if necessary.
154 # Make sure that bootstrap.conf is sourced from the current directory
155 # if we were invoked as "sh bootstrap".
157 */*) test -r "$0.conf" && . "$0.conf" ;;
158 *) test -r "$0.conf" && . ./"$0.conf" ;;
162 if test "$vc_ignore" = auto; then
164 test -d .git && vc_ignore=.gitignore
165 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
168 # Translate configuration into internal form.
179 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
181 PAXUTILS_SRCDIR=`expr "$option" : '--paxutils-srcdir=\(.*\)'`;;
185 checkout_only_file=;;
189 echo >&2 "$0: $option: unknown option"
194 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
195 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
199 # If $STR is not already on a line by itself in $FILE, insert it,
200 # sorting the new contents of the file and replacing $FILE with the result.
201 insert_sorted_if_absent() {
204 test -f $file || touch $file
205 echo "$str" | sort -u - $file | cmp -s - $file \
206 || echo "$str" | sort -u - $file -o $file \
210 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
212 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
213 >/dev/null && found_aux_dir=yes
214 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
215 >/dev/null && found_aux_dir=yes
216 if test $found_aux_dir = no; then
217 echo "$0: expected line not found in configure.ac. Add the following:" >&2
218 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
222 # If $build_aux doesn't exist, create it now, otherwise some bits
223 # below will malfunction. If creating it, also mark it as ignored.
224 if test ! -d $build_aux; then
226 for dot_ig in x $vc_ignore; do
227 test $dot_ig = x && continue
228 insert_sorted_if_absent $dot_ig $build_aux
232 echo "$0: Bootstrapping from checked-out $package sources..."
234 # See if we can use gnulib's git-merge-changelog merge driver.
235 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
236 if git config merge.merge-changelog.driver >/dev/null ; then
238 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
239 echo "initializing git-merge-changelog driver"
240 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
241 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
243 echo "consider installing git-merge-changelog from gnulib"
253 git_modules_config () {
254 GIT_CONFIG_LOCAL=.gitmodules git config "$@"
257 # Get paxutils files.
258 case ${PAXUTILS_SRCDIR--} in
259 -) if [ ! -d paxutils ]; then
260 echo "$0: getting paxutils files..."
262 trap "cleanup paxutils" 1 2 13 15
264 git clone --depth 1 git://git.sv.gnu.org/paxutils || cleanup paxutils
268 PAXUTILS_SRCDIR=paxutils
272 if [ -r $PAXUTILS_SRCDIR/gnulib.modules ]; then
274 (echo "$gnulib_modules"; grep '^[^#]' $PAXUTILS_SRCDIR/gnulib.modules) |
281 case ${GNULIB_SRCDIR--} in
283 if git_modules_config submodule.gnulib.url >/dev/null; then
284 echo "$0: getting gnulib files..."
285 git submodule init || exit $?
286 git submodule update || exit $?
288 elif [ ! -d gnulib ]; then
289 echo "$0: getting gnulib files..."
291 trap cleanup_gnulib 1 2 13 15
293 git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
294 git clone $shallow git://git.sv.gnu.org/gnulib ||
302 # Redirect the gnulib submodule to the directory on the command line
304 if test -d "$GNULIB_SRCDIR"/.git && \
305 git_modules_config submodule.gnulib.url >/dev/null; then
307 GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
308 git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
309 echo "$0: getting gnulib files..."
310 git submodule update || exit $?
316 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
317 <$gnulib_tool || exit
321 download_po_files() {
324 echo "$0: getting translations into $subdir for $domain..."
325 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
329 # Download .po files to $po_dir/.reference and copy only the new
330 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
332 # Directory containing primary .po files.
333 # Overwrite them only when we're sure a .po file is new.
337 # Download *.po files into this dir.
338 # Usually contains *.s1 checksum files.
339 ref_po_dir="$po_dir/.reference"
341 test -d $ref_po_dir || mkdir $ref_po_dir || return
342 download_po_files $ref_po_dir $domain \
343 && ls "$ref_po_dir"/*.po 2>/dev/null |
344 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
346 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
347 test "$langs" = '*' && langs=x
349 case $po in x) continue;; esac
350 new_po="$ref_po_dir/$po.po"
351 cksum_file="$ref_po_dir/$po.s1"
352 if ! test -f "$cksum_file" ||
353 ! test -f "$po_dir/$po.po" ||
354 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
355 echo "updated $po_dir/$po.po..."
356 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
364 update_po_files po $package || exit
367 if test -d runtime-po; then
368 update_po_files runtime-po $package-runtime || exit
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 "$dst"`
382 if ! test -d "$dst_dir"; then
385 # If we've just created a directory like lib/uniwidth,
386 # tell version control system(s) it's ignorable.
387 # FIXME: for now, this does only one level
388 parent=`dirname "$dst_dir"`
389 for dot_ig in x $vc_ignore; do
390 test $dot_ig = x && continue
392 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
398 test ! -h "$dst" || {
399 echo "$0: rm -f $dst" &&
404 cmp -s "$src" "$dst" || {
405 echo "$0: cp -fp $src $dst" &&
410 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
411 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
412 test "$src_i" = "$dst_i" || {
418 *//* | */../* | */./* | /*/*/*/*/*/)
419 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
421 /*/*/*/*/) dot_dots=../../../;;
422 /*/*/*/) dot_dots=../../;;
423 /*/*/) dot_dots=../;;
427 echo "$0: ln -fs $dot_dots$src $dst" &&
428 ln -fs "$dot_dots$src" "$dst"
434 cp_mark_as_generated()
439 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
440 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
441 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
442 symlink_to_dir $local_gl_dir "$cp_dst"
445 *.[ch]) c1='/* '; c2=' */';;
446 *.texi) c1='@c '; c2= ;;
447 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
451 # If the destination directory doesn't exist, create it.
452 # This is required at least for "lib/uniwidth/cjk.h".
453 dst_dir=`dirname "$cp_dst"`
454 test -d "$dst_dir" || mkdir -p "$dst_dir"
456 if test -z "$c1"; then
457 cmp -s "$cp_src" "$cp_dst" || {
458 # Copy the file first to get proper permissions if it
459 # doesn't already exist. Then overwrite the copy.
460 echo "$0: cp -f $cp_src $cp_dst" &&
462 cp "$cp_src" "$cp_dst-t" &&
463 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
464 mv -f "$cp_dst-t" "$cp_dst"
467 # Copy the file first to get proper permissions if it
468 # doesn't already exist. Then overwrite the copy.
469 cp "$cp_src" "$cp_dst-t" &&
471 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
472 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
473 sed "s!$bt_regex/!!g" "$cp_src"
475 if cmp -s "$cp_dst-t" "$cp_dst"; then
478 echo "$0: cp $cp_src $cp_dst # with edits" &&
479 mv -f "$cp_dst-t" "$cp_dst"
485 version_controlled_file() {
490 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
491 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
492 elif test -d .git; then
493 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
494 elif test -d .svn; then
495 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
497 echo "$0: no version control for $dir/$file?" >&2
503 for dir in . `(cd $1 && find * -type d -print)`; do
506 for file in `ls -a $1/$dir`; do
509 .*) continue;; # FIXME: should all file names starting with "." be ignored?
511 test -d $1/$dir/$file && continue
512 for excluded_file in $excluded_files; do
513 test "$dir/$file" = "$excluded_file" && continue 2
515 if test $file = Makefile.am; then
516 copied=$copied${sep}$gnulib_mk; sep=$nl
517 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
518 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
519 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
520 rm -f $dir/$gnulib_mk &&
521 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
523 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
524 version_controlled_file $dir $file; then
525 echo "$0: $dir/$file overrides $1/$dir/$file"
527 copied=$copied$sep$file; sep=$nl
528 if test $file = gettext.m4; then
529 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
532 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
533 AC_DEFUN([AM_INTL_SUBDIR], [
534 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
535 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
537 AC_DEFUN([gl_LOCK_EARLY], [])
538 ' $1/$dir/$file >$dir/$file
540 cp_mark_as_generated $1/$dir/$file $dir/$file
545 for dot_ig in x $vc_ignore; do
546 test $dot_ig = x && continue
548 if test -n "$copied"; then
549 insert_sorted_if_absent $ig "$copied"
550 # If an ignored file name ends with .in.h, then also add
551 # the name with just ".h". Many gnulib headers are generated,
552 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
553 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
554 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
555 insert_sorted_if_absent $ig "$f"
557 # For files like sys_stat.in.h and sys_time.in.h, record as
558 # ignorable the directory we might eventually create: sys/.
559 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
560 insert_sorted_if_absent $ig "$f"
567 # Create boot temporary directories to import from gnulib and gettext.
569 mkdir $bt $bt2 || exit
571 # Import from gnulib.
573 gnulib_tool_options="\
576 --aux-dir $bt/$build_aux\
577 --doc-base $bt/$doc_base\
579 --m4-base $bt/$m4_base/\
580 --source-base $bt/$source_base/\
581 --tests-base $bt/$tests_base\
582 --local-dir $local_gl_dir\
583 $gnulib_tool_option_extras\
585 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
586 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
589 for file in $gnulib_files; do
590 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
594 # Import from gettext.
596 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
599 if test $with_gettext = yes; then
600 echo "$0: (cd $bt2; autopoint) ..."
601 cp configure.ac $bt2 &&
602 (cd $bt2 && autopoint && rm configure.ac) &&
603 slurp $bt2 $bt || exit
605 rm -fr $bt $bt2 || exit
607 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
608 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
609 # The following requires GNU find 4.2.3 or newer. Considering the usual
610 # portability constraints of this script, that may seem a very demanding
611 # requirement, but it should be ok. Ignore any failure, which is fine,
612 # since this is only a convenience to help developers avoid the relatively
613 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
614 # between successive runs of this script.
615 find "$m4_base" "$source_base" \
616 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
617 -type l -xtype l -delete > /dev/null 2>&1
619 # copy_files srcdir dstdir
621 for file in `cat $1/DISTFILES`
626 dst=`echo $file | sed 's^.*/^^'`
627 if [ $# -eq 3 ]; then
633 symlink_to_dir "$1" "$file" "$2/$dst" || exit
634 # FIXME ignorefile $2 $dst
638 # Import from paxutils
639 copy_files ${PAXUTILS_SRCDIR} .
640 copy_files ${PAXUTILS_SRCDIR}/am m4
641 echo "$0: Creating m4/paxutils.m4"
642 (echo "# This file is generated automatically. Please, do not edit."
644 echo "AC_DEFUN([${package}_PAXUTILS],["
645 cat ${PAXUTILS_SRCDIR}/am/DISTFILES | sed '/^#/d;s/\(.*\)\.m4/pu_\1/' | tr a-z A-Z
646 echo "])") > ./m4/paxutils.m4
647 #FIXME ignorefile m4 paxutils.m4
655 for dir in doc rmt lib tests
657 copy_files ${PAXUTILS_SRCDIR}/$dir $dir
660 copy_files ${PAXUTILS_SRCDIR}/paxlib lib pax
663 # Reconfigure, getting other files.
667 'aclocal --force -I m4' \
669 'autoheader --force' \
670 'automake --add-missing --copy --force-missing';
672 if test "$command" = libtool; then
674 # We'd like to use grep -E, to see if any of LT_INIT,
675 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
676 # but that's not portable enough (e.g., for Solaris).
677 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
679 grep '^[ ]*LT_INIT' configure.ac >/dev/null \
681 test $use_libtool = 0 \
683 command='libtoolize -c -f'
685 echo "$0: $command ..."
690 # Get some extra files from gnulib, overriding existing files.
691 for file in $gnulib_extra_files; do
693 */INSTALL) dst=INSTALL;;
694 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
697 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
700 if test $with_gettext = yes; then
701 # Create gettext configuration.
702 echo "$0: Creating po/Makevars from po/Makevars.template ..."
705 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
706 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
707 /^XGETTEXT_OPTIONS *=/{
710 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
712 ' po/Makevars.template >po/Makevars
714 if test -d runtime-po; then
715 # Similarly for runtime-po/Makevars, but not quite the same.
716 rm -f runtime-po/Makevars
718 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
719 /^subdir *=.*/s/=.*/= runtime-po/
720 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
721 /^XGETTEXT_OPTIONS *=/{
724 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
726 ' <po/Makevars.template >runtime-po/Makevars
728 # Copy identical files from po to runtime-po.
729 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
733 echo "$0: done. Now you can run './configure'."