Automatically generated dependencies are important even
[coreutils.git] / bootstrap
bloba9124017ad247b39955d2dc5e9a712fcf7c70675
1 #! /bin/sh
3 # Bootstrap this package from CVS.
5 # Copyright (C) 2003, 2004, 2005, 2006 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)
10 # 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, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301, USA.
22 # Written by Paul Eggert.
24 nl='
27 # Ensure file names are sorted consistently across platforms.
28 # Also, ensure diagnostics are in English, e.g., "wget --help" below.
29 LC_ALL=C
30 export LC_ALL
32 usage() {
33 echo >&2 "\
34 Usage: $0 [OPTION]...
35 Bootstrap this package from the CVS sources.
37 Options:
38 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
39 sources reside. Use this if you already
40 have gnulib sources on your machine, and
41 do not want to waste your bandwidth dowloading
42 them again.
43 --force Bootstrap even if the sources didn't come from CVS.
44 --skip-po Do not download po files.
45 --cvs-user=USERNAME Set the CVS username to be used when accessing
46 the gnulib repository.
48 If the file .bootstrap.conf exists in the current working directory, its
49 contents are read as shell variables to configure the bootstrap.
51 Running without arguments will suffice in most cases.
55 # Configuration.
57 # List of gnulib modules needed.
58 gnulib_modules=
60 # Any gnulib files needed that are not in modules.
61 gnulib_files=
63 # Translation Project URL, for the registry of all projects
64 # and for the translation-team master directory.
65 TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
66 TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
68 extract_package_name='
69 /^AC_INIT(/{
70 /.*,.*,.*,/{
71 s///
72 s/[][]//g
76 s/AC_INIT(\[*//
77 s/]*,.*//
78 s/^GNU //
79 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
80 s/[^A-Za-z0-9_]/-/g
84 package=`sed -n "$extract_package_name" configure.ac` || exit
86 # Extra files from gnulib, which override files from other sources.
87 gnulib_extra_files='
88 build-aux/install-sh
89 build-aux/missing
90 build-aux/mdate-sh
91 build-aux/texinfo.tex
92 build-aux/depcomp
93 build-aux/config.guess
94 build-aux/config.sub
95 doc/INSTALL
98 # Other locale categories that need message catalogs.
99 EXTRA_LOCALE_CATEGORIES=
101 # Additional xgettext options to use. Use "\\\newline" to break lines.
102 XGETTEXT_OPTIONS='\\\
103 --flag=_:1:pass-c-format\\\
104 --flag=N_:1:pass-c-format\\\
105 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
108 # Files we don't want to import.
109 excluded_files=
111 # File that should exist with CVS checkout, but not with
112 # the distributed version.
113 CVS_only_file=CVS
115 # Override the default configuration, if necessary.
116 test -r bootstrap.conf && . ./bootstrap.conf
118 # Translate configuration into internal form.
120 # Parse options.
122 for option
124 case $option in
125 --help)
126 usage
127 exit;;
128 --gnulib-srcdir=*)
129 GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
130 --cvs-user=*)
131 CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
132 --skip-po)
133 SKIP_PO=t;;
134 --force)
135 CVS_only_file=;;
137 echo >&2 "$0: $option: unknown option"
138 exit 1;;
139 esac
140 done
142 if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
143 echo "$0: Bootstrapping from a non-CVS distribution is a bit risky." >&2
144 exit 1
147 echo "$0: Bootstrapping CVS $package..."
149 cleanup_gnulib() {
150 status=$?
151 rm -fr gnulib
152 exit $status
155 # Get gnulib files.
157 case ${GNULIB_SRCDIR--} in
159 if [ ! -d gnulib ]; then
160 echo "$0: getting gnulib files..."
162 case ${CVS_AUTH-pserver} in
163 pserver)
164 CVS_PREFIX=':pserver:anonymous@';;
165 ssh)
166 CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
168 echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
169 exit 1;;
170 esac
172 case $CVS_RSH in
173 '') CVS_RSH=ssh; export CVS_RSH;;
174 esac
176 trap cleanup_gnulib 1 2 13 15
178 cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
179 cleanup_gnulib
181 trap - 1 2 13 15
183 GNULIB_SRCDIR=gnulib
184 esac
186 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
187 <$gnulib_tool || exit
189 # Get translations.
191 get_translations() {
192 subdir=$1
193 domain=$2
195 case $WGET_COMMAND in
197 echo "$0: wget not available; skipping translations";;
199 echo "$0: getting translations into $subdir for $domain..." &&
201 (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
202 $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
204 sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
205 sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
206 awk -F. '
207 { if (lang && $1 != lang) print lang, ver }
208 { lang = $1; ver = substr($0, index($0, ".") + 1) }
209 END { if (lang) print lang, ver }
210 ' | awk -v domain="$domain" -v subdir="$subdir" '
212 lang = $1
213 ver = $2
214 urlfmt = ""
215 printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
216 printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
217 printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
218 printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
220 END { print ":" }
221 ' | WGET_COMMAND="$WGET_COMMAND" sh;;
222 esac &&
223 ls "$subdir"/*.po 2>/dev/null |
224 sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
225 rm -f "$subdir/$domain.html"
228 case $SKIP_PO in
230 case `wget --help` in
231 *'--no-cache'*)
232 WGET_COMMAND='wget -nv --no-cache';;
233 *'--cache=on/off'*)
234 WGET_COMMAND='wget -nv --cache=off';;
235 *'--non-verbose'*)
236 WGET_COMMAND='wget -nv';;
238 WGET_COMMAND='';;
239 esac
241 get_translations po $package || exit
243 if test -d runtime-po; then
244 get_translations runtime-po $package-runtime || exit
245 fi;;
246 esac
248 symlink_to_gnulib()
250 src=$GNULIB_SRCDIR/$1
251 dst=${2-$1}
252 dot_dots=
254 case $src in
255 /*) ;;
257 case /$dst/ in
258 *//* | */../* | */./* | /*/*/*/*/*/)
259 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
260 exit 1;;
261 /*/*/*/*/) dot_dots=../../../;;
262 /*/*/*/) dot_dots=../../;;
263 /*/*/) dot_dots=../;;
264 esac;;
265 esac
267 test -f "$src" && {
268 test -h "$dst" &&
269 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
270 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
271 test "$src_i" = "$dst_i" || {
272 echo "$0: ln -fs $dot_dots$src $dst" &&
273 ln -fs "$dot_dots$src" "$dst"
278 cp_mark_as_generated()
280 cp_src=$1
281 cp_dst=$2
283 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
284 symlink_to_gnulib "$cp_dst"
285 else
286 case $cp_dst in
287 *.[ch]) c1='/* '; c2=' */';;
288 *.texi) c1='@c '; c2= ;;
289 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
290 *) c1= ; c2= ;;
291 esac
293 if test -z "$c1"; then
294 cmp -s "$cp_src" "$cp_dst" || {
295 echo "$0: cp -f $cp_src $cp_dst" &&
296 cp -f "$cp_src" "$cp_dst"
298 else
299 # Copy the file first to get proper permissions if it
300 # doesn't already exist. Then overwrite the copy.
301 cp "$cp_src" "$cp_dst-t" &&
303 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
304 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
305 cat "$cp_src"
306 ) > $cp_dst-t &&
307 if cmp -s "$cp_dst-t" "$cp_dst"; then
308 rm -f "$cp_dst-t"
309 else
310 echo "$0: cp $cp_src $cp_dst # with edits" &&
311 mv -f "$cp_dst-t" "$cp_dst"
317 slurp() {
318 for dir in . `(cd $1 && find * -type d -print)`; do
319 copied=
320 sep=
321 for file in `ls $1/$dir`; do
322 test -d $1/$dir/$file && continue
323 for excluded_file in $excluded_files; do
324 test "$dir/$file" = "$excluded_file" && continue 2
325 done
326 if test $file = Makefile.am; then
327 copied=$copied${sep}gnulib.mk; sep=$nl
328 remove_intl='/^[^#].*\/intl/s/^/#/'
329 no_dep=no-dependencies
330 remove_no_dep="/^AUTOMAKE_OPTIONS =.* $no_dep/s/ $no_dep//"
331 sed_xform="$remove_intl;$remove_no_dep"
332 sed "$sed_xform" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
333 echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
334 rm -f $dir/gnulib.mk &&
335 sed "$sed_xform" $1/$dir/$file >$dir/gnulib.mk
337 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
338 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
339 grep -q '^/[^/]*/[0-9]'; then
340 echo "$0: $dir/$file overrides $1/$dir/$file"
341 else
342 copied=$copied$sep$file; sep=$nl
343 if test $file = gettext.m4; then
344 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
345 rm -f $dir/$file
346 sed '
347 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
348 AC_DEFUN([AM_INTL_SUBDIR], [
349 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
350 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
352 AC_DEFUN([gl_LOCK_EARLY], [])
353 ' $1/$dir/$file >$dir/$file
354 else
355 cp_mark_as_generated $1/$dir/$file $dir/$file
357 fi || exit
358 done
360 ig=$dir/.cvsignore
361 if test -n "$copied" && test -f $ig; then
362 echo "$copied" | sort -u - $ig | cmp -s - $ig ||
363 echo "$copied" | sort -u - $ig -o $ig || exit
365 done
369 # Create boot temporary directories to import from gnulib and gettext.
371 bt='.#bootmp'
372 bt2=${bt}2
373 rm -fr $bt $bt2 &&
374 mkdir $bt $bt2 || exit
376 # Import from gnulib.
378 gnulib_tool_options="\
379 --import\
380 --no-changelog\
381 --aux-dir $bt/build-aux\
382 --doc-base $bt/doc\
383 --lib lib$package\
384 --m4-base $bt/m4/\
385 --source-base $bt/lib/\
386 --tests-base $bt/tests\
387 --local-dir gl\
389 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
390 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
391 slurp $bt || exit
393 for file in $gnulib_files; do
394 symlink_to_gnulib $file || exit
395 done
398 # Import from gettext.
400 echo "$0: (cd $bt2; autopoint) ..."
401 cp configure.ac $bt2 &&
402 (cd $bt2 && autopoint && rm configure.ac) &&
403 slurp $bt2 $bt || exit
405 rm -fr $bt $bt2 || exit
408 # Reconfigure, getting other files.
410 for command in \
411 'aclocal --force -I m4' \
412 'autoconf --force' \
413 'autoheader --force' \
414 'automake --add-missing --copy --force-missing';
416 echo "$0: $command ..."
417 $command || exit
418 done
421 # Get some extra files from gnulib, overriding existing files.
423 for file in $gnulib_extra_files; do
424 case $file in
425 */INSTALL) dst=INSTALL;;
426 *) dst=$file;;
427 esac
428 symlink_to_gnulib $file $dst || exit
429 done
432 # Create gettext configuration.
433 echo "$0: Creating po/Makevars from po/Makevars.template ..."
434 rm -f po/Makevars
435 sed '
436 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
437 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
438 /^XGETTEXT_OPTIONS *=/{
439 s/$/ \\/
441 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
443 ' po/Makevars.template >po/Makevars
445 if test -d runtime-po; then
446 # Likewise for runtime-po/Makevars, except also change a few other parameters.
447 rm -f runtime-po/Makevars
448 sed '
449 s/^\(DOMAIN\) *=.*/\1 = '"$package"'-runtime/
450 s/^\(subdir\) *=.*/\1 = runtime-po/
451 s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = '"$XGETTEXT_OPTIONS_RUNTIME"'/
452 ' <po/Makevars >runtime-po/Makevars
454 # Copy identical files from po to runtime-po.
455 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
458 echo "$0: done. Now you can run './configure'."