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='
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 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
277 echo "updated $po_dir/$po.po..."
278 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
286 update_po_files po $package || exit
289 if test -d runtime-po; then
290 update_po_files runtime-po $package-runtime || exit
301 # If the destination directory doesn't exist, create it.
302 # This is required at least for "lib/uniwidth/cjk.h".
303 dst_dir=`dirname "$dst"`
304 if ! test -d "$dst_dir"; then
307 # If we've just created a directory like lib/uniwidth,
308 # tell version control system(s) it's ignorable.
309 # FIXME: for now, this does only one level
310 parent=`dirname "$dst_dir"`
311 for dot_ig in x $vc_ignore; do
312 test $dot_ig = x && continue
314 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
320 test ! -h "$dst" || {
321 echo "$0: rm -f $dst" &&
326 cmp -s "$src" "$dst" || {
327 echo "$0: cp -fp $src $dst" &&
332 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
333 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
334 test "$src_i" = "$dst_i" || {
340 *//* | */../* | */./* | /*/*/*/*/*/)
341 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
343 /*/*/*/*/) dot_dots=../../../;;
344 /*/*/*/) dot_dots=../../;;
345 /*/*/) dot_dots=../;;
349 echo "$0: ln -fs $dot_dots$src $dst" &&
350 ln -fs "$dot_dots$src" "$dst"
356 cp_mark_as_generated()
361 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
362 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
363 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
364 symlink_to_dir $local_gl_dir "$cp_dst"
367 *.[ch]) c1='/* '; c2=' */';;
368 *.texi) c1='@c '; c2= ;;
369 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
373 # If the destination directory doesn't exist, create it.
374 # This is required at least for "lib/uniwidth/cjk.h".
375 dst_dir=`dirname "$cp_dst"`
376 test -d "$dst_dir" || mkdir -p "$dst_dir"
378 if test -z "$c1"; then
379 cmp -s "$cp_src" "$cp_dst" || {
380 echo "$0: cp -f $cp_src $cp_dst" &&
382 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
385 # Copy the file first to get proper permissions if it
386 # doesn't already exist. Then overwrite the copy.
387 cp "$cp_src" "$cp_dst-t" &&
389 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
390 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
391 sed "s!$bt_regex/!!g" "$cp_src"
393 if cmp -s "$cp_dst-t" "$cp_dst"; then
396 echo "$0: cp $cp_src $cp_dst # with edits" &&
397 mv -f "$cp_dst-t" "$cp_dst"
403 version_controlled_file() {
408 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
409 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
410 elif test -d .git; then
411 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
413 echo "$0: no version control for $dir/$file?" >&2
419 for dir in . `(cd $1 && find * -type d -print)`; do
422 for file in `ls -a $1/$dir`; do
425 .*) continue;; # FIXME: should all file names starting with "." be ignored?
427 test -d $1/$dir/$file && continue
428 for excluded_file in $excluded_files; do
429 test "$dir/$file" = "$excluded_file" && continue 2
431 if test $file = Makefile.am; then
432 copied=$copied${sep}$gnulib_mk; sep=$nl
433 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
434 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
435 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
436 rm -f $dir/$gnulib_mk &&
437 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
439 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
440 version_controlled_file $dir $file; then
441 echo "$0: $dir/$file overrides $1/$dir/$file"
443 copied=$copied$sep$file; sep=$nl
444 if test $file = gettext.m4; then
445 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
448 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
449 AC_DEFUN([AM_INTL_SUBDIR], [
450 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
451 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
453 AC_DEFUN([gl_LOCK_EARLY], [])
454 ' $1/$dir/$file >$dir/$file
456 cp_mark_as_generated $1/$dir/$file $dir/$file
461 for dot_ig in x $vc_ignore; do
462 test $dot_ig = x && continue
464 if test -n "$copied"; then
465 insert_sorted_if_absent $ig "$copied"
466 # If an ignored file name ends with .in.h, then also add
467 # the name with just ".h". Many gnulib headers are generated,
468 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
469 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
470 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
471 insert_sorted_if_absent $ig "$f"
473 # For files like sys_stat.in.h and sys_time.in.h, record as
474 # ignorable the directory we might eventually create: sys/.
475 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
476 insert_sorted_if_absent $ig "$f"
483 # Create boot temporary directories to import from gnulib and gettext.
485 mkdir $bt $bt2 || exit
487 # Import from gnulib.
489 gnulib_tool_options="\
492 --aux-dir $bt/$build_aux\
496 --source-base $bt/lib/\
497 --tests-base $bt/tests\
498 --local-dir $local_gl_dir\
499 $gnulib_tool_option_extras\
501 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
502 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
505 for file in $gnulib_files; do
506 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
510 # Import from gettext.
512 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
515 if test $with_gettext = yes; then
516 echo "$0: (cd $bt2; autopoint) ..."
517 cp configure.ac $bt2 &&
518 (cd $bt2 && autopoint && rm configure.ac) &&
519 slurp $bt2 $bt || exit
521 rm -fr $bt $bt2 || exit
524 # Coreutils is unusual in that it generates some of its test-related
525 # Makefile.am files. That must be done before invoking automake.
526 mam_template=tests/Makefile.am.in
527 if test -f $mam_template; then
529 for tool in cut head join pr sort tac tail test tr uniq wc; do
530 m=tests/$tool/Makefile.am
533 sed -n '1,/^##test-files-begin/p' $mam_template > $t
534 echo "x = $tool" >> $t
536 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
537 sed -n '/^##test-files-end/,$p' $mam_template >> $t
543 # Reconfigure, getting other files.
547 'aclocal --force -I m4' \
549 'autoheader --force' \
550 'automake --add-missing --copy --force-missing';
552 if test "$command" = libtool; then
553 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
555 command='libtoolize -c -f'
557 echo "$0: $command ..."
562 # Get some extra files from gnulib, overriding existing files.
563 for file in $gnulib_extra_files; do
565 */INSTALL) dst=INSTALL;;
566 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
569 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
572 if test $with_gettext = yes; then
573 # Create gettext configuration.
574 echo "$0: Creating po/Makevars from po/Makevars.template ..."
577 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
578 /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
579 /^XGETTEXT_OPTIONS *=/{
582 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
584 ' po/Makevars.template >po/Makevars
586 if test -d runtime-po; then
587 # Similarly for runtime-po/Makevars, but not quite the same.
588 rm -f runtime-po/Makevars
590 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
591 /^subdir *=.*/s/=.*/= runtime-po/
592 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
593 /^XGETTEXT_OPTIONS *=/{
596 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
598 ' <po/Makevars.template >runtime-po/Makevars
600 # Copy identical files from po to runtime-po.
601 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
605 echo "$0: done. Now you can run './configure'."