3 # Bootstrap this package from checked-out sources.
5 # Copyright (C) 2003-2010 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
=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 # -------------------------
144 # Look for some needed program. Use the value of the ENVVAR if set,
145 # otherwise look for the first of the NAMES that can be run (i.e.,
146 # supports --version). If found, set ENVVAR to the program name,
150 # Find sha1sum, named gsha1sum on MacPorts.
154 eval "find_tool_res=\$$find_tool_envvar"
155 if test x
"$find_tool_res" = x
; then
158 if ($i --version </dev
/null
) >/dev
/null
2>&1; then
164 find_tool_error_prefix
="\$$find_tool_envvar: "
166 if test x
"$find_tool_res" = x
; then
167 echo >&2 "$0: one of these is required: $find_tool_names"
170 ($find_tool_res --version </dev
/null
) >/dev
/null
2>&1 || {
171 echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
174 eval "$find_tool_envvar=\$find_tool_res"
175 eval "export $find_tool_envvar"
178 # Find sha1sum, named gsha1sum on MacPorts.
179 find_tool SHA1SUM
sha1sum gsha1sum
181 # Override the default configuration, if necessary.
182 test -r bootstrap.conf
&& . .
/bootstrap.conf
184 if test "$vc_ignore" = auto
; then
186 test -d .git
&& vc_ignore
=.gitignore
187 test -d CVS
&& vc_ignore
="$vc_ignore .cvsignore"
190 # Translate configuration into internal form.
201 GNULIB_SRCDIR
=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
203 CVS_USER
=`expr "$option" : '--cvs-user=\(.*\)'`;;
207 checkout_only_file
=;;
211 echo >&2 "$0: $option: unknown option"
216 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
217 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
221 # If each line in $STR is not already on a line by itself in $FILE, insert it,
222 # sorting the new contents of the file and replacing $FILE with the result.
223 insert_sorted_if_absent
() {
226 test -f $file || touch $file
227 echo "$str" | sort -u - $file | cmp -s - $file \
228 || echo "$str" | sort -u - $file -o $file \
232 # Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
233 # insert_sorted_if_absent.
236 case $vc_ignore_file in
238 # A .gitignore entry that does not start with `/' applies recursively to
239 # subdirectories, so prepend `/' to every .gitignore entry.
240 pattern
=`echo "$2" | sed s,^,/,`;;
244 insert_sorted_if_absent
"$vc_ignore_file" "$pattern"
247 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
249 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
250 >/dev
/null
&& found_aux_dir
=yes
251 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
252 >/dev
/null
&& found_aux_dir
=yes
253 if test $found_aux_dir = no
; then
254 echo "$0: expected line not found in configure.ac. Add the following:" >&2
255 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
259 # If $build_aux doesn't exist, create it now, otherwise some bits
260 # below will malfunction. If creating it, also mark it as ignored.
261 if test ! -d $build_aux; then
263 for dot_ig
in x
$vc_ignore; do
264 test $dot_ig = x
&& continue
265 insert_vc_ignore
$dot_ig $build_aux
269 echo "$0: Bootstrapping from checked-out $package sources..."
277 # See if we can use gnulib's git-merge-changelog merge driver.
279 if test -d .git
&& (git
--version) >/dev
/null
2>/dev
/null
; then
280 if git config merge.merge
-changelog.driver
>/dev
/null
; then
282 elif (git
-merge-changelog --version) >/dev
/null
2>/dev
/null
; then
283 echo "initializing git-merge-changelog driver"
284 git config merge.merge
-changelog.name
'GNU-style ChangeLog merge driver'
285 git config merge.merge
-changelog.driver
'git-merge-changelog %O %A %B'
287 echo "consider installing git-merge-changelog from gnulib"
293 case ${GNULIB_SRCDIR--} in
295 if [ ! -d gnulib
]; then
296 echo "$0: getting gnulib files..."
298 case ${CVS_AUTH-pserver} in
300 CVS_PREFIX
=':pserver:anonymous@';;
302 CVS_PREFIX
="$CVS_USER${CVS_USER+@}";;
304 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
309 '') CVS_RSH
=ssh; export CVS_RSH
;;
312 trap cleanup_gnulib
1 2 13 15
314 cvs
-z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org
:/gnulib.git co
-d gnulib HEAD
||
322 gnulib_tool
=$GNULIB_SRCDIR/gnulib
-tool
323 <$gnulib_tool || exit
327 download_po_files
() {
330 echo "$0: getting translations into $subdir for $domain..."
331 cmd
=`printf "$po_download_command_format" "$domain" "$subdir"`
335 # Download .po files to $po_dir/.reference and copy only the new
336 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
338 # Directory containing primary .po files.
339 # Overwrite them only when we're sure a .po file is new.
343 # Download *.po files into this dir.
344 # Usually contains *.s1 checksum files.
345 ref_po_dir
="$po_dir/.reference"
347 test -d $ref_po_dir || mkdir $ref_po_dir || return
348 download_po_files
$ref_po_dir $domain \
349 && ls "$ref_po_dir"/*.po
2>/dev
/null
|
350 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
352 for po
in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
353 new_po
="$ref_po_dir/$po.po"
354 cksum_file
="$ref_po_dir/$po.s1"
355 if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev
/null
; then
356 echo "updated $po_dir/$po.po..."
357 cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file"
365 update_po_files po
$package || exit
368 if test -d runtime
-po; then
369 update_po_files runtime
-po $package-runtime || exit
376 # If the destination directory doesn't exist, create it.
377 # This is required at least for "lib/uniwidth/cjk.h".
378 dst_dir
=`dirname "$dst"`
379 if ! test -d "$dst_dir"; then
382 # If we've just created a directory like lib/uniwidth,
383 # tell version control system(s) it's ignorable.
384 # FIXME: for now, this does only one level
385 parent
=`dirname "$dst_dir"`
386 for dot_ig
in x
$vc_ignore; do
387 test $dot_ig = x
&& continue
389 insert_vc_ignore
$ig `echo "$dst_dir"|sed 's,.*/,,'`
405 test ! -h "$dst" || {
406 echo "$0: rm -f $dst" &&
411 cmp -s "$src" "$dst" || {
412 echo "$0: cp -fp $src $dst" &&
417 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
418 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
419 test "$src_i" = "$dst_i" || {
425 *//* | */..
/* | */.
/* | /*/*/*/*/*/)
426 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
428 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
429 /*/*/*/) dot_dots
=..
/..
/;;
430 /*/*/) dot_dots
=..
/;;
434 echo "$0: ln -fs $dot_dots$src $dst" &&
435 ln -fs "$dot_dots$src" "$dst"
441 cp_mark_as_generated
()
446 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
447 symlink_to_dir
"$GNULIB_SRCDIR" "$cp_dst"
448 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
449 symlink_to_dir
$local_gl_dir "$cp_dst"
452 *.
[ch
]) c1
='/* '; c2
=' */';;
453 *.texi
) c1
='@c '; c2
= ;;
454 *.
m4|*/Make
*|Make
*) c1
='# ' ; c2
= ;;
458 if test -z "$c1"; then
459 cmp -s "$cp_src" "$cp_dst" || {
460 echo "$0: cp -f $cp_src $cp_dst" &&
462 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
465 check_dst_dir
"$cp_dst"
466 # Copy the file first to get proper permissions if it
467 # doesn't already exist. Then overwrite the copy.
468 cp "$cp_src" "$cp_dst-t" &&
470 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
471 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
472 sed "s!$bt_regex/!!g" "$cp_src"
474 if cmp -s "$cp_dst-t" "$cp_dst"; then
477 echo "$0: cp $cp_src $cp_dst # with edits" &&
478 mv -f "$cp_dst-t" "$cp_dst"
484 version_controlled_file
() {
489 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null
|
490 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
491 elif test -d .git
; then
492 git
-rm -n "$dir/$file" > /dev
/null
2>&1 && found
=yes
494 echo "$0: no version control for $dir/$file?" >&2
500 for dir
in .
`(cd $1 && find * -type d -print)`; do
503 for file in `ls -a $1/$dir`; do
506 .
*) continue;; # FIXME: should all file names starting with "." be ignored?
508 test -d $1/$dir/$file && continue
509 for excluded_file
in $excluded_files; do
510 test "$dir/$file" = "$excluded_file" && continue 2
512 if test $file = Makefile.am
; then
513 copied
=$copied${sep}$gnulib_mk; sep
=$nl
514 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
515 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
516 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
517 rm -f $dir/$gnulib_mk &&
518 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
520 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
521 version_controlled_file
$dir $file; then
522 echo "$0: $dir/$file overrides $1/$dir/$file"
524 copied
=$copied$sep$file; sep
=$nl
525 if test $file = gettext.
m4; then
526 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
529 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
530 AC_DEFUN([AM_INTL_SUBDIR], [
531 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
532 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
534 AC_DEFUN([gl_LOCK_EARLY], [])
535 ' $1/$dir/$file >$dir/$file
537 cp_mark_as_generated
$1/$dir/$file $dir/$file
542 for dot_ig
in x
$vc_ignore; do
543 test $dot_ig = x
&& continue
545 if test -n "$copied"; then
546 insert_vc_ignore
$ig "$copied"
547 # If an ignored file name ends with _.h, then also add
548 # the name with just ".h". Many gnulib headers are generated,
549 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
550 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
551 f
=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
552 insert_vc_ignore
$ig "$f"
554 # For files like sys_stat_.h and sys_time_.h, record as
555 # ignorable the directory we might eventually create: sys/.
556 f
=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'`
557 insert_vc_ignore
$ig "$f"
564 # Create boot temporary directories to import from gnulib and gettext.
566 mkdir $bt $bt2 || exit
568 # Import from gnulib.
570 gnulib_tool_options
="\
573 --aux-dir $bt/$build_aux\
577 --source-base $bt/lib/\
578 --tests-base $bt/tests\
579 --local-dir $local_gl_dir\
580 $gnulib_tool_option_extras\
582 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
583 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
586 for file in $gnulib_files; do
587 symlink_to_dir
"$GNULIB_SRCDIR" $file || exit
591 # Import from gettext.
593 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac
>/dev
/null
|| \
596 if test $with_gettext = yes; then
597 echo "$0: (cd $bt2; autopoint) ..."
598 cp configure.ac
$bt2 &&
599 (cd $bt2 && autopoint
&& rm configure.ac
) &&
600 slurp
$bt2 $bt || exit
602 rm -fr $bt $bt2 || exit
605 # Coreutils is unusual in that it generates some of its test-related
606 # Makefile.am files. That must be done before invoking automake.
607 mam_template
=tests
/Makefile.am.
in
608 if test -f $mam_template; then
610 for tool
in cut
head join pr sort tac tail test tr uniq wc; do
611 m
=tests
/$tool/Makefile.am
614 sed -n '1,/^##test-files-begin/p' $mam_template > $t
615 echo "x = $tool" >> $t
617 $PERL -I$srcdir -w -- tests
/mk
-script $srcdir --list >> $t
618 sed -n '/^##test-files-end/,$p' $mam_template >> $t
624 # Reconfigure, getting other files.
628 'aclocal --force -I m4' \
630 'autoheader --force' \
631 'automake --add-missing --copy --force-missing';
633 if test "$command" = libtool
; then
634 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac
>/dev
/null
||
636 command='libtoolize -c -f'
638 echo "$0: $command ..."
643 # Get some extra files from gnulib, overriding existing files.
644 for file in $gnulib_extra_files; do
646 */INSTALL
) dst
=INSTALL
;;
647 build
-aux/*) dst
=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
650 symlink_to_dir
"$GNULIB_SRCDIR" $file $dst || exit
653 if test $with_gettext = yes; then
654 # Create gettext configuration.
655 echo "$0: Creating po/Makevars from po/Makevars.template ..."
658 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
659 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
660 /^XGETTEXT_OPTIONS *=/{
663 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
665 ' po
/Makevars.template
>po
/Makevars
667 if test -d runtime
-po; then
668 # Similarly for runtime-po/Makevars, but not quite the same.
669 rm -f runtime
-po/Makevars
671 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
672 /^subdir *=.*/s/=.*/= runtime-po/
673 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
674 /^XGETTEXT_OPTIONS *=/{
677 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
679 ' <po
/Makevars.template
>runtime
-po/Makevars
681 # Copy identical files from po to runtime-po.
682 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime
-po)
686 echo "$0: done. Now you can run './configure'."