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 each line in $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 # Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
226 # insert_sorted_if_absent.
229 case $vc_ignore_file in
231 # A .gitignore entry that does not start with `/' applies recursively to
232 # subdirectories, so prepend `/' to every .gitignore entry.
233 pattern
=`echo "$2" | sed s,^,/,`;;
237 insert_sorted_if_absent
"$vc_ignore_file" "$pattern"
240 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
242 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
243 >/dev
/null
&& found_aux_dir
=yes
244 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
245 >/dev
/null
&& found_aux_dir
=yes
246 if test $found_aux_dir = no
; then
247 echo "$0: expected line not found in configure.ac. Add the following:" >&2
248 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
252 # If $build_aux doesn't exist, create it now, otherwise some bits
253 # below will malfunction. If creating it, also mark it as ignored.
254 if test ! -d $build_aux; then
256 for dot_ig
in x
$vc_ignore; do
257 test $dot_ig = x
&& continue
258 insert_vc_ignore
$dot_ig $build_aux
262 echo "$0: Bootstrapping from checked-out $package sources..."
272 case ${GNULIB_SRCDIR--} in
274 if [ ! -d gnulib
]; then
275 echo "$0: getting gnulib files..."
277 case ${CVS_AUTH-pserver} in
279 CVS_PREFIX
=':pserver:anonymous@';;
281 CVS_PREFIX
="$CVS_USER${CVS_USER+@}";;
283 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
288 '') CVS_RSH
=ssh; export CVS_RSH
;;
291 trap cleanup_gnulib
1 2 13 15
293 cvs
-z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org
:/gnulib.git co
-d gnulib HEAD
||
301 gnulib_tool
=$GNULIB_SRCDIR/gnulib
-tool
302 <$gnulib_tool || exit
306 download_po_files
() {
309 echo "$0: getting translations into $subdir for $domain..."
310 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
314 # Download .po files to $po_dir/.reference and copy only the new
315 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
317 # Directory containing primary .po files.
318 # Overwrite them only when we're sure a .po file is new.
322 # Download *.po files into this dir.
323 # Usually contains *.s1 checksum files.
324 ref_po_dir
="$po_dir/.reference"
326 test -d $ref_po_dir || mkdir $ref_po_dir || return
327 download_po_files
$ref_po_dir $domain \
328 && ls "$ref_po_dir"/*.po
2>/dev
/null
|
329 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
331 for po
in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
332 new_po
="$ref_po_dir/$po.po"
333 cksum_file
="$ref_po_dir/$po.s1"
334 if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev
/null
; then
335 echo "updated $po_dir/$po.po..."
336 cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file"
344 update_po_files po
$package || exit
347 if test -d runtime
-po; then
348 update_po_files runtime
-po $package-runtime || exit
355 # If the destination directory doesn't exist, create it.
356 # This is required at least for "lib/uniwidth/cjk.h".
357 dst_dir
=`dirname "$dst"`
358 if ! test -d "$dst_dir"; then
361 # If we've just created a directory like lib/uniwidth,
362 # tell version control system(s) it's ignorable.
363 # FIXME: for now, this does only one level
364 parent
=`dirname "$dst_dir"`
365 for dot_ig
in x
$vc_ignore; do
366 test $dot_ig = x
&& continue
368 insert_vc_ignore
$ig `echo "$dst_dir"|sed 's,.*/,,'`
384 test ! -h "$dst" || {
385 echo "$0: rm -f $dst" &&
390 cmp -s "$src" "$dst" || {
391 echo "$0: cp -fp $src $dst" &&
396 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
397 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
398 test "$src_i" = "$dst_i" || {
404 *//* | */..
/* | */.
/* | /*/*/*/*/*/)
405 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
407 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
408 /*/*/*/) dot_dots
=..
/..
/;;
409 /*/*/) dot_dots
=..
/;;
413 echo "$0: ln -fs $dot_dots$src $dst" &&
414 ln -fs "$dot_dots$src" "$dst"
420 cp_mark_as_generated
()
425 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
426 symlink_to_dir
"$GNULIB_SRCDIR" "$cp_dst"
427 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
428 symlink_to_dir
$local_gl_dir "$cp_dst"
431 *.
[ch
]) c1
='/* '; c2
=' */';;
432 *.texi
) c1
='@c '; c2
= ;;
433 *.
m4|*/Make
*|Make
*) c1
='# ' ; c2
= ;;
437 if test -z "$c1"; then
438 cmp -s "$cp_src" "$cp_dst" || {
439 echo "$0: cp -f $cp_src $cp_dst" &&
441 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
444 check_dst_dir
"$cp_dst"
445 # Copy the file first to get proper permissions if it
446 # doesn't already exist. Then overwrite the copy.
447 cp "$cp_src" "$cp_dst-t" &&
449 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
450 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
451 sed "s!$bt_regex/!!g" "$cp_src"
453 if cmp -s "$cp_dst-t" "$cp_dst"; then
456 echo "$0: cp $cp_src $cp_dst # with edits" &&
457 mv -f "$cp_dst-t" "$cp_dst"
463 version_controlled_file
() {
468 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null
|
469 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
470 elif test -d .git
; then
471 git
-rm -n "$dir/$file" > /dev
/null
2>&1 && found
=yes
473 echo "$0: no version control for $dir/$file?" >&2
479 for dir
in .
`(cd $1 && find * -type d -print)`; do
482 for file in `ls -a $1/$dir`; do
485 .
*) continue;; # FIXME: should all file names starting with "." be ignored?
487 test -d $1/$dir/$file && continue
488 for excluded_file
in $excluded_files; do
489 test "$dir/$file" = "$excluded_file" && continue 2
491 if test $file = Makefile.am
; then
492 copied
=$copied${sep}$gnulib_mk; sep
=$nl
493 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
494 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
495 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
496 rm -f $dir/$gnulib_mk &&
497 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
499 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
500 version_controlled_file
$dir $file; then
501 echo "$0: $dir/$file overrides $1/$dir/$file"
503 copied
=$copied$sep$file; sep
=$nl
504 if test $file = gettext.
m4; then
505 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
508 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
509 AC_DEFUN([AM_INTL_SUBDIR], [
510 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
511 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
513 AC_DEFUN([gl_LOCK_EARLY], [])
514 ' $1/$dir/$file >$dir/$file
516 cp_mark_as_generated
$1/$dir/$file $dir/$file
521 for dot_ig
in x
$vc_ignore; do
522 test $dot_ig = x
&& continue
524 if test -n "$copied"; then
525 insert_vc_ignore
$ig "$copied"
526 # If an ignored file name ends with _.h, then also add
527 # the name with just ".h". Many gnulib headers are generated,
528 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
529 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
530 f
=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
531 insert_vc_ignore
$ig "$f"
533 # For files like sys_stat_.h and sys_time_.h, record as
534 # ignorable the directory we might eventually create: sys/.
535 f
=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
536 insert_vc_ignore
$ig "$f"
543 # Create boot temporary directories to import from gnulib and gettext.
545 mkdir $bt $bt2 || exit
547 # Import from gnulib.
549 gnulib_tool_options
="\
552 --aux-dir $bt/$build_aux\
556 --source-base $bt/lib/\
557 --tests-base $bt/tests\
558 --local-dir $local_gl_dir\
559 $gnulib_tool_option_extras\
561 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
562 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
565 for file in $gnulib_files; do
566 symlink_to_dir
"$GNULIB_SRCDIR" $file || exit
570 # Import from gettext.
572 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac
>/dev
/null
|| \
575 if test $with_gettext = yes; then
576 echo "$0: (cd $bt2; autopoint) ..."
577 cp configure.ac
$bt2 &&
578 (cd $bt2 && autopoint
&& rm configure.ac
) &&
579 slurp
$bt2 $bt || exit
581 rm -fr $bt $bt2 || exit
584 # Coreutils is unusual in that it generates some of its test-related
585 # Makefile.am files. That must be done before invoking automake.
586 mam_template
=tests
/Makefile.am.
in
587 if test -f $mam_template; then
589 for tool
in cut
head join pr sort tac tail test tr uniq wc; do
590 m
=tests
/$tool/Makefile.am
593 sed -n '1,/^##test-files-begin/p' $mam_template > $t
594 echo "x = $tool" >> $t
596 $PERL -I$srcdir -w -- tests
/mk
-script $srcdir --list >> $t
597 sed -n '/^##test-files-end/,$p' $mam_template >> $t
603 # FIXME: Gnulib should be patched to add "/" in front of .gitignore entries
604 # instead. Anyway, this hack must be done before invoking autoconf so that
605 # build-aux/git-version-gen doesn't think the version is dirty because
606 # .gitignore isn't committed.
607 grep -v '^GNUmakefile$' .gitignore
> .gitignore~
&& mv .gitignore~ .gitignore
609 # Reconfigure, getting other files.
613 'aclocal --force -I m4' \
615 'autoheader --force' \
616 'automake --add-missing --copy --force-missing';
618 if test "$command" = libtool
; then
619 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac
>/dev
/null
||
621 command='libtoolize -c -f'
623 echo "$0: $command ..."
628 # Get some extra files from gnulib, overriding existing files.
629 for file in $gnulib_extra_files; do
631 */INSTALL
) dst
=INSTALL
;;
632 build
-aux/*) dst
=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
635 symlink_to_dir
"$GNULIB_SRCDIR" $file $dst || exit
638 if test $with_gettext = yes; then
639 # Create gettext configuration.
640 echo "$0: Creating po/Makevars from po/Makevars.template ..."
643 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
644 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
645 /^XGETTEXT_OPTIONS *=/{
648 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
650 ' po
/Makevars.template
>po
/Makevars
652 if test -d runtime
-po; then
653 # Similarly for runtime-po/Makevars, but not quite the same.
654 rm -f runtime
-po/Makevars
656 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
657 /^subdir *=.*/s/=.*/= runtime-po/
658 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
659 /^XGETTEXT_OPTIONS *=/{
662 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
664 ' <po
/Makevars.template
>runtime
-po/Makevars
666 # Copy identical files from po to runtime-po.
667 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime
-po)
671 echo "$0: done. Now you can run './configure'."