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 2, or (at your option)
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, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 # Written by Paul Eggert.
27 # Ensure file names are sorted consistently across platforms.
28 # 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 # List of gnulib modules needed.
67 # Any gnulib files needed that are not in modules.
70 # Translation Project URL, for the registry of all projects
71 # and for the translation-team master directory.
72 TP_URL
='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
73 TP_PO_URL
='http://www.iro.umontreal.ca/translation/teams/PO/'
75 extract_package_name
='
86 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
91 package
=`sed -n "$extract_package_name" configure.ac` ||
exit
94 # Extra files from gnulib, which override files from other sources.
99 $build_aux/texinfo.tex
101 $build_aux/config.guess
102 $build_aux/config.sub
106 # Other locale categories that need message catalogs.
107 EXTRA_LOCALE_CATEGORIES
=
109 # Additional xgettext options to use. Use "\\\newline" to break lines.
110 XGETTEXT_OPTIONS
='\\\
111 --flag=_:1:pass-c-format\\\
112 --flag=N_:1:pass-c-format\\\
113 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
116 # Files we don't want to import.
119 # File that should exist in the top directory of a checked out hierarchy,
120 # but not in a distribution tarball.
121 checkout_only_file
=README-hacking
123 # Whether to use copies instead of symlinks.
126 # Override the default configuration, if necessary.
127 test -r bootstrap.conf
&& . .
/bootstrap.conf
129 # Translate configuration into internal form.
140 GNULIB_SRCDIR
=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
142 CVS_USER
=`expr "$option" : '--cvs-user=\(.*\)'`;;
146 checkout_only_file
=;;
150 echo >&2 "$0: $option: unknown option"
155 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
156 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
160 # If $STR is not already on a line by itself in $FILE, insert it,
161 # sorting the new contents of the file and replacing $FILE with the result.
162 insert_sorted_if_absent
() {
165 echo "$str" |
sort -u - $file |
cmp -s - $file \
166 ||
echo "$str" |
sort -u - $file -o $file \
170 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
171 grep '^[ ]*AC_CONFIG_AUX_DIR('$build_aux')' configure.ac
>/dev
/null ||
173 echo "$0: expected line not found in configure.ac. Add the following:" >&2
174 echo " AC_CONFIG_AUX_DIR($build_aux)" >&2.
177 # If $build_aux doesn't exist, create it now, otherwise some bits
178 # below will malfunction. If creating it, also mark it as ignored.
179 if test ! -d $build_aux; then
181 for ig
in .cvsignore .gitignore
; do
182 test -f $ig && insert_sorted_if_absent
$ig $build_aux
186 echo "$0: Bootstrapping from checked-out $package sources..."
196 case ${GNULIB_SRCDIR--} in
198 if [ ! -d gnulib
]; then
199 echo "$0: getting gnulib files..."
201 case ${CVS_AUTH-pserver} in
203 CVS_PREFIX
=':pserver:anonymous@';;
205 CVS_PREFIX
="$CVS_USER${CVS_USER+@}";;
207 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
212 '') CVS_RSH
=ssh; export CVS_RSH
;;
215 trap cleanup_gnulib
1 2 13 15
217 cvs
-z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org
:/cvsroot
/gnulib co gnulib ||
225 gnulib_tool
=$GNULIB_SRCDIR/gnulib-tool
226 <$gnulib_tool ||
exit
234 case $WGET_COMMAND in
236 echo "$0: wget not available; skipping translations";;
238 echo "$0: getting translations into $subdir for $domain..." &&
240 (cd $subdir && rm -f dummy
`ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
241 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
243 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
244 sort -k 1,1 -k 2,2n
-k2,2 -k3,3n
-k3,3 -k4,4n
-k4,4 -k5,5n
-k5.5 |
246 { if (lang && $1 != lang) print lang, ver }
247 { lang = $1; ver = substr($0, index($0, ".") + 1) }
248 END { if (lang) print lang, ver }
249 ' |
awk -v domain
="$domain" -v subdir
="$subdir" '
254 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
255 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
256 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
257 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
260 ' | WGET_COMMAND
="$WGET_COMMAND" sh
;;
262 ls "$subdir"/*.po
2>/dev
/null |
263 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
264 rm -f "$subdir/$domain.html"
269 case `wget --help` in
271 WGET_COMMAND
='wget -nv --no-cache';;
273 WGET_COMMAND
='wget -nv --cache=off';;
275 WGET_COMMAND
='wget -nv';;
281 get_translations po
$package ||
exit
284 if test -d runtime-po
; then
285 get_translations runtime-po
$package-runtime ||
exit
291 src
=$GNULIB_SRCDIR/$1
297 test ! -h "$dst" ||
{
298 echo "$0: rm -f $dst" &&
303 cmp -s "$src" "$dst" ||
{
304 echo "$0: cp -fp $src $dst" &&
309 src_ls
=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i
=$1 &&
310 dst_ls
=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i
=$1 &&
311 test "$src_i" = "$dst_i" ||
{
317 *//* |
*/..
/* |
*/.
/* |
/*/*/*/*/*/)
318 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
320 /*/*/*/*/) dot_dots
=..
/..
/..
/;;
321 /*/*/*/) dot_dots
=..
/..
/;;
322 /*/*/) dot_dots
=..
/;;
326 echo "$0: ln -fs $dot_dots$src $dst" &&
327 ln -fs "$dot_dots$src" "$dst"
333 cp_mark_as_generated
()
338 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
339 symlink_to_gnulib
"$cp_dst"
342 *.
[ch
]) c1
='/* '; c2
=' */';;
343 *.texi
) c1
='@c '; c2
= ;;
344 *.
m4|
*/Make
*|Make
*) c1
='# ' ; c2
= ;;
348 if test -z "$c1"; then
349 cmp -s "$cp_src" "$cp_dst" ||
{
350 echo "$0: cp -f $cp_src $cp_dst" &&
352 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
355 # Copy the file first to get proper permissions if it
356 # doesn't already exist. Then overwrite the copy.
357 cp "$cp_src" "$cp_dst-t" &&
359 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
360 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
361 sed "s!$bt_regex/!!g" "$cp_src"
363 if cmp -s "$cp_dst-t" "$cp_dst"; then
366 echo "$0: cp $cp_src $cp_dst # with edits" &&
367 mv -f "$cp_dst-t" "$cp_dst"
373 version_controlled_file
() {
378 grep -F "/$file/" $dir/CVS
/Entries
2>/dev
/null |
379 grep '^/[^/]*/[0-9]' > /dev
/null
&& found
=yes
380 elif test -d .git
; then
381 git-rm
-n "$dir/$file" > /dev
/null
2>&1 && found
=yes
383 echo "$0: no version control for $dir/$file?" >&2
389 for dir
in .
`(cd $1 && find * -type d -print)`; do
392 for file in `ls $1/$dir`; do
393 test -d $1/$dir/$file && continue
394 for excluded_file
in $excluded_files; do
395 test "$dir/$file" = "$excluded_file" && continue 2
397 if test $file = Makefile.am
; then
398 copied
=$copied${sep}gnulib.mk
; sep
=$nl
399 remove_intl
='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
400 sed "$remove_intl" $1/$dir/$file |
cmp -s - $dir/gnulib.mk ||
{
401 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
402 rm -f $dir/gnulib.mk
&&
403 sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
405 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
406 version_controlled_file
$dir $file; then
407 echo "$0: $dir/$file overrides $1/$dir/$file"
409 copied
=$copied$sep$file; sep
=$nl
410 if test $file = gettext.
m4; then
411 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
414 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
415 AC_DEFUN([AM_INTL_SUBDIR], [
416 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
417 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
419 AC_DEFUN([gl_LOCK_EARLY], [])
420 ' $1/$dir/$file >$dir/$file
422 cp_mark_as_generated
$1/$dir/$file $dir/$file
427 for dot_ig
in .cvsignore .gitignore
; do
429 if test -n "$copied" && test -f $ig; then
430 insert_sorted_if_absent
$ig "$copied"
431 # If an ignored file name ends with _.h, then also add
432 # the name with just ".h". Many gnulib headers are generated,
433 # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
434 f
=`echo "$copied"|sed 's/_\.h$/.h/'`
435 insert_sorted_if_absent
$ig "$f"
442 # Create boot temporary directories to import from gnulib and gettext.
444 mkdir
$bt $bt2 ||
exit
446 # Import from gnulib.
448 gnulib_tool_options
="\
451 --aux-dir $bt/$build_aux\
455 --source-base $bt/lib/\
456 --tests-base $bt/tests\
459 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
460 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
463 for file in $gnulib_files; do
464 symlink_to_gnulib
$file ||
exit
468 # Import from gettext.
470 echo "$0: (cd $bt2; autopoint) ..."
471 cp configure.ac
$bt2 &&
472 (cd $bt2 && autopoint
&& rm configure.ac
) &&
473 slurp
$bt2 $bt ||
exit
475 rm -fr $bt $bt2 ||
exit
478 # Reconfigure, getting other files.
482 'aclocal --force -I m4' \
484 'autoheader --force' \
485 'automake --add-missing --copy --force-missing';
487 if test "$command" = libtool
; then
488 grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac
>/dev
/null ||
490 command='libtoolize -c -f'
492 echo "$0: $command ..."
497 # Get some extra files from gnulib, overriding existing files.
499 for file in $gnulib_extra_files; do
501 */INSTALL
) dst
=INSTALL
;;
504 symlink_to_gnulib
$file $dst ||
exit
508 # Create gettext configuration.
509 echo "$0: Creating po/Makevars from po/Makevars.template ..."
512 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
513 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
514 /^XGETTEXT_OPTIONS *=/{
517 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
519 ' po
/Makevars.template
>po
/Makevars
521 if test -d runtime-po
; then
522 # Similarly for runtime-po/Makevars, but not quite the same.
523 rm -f runtime-po
/Makevars
525 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
526 /^subdir *=.*/s/=.*/= runtime-po/
527 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
528 /^XGETTEXT_OPTIONS *=/{
531 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
533 ' <po
/Makevars.template
>runtime-po
/Makevars
535 # Copy identical files from po to runtime-po.
536 (cd po
&& cp -p Makefile.
in.
in *-quot *.header
*.
sed *.sin ..
/runtime-po
)
539 echo "$0: done. Now you can run './configure'."