3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2008 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 Running without arguments will suffice in most cases.
61 # Name of the Makefile.am
64 # List of gnulib modules needed.
67 # Any gnulib files needed that are not in modules.
70 # The command to download all .po files for a specified domain into
71 # a specified directory. Fill in the first %s is the domain name, and
72 # the second with the destination directory. Use rsync's -L and -r
73 # options because the latest/%s directory and the .po files within are
75 po_download_command_format=\
76 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
78 extract_package_name='
90 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
95 package=`sed -n "$extract_package_name" configure.ac` || exit
96 gnulib_name=lib$package
104 # Extra files from gnulib, which override files from other sources.
106 $build_aux/install-sh
109 $build_aux/texinfo.tex
111 $build_aux/config.guess
112 $build_aux/config.sub
116 # Additional gnulib-tool options to use. Use "\newline" to break lines.
117 gnulib_tool_option_extras=
119 # Other locale categories that need message catalogs.
120 EXTRA_LOCALE_CATEGORIES=
122 # Additional xgettext options to use. Use "\\\newline" to break lines.
123 XGETTEXT_OPTIONS='\\\
124 --flag=_:1:pass-c-format\\\
125 --flag=N_:1:pass-c-format\\\
126 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
129 # Package bug report address for gettext files
130 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
132 # Files we don't want to import.
135 # File that should exist in the top directory of a checked out hierarchy,
136 # but not in a distribution tarball.
137 checkout_only_file=README-hacking
139 # Whether to use copies instead of symlinks.
142 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
143 # those files to be generated in directories like lib/, m4/, and po/.
144 # Or set it to 'auto' to make this script select which to use based
145 # on which version control system (if any) is used in the source directory.
148 # Override the default configuration, if necessary.
149 # Make sure that bootstrap.conf is sourced from the current directory
150 # if we were invoked as "sh bootstrap".
152 */*) test -r "$0.conf" && . "$0.conf" ;;
153 *) test -r "$0.conf" && . ./"$0.conf" ;;
157 if test "$vc_ignore" = auto; then
159 test -d .git && vc_ignore=.gitignore
160 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
163 # Translate configuration into internal form.
174 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
178 checkout_only_file=;;
182 echo >&2 "$0: $option: unknown option"
187 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
188 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
192 # If $STR is not already on a line by itself in $FILE, insert it,
193 # sorting the new contents of the file and replacing $FILE with the result.
194 insert_sorted_if_absent() {
197 test -f $file || touch $file
198 echo "$str" | sort -u - $file | cmp -s - $file \
199 || echo "$str" | sort -u - $file -o $file \
203 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
205 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
206 >/dev/null && found_aux_dir=yes
207 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
208 >/dev/null && found_aux_dir=yes
209 if test $found_aux_dir = no; then
210 echo "$0: expected line not found in configure.ac. Add the following:" >&2
211 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
215 # If $build_aux doesn't exist, create it now, otherwise some bits
216 # below will malfunction. If creating it, also mark it as ignored.
217 if test ! -d $build_aux; then
219 for dot_ig in x $vc_ignore; do
220 test $dot_ig = x && continue
221 insert_sorted_if_absent $dot_ig $build_aux
225 echo "$0: Bootstrapping from checked-out $package sources..."
227 # See if we can use gnulib's git-merge-changelog merge driver.
228 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
229 if git config merge.merge-changelog.driver >/dev/null ; then
231 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
232 echo "initializing git-merge-changelog driver"
233 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
234 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
236 echo "consider installing git-merge-changelog from gnulib"
247 git_modules_config () {
248 GIT_CONFIG_LOCAL=.gitmodules git config "$@"
253 case ${GNULIB_SRCDIR--} in
255 if git_modules_config submodule.gnulib.url >/dev/null; then
256 echo "$0: getting gnulib files..."
257 git submodule init || exit $?
258 git submodule update || exit $?
260 elif [ ! -d gnulib ]; then
261 echo "$0: getting gnulib files..."
263 trap cleanup_gnulib 1 2 13 15
265 git clone --depth 2 git://git.sv.gnu.org/gnulib ||
273 # Redirect the gnulib submodule to the directory on the command line
275 if test -d "$GNULIB_SRCDIR"/.git && \
276 git_modules_config submodule.gnulib.url >/dev/null; then
278 GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
279 git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
280 echo "$0: getting gnulib files..."
281 git submodule update || exit $?
287 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
288 <$gnulib_tool || exit
292 download_po_files() {
295 echo "$0: getting translations into $subdir for $domain..."
296 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
300 # Download .po files to $po_dir/.reference and copy only the new
301 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
303 # Directory containing primary .po files.
304 # Overwrite them only when we're sure a .po file is new.
308 # Download *.po files into this dir.
309 # Usually contains *.s1 checksum files.
310 ref_po_dir="$po_dir/.reference"
312 test -d $ref_po_dir || mkdir $ref_po_dir || return
313 download_po_files $ref_po_dir $domain \
314 && ls "$ref_po_dir"/*.po 2>/dev/null |
315 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
317 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
318 test "$langs" = '*' && langs=x
320 case $po in x) continue;; esac
321 new_po="$ref_po_dir/$po.po"
322 cksum_file="$ref_po_dir/$po.s1"
323 if ! test -f "$cksum_file" ||
324 ! test -f "$po_dir/$po.po" ||
325 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
326 echo "updated $po_dir/$po.po..."
327 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
335 update_po_files po $package || exit
338 if test -d runtime-po; then
339 update_po_files runtime-po $package-runtime || exit
350 # If the destination directory doesn't exist, create it.
351 # This is required at least for "lib/uniwidth/cjk.h".
352 dst_dir=`dirname "$dst"`
353 if ! test -d "$dst_dir"; then
356 # If we've just created a directory like lib/uniwidth,
357 # tell version control system(s) it's ignorable.
358 # FIXME: for now, this does only one level
359 parent=`dirname "$dst_dir"`
360 for dot_ig in x $vc_ignore; do
361 test $dot_ig = x && continue
363 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
369 test ! -h "$dst" || {
370 echo "$0: rm -f $dst" &&
375 cmp -s "$src" "$dst" || {
376 echo "$0: cp -fp $src $dst" &&
381 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
382 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
383 test "$src_i" = "$dst_i" || {
389 *//* | */../* | */./* | /*/*/*/*/*/)
390 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
392 /*/*/*/*/) dot_dots=../../../;;
393 /*/*/*/) dot_dots=../../;;
394 /*/*/) dot_dots=../;;
398 echo "$0: ln -fs $dot_dots$src $dst" &&
399 ln -fs "$dot_dots$src" "$dst"
405 cp_mark_as_generated()
410 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
411 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
412 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
413 symlink_to_dir $local_gl_dir "$cp_dst"
416 *.[ch]) c1='/* '; c2=' */';;
417 *.texi) c1='@c '; c2= ;;
418 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
422 # If the destination directory doesn't exist, create it.
423 # This is required at least for "lib/uniwidth/cjk.h".
424 dst_dir=`dirname "$cp_dst"`
425 test -d "$dst_dir" || mkdir -p "$dst_dir"
427 if test -z "$c1"; then
428 cmp -s "$cp_src" "$cp_dst" || {
429 # Copy the file first to get proper permissions if it
430 # doesn't already exist. Then overwrite the copy.
431 echo "$0: cp -f $cp_src $cp_dst" &&
433 cp "$cp_src" "$cp_dst-t" &&
434 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
435 mv -f "$cp_dst-t" "$cp_dst"
438 # Copy the file first to get proper permissions if it
439 # doesn't already exist. Then overwrite the copy.
440 cp "$cp_src" "$cp_dst-t" &&
442 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
443 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
444 sed "s!$bt_regex/!!g" "$cp_src"
446 if cmp -s "$cp_dst-t" "$cp_dst"; then
449 echo "$0: cp $cp_src $cp_dst # with edits" &&
450 mv -f "$cp_dst-t" "$cp_dst"
456 version_controlled_file() {
461 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
462 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
463 elif test -d .git; then
464 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
465 elif test -d .svn; then
466 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
468 echo "$0: no version control for $dir/$file?" >&2
474 for dir in . `(cd $1 && find * -type d -print)`; do
477 for file in `ls -a $1/$dir`; do
480 .*) continue;; # FIXME: should all file names starting with "." be ignored?
482 test -d $1/$dir/$file && continue
483 for excluded_file in $excluded_files; do
484 test "$dir/$file" = "$excluded_file" && continue 2
486 if test $file = Makefile.am; then
487 copied=$copied${sep}$gnulib_mk; sep=$nl
488 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
489 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
490 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
491 rm -f $dir/$gnulib_mk &&
492 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
494 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
495 version_controlled_file $dir $file; then
496 echo "$0: $dir/$file overrides $1/$dir/$file"
498 copied=$copied$sep$file; sep=$nl
499 if test $file = gettext.m4; then
500 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
503 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
504 AC_DEFUN([AM_INTL_SUBDIR], [
505 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
506 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
508 AC_DEFUN([gl_LOCK_EARLY], [])
509 ' $1/$dir/$file >$dir/$file
511 cp_mark_as_generated $1/$dir/$file $dir/$file
516 for dot_ig in x $vc_ignore; do
517 test $dot_ig = x && continue
519 if test -n "$copied"; then
520 insert_sorted_if_absent $ig "$copied"
521 # If an ignored file name ends with .in.h, then also add
522 # the name with just ".h". Many gnulib headers are generated,
523 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
524 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
525 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
526 insert_sorted_if_absent $ig "$f"
528 # For files like sys_stat.in.h and sys_time.in.h, record as
529 # ignorable the directory we might eventually create: sys/.
530 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
531 insert_sorted_if_absent $ig "$f"
538 # Create boot temporary directories to import from gnulib and gettext.
540 mkdir $bt $bt2 || exit
542 # Import from gnulib.
544 gnulib_tool_options="\
547 --aux-dir $bt/$build_aux\
548 --doc-base $bt/$doc_base\
550 --m4-base $bt/$m4_base/\
551 --source-base $bt/$source_base/\
552 --tests-base $bt/$tests_base\
553 --local-dir $local_gl_dir\
554 $gnulib_tool_option_extras\
556 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
557 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
560 for file in $gnulib_files; do
561 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
565 # Import from gettext.
567 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
570 if test $with_gettext = yes; then
571 echo "$0: (cd $bt2; autopoint) ..."
572 cp configure.ac $bt2 &&
573 (cd $bt2 && autopoint && rm configure.ac) &&
574 slurp $bt2 $bt || exit
576 rm -fr $bt $bt2 || exit
578 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
579 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
580 # The following requires GNU find 4.2.3 or newer. Considering the usual
581 # portability constraints of this script, that may seem a very demanding
582 # requirement, but it should be ok. Ignore any failure, which is fine,
583 # since this is only a convenience to help developers avoid the relatively
584 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
585 # between successive runs of this script.
586 find "$m4_base" "$source_base" \
587 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
588 -type l -xtype l -delete > /dev/null 2>&1
590 # Reconfigure, getting other files.
594 'aclocal --force -I m4' \
596 'autoheader --force' \
597 'automake --add-missing --copy --force-missing';
599 if test "$command" = libtool; then
601 # We'd like to use grep -E, to see if any of LT_INIT,
602 # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
603 # but that's not portable enough (e.g., for Solaris).
604 grep '^[ ]*A[CM]_PROG_LIBTOOL\>' configure.ac >/dev/null \
606 grep '^[ ]*LT_INIT\>' configure.ac >/dev/null \
608 test $use_libtool = 0 \
610 command='libtoolize -c -f'
612 echo "$0: $command ..."
617 # Get some extra files from gnulib, overriding existing files.
618 for file in $gnulib_extra_files; do
620 */INSTALL) dst=INSTALL;;
621 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
624 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
627 if test $with_gettext = yes; then
628 # Create gettext configuration.
629 echo "$0: Creating po/Makevars from po/Makevars.template ..."
632 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
633 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
634 /^XGETTEXT_OPTIONS *=/{
637 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
639 ' po/Makevars.template >po/Makevars
641 if test -d runtime-po; then
642 # Similarly for runtime-po/Makevars, but not quite the same.
643 rm -f runtime-po/Makevars
645 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
646 /^subdir *=.*/s/=.*/= runtime-po/
647 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
648 /^XGETTEXT_OPTIONS *=/{
651 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
653 ' <po/Makevars.template >runtime-po/Makevars
655 # Copy identical files from po to runtime-po.
656 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
660 echo "$0: done. Now you can run './configure'."