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.
26 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
32 # Temporary directory names.
34 bt_regex
=`echo "$bt"| sed 's/\./[.]/g'`
40 Bootstrap this package from the checked-out sources.
43 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
44 sources reside. Use this if you already
45 have gnulib sources on your machine, and
46 do not want to waste your bandwidth downloading
48 --copy Copy files instead of creating symbolic links.
49 --force Attempt to bootstrap even if the sources seem
50 not to have been checked out.
51 --skip-po Do not download po files.
52 --cvs-user=USERNAME Set the username to use when checking out
53 sources from the gnulib repository.
55 If the file bootstrap.conf exists in the current working directory, its
56 contents are read as shell variables to configure the bootstrap.
58 Running without arguments will suffice in most cases.
64 # Name of the Makefile.am
67 # List of gnulib modules needed.
70 # Any gnulib files needed that are not in modules.
73 # The command to download all .po files for a specified domain into
74 # a specified directory. Fill in the first %s is the domain name, and
75 # the second with the destination directory. Use rsync's -L and -r
76 # options because the latest/%s directory and the .po files within are
78 po_download_command_format
=\
79 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
81 extract_package_name
='
92 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
97 package
=`sed -n "$extract_package_name" configure.ac` || exit
98 gnulib_name
=lib
$package
101 # Extra files from gnulib, which override files from other sources.
103 $build_aux/install-sh
106 $build_aux/texinfo.tex
108 $build_aux/config.guess
109 $build_aux/config.sub
113 # Additional gnulib-tool options to use. Use "\newline" to break lines.
114 gnulib_tool_option_extras
=
116 # Other locale categories that need message catalogs.
117 EXTRA_LOCALE_CATEGORIES
=
119 # Additional xgettext options to use. Use "\\\newline" to break lines.
120 XGETTEXT_OPTIONS
='\\\
121 --flag=_:1:pass-c-format\\\
122 --flag=N_:1:pass-c-format\\\
123 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
126 # Files we don't want to import.
129 # File that should exist in the top directory of a checked out hierarchy,
130 # but not in a distribution tarball.
131 checkout_only_file
=README
-hacking
133 # Whether to use copies instead of symlinks.
136 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
137 # those files to be generated in directories like lib/, m4/, and po/.
138 # Or set it to 'auto' to make this script select which to use based
139 # on which version control system (if any) is used in the source directory.
142 # find_tool ENVVAR NAMES...
143 # -------------------------
146 # Find sha1sum, named gsha1sum on MacPorts.
149 if eval test x
"\$$find_tool_envvar" = x
; then
152 if ($i --version </dev
/null
) >/dev
/null
2>&1; then
158 if test x
"$find_tool_res" = x
; then
159 echo >&2 "$0: $find_tool_name is required"
162 ($find_tool_res --version </dev
/null
) >/dev
/null
2>&1 || {
163 echo >&2 "$0: cannot run $find_tool_res --version"
166 eval "$find_tool_envvar=\"$find_tool_res\""
167 eval "export $find_tool_envvar"
170 # Find sha1sum, named gsha1sum on MacPorts.
171 find_tool SHA1SUM
sha1sum gsha1sum
173 # Override the default configuration, if necessary.
174 test -r bootstrap.conf
&& . .
/bootstrap.conf
176 if test "$vc_ignore" = auto
; then
178 test -d .git
&& vc_ignore
=.gitignore
179 test -d CVS
&& vc_ignore
="$vc_ignore .cvsignore"
182 # Translate configuration into internal form.
193 GNULIB_SRCDIR
=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
195 CVS_USER
=`expr "$option" : '--cvs-user=\(.*\)'`;;
199 checkout_only_file
=;;
203 echo >&2 "$0: $option: unknown option"
208 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
209 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
213 # If $STR is not already on a line by itself in $FILE, insert it,
214 # sorting the new contents of the file and replacing $FILE with the result.
215 insert_sorted_if_absent
() {
218 test -f $file || touch $file
219 echo "$str" | sort -u - $file | cmp -s - $file \
220 || echo "$str" | sort -u - $file -o $file \
224 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
226 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
227 >/dev
/null
&& found_aux_dir
=yes
228 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
229 >/dev
/null
&& found_aux_dir
=yes
230 if test $found_aux_dir = no
; then
231 echo "$0: expected line not found in configure.ac. Add the following:" >&2
232 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
236 # If $build_aux doesn't exist, create it now, otherwise some bits
237 # below will malfunction. If creating it, also mark it as ignored.
238 if test ! -d $build_aux; then
240 for dot_ig
in x
$vc_ignore; do
241 test $dot_ig = x
&& continue
242 insert_sorted_if_absent
$dot_ig $build_aux
246 echo "$0: Bootstrapping from checked-out $package sources..."
256 case ${GNULIB_SRCDIR--} in
258 if [ ! -d gnulib
]; then
259 echo "$0: getting gnulib files..."
261 case ${CVS_AUTH-pserver} in
263 CVS_PREFIX
=':pserver:anonymous@';;
265 CVS_PREFIX
="$CVS_USER${CVS_USER+@}";;
267 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
272 '') CVS_RSH
=ssh; export CVS_RSH
;;
275 trap cleanup_gnulib
1 2 13 15
277 cvs
-z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org
:/cvsroot
/gnulib co gnulib
||
285 gnulib_tool
=$GNULIB_SRCDIR/gnulib
-tool
286 <$gnulib_tool || exit
290 download_po_files
() {
293 echo "$0: getting translations into $subdir for $domain..."
294 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
298 # Download .po files to $po_dir/.reference and copy only the new
299 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
301 # Directory containing primary .po files.
302 # Overwrite them only when we're sure a .po file is new.
306 # Download *.po files into this dir.
307 # Usually contains *.s1 checksum files.
308 ref_po_dir
="$po_dir/.reference"
310 test -d $ref_po_dir || mkdir $ref_po_dir || return
311 download_po_files
$ref_po_dir $domain \
312 && ls "$ref_po_dir"/*.po
2>/dev
/null
|
313 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
315 for po
in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
316 new_po
="$ref_po_dir/$po.po"
317 cksum_file
="$ref_po_dir/$po.s1"
318 if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev
/null
; then
319 echo "updated $po_dir/$po.po..."
320 cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file"
328 update_po_files po
$package || exit
331 if test -d runtime
-po; then
332 update_po_files runtime
-po $package-runtime || exit
343 # If the destination directory doesn't exist, create it.
344 # This is required at least for "lib/uniwidth/cjk.h".
345 dst_dir
=`dirname "$dst"`
346 if ! test -d "$dst_dir"; then
349 # If we've just created a directory like lib/uniwidth,
350 # tell version control system(s) it's ignorable.
351 # FIXME: for now, this does only one level
352 parent
=`dirname "$dst_dir"`
353 for dot_ig
in x
$vc_ignore; do
354 test $dot_ig = x
&& continue
356 insert_sorted_if_absent
$ig `echo "$dst_dir"|sed 's,.*/,,'`
362 test ! -h "$dst" || {
363 echo "$0: rm -f $dst" &&
368 cmp -s "$src" "$dst" || {
369 echo "$0: cp -fp $src $dst" &&
374 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
375 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
376 test "$src_i" = "$dst_i" || {
382 *//* | */..
/* | */.
/* | /*/*/*/*/*/)
383 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
385 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
386 /*/*/*/) dot_dots
=..
/..
/;;
387 /*/*/) dot_dots
=..
/;;
391 echo "$0: ln -fs $dot_dots$src $dst" &&
392 ln -fs "$dot_dots$src" "$dst"
398 cp_mark_as_generated
()
403 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
404 symlink_to_dir
"$GNULIB_SRCDIR" "$cp_dst"
405 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
406 symlink_to_dir
$local_gl_dir "$cp_dst"
409 *.
[ch
]) c1
='/* '; c2
=' */';;
410 *.texi
) c1
='@c '; c2
= ;;
411 *.
m4|*/Make
*|Make
*) c1
='# ' ; c2
= ;;
415 if test -z "$c1"; then
416 cmp -s "$cp_src" "$cp_dst" || {
417 echo "$0: cp -f $cp_src $cp_dst" &&
419 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
422 # Copy the file first to get proper permissions if it
423 # doesn't already exist. Then overwrite the copy.
424 cp "$cp_src" "$cp_dst-t" &&
426 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
427 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
428 sed "s!$bt_regex/!!g" "$cp_src"
430 if cmp -s "$cp_dst-t" "$cp_dst"; then
433 echo "$0: cp $cp_src $cp_dst # with edits" &&
434 mv -f "$cp_dst-t" "$cp_dst"
440 version_controlled_file
() {
445 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null
|
446 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
447 elif test -d .git
; then
448 git
-rm -n "$dir/$file" > /dev
/null
2>&1 && found
=yes
450 echo "$0: no version control for $dir/$file?" >&2
456 for dir
in .
`(cd $1 && find * -type d -print)`; do
459 for file in `ls -a $1/$dir`; do
462 .
*) continue;; # FIXME: should all file names starting with "." be ignored?
464 test -d $1/$dir/$file && continue
465 for excluded_file
in $excluded_files; do
466 test "$dir/$file" = "$excluded_file" && continue 2
468 if test $file = Makefile.am
; then
469 copied
=$copied${sep}$gnulib_mk; sep
=$nl
470 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
471 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
472 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
473 rm -f $dir/$gnulib_mk &&
474 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
476 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
477 version_controlled_file
$dir $file; then
478 echo "$0: $dir/$file overrides $1/$dir/$file"
480 copied
=$copied$sep$file; sep
=$nl
481 if test $file = gettext.
m4; then
482 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
485 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
486 AC_DEFUN([AM_INTL_SUBDIR], [
487 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
488 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
490 AC_DEFUN([gl_LOCK_EARLY], [])
491 ' $1/$dir/$file >$dir/$file
493 cp_mark_as_generated
$1/$dir/$file $dir/$file
498 for dot_ig
in x
$vc_ignore; do
499 test $dot_ig = x
&& continue
501 if test -n "$copied"; then
502 insert_sorted_if_absent
$ig "$copied"
503 # If an ignored file name ends with _.h, then also add
504 # the name with just ".h". Many gnulib headers are generated,
505 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
506 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
507 f
=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
508 insert_sorted_if_absent
$ig "$f"
510 # For files like sys_stat_.h and sys_time_.h, record as
511 # ignorable the directory we might eventually create: sys/.
512 f
=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
513 insert_sorted_if_absent
$ig "$f"
520 # Create boot temporary directories to import from gnulib and gettext.
522 mkdir $bt $bt2 || exit
524 # Import from gnulib.
526 gnulib_tool_options
="\
529 --aux-dir $bt/$build_aux\
533 --source-base $bt/lib/\
534 --tests-base $bt/tests\
535 --local-dir $local_gl_dir\
536 $gnulib_tool_option_extras\
538 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
539 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
542 for file in $gnulib_files; do
543 symlink_to_dir
"$GNULIB_SRCDIR" $file || exit
547 # Import from gettext.
549 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac
>/dev
/null
|| \
552 if test $with_gettext = yes; then
553 echo "$0: (cd $bt2; autopoint) ..."
554 cp configure.ac
$bt2 &&
555 (cd $bt2 && autopoint
&& rm configure.ac
) &&
556 slurp
$bt2 $bt || exit
558 rm -fr $bt $bt2 || exit
561 # Coreutils is unusual in that it generates some of its test-related
562 # Makefile.am files. That must be done before invoking automake.
563 mam_template
=tests
/Makefile.am.
in
564 if test -f $mam_template; then
566 for tool
in cut
head join pr sort tac tail test tr uniq wc; do
567 m
=tests
/$tool/Makefile.am
570 sed -n '1,/^##test-files-begin/p' $mam_template > $t
571 echo "x = $tool" >> $t
573 $PERL -I$srcdir -w -- tests
/mk
-script $srcdir --list >> $t
574 sed -n '/^##test-files-end/,$p' $mam_template >> $t
580 # Reconfigure, getting other files.
584 'aclocal --force -I m4' \
586 'autoheader --force' \
587 'automake --add-missing --copy --force-missing';
589 if test "$command" = libtool
; then
590 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac
>/dev
/null
||
592 command='libtoolize -c -f'
594 echo "$0: $command ..."
599 # Get some extra files from gnulib, overriding existing files.
600 for file in $gnulib_extra_files; do
602 */INSTALL
) dst
=INSTALL
;;
603 build
-aux/*) dst
=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
606 symlink_to_dir
"$GNULIB_SRCDIR" $file $dst || exit
609 if test $with_gettext = yes; then
610 # Create gettext configuration.
611 echo "$0: Creating po/Makevars from po/Makevars.template ..."
614 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
615 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
616 /^XGETTEXT_OPTIONS *=/{
619 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
621 ' po
/Makevars.template
>po
/Makevars
623 if test -d runtime
-po; then
624 # Similarly for runtime-po/Makevars, but not quite the same.
625 rm -f runtime
-po/Makevars
627 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
628 /^subdir *=.*/s/=.*/= runtime-po/
629 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
630 /^XGETTEXT_OPTIONS *=/{
633 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
635 ' <po
/Makevars.template
>runtime
-po/Makevars
637 # Copy identical files from po to runtime-po.
638 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime
-po)
642 echo "$0: done. Now you can run './configure'."