3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007 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='
89 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
94 package=`sed -n "$extract_package_name" configure.ac` || exit
95 gnulib_name=lib$package
98 # Extra files from gnulib, which override files from other sources.
100 $build_aux/install-sh
103 $build_aux/texinfo.tex
105 $build_aux/config.guess
106 $build_aux/config.sub
110 # Additional gnulib-tool options to use. Use "\newline" to break lines.
111 gnulib_tool_option_extras=
113 # Other locale categories that need message catalogs.
114 EXTRA_LOCALE_CATEGORIES=
116 # Additional xgettext options to use. Use "\\\newline" to break lines.
117 XGETTEXT_OPTIONS='\\\
118 --flag=_:1:pass-c-format\\\
119 --flag=N_:1:pass-c-format\\\
120 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
123 # Files we don't want to import.
126 # File that should exist in the top directory of a checked out hierarchy,
127 # but not in a distribution tarball.
128 checkout_only_file=README-hacking
130 # Whether to use copies instead of symlinks.
133 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
134 # those files to be generated in directories like lib/, m4/, and po/.
135 # Or set it to 'auto' to make this script select which to use based
136 # on which version control system (if any) is used in the source directory.
139 # Override the default configuration, if necessary.
140 test -r bootstrap.conf && . ./bootstrap.conf
142 if test "$vc_ignore" = auto; then
144 test -d .git && vc_ignore=.gitignore
145 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
148 # Translate configuration into internal form.
159 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
163 checkout_only_file=;;
167 echo >&2 "$0: $option: unknown option"
172 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
173 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
177 # If $STR is not already on a line by itself in $FILE, insert it,
178 # sorting the new contents of the file and replacing $FILE with the result.
179 insert_sorted_if_absent() {
182 test -f $file || touch $file
183 echo "$str" | sort -u - $file | cmp -s - $file \
184 || echo "$str" | sort -u - $file -o $file \
188 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
190 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
191 >/dev/null && found_aux_dir=yes
192 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
193 >/dev/null && found_aux_dir=yes
194 if test $found_aux_dir = no; then
195 echo "$0: expected line not found in configure.ac. Add the following:" >&2
196 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
200 # If $build_aux doesn't exist, create it now, otherwise some bits
201 # below will malfunction. If creating it, also mark it as ignored.
202 if test ! -d $build_aux; then
204 for dot_ig in x $vc_ignore; do
205 test $dot_ig = x && continue
206 insert_sorted_if_absent $dot_ig $build_aux
210 echo "$0: Bootstrapping from checked-out $package sources..."
220 case ${GNULIB_SRCDIR--} in
222 if [ ! -d gnulib ]; then
223 echo "$0: getting gnulib files..."
225 trap cleanup_gnulib 1 2 13 15
227 git clone --depth 2 git://git.sv.gnu.org/gnulib ||
235 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
236 <$gnulib_tool || exit
240 download_po_files() {
243 echo "$0: getting translations into $subdir for $domain..."
244 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
248 # Download .po files to $po_dir/.reference and copy only the new
249 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
251 # Directory containing primary .po files.
252 # Overwrite them only when we're sure a .po file is new.
256 # Download *.po files into this dir.
257 # Usually contains *.s1 checksum files.
258 ref_po_dir="$po_dir/.reference"
260 test -d $ref_po_dir || mkdir $ref_po_dir || return
261 download_po_files $ref_po_dir $domain \
262 && ls "$ref_po_dir"/*.po 2>/dev/null |
263 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
265 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
266 test "$langs" = '*' && langs=x
267 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
268 case $po in x) continue;; esac
269 new_po="$ref_po_dir/$po.po"
270 cksum_file="$ref_po_dir/$po.s1"
271 if ! test -f "$cksum_file" ||
272 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
273 echo "updated $po_dir/$po.po..."
274 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
282 update_po_files po $package || exit
285 if test -d runtime-po; then
286 update_po_files runtime-po $package-runtime || exit
297 # If the destination directory doesn't exist, create it.
298 # This is required at least for "lib/uniwidth/cjk.h".
299 dst_dir=`dirname "$dst"`
300 if ! test -d "$dst_dir"; then
303 # If we've just created a directory like lib/uniwidth,
304 # tell version control system(s) it's ignorable.
305 # FIXME: for now, this does only one level
306 parent=`dirname "$dst_dir"`
307 for dot_ig in x $vc_ignore; do
308 test $dot_ig = x && continue
310 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
316 test ! -h "$dst" || {
317 echo "$0: rm -f $dst" &&
322 cmp -s "$src" "$dst" || {
323 echo "$0: cp -fp $src $dst" &&
328 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
329 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
330 test "$src_i" = "$dst_i" || {
336 *//* | */../* | */./* | /*/*/*/*/*/)
337 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
339 /*/*/*/*/) dot_dots=../../../;;
340 /*/*/*/) dot_dots=../../;;
341 /*/*/) dot_dots=../;;
345 echo "$0: ln -fs $dot_dots$src $dst" &&
346 ln -fs "$dot_dots$src" "$dst"
352 cp_mark_as_generated()
357 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
358 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
359 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
360 symlink_to_dir $local_gl_dir "$cp_dst"
363 *.[ch]) c1='/* '; c2=' */';;
364 *.texi) c1='@c '; c2= ;;
365 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
369 if test -z "$c1"; then
370 cmp -s "$cp_src" "$cp_dst" || {
371 echo "$0: cp -f $cp_src $cp_dst" &&
373 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
376 # Copy the file first to get proper permissions if it
377 # doesn't already exist. Then overwrite the copy.
378 cp "$cp_src" "$cp_dst-t" &&
380 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
381 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
382 sed "s!$bt_regex/!!g" "$cp_src"
384 if cmp -s "$cp_dst-t" "$cp_dst"; then
387 echo "$0: cp $cp_src $cp_dst # with edits" &&
388 mv -f "$cp_dst-t" "$cp_dst"
394 version_controlled_file() {
399 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
400 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
401 elif test -d .git; then
402 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
404 echo "$0: no version control for $dir/$file?" >&2
410 for dir in . `(cd $1 && find * -type d -print)`; do
413 for file in `ls -a $1/$dir`; do
416 .*) continue;; # FIXME: should all file names starting with "." be ignored?
418 test -d $1/$dir/$file && continue
419 for excluded_file in $excluded_files; do
420 test "$dir/$file" = "$excluded_file" && continue 2
422 if test $file = Makefile.am; then
423 copied=$copied${sep}$gnulib_mk; sep=$nl
424 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
425 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
426 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
427 rm -f $dir/$gnulib_mk &&
428 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
430 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
431 version_controlled_file $dir $file; then
432 echo "$0: $dir/$file overrides $1/$dir/$file"
434 copied=$copied$sep$file; sep=$nl
435 if test $file = gettext.m4; then
436 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
439 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
440 AC_DEFUN([AM_INTL_SUBDIR], [
441 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
442 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
444 AC_DEFUN([gl_LOCK_EARLY], [])
445 ' $1/$dir/$file >$dir/$file
447 cp_mark_as_generated $1/$dir/$file $dir/$file
452 for dot_ig in x $vc_ignore; do
453 test $dot_ig = x && continue
455 if test -n "$copied"; then
456 insert_sorted_if_absent $ig "$copied"
457 # If an ignored file name ends with .in.h, then also add
458 # the name with just ".h". Many gnulib headers are generated,
459 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
460 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
461 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
462 insert_sorted_if_absent $ig "$f"
464 # For files like sys_stat.in.h and sys_time.in.h, record as
465 # ignorable the directory we might eventually create: sys/.
466 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
467 insert_sorted_if_absent $ig "$f"
474 # Create boot temporary directories to import from gnulib and gettext.
476 mkdir $bt $bt2 || exit
478 # Import from gnulib.
480 gnulib_tool_options="\
483 --aux-dir $bt/$build_aux\
487 --source-base $bt/lib/\
488 --tests-base $bt/tests\
489 --local-dir $local_gl_dir\
490 $gnulib_tool_option_extras\
492 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
493 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
496 for file in $gnulib_files; do
497 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
501 # Import from gettext.
503 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
506 if test $with_gettext = yes; then
507 echo "$0: (cd $bt2; autopoint) ..."
508 cp configure.ac $bt2 &&
509 (cd $bt2 && autopoint && rm configure.ac) &&
510 slurp $bt2 $bt || exit
512 rm -fr $bt $bt2 || exit
515 # Coreutils is unusual in that it generates some of its test-related
516 # Makefile.am files. That must be done before invoking automake.
517 mam_template=tests/Makefile.am.in
518 if test -f $mam_template; then
520 for tool in cut head join pr sort tac tail test tr uniq wc; do
521 m=tests/$tool/Makefile.am
524 sed -n '1,/^##test-files-begin/p' $mam_template > $t
525 echo "x = $tool" >> $t
527 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
528 sed -n '/^##test-files-end/,$p' $mam_template >> $t
534 # Reconfigure, getting other files.
538 'aclocal --force -I m4' \
540 'autoheader --force' \
541 'automake --add-missing --copy --force-missing';
543 if test "$command" = libtool; then
544 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
546 command='libtoolize -c -f'
548 echo "$0: $command ..."
553 # Get some extra files from gnulib, overriding existing files.
554 for file in $gnulib_extra_files; do
556 */INSTALL) dst=INSTALL;;
557 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
560 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
563 if test $with_gettext = yes; then
564 # Create gettext configuration.
565 echo "$0: Creating po/Makevars from po/Makevars.template ..."
568 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
569 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
570 /^XGETTEXT_OPTIONS *=/{
573 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
575 ' po/Makevars.template >po/Makevars
577 if test -d runtime-po; then
578 # Similarly for runtime-po/Makevars, but not quite the same.
579 rm -f runtime-po/Makevars
581 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
582 /^subdir *=.*/s/=.*/= runtime-po/
583 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
584 /^XGETTEXT_OPTIONS *=/{
587 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
589 ' <po/Makevars.template >runtime-po/Makevars
591 # Copy identical files from po to runtime-po.
592 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
596 echo "$0: done. Now you can run './configure'."