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.
31 # Temporary directory names.
33 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
39 Bootstrap this package from the checked-out sources.
42 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
43 sources reside. Use this if you already
44 have gnulib sources on your machine, and
45 do not want to waste your bandwidth downloading
47 --copy Copy files instead of creating symbolic links.
48 --force Attempt to bootstrap even if the sources seem
49 not to have been checked out.
50 --skip-po Do not download po files.
52 If the file bootstrap.conf exists in the current working directory, its
53 contents are read as shell variables to configure the bootstrap.
55 Running without arguments will suffice in most cases.
61 # Name of the Makefile.am
64 # List of gnulib modules needed.
67 # Any gnulib files needed that are not in modules.
70 # The command to download all .po files for a specified domain into
71 # a specified directory. Fill in the first %s is the domain name, and
72 # the second with the destination directory. Use rsync's -L and -r
73 # options because the latest/%s directory and the .po files within are
75 po_download_command_format=\
76 "rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
78 extract_package_name='
90 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
95 package=`sed -n "$extract_package_name" configure.ac` || exit
96 gnulib_name=lib$package
99 # Extra files from gnulib, which override files from other sources.
101 $build_aux/install-sh
104 $build_aux/texinfo.tex
106 $build_aux/config.guess
107 $build_aux/config.sub
111 # Additional gnulib-tool options to use. Use "\newline" to break lines.
112 gnulib_tool_option_extras=
114 # Other locale categories that need message catalogs.
115 EXTRA_LOCALE_CATEGORIES=
117 # Additional xgettext options to use. Use "\\\newline" to break lines.
118 XGETTEXT_OPTIONS='\\\
119 --flag=_:1:pass-c-format\\\
120 --flag=N_:1:pass-c-format\\\
121 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
124 # Files we don't want to import.
127 # File that should exist in the top directory of a checked out hierarchy,
128 # but not in a distribution tarball.
129 checkout_only_file=README-hacking
131 # Whether to use copies instead of symlinks.
134 # Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
135 # those files to be generated in directories like lib/, m4/, and po/.
136 # Or set it to 'auto' to make this script select which to use based
137 # on which version control system (if any) is used in the source directory.
140 # Override the default configuration, if necessary.
141 test -r bootstrap.conf && . ./bootstrap.conf
143 if test "$vc_ignore" = auto; then
145 test -d .git && vc_ignore=.gitignore
146 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
149 # Translate configuration into internal form.
160 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
164 checkout_only_file=;;
168 echo >&2 "$0: $option: unknown option"
173 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
174 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
178 # If $STR is not already on a line by itself in $FILE, insert it,
179 # sorting the new contents of the file and replacing $FILE with the result.
180 insert_sorted_if_absent() {
183 test -f $file || touch $file
184 echo "$str" | sort -u - $file | cmp -s - $file \
185 || echo "$str" | sort -u - $file -o $file \
189 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
191 grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
192 >/dev/null && found_aux_dir=yes
193 grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
194 >/dev/null && found_aux_dir=yes
195 if test $found_aux_dir = no; then
196 echo "$0: expected line not found in configure.ac. Add the following:" >&2
197 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
201 # If $build_aux doesn't exist, create it now, otherwise some bits
202 # below will malfunction. If creating it, also mark it as ignored.
203 if test ! -d $build_aux; then
205 for dot_ig in x $vc_ignore; do
206 test $dot_ig = x && continue
207 insert_sorted_if_absent $dot_ig $build_aux
211 echo "$0: Bootstrapping from checked-out $package sources..."
221 case ${GNULIB_SRCDIR--} in
223 if [ ! -d gnulib ]; then
224 echo "$0: getting gnulib files..."
226 trap cleanup_gnulib 1 2 13 15
228 git clone --depth 2 git://git.sv.gnu.org/gnulib ||
236 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
237 <$gnulib_tool || exit
241 download_po_files() {
244 echo "$0: getting translations into $subdir for $domain..."
245 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
249 # Download .po files to $po_dir/.reference and copy only the new
250 # or modified ones into $po_dir. Also update $po_dir/LINGUAS.
252 # Directory containing primary .po files.
253 # Overwrite them only when we're sure a .po file is new.
257 # Download *.po files into this dir.
258 # Usually contains *.s1 checksum files.
259 ref_po_dir="$po_dir/.reference"
261 test -d $ref_po_dir || mkdir $ref_po_dir || return
262 download_po_files $ref_po_dir $domain \
263 && ls "$ref_po_dir"/*.po 2>/dev/null |
264 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
266 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
267 test "$langs" = '*' && langs=x
268 for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
269 case $po in x) continue;; esac
270 new_po="$ref_po_dir/$po.po"
271 cksum_file="$ref_po_dir/$po.s1"
272 if ! test -f "$cksum_file" ||
273 ! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
274 echo "updated $po_dir/$po.po..."
275 cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
283 update_po_files po $package || exit
286 if test -d runtime-po; then
287 update_po_files runtime-po $package-runtime || exit
298 # If the destination directory doesn't exist, create it.
299 # This is required at least for "lib/uniwidth/cjk.h".
300 dst_dir=`dirname "$dst"`
301 if ! test -d "$dst_dir"; then
304 # If we've just created a directory like lib/uniwidth,
305 # tell version control system(s) it's ignorable.
306 # FIXME: for now, this does only one level
307 parent=`dirname "$dst_dir"`
308 for dot_ig in x $vc_ignore; do
309 test $dot_ig = x && continue
311 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
317 test ! -h "$dst" || {
318 echo "$0: rm -f $dst" &&
323 cmp -s "$src" "$dst" || {
324 echo "$0: cp -fp $src $dst" &&
329 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
330 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
331 test "$src_i" = "$dst_i" || {
337 *//* | */../* | */./* | /*/*/*/*/*/)
338 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
340 /*/*/*/*/) dot_dots=../../../;;
341 /*/*/*/) dot_dots=../../;;
342 /*/*/) dot_dots=../;;
346 echo "$0: ln -fs $dot_dots$src $dst" &&
347 ln -fs "$dot_dots$src" "$dst"
353 cp_mark_as_generated()
358 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
359 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
360 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
361 symlink_to_dir $local_gl_dir "$cp_dst"
364 *.[ch]) c1='/* '; c2=' */';;
365 *.texi) c1='@c '; c2= ;;
366 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
370 # If the destination directory doesn't exist, create it.
371 # This is required at least for "lib/uniwidth/cjk.h".
372 dst_dir=`dirname "$cp_dst"`
373 test -d "$dst_dir" || mkdir -p "$dst_dir"
375 if test -z "$c1"; then
376 cmp -s "$cp_src" "$cp_dst" || {
377 echo "$0: cp -f $cp_src $cp_dst" &&
379 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
382 # Copy the file first to get proper permissions if it
383 # doesn't already exist. Then overwrite the copy.
384 cp "$cp_src" "$cp_dst-t" &&
386 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
387 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
388 sed "s!$bt_regex/!!g" "$cp_src"
390 if cmp -s "$cp_dst-t" "$cp_dst"; then
393 echo "$0: cp $cp_src $cp_dst # with edits" &&
394 mv -f "$cp_dst-t" "$cp_dst"
400 version_controlled_file() {
405 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
406 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
407 elif test -d .git; then
408 git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
410 echo "$0: no version control for $dir/$file?" >&2
416 for dir in . `(cd $1 && find * -type d -print)`; do
419 for file in `ls -a $1/$dir`; do
422 .*) continue;; # FIXME: should all file names starting with "." be ignored?
424 test -d $1/$dir/$file && continue
425 for excluded_file in $excluded_files; do
426 test "$dir/$file" = "$excluded_file" && continue 2
428 if test $file = Makefile.am; then
429 copied=$copied${sep}$gnulib_mk; sep=$nl
430 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
431 sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
432 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
433 rm -f $dir/$gnulib_mk &&
434 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
436 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
437 version_controlled_file $dir $file; then
438 echo "$0: $dir/$file overrides $1/$dir/$file"
440 copied=$copied$sep$file; sep=$nl
441 if test $file = gettext.m4; then
442 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
445 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
446 AC_DEFUN([AM_INTL_SUBDIR], [
447 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
448 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
450 AC_DEFUN([gl_LOCK_EARLY], [])
451 ' $1/$dir/$file >$dir/$file
453 cp_mark_as_generated $1/$dir/$file $dir/$file
458 for dot_ig in x $vc_ignore; do
459 test $dot_ig = x && continue
461 if test -n "$copied"; then
462 insert_sorted_if_absent $ig "$copied"
463 # If an ignored file name ends with .in.h, then also add
464 # the name with just ".h". Many gnulib headers are generated,
465 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
466 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
467 f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
468 insert_sorted_if_absent $ig "$f"
470 # For files like sys_stat.in.h and sys_time.in.h, record as
471 # ignorable the directory we might eventually create: sys/.
472 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
473 insert_sorted_if_absent $ig "$f"
480 # Create boot temporary directories to import from gnulib and gettext.
482 mkdir $bt $bt2 || exit
484 # Import from gnulib.
486 gnulib_tool_options="\
489 --aux-dir $bt/$build_aux\
493 --source-base $bt/lib/\
494 --tests-base $bt/tests\
495 --local-dir $local_gl_dir\
496 $gnulib_tool_option_extras\
498 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
499 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
502 for file in $gnulib_files; do
503 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
507 # Import from gettext.
509 grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
512 if test $with_gettext = yes; then
513 echo "$0: (cd $bt2; autopoint) ..."
514 cp configure.ac $bt2 &&
515 (cd $bt2 && autopoint && rm configure.ac) &&
516 slurp $bt2 $bt || exit
518 rm -fr $bt $bt2 || exit
521 # Coreutils is unusual in that it generates some of its test-related
522 # Makefile.am files. That must be done before invoking automake.
523 mam_template=tests/Makefile.am.in
524 if test -f $mam_template; then
526 for tool in cut head join pr sort tac tail test tr uniq wc; do
527 m=tests/$tool/Makefile.am
530 sed -n '1,/^##test-files-begin/p' $mam_template > $t
531 echo "x = $tool" >> $t
533 $PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
534 sed -n '/^##test-files-end/,$p' $mam_template >> $t
540 # Reconfigure, getting other files.
544 'aclocal --force -I m4' \
546 'autoheader --force' \
547 'automake --add-missing --copy --force-missing';
549 if test "$command" = libtool; then
550 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
552 command='libtoolize -c -f'
554 echo "$0: $command ..."
559 # Get some extra files from gnulib, overriding existing files.
560 for file in $gnulib_extra_files; do
562 */INSTALL) dst=INSTALL;;
563 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
566 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
569 if test $with_gettext = yes; then
570 # Create gettext configuration.
571 echo "$0: Creating po/Makevars from po/Makevars.template ..."
574 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
575 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
576 /^XGETTEXT_OPTIONS *=/{
579 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
581 ' po/Makevars.template >po/Makevars
583 if test -d runtime-po; then
584 # Similarly for runtime-po/Makevars, but not quite the same.
585 rm -f runtime-po/Makevars
587 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
588 /^subdir *=.*/s/=.*/= runtime-po/
589 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
590 /^XGETTEXT_OPTIONS *=/{
593 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
595 ' <po/Makevars.template >runtime-po/Makevars
597 # Copy identical files from po to runtime-po.
598 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
602 echo "$0: done. Now you can run './configure'."