* gl/modules/getloadavg.diff: New file. Work around the way the latest
[platform/upstream/coreutils.git] / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from CVS.
4
5 # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6
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.
11
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.
16
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.
21
22 # Written by Paul Eggert.
23
24 nl='
25 '
26
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
31
32 usage() {
33   echo >&2 "\
34 Usage: $0 [OPTION]...
35 Bootstrap this package from the CVS sources.
36
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.
47
48 If the file .bootstrap.conf exists in the current working directory, its
49 contents are read as shell variables to configure the bootstrap.
50
51 Running without arguments will suffice in most cases.
52 "
53 }
54
55 # Configuration.
56
57 # List of gnulib modules needed.
58 gnulib_modules=
59
60 # Any gnulib files needed that are not in modules.
61 gnulib_files=
62
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/'
67
68 extract_package_name='
69   /^AC_INIT(/{
70      /.*,.*,.*,/{
71        s///
72        s/[][]//g
73        p
74        q
75      }
76      s/AC_INIT(\[*//
77      s/]*,.*//
78      s/^GNU //
79      y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
80      s/[^A-Za-z0-9_]/-/g
81      p
82   }
83 '
84 package=`sed -n "$extract_package_name" configure.ac` || exit
85
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
96 '
97
98 # Other locale categories that need message catalogs.
99 EXTRA_LOCALE_CATEGORIES=
100
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\\\
106 '
107
108 # Files we don't want to import.
109 excluded_files=
110
111 # File that should exist with CVS checkout, but not with
112 # the distributed version.
113 CVS_only_file=CVS
114
115 # Override the default configuration, if necessary.
116 test -r bootstrap.conf && . ./bootstrap.conf
117
118 # Translate configuration into internal form.
119
120 # Parse options.
121
122 for option
123 do
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=;;
136   *)
137     echo >&2 "$0: $option: unknown option"
138     exit 1;;
139   esac
140 done
141
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
145 fi
146
147 echo "$0: Bootstrapping CVS $package..."
148
149 cleanup_gnulib() {
150   status=$?
151   rm -fr gnulib
152   exit $status
153 }
154
155 # Get gnulib files.
156
157 case ${GNULIB_SRCDIR--} in
158 -)
159   if [ ! -d gnulib ]; then
160     echo "$0: getting gnulib files..."
161
162     case ${CVS_AUTH-pserver} in
163     pserver)
164       CVS_PREFIX=':pserver:anonymous@';;
165     ssh)
166       CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
167     *)
168       echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
169       exit 1;;
170     esac
171
172     case $CVS_RSH in
173     '') CVS_RSH=ssh; export CVS_RSH;;
174     esac
175
176     trap cleanup_gnulib 1 2 13 15
177
178     cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
179       cleanup_gnulib
180
181     trap - 1 2 13 15
182   fi
183   GNULIB_SRCDIR=gnulib
184 esac
185
186 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
187 <$gnulib_tool || exit
188
189 # Get translations.
190
191 get_translations() {
192   subdir=$1
193   domain=$2
194
195   case $WGET_COMMAND in
196   '')
197     echo "$0: wget not available; skipping translations";;
198   ?*)
199     echo "$0: getting translations into $subdir for $domain..." &&
200
201     (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
202     $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
203
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" '
211       {
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
219       }
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"
226 }
227
228 case $SKIP_PO in
229 '')
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';;
237   *)
238     WGET_COMMAND='';;
239   esac
240
241   get_translations po $package || exit
242
243   if test -d runtime-po; then
244     get_translations runtime-po $package-runtime || exit
245   fi;;
246 esac
247
248 symlink_to_gnulib()
249 {
250   src=$GNULIB_SRCDIR/$1
251   dst=${2-$1}
252   dot_dots=
253
254   case $src in
255   /*) ;;
256   *)
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
266
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"
274     }
275   }
276 }
277
278 cp_mark_as_generated()
279 {
280   cp_src=$1
281   cp_dst=$2
282
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
292
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"
297       }
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" &&
302       (
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"
312       fi
313     fi
314   fi
315 }
316
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         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
330           echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
331           rm -f $dir/gnulib.mk &&
332           sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
333         }
334       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
335            grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
336              grep -q '^/[^/]*/[0-9]'; then
337         echo "$0: $dir/$file overrides $1/$dir/$file"
338       else
339         copied=$copied$sep$file; sep=$nl
340         if test $file = gettext.m4; then
341           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
342           rm -f $dir/$file
343           sed '
344             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
345               AC_DEFUN([AM_INTL_SUBDIR], [
346             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
347               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
348             $a\
349               AC_DEFUN([gl_LOCK_EARLY], [])
350           ' $1/$dir/$file >$dir/$file
351         else
352           cp_mark_as_generated $1/$dir/$file $dir/$file
353         fi
354       fi || exit
355     done
356
357     ig=$dir/.cvsignore
358     if test -n "$copied" && test -f $ig; then
359       echo "$copied" | sort -u - $ig | cmp -s - $ig ||
360       echo "$copied" | sort -u - $ig -o $ig || exit
361     fi
362   done
363 }
364
365
366 # Create boot temporary directories to import from gnulib and gettext.
367
368 bt='.#bootmp'
369 bt2=${bt}2
370 rm -fr $bt $bt2 &&
371 mkdir $bt $bt2 || exit
372
373 # Import from gnulib.
374
375 gnulib_tool_options="\
376  --import\
377  --no-changelog\
378  --aux-dir $bt/build-aux\
379  --doc-base $bt/doc\
380  --lib lib$package\
381  --m4-base $bt/m4/\
382  --source-base $bt/lib/\
383  --tests-base $bt/tests\
384  --local-dir gl\
385 "
386 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
387 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
388 slurp $bt || exit
389
390 for file in $gnulib_files; do
391   symlink_to_gnulib $file || exit
392 done
393
394
395 # Import from gettext.
396
397 echo "$0: (cd $bt2; autopoint) ..."
398 cp configure.ac $bt2 &&
399 (cd $bt2 && autopoint && rm configure.ac) &&
400 slurp $bt2 $bt || exit
401
402 rm -fr $bt $bt2 || exit
403
404
405 # Reconfigure, getting other files.
406
407 for command in \
408   'aclocal --force -I m4' \
409   'autoconf --force' \
410   'autoheader --force' \
411   'automake --add-missing --copy --force-missing';
412 do
413   echo "$0: $command ..."
414   $command || exit
415 done
416
417
418 # Get some extra files from gnulib, overriding existing files.
419
420 for file in $gnulib_extra_files; do
421   case $file in
422   */INSTALL) dst=INSTALL;;
423   *) dst=$file;;
424   esac
425   symlink_to_gnulib $file $dst || exit
426 done
427
428
429 # Create gettext configuration.
430 echo "$0: Creating po/Makevars from po/Makevars.template ..."
431 rm -f po/Makevars
432 sed '
433   /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
434   /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
435   /^XGETTEXT_OPTIONS *=/{
436     s/$/ \\/
437     a\
438         '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
439   }
440 ' po/Makevars.template >po/Makevars
441
442 if test -d runtime-po; then
443   # Likewise for runtime-po/Makevars, except also change a few other parameters.
444   rm -f runtime-po/Makevars
445   sed '
446     s/^\(DOMAIN\) *=.*/\1 = '"$package"'-runtime/
447     s/^\(subdir\) *=.*/\1 = runtime-po/
448     s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = '"$XGETTEXT_OPTIONS_RUNTIME"'/
449   ' <po/Makevars >runtime-po/Makevars
450
451   # Copy identical files from po to runtime-po.
452   (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
453 fi
454
455 echo "$0: done.  Now you can run './configure'."