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
99 # Extra files from gnulib, which override files from other sources.
101 $build_aux/install-sh
104 $build_aux/texinfo.tex
106 $build_aux/config.guess
107 $build_aux/config.sub
111 # Additional gnulib-tool options to use. Use "\newline" to break lines.
112 gnulib_tool_option_extras=
114 # Other locale categories that need message catalogs.
115 EXTRA_LOCALE_CATEGORIES=
117 # Additional xgettext options to use. Use "\\\newline" to break lines.
118 XGETTEXT_OPTIONS='\\\
119 --flag=_:1:pass-c-format\\\
120 --flag=N_:1:pass-c-format\\\
121 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
124 # Package bug report address for gettext files
125 MSGID_BUGS_ADDRESS=bug-$package@gnu.org
127 # Files we don't want to import.
130 # File that should exist in the top directory of a checked out hierarchy,
131 # but not in a distribution tarball.
132 checkout_only_file=README-hacking
134 # Whether to use copies instead of symlinks.
137 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
138 # those files to be generated in directories like lib/, m4/, and po/.
139 # Or set it to 'auto' to make this script select which to use based
140 # on which version control system (if any) is used in the source directory.
143 # Override the default configuration, if necessary.
144 test -r bootstrap.conf && . ./bootstrap.conf
146 if test "$vc_ignore" = auto; then
148 test -d .git && vc_ignore=.gitignore
149 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
152 # Translate configuration into internal form.
163 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
167 checkout_only_file=;;
171 echo >&2 "$0: $option: unknown option"
176 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
177 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
181 # If $STR is not already on a line by itself in $FILE, insert it,
182 # sorting the new contents of the file and replacing $FILE with the result.
183 insert_sorted_if_absent() {
186 test -f $file || touch $file
187 echo "$str" | sort -u - $file | cmp -s - $file \
188 || echo "$str" | sort -u - $file -o $file \
192 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
194 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
195 >/dev/null && found_aux_dir=yes
196 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
197 >/dev/null && found_aux_dir=yes
198 if test $found_aux_dir = no; then
199 echo "$0: expected line not found in configure.ac. Add the following:" >&2
200 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
204 # If $build_aux doesn't exist, create it now, otherwise some bits
205 # below will malfunction. If creating it, also mark it as ignored.
206 if test ! -d $build_aux; then
208 for dot_ig in x $vc_ignore; do
209 test $dot_ig = x && continue
210 insert_sorted_if_absent $dot_ig $build_aux
214 echo "$0: Bootstrapping from checked-out $package sources..."
224 case ${GNULIB_SRCDIR--} in
226 if [ ! -d gnulib ]; then
227 echo "$0: getting gnulib files..."
229 trap cleanup_gnulib 1 2 13 15
231 git clone --depth 2 git://git.sv.gnu.org/gnulib ||
239 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
240 <$gnulib_tool || exit
244 download_po_files() {
247 echo "$0: getting translations into $subdir for $domain..."
248 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
252 # Download .po files to $po_dir/.reference and copy only the new
253 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
255 # Directory containing primary .po files.
256 # Overwrite them only when we're sure a .po file is new.
260 # Download *.po files into this dir.
261 # Usually contains *.s1 checksum files.
262 ref_po_dir="$po_dir/.reference"
264 test -d $ref_po_dir || mkdir $ref_po_dir || return
265 download_po_files $ref_po_dir $domain \
266 && ls "$ref_po_dir"/*.po 2>/dev/null |
267 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
269 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
270 test "$langs" = '*' && langs=x
271 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
272 case $po in x) continue;; esac
273 new_po="$ref_po_dir/$po.po"
274 cksum_file="$ref_po_dir/$po.s1"
275 if ! test -f "$cksum_file" ||
276 ! test -f "$po_dir/$po.po" ||
277 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
278 echo "updated $po_dir/$po.po..."
279 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
287 update_po_files po $package || exit
290 if test -d runtime-po; then
291 update_po_files runtime-po $package-runtime || exit
302 # If the destination directory doesn't exist, create it.
303 # This is required at least for "lib/uniwidth/cjk.h".
304 dst_dir=`dirname "$dst"`
305 if ! test -d "$dst_dir"; then
308 # If we've just created a directory like lib/uniwidth,
309 # tell version control system(s) it's ignorable.
310 # FIXME: for now, this does only one level
311 parent=`dirname "$dst_dir"`
312 for dot_ig in x $vc_ignore; do
313 test $dot_ig = x && continue
315 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
321 test ! -h "$dst" || {
322 echo "$0: rm -f $dst" &&
327 cmp -s "$src" "$dst" || {
328 echo "$0: cp -fp $src $dst" &&
333 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
334 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
335 test "$src_i" = "$dst_i" || {
341 *//* | */../* | */./* | /*/*/*/*/*/)
342 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
344 /*/*/*/*/) dot_dots=../../../;;
345 /*/*/*/) dot_dots=../../;;
346 /*/*/) dot_dots=../;;
350 echo "$0: ln -fs $dot_dots$src $dst" &&
351 ln -fs "$dot_dots$src" "$dst"
357 cp_mark_as_generated()
362 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
363 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
364 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
365 symlink_to_dir $local_gl_dir "$cp_dst"
368 *.[ch]) c1='/* '; c2=' */';;
369 *.texi) c1='@c '; c2= ;;
370 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
374 # If the destination directory doesn't exist, create it.
375 # This is required at least for "lib/uniwidth/cjk.h".
376 dst_dir=`dirname "$cp_dst"`
377 test -d "$dst_dir" || mkdir -p "$dst_dir"
379 if test -z "$c1"; then
380 cmp -s "$cp_src" "$cp_dst" || {
381 echo "$0: cp -f $cp_src $cp_dst" &&
383 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
386 # Copy the file first to get proper permissions if it
387 # doesn't already exist. Then overwrite the copy.
388 cp "$cp_src" "$cp_dst-t" &&
390 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
391 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
392 sed "s!$bt_regex/!!g" "$cp_src"
394 if cmp -s "$cp_dst-t" "$cp_dst"; then
397 echo "$0: cp $cp_src $cp_dst # with edits" &&
398 mv -f "$cp_dst-t" "$cp_dst"
404 version_controlled_file() {
409 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
410 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
411 elif test -d .git; then
412 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
414 echo "$0: no version control for $dir/$file?" >&2
420 for dir in . `(cd $1 && find * -type d -print)`; do
423 for file in `ls -a $1/$dir`; do
426 .*) continue;; # FIXME: should all file names starting with "." be ignored?
428 test -d $1/$dir/$file && continue
429 for excluded_file in $excluded_files; do
430 test "$dir/$file" = "$excluded_file" && continue 2
432 if test $file = Makefile.am; then
433 copied=$copied${sep}$gnulib_mk; sep=$nl
434 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
435 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
436 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
437 rm -f $dir/$gnulib_mk &&
438 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
440 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
441 version_controlled_file $dir $file; then
442 echo "$0: $dir/$file overrides $1/$dir/$file"
444 copied=$copied$sep$file; sep=$nl
445 if test $file = gettext.m4; then
446 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
449 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
450 AC_DEFUN([AM_INTL_SUBDIR], [
451 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
452 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
454 AC_DEFUN([gl_LOCK_EARLY], [])
455 ' $1/$dir/$file >$dir/$file
457 cp_mark_as_generated $1/$dir/$file $dir/$file
462 for dot_ig in x $vc_ignore; do
463 test $dot_ig = x && continue
465 if test -n "$copied"; then
466 insert_sorted_if_absent $ig "$copied"
467 # If an ignored file name ends with .in.h, then also add
468 # the name with just ".h". Many gnulib headers are generated,
469 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
470 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
471 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
472 insert_sorted_if_absent $ig "$f"
474 # For files like sys_stat.in.h and sys_time.in.h, record as
475 # ignorable the directory we might eventually create: sys/.
476 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
477 insert_sorted_if_absent $ig "$f"
484 # Create boot temporary directories to import from gnulib and gettext.
486 mkdir $bt $bt2 || exit
488 # Import from gnulib.
490 gnulib_tool_options="\
493 --aux-dir $bt/$build_aux\
497 --source-base $bt/lib/\
498 --tests-base $bt/tests\
499 --local-dir $local_gl_dir\
500 $gnulib_tool_option_extras\
502 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
503 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
506 for file in $gnulib_files; do
507 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
511 # Import from gettext.
513 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
516 if test $with_gettext = yes; then
517 echo "$0: (cd $bt2; autopoint) ..."
518 cp configure.ac $bt2 &&
519 (cd $bt2 && autopoint && rm configure.ac) &&
520 slurp $bt2 $bt || exit
522 rm -fr $bt $bt2 || exit
525 # Coreutils is unusual in that it generates some of its test-related
526 # Makefile.am files. That must be done before invoking automake.
527 mam_template=tests/Makefile.am.in
528 if test -f $mam_template; then
530 for tool in cut head join pr sort tac tail test tr uniq wc; do
531 m=tests/$tool/Makefile.am
534 sed -n '1,/^##test-files-begin/p' $mam_template > $t
535 echo "x = $tool" >> $t
537 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
538 sed -n '/^##test-files-end/,$p' $mam_template >> $t
544 # Remove dangling symlinks in gnulib-populated directories, since
545 # a dangling m4/*.m4 symlink would cause aclocal to fail.
546 # This depends on GNU find, and a relatively recent version at that.
547 # Ignore any failure for now, since it's only to avoid the relatively
548 # unusual case in which a symlinked-to file in gnulib/ or gl/ is removed.
549 find m4 lib build-aux -depth -type l -xtype l -delete > /dev/null 2>&1
551 # Reconfigure, getting other files.
555 'aclocal --force -I m4' \
557 'autoheader --force' \
558 'automake --add-missing --copy --force-missing';
560 if test "$command" = libtool; then
561 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
563 command='libtoolize -c -f'
565 echo "$0: $command ..."
570 # Get some extra files from gnulib, overriding existing files.
571 for file in $gnulib_extra_files; do
573 */INSTALL) dst=INSTALL;;
574 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
577 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
580 if test $with_gettext = yes; then
581 # Create gettext configuration.
582 echo "$0: Creating po/Makevars from po/Makevars.template ..."
585 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
586 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
587 /^XGETTEXT_OPTIONS *=/{
590 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
592 ' po/Makevars.template >po/Makevars
594 if test -d runtime-po; then
595 # Similarly for runtime-po/Makevars, but not quite the same.
596 rm -f runtime-po/Makevars
598 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
599 /^subdir *=.*/s/=.*/= runtime-po/
600 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
601 /^XGETTEXT_OPTIONS *=/{
604 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
606 ' <po/Makevars.template >runtime-po/Makevars
608 # Copy identical files from po to runtime-po.
609 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
613 # Horrible, coreutils-specific kludges.
614 # Change paths in gnulib-tests/gnulib.mk from "../.." to "..".
615 m=gnulib-tests/gnulib.mk
616 sed 's,\.\./\.\.,..,g' $m > $m-t
619 chmod a+x gnulib-tests/test-*.sh
621 echo "$0: done. Now you can run './configure'."