3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
6 # Free Software Foundation, Inc.
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
=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 # -------------------------
145 # Look for some needed program. Use the value of the ENVVAR if set,
146 # otherwise look for the first of the NAMES that can be run (i.e.,
147 # supports --version). If found, set ENVVAR to the program name,
151 # Find sha1sum, named gsha1sum on MacPorts.
155 eval "find_tool_res=\$$find_tool_envvar"
156 if test x
"$find_tool_res" = x
; then
159 if ($i --version </dev
/null
) >/dev
/null
2>&1; then
165 find_tool_error_prefix
="\$$find_tool_envvar: "
167 if test x
"$find_tool_res" = x
; then
168 echo >&2 "$0: one of these is required: $find_tool_names"
171 ($find_tool_res --version </dev
/null
) >/dev
/null
2>&1 || {
172 echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
175 eval "$find_tool_envvar=\$find_tool_res"
176 eval "export $find_tool_envvar"
179 # Find sha1sum, named gsha1sum on MacPorts.
180 find_tool SHA1SUM
sha1sum gsha1sum
182 # Override the default configuration, if necessary.
183 test -r bootstrap.conf
&& . .
/bootstrap.conf
185 if test "$vc_ignore" = auto
; then
187 test -d .git
&& vc_ignore
=.gitignore
188 test -d CVS
&& vc_ignore
="$vc_ignore .cvsignore"
191 # Translate configuration into internal form.
202 GNULIB_SRCDIR
=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
204 CVS_USER
=`expr "$option" : '--cvs-user=\(.*\)'`;;
208 checkout_only_file
=;;
212 echo >&2 "$0: $option: unknown option"
217 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
218 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
222 # If each line in $STR is not already on a line by itself in $FILE, insert it,
223 # sorting the new contents of the file and replacing $FILE with the result.
224 insert_sorted_if_absent
() {
227 test -f $file || touch $file
228 echo "$str" | sort -u - $file | cmp -s - $file \
229 || echo "$str" | sort -u - $file -o $file \
233 # Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
234 # insert_sorted_if_absent.
237 case $vc_ignore_file in
239 # A .gitignore entry that does not start with `/' applies recursively to
240 # subdirectories, so prepend `/' to every .gitignore entry.
241 pattern
=`echo "$2" | sed s,^,/,`;;
245 insert_sorted_if_absent
"$vc_ignore_file" "$pattern"
248 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
250 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
251 >/dev
/null
&& found_aux_dir
=yes
252 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
253 >/dev
/null
&& found_aux_dir
=yes
254 if test $found_aux_dir = no
; then
255 echo "$0: expected line not found in configure.ac. Add the following:" >&2
256 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
260 # If $build_aux doesn't exist, create it now, otherwise some bits
261 # below will malfunction. If creating it, also mark it as ignored.
262 if test ! -d $build_aux; then
264 for dot_ig
in x
$vc_ignore; do
265 test $dot_ig = x
&& continue
266 insert_vc_ignore
$dot_ig $build_aux
270 echo "$0: Bootstrapping from checked-out $package sources..."
278 # See if we can use gnulib's git-merge-changelog merge driver.
280 if test -d .git
&& (git
--version) >/dev
/null
2>/dev
/null
; then
281 if git config merge.merge
-changelog.driver
>/dev
/null
; then
283 elif (git
-merge-changelog --version) >/dev
/null
2>/dev
/null
; then
284 echo "initializing git-merge-changelog driver"
285 git config merge.merge
-changelog.name
'GNU-style ChangeLog merge driver'
286 git config merge.merge
-changelog.driver
'git-merge-changelog %O %A %B'
288 echo "consider installing git-merge-changelog from gnulib"
294 case ${GNULIB_SRCDIR--} in
296 if [ ! -d gnulib
]; then
297 echo "$0: getting gnulib files..."
299 case ${CVS_AUTH-pserver} in
301 CVS_PREFIX
=':pserver:anonymous@';;
303 CVS_PREFIX
="$CVS_USER${CVS_USER+@}";;
305 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
310 '') CVS_RSH
=ssh; export CVS_RSH
;;
313 trap cleanup_gnulib
1 2 13 15
315 cvs
-z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org
:/gnulib.git co
-d gnulib HEAD
||
323 gnulib_tool
=$GNULIB_SRCDIR/gnulib
-tool
324 <$gnulib_tool || exit
328 download_po_files
() {
331 echo "$0: getting translations into $subdir for $domain..."
332 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
336 # Download .po files to $po_dir/.reference and copy only the new
337 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
339 # Directory containing primary .po files.
340 # Overwrite them only when we're sure a .po file is new.
344 # Download *.po files into this dir.
345 # Usually contains *.s1 checksum files.
346 ref_po_dir
="$po_dir/.reference"
348 test -d $ref_po_dir || mkdir $ref_po_dir || return
349 download_po_files
$ref_po_dir $domain \
350 && ls "$ref_po_dir"/*.po
2>/dev
/null
|
351 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
353 for po
in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
354 new_po
="$ref_po_dir/$po.po"
355 cksum_file
="$ref_po_dir/$po.s1"
356 if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev
/null
; then
357 echo "updated $po_dir/$po.po..."
358 cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file"
366 update_po_files po
$package || exit
369 if test -d runtime
-po; then
370 update_po_files runtime
-po $package-runtime || exit
377 # If the destination directory doesn't exist, create it.
378 # This is required at least for "lib/uniwidth/cjk.h".
379 dst_dir
=`dirname "$dst"`
380 if ! test -d "$dst_dir"; then
383 # If we've just created a directory like lib/uniwidth,
384 # tell version control system(s) it's ignorable.
385 # FIXME: for now, this does only one level
386 parent
=`dirname "$dst_dir"`
387 for dot_ig
in x
$vc_ignore; do
388 test $dot_ig = x
&& continue
390 insert_vc_ignore
$ig `echo "$dst_dir"|sed 's,.*/,,'`
406 test ! -h "$dst" || {
407 echo "$0: rm -f $dst" &&
412 cmp -s "$src" "$dst" || {
413 echo "$0: cp -fp $src $dst" &&
418 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
419 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
420 test "$src_i" = "$dst_i" || {
426 *//* | */..
/* | */.
/* | /*/*/*/*/*/)
427 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
429 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
430 /*/*/*/) dot_dots
=..
/..
/;;
431 /*/*/) dot_dots
=..
/;;
435 echo "$0: ln -fs $dot_dots$src $dst" &&
436 ln -fs "$dot_dots$src" "$dst"
442 cp_mark_as_generated
()
447 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
448 symlink_to_dir
"$GNULIB_SRCDIR" "$cp_dst"
449 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
450 symlink_to_dir
$local_gl_dir "$cp_dst"
453 *.
[ch
]) c1
='/* '; c2
=' */';;
454 *.texi
) c1
='@c '; c2
= ;;
455 *.
m4|*/Make
*|Make
*) c1
='# ' ; c2
= ;;
459 if test -z "$c1"; then
460 cmp -s "$cp_src" "$cp_dst" || {
461 echo "$0: cp -f $cp_src $cp_dst" &&
463 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
466 check_dst_dir
"$cp_dst"
467 # Copy the file first to get proper permissions if it
468 # doesn't already exist. Then overwrite the copy.
469 cp "$cp_src" "$cp_dst-t" &&
471 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
472 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
473 sed "s!$bt_regex/!!g" "$cp_src"
475 if cmp -s "$cp_dst-t" "$cp_dst"; then
478 echo "$0: cp $cp_src $cp_dst # with edits" &&
479 mv -f "$cp_dst-t" "$cp_dst"
485 version_controlled_file
() {
490 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null
|
491 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
492 elif test -d .git
; then
493 git
-rm -n "$dir/$file" > /dev
/null
2>&1 && found
=yes
495 echo "$0: no version control for $dir/$file?" >&2
501 for dir
in .
`(cd $1 && find * -type d -print)`; do
504 for file in `ls -a $1/$dir`; do
507 .
*) continue;; # FIXME: should all file names starting with "." be ignored?
509 test -d $1/$dir/$file && continue
510 for excluded_file
in $excluded_files; do
511 test "$dir/$file" = "$excluded_file" && continue 2
513 if test $file = Makefile.am
; then
514 copied
=$copied${sep}$gnulib_mk; sep
=$nl
515 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
516 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
517 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
518 rm -f $dir/$gnulib_mk &&
519 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
521 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
522 version_controlled_file
$dir $file; then
523 echo "$0: $dir/$file overrides $1/$dir/$file"
525 copied
=$copied$sep$file; sep
=$nl
526 if test $file = gettext.
m4; then
527 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
530 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
531 AC_DEFUN([AM_INTL_SUBDIR], [
532 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
533 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
535 AC_DEFUN([gl_LOCK_EARLY], [])
536 ' $1/$dir/$file >$dir/$file
538 cp_mark_as_generated
$1/$dir/$file $dir/$file
543 for dot_ig
in x
$vc_ignore; do
544 test $dot_ig = x
&& continue
546 if test -n "$copied"; then
547 insert_vc_ignore
$ig "$copied"
548 # If an ignored file name ends with _.h, then also add
549 # the name with just ".h". Many gnulib headers are generated,
550 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
551 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
552 f
=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
553 insert_vc_ignore
$ig "$f"
555 # For files like sys_stat_.h and sys_time_.h, record as
556 # ignorable the directory we might eventually create: sys/.
557 f
=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
558 insert_vc_ignore
$ig "$f"
565 # Create boot temporary directories to import from gnulib and gettext.
567 mkdir $bt $bt2 || exit
569 # Import from gnulib.
571 gnulib_tool_options
="\
574 --aux-dir $bt/$build_aux\
578 --source-base $bt/lib/\
579 --tests-base $bt/tests\
580 --local-dir $local_gl_dir\
581 $gnulib_tool_option_extras\
583 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
584 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
587 for file in $gnulib_files; do
588 symlink_to_dir
"$GNULIB_SRCDIR" $file || exit
592 # Import from gettext.
594 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac
>/dev
/null
|| \
597 if test $with_gettext = yes; then
598 echo "$0: (cd $bt2; autopoint) ..."
599 cp configure.ac
$bt2 &&
600 (cd $bt2 && autopoint
&& rm configure.ac
) &&
601 slurp
$bt2 $bt || exit
603 rm -fr $bt $bt2 || exit
606 # Coreutils is unusual in that it generates some of its test-related
607 # Makefile.am files. That must be done before invoking automake.
608 mam_template
=tests
/Makefile.am.
in
609 if test -f $mam_template; then
611 for tool
in cut
head join pr sort tac tail test tr uniq wc; do
612 m
=tests
/$tool/Makefile.am
615 sed -n '1,/^##test-files-begin/p' $mam_template > $t
616 echo "x = $tool" >> $t
618 $PERL -I$srcdir -w -- tests
/mk
-script $srcdir --list >> $t
619 sed -n '/^##test-files-end/,$p' $mam_template >> $t
625 # Reconfigure, getting other files.
629 'aclocal --force -I m4' \
631 'autoheader --force' \
632 'automake --add-missing --copy --force-missing';
634 if test "$command" = libtool
; then
635 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac
>/dev
/null
||
637 command='libtoolize -c -f'
639 echo "$0: $command ..."
644 # Get some extra files from gnulib, overriding existing files.
645 for file in $gnulib_extra_files; do
647 */INSTALL
) dst
=INSTALL
;;
648 build
-aux/*) dst
=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
651 symlink_to_dir
"$GNULIB_SRCDIR" $file $dst || exit
654 if test $with_gettext = yes; then
655 # Create gettext configuration.
656 echo "$0: Creating po/Makevars from po/Makevars.template ..."
659 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
660 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
661 /^XGETTEXT_OPTIONS *=/{
664 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
666 ' po
/Makevars.template
>po
/Makevars
668 if test -d runtime
-po; then
669 # Similarly for runtime-po/Makevars, but not quite the same.
670 rm -f runtime
-po/Makevars
672 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
673 /^subdir *=.*/s/=.*/= runtime-po/
674 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
675 /^XGETTEXT_OPTIONS *=/{
678 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
680 ' <po
/Makevars.template
>runtime
-po/Makevars
682 # Copy identical files from po to runtime-po.
683 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime
-po)
687 echo "$0: done. Now you can run './configure'."