161e11aa4b064ea38e409c9e9c4e92eee598a92a
[gnulib.git] / build-aux / bootstrap
1 #! /bin/sh
2
3 # Bootstrap this package from checked-out sources.
4
5 # Copyright (C) 2003, 2004, 2005, 2006, 2007 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 # Temporary directory names.
33 bt='._bootmp'
34 bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
35 bt2=${bt}2
36
37 usage() {
38   echo >&2 "\
39 Usage: $0 [OPTION]...
40 Bootstrap this package from the checked-out sources.
41
42 Options:
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
47                           them again.
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.
54
55 If the file bootstrap.conf exists in the current working directory, its
56 contents are read as shell variables to configure the bootstrap.
57
58 Running without arguments will suffice in most cases.
59 "
60 }
61
62 # Configuration.
63
64 # Name of the Makefile.am
65 gnulib_mk=gnulib.mk
66
67 # List of gnulib modules needed.
68 gnulib_modules=
69
70 # Any gnulib files needed that are not in modules.
71 gnulib_files=
72
73 # Translation Project URL, for the registry of all projects
74 # and for the translation-team master directory.
75 TP_URL="http://translationproject.org/latest/"
76
77 extract_package_name='
78   /^AC_INIT(/{
79      /.*,.*,.*,/{
80        s///
81        s/[][]//g
82        p
83        q
84      }
85      s/AC_INIT(\[*//
86      s/]*,.*//
87      s/^GNU //
88      y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
89      s/[^A-Za-z0-9_]/-/g
90      p
91   }
92 '
93 package=`sed -n "$extract_package_name" configure.ac` || exit
94 gnulib_name=lib$package
95
96 build_aux=build-aux
97 # Extra files from gnulib, which override files from other sources.
98 gnulib_extra_files="
99         $build_aux/install-sh
100         $build_aux/missing
101         $build_aux/mdate-sh
102         $build_aux/texinfo.tex
103         $build_aux/depcomp
104         $build_aux/config.guess
105         $build_aux/config.sub
106         doc/INSTALL
107 "
108
109 # Additional gnulib-tool options to use.  Use "\newline" to break lines.
110 gnulib_tool_option_extras=
111
112 # Other locale categories that need message catalogs.
113 EXTRA_LOCALE_CATEGORIES=
114
115 # Additional xgettext options to use.  Use "\\\newline" to break lines.
116 XGETTEXT_OPTIONS='\\\
117  --flag=_:1:pass-c-format\\\
118  --flag=N_:1:pass-c-format\\\
119  --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
120 '
121
122 # Files we don't want to import.
123 excluded_files=
124
125 # File that should exist in the top directory of a checked out hierarchy,
126 # but not in a distribution tarball.
127 checkout_only_file=README-hacking
128
129 # Whether to use copies instead of symlinks.
130 copy=false
131
132 # Override the default configuration, if necessary.
133 test -r bootstrap.conf && . ./bootstrap.conf
134
135 # Translate configuration into internal form.
136
137 # Parse options.
138
139 for option
140 do
141   case $option in
142   --help)
143     usage
144     exit;;
145   --gnulib-srcdir=*)
146     GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
147   --cvs-user=*)
148     CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
149   --skip-po)
150     SKIP_PO=t;;
151   --force)
152     checkout_only_file=;;
153   --copy)
154     copy=true;;
155   *)
156     echo >&2 "$0: $option: unknown option"
157     exit 1;;
158   esac
159 done
160
161 if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
162   echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
163   exit 1
164 fi
165
166 # If $STR is not already on a line by itself in $FILE, insert it,
167 # sorting the new contents of the file and replacing $FILE with the result.
168 insert_sorted_if_absent() {
169   file=$1
170   str=$2
171   echo "$str" | sort -u - $file | cmp -s - $file \
172     || echo "$str" | sort -u - $file -o $file \
173     || exit 1
174 }
175
176 # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
177 found_aux_dir=no
178 grep '^[         ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
179     >/dev/null && found_aux_dir=yes
180 grep '^[         ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
181     >/dev/null && found_aux_dir=yes
182 if test $found_aux_dir = no; then
183   echo "$0: expected line not found in configure.ac. Add the following:" >&2
184   echo "  AC_CONFIG_AUX_DIR([$build_aux])" >&2
185   exit 1
186 fi
187
188 # If $build_aux doesn't exist, create it now, otherwise some bits
189 # below will malfunction.  If creating it, also mark it as ignored.
190 if test ! -d $build_aux; then
191   mkdir $build_aux
192   for ig in .cvsignore .gitignore; do
193     test -f $ig && insert_sorted_if_absent $ig $build_aux
194   done
195 fi
196
197 echo "$0: Bootstrapping from checked-out $package sources..."
198
199 cleanup_gnulib() {
200   status=$?
201   rm -fr gnulib
202   exit $status
203 }
204
205 # Get gnulib files.
206
207 case ${GNULIB_SRCDIR--} in
208 -)
209   if [ ! -d gnulib ]; then
210     echo "$0: getting gnulib files..."
211
212     case ${CVS_AUTH-pserver} in
213     pserver)
214       CVS_PREFIX=':pserver:anonymous@';;
215     ssh)
216       CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
217     *)
218       echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
219       exit 1;;
220     esac
221
222     case $CVS_RSH in
223     '') CVS_RSH=ssh; export CVS_RSH;;
224     esac
225
226     trap cleanup_gnulib 1 2 13 15
227
228     cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
229       cleanup_gnulib
230
231     trap - 1 2 13 15
232   fi
233   GNULIB_SRCDIR=gnulib
234 esac
235
236 gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
237 <$gnulib_tool || exit
238
239 # Get translations.
240
241 get_translations() {
242   subdir=$1
243   domain=$2
244
245   case $WGET_COMMAND in
246   '')
247     echo "$0: wget not available; skipping translations";;
248   ?*)
249     echo "$0: getting translations into $subdir for $domain..." &&
250
251     (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'` &&
252      $WGET_COMMAND -r -l1 -nd -np -A.po $TP_URL/$domain)
253     ;;
254   esac &&
255   ls "$subdir"/*.po 2>/dev/null |
256     sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS"
257 }
258
259 case $SKIP_PO in
260 '')
261   case `wget --help` in
262   *'--no-cache'*)
263     WGET_COMMAND='wget -nv --no-cache';;
264   *'--cache=on/off'*)
265     WGET_COMMAND='wget -nv --cache=off';;
266   *'--non-verbose'*)
267     WGET_COMMAND='wget -nv';;
268   *)
269     WGET_COMMAND='';;
270   esac
271
272   if test -d po; then
273     get_translations po $package || exit
274   fi
275
276   if test -d runtime-po; then
277     get_translations runtime-po $package-runtime || exit
278   fi;;
279 esac
280
281 symlink_to_gnulib()
282 {
283   src=$GNULIB_SRCDIR/$1
284   dst=${2-$1}
285
286   test -f "$src" && {
287     if $copy; then
288       {
289         test ! -h "$dst" || {
290           echo "$0: rm -f $dst" &&
291           rm -f "$dst"
292         }
293       } &&
294       test -f "$dst" &&
295       cmp -s "$src" "$dst" || {
296         echo "$0: cp -fp $src $dst" &&
297         cp -fp "$src" "$dst"
298       }
299     else
300       test -h "$dst" &&
301       src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
302       dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
303       test "$src_i" = "$dst_i" || {
304         dot_dots=
305         case $src in
306         /*) ;;
307         *)
308           case /$dst/ in
309           *//* | */../* | */./* | /*/*/*/*/*/)
310              echo >&2 "$0: invalid symlink calculation: $src -> $dst"
311              exit 1;;
312           /*/*/*/*/)    dot_dots=../../../;;
313           /*/*/*/)      dot_dots=../../;;
314           /*/*/)        dot_dots=../;;
315           esac;;
316         esac
317
318         echo "$0: ln -fs $dot_dots$src $dst" &&
319         ln -fs "$dot_dots$src" "$dst"
320       }
321     fi
322   }
323 }
324
325 cp_mark_as_generated()
326 {
327   cp_src=$1
328   cp_dst=$2
329
330   if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
331     symlink_to_gnulib "$cp_dst"
332   else
333     case $cp_dst in
334       *.[ch])             c1='/* '; c2=' */';;
335       *.texi)             c1='@c '; c2=     ;;
336       *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
337       *)                  c1=     ; c2=     ;;
338     esac
339
340     if test -z "$c1"; then
341       cmp -s "$cp_src" "$cp_dst" || {
342         echo "$0: cp -f $cp_src $cp_dst" &&
343         rm -f "$cp_dst" &&
344         sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
345       }
346     else
347       # Copy the file first to get proper permissions if it
348       # doesn't already exist.  Then overwrite the copy.
349       cp "$cp_src" "$cp_dst-t" &&
350       (
351         echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
352         echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
353         sed "s!$bt_regex/!!g" "$cp_src"
354       ) > $cp_dst-t &&
355       if cmp -s "$cp_dst-t" "$cp_dst"; then
356         rm -f "$cp_dst-t"
357       else
358         echo "$0: cp $cp_src $cp_dst # with edits" &&
359         mv -f "$cp_dst-t" "$cp_dst"
360       fi
361     fi
362   fi
363 }
364
365 version_controlled_file() {
366   dir=$1
367   file=$2
368   found=no
369   if test -d CVS; then
370     grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
371              grep '^/[^/]*/[0-9]' > /dev/null && found=yes
372   elif test -d .git; then
373     git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
374   else
375     echo "$0: no version control for $dir/$file?" >&2
376   fi
377   test $found = yes
378 }
379
380 slurp() {
381   for dir in . `(cd $1 && find * -type d -print)`; do
382     copied=
383     sep=
384     for file in `ls $1/$dir`; do
385       test -d $1/$dir/$file && continue
386       for excluded_file in $excluded_files; do
387         test "$dir/$file" = "$excluded_file" && continue 2
388       done
389       if test $file = Makefile.am; then
390         copied=$copied${sep}$gnulib_mk; sep=$nl
391         remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
392         sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
393           echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
394           rm -f $dir/$gnulib_mk &&
395           sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
396         }
397       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
398            version_controlled_file $dir $file; then
399         echo "$0: $dir/$file overrides $1/$dir/$file"
400       else
401         copied=$copied$sep$file; sep=$nl
402         if test $file = gettext.m4; then
403           echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
404           rm -f $dir/$file
405           sed '
406             /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
407               AC_DEFUN([AM_INTL_SUBDIR], [
408             /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
409               AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
410             $a\
411               AC_DEFUN([gl_LOCK_EARLY], [])
412           ' $1/$dir/$file >$dir/$file
413         else
414           cp_mark_as_generated $1/$dir/$file $dir/$file
415         fi
416       fi || exit
417     done
418
419     for dot_ig in .cvsignore .gitignore; do
420       ig=$dir/$dot_ig
421       if test -n "$copied" && test -f $ig; then
422         insert_sorted_if_absent $ig "$copied"
423         # If an ignored file name ends with _.h, then also add
424         # the name with just ".h".  Many gnulib headers are generated,
425         # e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
426         f=`echo "$copied"|sed 's/_\.h$/.h/'`
427         insert_sorted_if_absent $ig "$f"
428       fi
429     done
430   done
431 }
432
433
434 # Create boot temporary directories to import from gnulib and gettext.
435 rm -fr $bt $bt2 &&
436 mkdir $bt $bt2 || exit
437
438 # Import from gnulib.
439
440 gnulib_tool_options="\
441  --import\
442  --no-changelog\
443  --aux-dir $bt/$build_aux\
444  --doc-base $bt/doc\
445  --lib $gnulib_name\
446  --m4-base $bt/m4/\
447  --source-base $bt/lib/\
448  --tests-base $bt/tests\
449  --local-dir gl\
450 $gnulib_tool_option_extras\
451 "
452 echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
453 $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
454 slurp $bt || exit
455
456 for file in $gnulib_files; do
457   symlink_to_gnulib $file || exit
458 done
459
460
461 # Import from gettext.
462 with_gettext=yes
463 grep '^[         ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
464     with_gettext=no
465
466 if test $with_gettext = yes; then
467   echo "$0: (cd $bt2; autopoint) ..."
468   cp configure.ac $bt2 &&
469   (cd $bt2 && autopoint && rm configure.ac) &&
470   slurp $bt2 $bt || exit
471
472   rm -fr $bt $bt2 || exit
473 fi
474
475
476 # Reconfigure, getting other files.
477
478 for command in \
479   libtool \
480   'aclocal --force -I m4' \
481   'autoconf --force' \
482   'autoheader --force' \
483   'automake --add-missing --copy --force-missing';
484 do
485   if test "$command" = libtool; then
486     grep '^[     ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
487       continue
488     command='libtoolize -c -f'
489   fi
490   echo "$0: $command ..."
491   $command || exit
492 done
493
494
495 # Get some extra files from gnulib, overriding existing files.
496 for file in $gnulib_extra_files; do
497   case $file in
498   */INSTALL) dst=INSTALL;;
499   build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
500   *) dst=$file;;
501   esac
502   symlink_to_gnulib $file $dst || exit
503 done
504
505 if test $with_gettext = yes; then
506   # Create gettext configuration.
507   echo "$0: Creating po/Makevars from po/Makevars.template ..."
508   rm -f po/Makevars
509   sed '
510     /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
511     /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
512     /^XGETTEXT_OPTIONS *=/{
513       s/$/ \\/
514       a\
515           '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
516     }
517   ' po/Makevars.template >po/Makevars
518
519   if test -d runtime-po; then
520     # Similarly for runtime-po/Makevars, but not quite the same.
521     rm -f runtime-po/Makevars
522     sed '
523       /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
524       /^subdir *=.*/s/=.*/= runtime-po/
525       /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
526       /^XGETTEXT_OPTIONS *=/{
527         s/$/ \\/
528         a\
529             '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
530       }
531     ' <po/Makevars.template >runtime-po/Makevars
532
533     # Copy identical files from po to runtime-po.
534     (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
535   fi
536 fi
537
538 echo "$0: done.  Now you can run './configure'."