3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation,
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 # Written by Paul Eggert.
26 # Ensure file names are sorted consistently across platforms.
27 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
33 # Temporary directory names.
35 bt_regex
=`echo "$bt"| sed 's/\./[.]/g'`
41 Bootstrap this package from the checked-out sources.
44 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
45 sources reside. Use this if you already
46 have gnulib sources on your machine, and
47 do not want to waste your bandwidth downloading
49 --copy Copy files instead of creating symbolic links.
50 --force Attempt to bootstrap even if the sources seem
51 not to have been checked out.
52 --skip-po Do not download po files.
53 --cvs-user=USERNAME Set the username to use when checking out
54 sources from the gnulib repository.
56 If the file bootstrap.conf exists in the current working directory, its
57 contents are read as shell variables to configure the bootstrap.
59 Running without arguments will suffice in most cases.
65 # Name of the Makefile.am
68 # List of gnulib modules needed.
71 # Any gnulib files needed that are not in modules.
74 # The command to download all .po files for a specified domain into
75 # a specified directory. Fill in the first %s is the domain name, and
76 # the second with the destination directory. Use rsync's -L and -r
77 # options because the latest/%s directory and the .po files within are
79 po_download_command_format
=\
80 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
82 extract_package_name
='
93 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
98 package
=`sed -n "$extract_package_name" configure.ac` || exit
99 gnulib_name
=lib
$package
102 # Extra files from gnulib, which override files from other sources.
104 $build_aux/install-sh
107 $build_aux/texinfo.tex
109 $build_aux/config.guess
110 $build_aux/config.sub
114 # Additional gnulib-tool options to use. Use "\newline" to break lines.
115 gnulib_tool_option_extras
=
117 # Other locale categories that need message catalogs.
118 EXTRA_LOCALE_CATEGORIES
=
120 # Additional xgettext options to use. Use "\\\newline" to break lines.
121 XGETTEXT_OPTIONS
='\\\
122 --flag=_:1:pass-c-format\\\
123 --flag=N_:1:pass-c-format\\\
124 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
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 # find_tool ENVVAR NAMES...
144 # -------------------------
147 # Find sha1sum, named gsha1sum on MacPorts.
150 if eval test x
"\$$find_tool_envvar" = x
; then
153 if ($i --version </dev
/null
) >/dev
/null
2>&1; then
159 if test x
"$find_tool_res" = x
; then
160 echo >&2 "$0: $find_tool_name is required"
163 ($find_tool_res --version </dev
/null
) >/dev
/null
2>&1 || {
164 echo >&2 "$0: cannot run $find_tool_res --version"
167 eval "$find_tool_envvar=\"$find_tool_res\""
168 eval "export $find_tool_envvar"
171 # Find sha1sum, named gsha1sum on MacPorts.
172 find_tool SHA1SUM
sha1sum gsha1sum
174 # Override the default configuration, if necessary.
175 test -r bootstrap.conf
&& . .
/bootstrap.conf
177 if test "$vc_ignore" = auto
; then
179 test -d .git
&& vc_ignore
=.gitignore
180 test -d CVS
&& vc_ignore
="$vc_ignore .cvsignore"
183 # Translate configuration into internal form.
194 GNULIB_SRCDIR
=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
196 CVS_USER
=`expr "$option" : '--cvs-user=\(.*\)'`;;
200 checkout_only_file
=;;
204 echo >&2 "$0: $option: unknown option"
209 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
210 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
214 # If $STR is not already on a line by itself in $FILE, insert it,
215 # sorting the new contents of the file and replacing $FILE with the result.
216 insert_sorted_if_absent
() {
219 test -f $file || touch $file
220 echo "$str" | sort -u - $file | cmp -s - $file \
221 || echo "$str" | sort -u - $file -o $file \
225 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
227 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
228 >/dev
/null
&& found_aux_dir
=yes
229 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
230 >/dev
/null
&& found_aux_dir
=yes
231 if test $found_aux_dir = no
; then
232 echo "$0: expected line not found in configure.ac. Add the following:" >&2
233 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
237 # If $build_aux doesn't exist, create it now, otherwise some bits
238 # below will malfunction. If creating it, also mark it as ignored.
239 if test ! -d $build_aux; then
241 for dot_ig
in x
$vc_ignore; do
242 test $dot_ig = x
&& continue
243 insert_sorted_if_absent
$dot_ig $build_aux
247 echo "$0: Bootstrapping from checked-out $package sources..."
257 case ${GNULIB_SRCDIR--} in
259 if [ ! -d gnulib
]; then
260 echo "$0: getting gnulib files..."
262 case ${CVS_AUTH-pserver} in
264 CVS_PREFIX
=':pserver:anonymous@';;
266 CVS_PREFIX
="$CVS_USER${CVS_USER+@}";;
268 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
273 '') CVS_RSH
=ssh; export CVS_RSH
;;
276 trap cleanup_gnulib
1 2 13 15
278 cvs
-z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org
:/gnulib.git co
-d gnulib HEAD
||
286 gnulib_tool
=$GNULIB_SRCDIR/gnulib
-tool
287 <$gnulib_tool || exit
291 download_po_files
() {
294 echo "$0: getting translations into $subdir for $domain..."
295 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
299 # Download .po files to $po_dir/.reference and copy only the new
300 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
302 # Directory containing primary .po files.
303 # Overwrite them only when we're sure a .po file is new.
307 # Download *.po files into this dir.
308 # Usually contains *.s1 checksum files.
309 ref_po_dir
="$po_dir/.reference"
311 test -d $ref_po_dir || mkdir $ref_po_dir || return
312 download_po_files
$ref_po_dir $domain \
313 && ls "$ref_po_dir"/*.po
2>/dev
/null
|
314 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
316 for po
in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
317 new_po
="$ref_po_dir/$po.po"
318 cksum_file
="$ref_po_dir/$po.s1"
319 if ! "$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
340 # If the destination directory doesn't exist, create it.
341 # This is required at least for "lib/uniwidth/cjk.h".
342 dst_dir
=`dirname "$dst"`
343 if ! test -d "$dst_dir"; then
346 # If we've just created a directory like lib/uniwidth,
347 # tell version control system(s) it's ignorable.
348 # FIXME: for now, this does only one level
349 parent
=`dirname "$dst_dir"`
350 for dot_ig
in x
$vc_ignore; do
351 test $dot_ig = x
&& continue
353 insert_sorted_if_absent
$ig `echo "$dst_dir"|sed 's,.*/,,'`
369 test ! -h "$dst" || {
370 echo "$0: rm -f $dst" &&
375 cmp -s "$src" "$dst" || {
376 echo "$0: cp -fp $src $dst" &&
381 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
382 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
383 test "$src_i" = "$dst_i" || {
389 *//* | */..
/* | */.
/* | /*/*/*/*/*/)
390 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
392 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
393 /*/*/*/) dot_dots
=..
/..
/;;
394 /*/*/) dot_dots
=..
/;;
398 echo "$0: ln -fs $dot_dots$src $dst" &&
399 ln -fs "$dot_dots$src" "$dst"
405 cp_mark_as_generated
()
410 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
411 symlink_to_dir
"$GNULIB_SRCDIR" "$cp_dst"
412 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
413 symlink_to_dir
$local_gl_dir "$cp_dst"
416 *.
[ch
]) c1
='/* '; c2
=' */';;
417 *.texi
) c1
='@c '; c2
= ;;
418 *.
m4|*/Make
*|Make
*) c1
='# ' ; c2
= ;;
422 if test -z "$c1"; then
423 cmp -s "$cp_src" "$cp_dst" || {
424 echo "$0: cp -f $cp_src $cp_dst" &&
426 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
429 check_dst_dir
"$cp_dst"
430 # Copy the file first to get proper permissions if it
431 # doesn't already exist. Then overwrite the copy.
432 cp "$cp_src" "$cp_dst-t" &&
434 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
435 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
436 sed "s!$bt_regex/!!g" "$cp_src"
438 if cmp -s "$cp_dst-t" "$cp_dst"; then
441 echo "$0: cp $cp_src $cp_dst # with edits" &&
442 mv -f "$cp_dst-t" "$cp_dst"
448 version_controlled_file
() {
453 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null
|
454 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
455 elif test -d .git
; then
456 git
-rm -n "$dir/$file" > /dev
/null
2>&1 && found
=yes
458 echo "$0: no version control for $dir/$file?" >&2
464 for dir
in .
`(cd $1 && find * -type d -print)`; do
467 for file in `ls -a $1/$dir`; do
470 .
*) continue;; # FIXME: should all file names starting with "." be ignored?
472 test -d $1/$dir/$file && continue
473 for excluded_file
in $excluded_files; do
474 test "$dir/$file" = "$excluded_file" && continue 2
476 if test $file = Makefile.am
; then
477 copied
=$copied${sep}$gnulib_mk; sep
=$nl
478 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
479 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
480 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
481 rm -f $dir/$gnulib_mk &&
482 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
484 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
485 version_controlled_file
$dir $file; then
486 echo "$0: $dir/$file overrides $1/$dir/$file"
488 copied
=$copied$sep$file; sep
=$nl
489 if test $file = gettext.
m4; then
490 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
493 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
494 AC_DEFUN([AM_INTL_SUBDIR], [
495 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
496 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
498 AC_DEFUN([gl_LOCK_EARLY], [])
499 ' $1/$dir/$file >$dir/$file
501 cp_mark_as_generated
$1/$dir/$file $dir/$file
506 for dot_ig
in x
$vc_ignore; do
507 test $dot_ig = x
&& continue
509 if test -n "$copied"; then
510 insert_sorted_if_absent
$ig "$copied"
511 # If an ignored file name ends with _.h, then also add
512 # the name with just ".h". Many gnulib headers are generated,
513 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
514 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
515 f
=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
516 insert_sorted_if_absent
$ig "$f"
518 # For files like sys_stat_.h and sys_time_.h, record as
519 # ignorable the directory we might eventually create: sys/.
520 f
=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
521 insert_sorted_if_absent
$ig "$f"
528 # Create boot temporary directories to import from gnulib and gettext.
530 mkdir $bt $bt2 || exit
532 # Import from gnulib.
534 gnulib_tool_options
="\
537 --aux-dir $bt/$build_aux\
541 --source-base $bt/lib/\
542 --tests-base $bt/tests\
543 --local-dir $local_gl_dir\
544 $gnulib_tool_option_extras\
546 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
547 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
550 for file in $gnulib_files; do
551 symlink_to_dir
"$GNULIB_SRCDIR" $file || exit
555 # Import from gettext.
557 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac
>/dev
/null
|| \
560 if test $with_gettext = yes; then
561 echo "$0: (cd $bt2; autopoint) ..."
562 cp configure.ac
$bt2 &&
563 (cd $bt2 && autopoint
&& rm configure.ac
) &&
564 slurp
$bt2 $bt || exit
566 rm -fr $bt $bt2 || exit
569 # Coreutils is unusual in that it generates some of its test-related
570 # Makefile.am files. That must be done before invoking automake.
571 mam_template
=tests
/Makefile.am.
in
572 if test -f $mam_template; then
574 for tool
in cut
head join pr sort tac tail test tr uniq wc; do
575 m
=tests
/$tool/Makefile.am
578 sed -n '1,/^##test-files-begin/p' $mam_template > $t
579 echo "x = $tool" >> $t
581 $PERL -I$srcdir -w -- tests
/mk
-script $srcdir --list >> $t
582 sed -n '/^##test-files-end/,$p' $mam_template >> $t
588 # Reconfigure, getting other files.
592 'aclocal --force -I m4' \
594 'autoheader --force' \
595 'automake --add-missing --copy --force-missing';
597 if test "$command" = libtool
; then
598 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac
>/dev
/null
||
600 command='libtoolize -c -f'
602 echo "$0: $command ..."
607 # Get some extra files from gnulib, overriding existing files.
608 for file in $gnulib_extra_files; do
610 */INSTALL
) dst
=INSTALL
;;
611 build
-aux/*) dst
=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
614 symlink_to_dir
"$GNULIB_SRCDIR" $file $dst || exit
617 if test $with_gettext = yes; then
618 # Create gettext configuration.
619 echo "$0: Creating po/Makevars from po/Makevars.template ..."
622 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
623 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
624 /^XGETTEXT_OPTIONS *=/{
627 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
629 ' po
/Makevars.template
>po
/Makevars
631 if test -d runtime
-po; then
632 # Similarly for runtime-po/Makevars, but not quite the same.
633 rm -f runtime
-po/Makevars
635 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
636 /^subdir *=.*/s/=.*/= runtime-po/
637 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
638 /^XGETTEXT_OPTIONS *=/{
641 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
643 ' <po
/Makevars.template
>runtime
-po/Makevars
645 # Copy identical files from po to runtime-po.
646 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime
-po)
650 echo "$0: done. Now you can run './configure'."