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 bootstrap.conf exists in the current working directory, 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 test -r bootstrap.conf && . ./bootstrap.conf
151 if test "$vc_ignore" = auto; then
153 test -d .git && vc_ignore=.gitignore
154 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
157 # Translate configuration into internal form.
168 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
172 checkout_only_file=;;
176 echo >&2 "$0: $option: unknown option"
181 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
182 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
186 # If $STR is not already on a line by itself in $FILE, insert it,
187 # sorting the new contents of the file and replacing $FILE with the result.
188 insert_sorted_if_absent() {
191 test -f $file || touch $file
192 echo "$str" | sort -u - $file | cmp -s - $file \
193 || echo "$str" | sort -u - $file -o $file \
197 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
199 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
200 >/dev/null && found_aux_dir=yes
201 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
202 >/dev/null && found_aux_dir=yes
203 if test $found_aux_dir = no; then
204 echo "$0: expected line not found in configure.ac. Add the following:" >&2
205 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
209 # If $build_aux doesn't exist, create it now, otherwise some bits
210 # below will malfunction. If creating it, also mark it as ignored.
211 if test ! -d $build_aux; then
213 for dot_ig in x $vc_ignore; do
214 test $dot_ig = x && continue
215 insert_sorted_if_absent $dot_ig $build_aux
219 echo "$0: Bootstrapping from checked-out $package sources..."
221 # See if we can use gnulib's git-merge-changelog merge driver.
222 if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
223 if git config merge.merge-changelog.driver >/dev/null ; then
225 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
226 echo "initializing git-merge-changelog driver"
227 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
228 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
230 echo "consider installing git-merge-changelog from gnulib"
241 git_modules_config () {
242 GIT_CONFIG_LOCAL=.gitmodules git config "$@"
247 case ${GNULIB_SRCDIR--} in
249 if git_modules_config submodule.gnulib.url >/dev/null; then
250 echo "$0: getting gnulib files..."
251 git submodule init || exit $?
252 git submodule update || exit $?
254 elif [ ! -d gnulib ]; then
255 echo "$0: getting gnulib files..."
257 trap cleanup_gnulib 1 2 13 15
259 git clone --depth 2 git://git.sv.gnu.org/gnulib ||
267 # Redirect the gnulib submodule to the directory on the command line
269 if test -d "$GNULIB_SRCDIR"/.git && \
270 git_modules_config submodule.gnulib.url >/dev/null; then
272 GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
273 git config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
274 echo "$0: getting gnulib files..."
275 git submodule update || exit $?
281 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
282 <$gnulib_tool || exit
286 download_po_files() {
289 echo "$0: getting translations into $subdir for $domain..."
290 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
294 # Download .po files to $po_dir/.reference and copy only the new
295 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
297 # Directory containing primary .po files.
298 # Overwrite them only when we're sure a .po file is new.
302 # Download *.po files into this dir.
303 # Usually contains *.s1 checksum files.
304 ref_po_dir="$po_dir/.reference"
306 test -d $ref_po_dir || mkdir $ref_po_dir || return
307 download_po_files $ref_po_dir $domain \
308 && ls "$ref_po_dir"/*.po 2>/dev/null |
309 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
311 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
312 test "$langs" = '*' && langs=x
314 case $po in x) continue;; esac
315 new_po="$ref_po_dir/$po.po"
316 cksum_file="$ref_po_dir/$po.s1"
317 if ! test -f "$cksum_file" ||
318 ! test -f "$po_dir/$po.po" ||
319 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
320 echo "updated $po_dir/$po.po..."
321 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
329 update_po_files po $package || exit
332 if test -d runtime-po; then
333 update_po_files runtime-po $package-runtime || exit
344 # If the destination directory doesn't exist, create it.
345 # This is required at least for "lib/uniwidth/cjk.h".
346 dst_dir=`dirname "$dst"`
347 if ! test -d "$dst_dir"; then
350 # If we've just created a directory like lib/uniwidth,
351 # tell version control system(s) it's ignorable.
352 # FIXME: for now, this does only one level
353 parent=`dirname "$dst_dir"`
354 for dot_ig in x $vc_ignore; do
355 test $dot_ig = x && continue
357 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
363 test ! -h "$dst" || {
364 echo "$0: rm -f $dst" &&
369 cmp -s "$src" "$dst" || {
370 echo "$0: cp -fp $src $dst" &&
375 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
376 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
377 test "$src_i" = "$dst_i" || {
383 *//* | */../* | */./* | /*/*/*/*/*/)
384 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
386 /*/*/*/*/) dot_dots=../../../;;
387 /*/*/*/) dot_dots=../../;;
388 /*/*/) dot_dots=../;;
392 echo "$0: ln -fs $dot_dots$src $dst" &&
393 ln -fs "$dot_dots$src" "$dst"
399 cp_mark_as_generated()
404 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
405 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
406 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
407 symlink_to_dir $local_gl_dir "$cp_dst"
410 *.[ch]) c1='/* '; c2=' */';;
411 *.texi) c1='@c '; c2= ;;
412 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
416 # If the destination directory doesn't exist, create it.
417 # This is required at least for "lib/uniwidth/cjk.h".
418 dst_dir=`dirname "$cp_dst"`
419 test -d "$dst_dir" || mkdir -p "$dst_dir"
421 if test -z "$c1"; then
422 cmp -s "$cp_src" "$cp_dst" || {
423 # Copy the file first to get proper permissions if it
424 # doesn't already exist. Then overwrite the copy.
425 echo "$0: cp -f $cp_src $cp_dst" &&
427 cp "$cp_src" "$cp_dst-t" &&
428 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
429 mv -f "$cp_dst-t" "$cp_dst"
432 # Copy the file first to get proper permissions if it
433 # doesn't already exist. Then overwrite the copy.
434 cp "$cp_src" "$cp_dst-t" &&
436 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
437 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
438 sed "s!$bt_regex/!!g" "$cp_src"
440 if cmp -s "$cp_dst-t" "$cp_dst"; then
443 echo "$0: cp $cp_src $cp_dst # with edits" &&
444 mv -f "$cp_dst-t" "$cp_dst"
450 version_controlled_file() {
455 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
456 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
457 elif test -d .git; then
458 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
459 elif test -d .svn; then
460 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
462 echo "$0: no version control for $dir/$file?" >&2
468 for dir in . `(cd $1 && find * -type d -print)`; do
471 for file in `ls -a $1/$dir`; do
474 .*) continue;; # FIXME: should all file names starting with "." be ignored?
476 test -d $1/$dir/$file && continue
477 for excluded_file in $excluded_files; do
478 test "$dir/$file" = "$excluded_file" && continue 2
480 if test $file = Makefile.am; then
481 copied=$copied${sep}$gnulib_mk; sep=$nl
482 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
483 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
484 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
485 rm -f $dir/$gnulib_mk &&
486 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
488 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
489 version_controlled_file $dir $file; then
490 echo "$0: $dir/$file overrides $1/$dir/$file"
492 copied=$copied$sep$file; sep=$nl
493 if test $file = gettext.m4; then
494 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
497 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
498 AC_DEFUN([AM_INTL_SUBDIR], [
499 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
500 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
502 AC_DEFUN([gl_LOCK_EARLY], [])
503 ' $1/$dir/$file >$dir/$file
505 cp_mark_as_generated $1/$dir/$file $dir/$file
510 for dot_ig in x $vc_ignore; do
511 test $dot_ig = x && continue
513 if test -n "$copied"; then
514 insert_sorted_if_absent $ig "$copied"
515 # If an ignored file name ends with .in.h, then also add
516 # the name with just ".h". Many gnulib headers are generated,
517 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
518 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
519 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
520 insert_sorted_if_absent $ig "$f"
522 # For files like sys_stat.in.h and sys_time.in.h, record as
523 # ignorable the directory we might eventually create: sys/.
524 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
525 insert_sorted_if_absent $ig "$f"
532 # Create boot temporary directories to import from gnulib and gettext.
534 mkdir $bt $bt2 || exit
536 # Import from gnulib.
538 gnulib_tool_options="\
541 --aux-dir $bt/$build_aux\
542 --doc-base $bt/$doc_base\
544 --m4-base $bt/$m4_base/\
545 --source-base $bt/$source_base/\
546 --tests-base $bt/$tests_base\
547 --local-dir $local_gl_dir\
548 $gnulib_tool_option_extras\
550 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
551 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
554 for file in $gnulib_files; do
555 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
559 # Import from gettext.
561 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
564 if test $with_gettext = yes; then
565 echo "$0: (cd $bt2; autopoint) ..."
566 cp configure.ac $bt2 &&
567 (cd $bt2 && autopoint && rm configure.ac) &&
568 slurp $bt2 $bt || exit
570 rm -fr $bt $bt2 || exit
572 # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
573 # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
574 # The following requires GNU find 4.2.3 or newer. Considering the usual
575 # portability constraints of this script, that may seem a very demanding
576 # requirement, but it should be ok. Ignore any failure, which is fine,
577 # since this is only a convenience to help developers avoid the relatively
578 # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
579 # between successive runs of this script.
580 find "$m4_base" "$source_base" \
581 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
582 -type l -xtype l -delete > /dev/null 2>&1
584 # Reconfigure, getting other files.
588 'aclocal --force -I m4' \
590 'autoheader --force' \
591 'automake --add-missing --copy --force-missing';
593 if test "$command" = libtool; then
594 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
596 command='libtoolize -c -f'
598 echo "$0: $command ..."
603 # Get some extra files from gnulib, overriding existing files.
604 for file in $gnulib_extra_files; do
606 */INSTALL) dst=INSTALL;;
607 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
610 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
613 if test $with_gettext = yes; then
614 # Create gettext configuration.
615 echo "$0: Creating po/Makevars from po/Makevars.template ..."
618 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
619 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
620 /^XGETTEXT_OPTIONS *=/{
623 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
625 ' po/Makevars.template >po/Makevars
627 if test -d runtime-po; then
628 # Similarly for runtime-po/Makevars, but not quite the same.
629 rm -f runtime-po/Makevars
631 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
632 /^subdir *=.*/s/=.*/= runtime-po/
633 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
634 /^XGETTEXT_OPTIONS *=/{
637 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
639 ' <po/Makevars.template >runtime-po/Makevars
641 # Copy identical files from po to runtime-po.
642 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
646 echo "$0: done. Now you can run './configure'."