]> git.saurik.com Git - bison.git/blame - bootstrap
Adjust to recent changes to gnulib bootstrap.
[bison.git] / bootstrap
CommitLineData
01c56de4 1#! /bin/sh
86996fca
PE
2# Print a version string.
3scriptversion=2010-10-08.16; # UTC
01c56de4 4
bbb44d83 5# Bootstrap this package from checked-out sources.
01c56de4 6
86996fca 7# Copyright (C) 2003-2010 Free Software Foundation, Inc.
1f65350a 8
f16b0819 9# This program is free software: you can redistribute it and/or modify
1f65350a 10# it under the terms of the GNU General Public License as published by
f16b0819
PE
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
6d8e724d 13
1f65350a
PE
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
6d8e724d 18
1f65350a 19# You should have received a copy of the GNU General Public License
f16b0819 20# along with this program. If not, see <http://www.gnu.org/licenses/>.
1f65350a 21
86996fca
PE
22# Originally written by Paul Eggert. The canonical version of this
23# script is maintained as build-aux/bootstrap in gnulib, however, to
24# be useful to your project, you should place a copy of it under
25# version control in the top-level directory of your project. The
26# intent is that all customization can be done with a bootstrap.conf
27# file also maintained in your version control; gnulib comes with a
28# template build-aux/bootstrap.conf to get you started.
29
30# Please report bugs or propose patches to bug-gnulib@gnu.org.
1f65350a 31
3b2942e6
PE
32nl='
33'
5a2baae7 34
62a9592d 35# Ensure file names are sorted consistently across platforms.
a9f027b9
PE
36LC_ALL=C
37export LC_ALL
38
6d8e724d
PE
39local_gl_dir=gl
40
bbb44d83
PE
41# Temporary directory names.
42bt='._bootmp'
43bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
44bt2=${bt}2
45
e3ddc1e3 46usage() {
c1455bab 47 cat <<EOF
e3ddc1e3 48Usage: $0 [OPTION]...
10f429ef 49Bootstrap this package from the checked-out sources.
e3ddc1e3
PE
50
51Options:
52 --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
f0a43dd1
JD
53 sources reside. Use this if you already
54 have gnulib sources on your machine, and
55 do not want to waste your bandwidth downloading
86996fca 56 them again. Defaults to \$GNULIB_SRCDIR.
46356ea4 57 --copy Copy files instead of creating symbolic links.
10f429ef 58 --force Attempt to bootstrap even if the sources seem
f0a43dd1 59 not to have been checked out.
e3ddc1e3 60 --skip-po Do not download po files.
e3ddc1e3 61
f0a43dd1 62If the file $0.conf exists in the same directory as this script, its
e3ddc1e3
PE
63contents are read as shell variables to configure the bootstrap.
64
f0a43dd1
JD
65For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
66are honored.
67
e3ddc1e3 68Running without arguments will suffice in most cases.
c1455bab 69EOF
e3ddc1e3 70}
3b2942e6
PE
71
72# Configuration.
73
6d8e724d
PE
74# Name of the Makefile.am
75gnulib_mk=gnulib.mk
76
3b2942e6
PE
77# List of gnulib modules needed.
78gnulib_modules=
79
80# Any gnulib files needed that are not in modules.
81gnulib_files=
82
86996fca
PE
83# A function to be called to edit gnulib.mk right after it's created.
84# Override it via your own definition in bootstrap.conf.
85gnulib_mk_hook() { :; }
86
f0a43dd1
JD
87# A function to be called after everything else in this script.
88# Override it via your own definition in bootstrap.conf.
89bootstrap_epilogue() { :; }
90
6d8e724d
PE
91# The command to download all .po files for a specified domain into
92# a specified directory. Fill in the first %s is the domain name, and
93# the second with the destination directory. Use rsync's -L and -r
94# options because the latest/%s directory and the .po files within are
95# all symlinks.
96po_download_command_format=\
86996fca
PE
97"rsync --delete --exclude '*.s1' -Lrtvz \
98 'translationproject.org::tp/latest/%s/' '%s'"
3b2942e6
PE
99
100extract_package_name='
101 /^AC_INIT(/{
f0a43dd1 102 /.*,.*,.*, */{
3b2942e6
PE
103 s///
104 s/[][]//g
f0a43dd1 105 s/)$//
3b2942e6
PE
106 p
107 q
108 }
109 s/AC_INIT(\[*//
110 s/]*,.*//
111 s/^GNU //
112 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
113 s/[^A-Za-z0-9_]/-/g
114 p
115 }
116'
117package=`sed -n "$extract_package_name" configure.ac` || exit
bbb44d83 118gnulib_name=lib$package
3b2942e6 119
bbb44d83 120build_aux=build-aux
f0a43dd1
JD
121source_base=lib
122m4_base=m4
123doc_base=doc
124tests_base=tests
125
3b2942e6 126# Extra files from gnulib, which override files from other sources.
bbb44d83 127gnulib_extra_files="
f0a43dd1
JD
128 $build_aux/install-sh
129 $build_aux/missing
130 $build_aux/mdate-sh
131 $build_aux/texinfo.tex
132 $build_aux/depcomp
133 $build_aux/config.guess
134 $build_aux/config.sub
135 doc/INSTALL
bbb44d83 136"
3b2942e6 137
6d8e724d
PE
138# Additional gnulib-tool options to use. Use "\newline" to break lines.
139gnulib_tool_option_extras=
140
3b2942e6
PE
141# Other locale categories that need message catalogs.
142EXTRA_LOCALE_CATEGORIES=
143
144# Additional xgettext options to use. Use "\\\newline" to break lines.
145XGETTEXT_OPTIONS='\\\
146 --flag=_:1:pass-c-format\\\
147 --flag=N_:1:pass-c-format\\\
148 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
149'
150
86996fca
PE
151# Package bug report address and copyright holder for gettext files
152COPYRIGHT_HOLDER='Free Software Foundation, Inc.'
f0a43dd1
JD
153MSGID_BUGS_ADDRESS=bug-$package@gnu.org
154
3b2942e6
PE
155# Files we don't want to import.
156excluded_files=
157
10f429ef
PE
158# File that should exist in the top directory of a checked out hierarchy,
159# but not in a distribution tarball.
86996fca 160checkout_only_file=README-hacking
e3ddc1e3 161
46356ea4
PE
162# Whether to use copies instead of symlinks.
163copy=false
164
6d8e724d
PE
165# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
166# those files to be generated in directories like lib/, m4/, and po/.
167# Or set it to 'auto' to make this script select which to use based
168# on which version control system (if any) is used in the source directory.
169vc_ignore=auto
170
d7be4085
AD
171# find_tool ENVVAR NAMES...
172# -------------------------
f0a43dd1
JD
173# Search for a required program. Use the value of ENVVAR, if set,
174# otherwise find the first of the NAMES that can be run (i.e.,
3710dd02
AD
175# supports --version). If found, set ENVVAR to the program name,
176# die otherwise.
d7be4085
AD
177find_tool ()
178{
d7be4085
AD
179 find_tool_envvar=$1
180 shift
3710dd02
AD
181 find_tool_names=$@
182 eval "find_tool_res=\$$find_tool_envvar"
183 if test x"$find_tool_res" = x; then
d7be4085
AD
184 for i
185 do
186 if ($i --version </dev/null) >/dev/null 2>&1; then
3710dd02
AD
187 find_tool_res=$i
188 break
d7be4085
AD
189 fi
190 done
3710dd02
AD
191 else
192 find_tool_error_prefix="\$$find_tool_envvar: "
d7be4085
AD
193 fi
194 if test x"$find_tool_res" = x; then
3710dd02 195 echo >&2 "$0: one of these is required: $find_tool_names"
d7be4085
AD
196 exit 1
197 fi
198 ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
3710dd02 199 echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
d7be4085
AD
200 exit 1
201 }
3710dd02 202 eval "$find_tool_envvar=\$find_tool_res"
d7be4085
AD
203 eval "export $find_tool_envvar"
204}
205
86996fca
PE
206# Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6.
207find_tool SHA1SUM sha1sum gsha1sum shasum
d7be4085 208
3b2942e6 209# Override the default configuration, if necessary.
f0a43dd1
JD
210# Make sure that bootstrap.conf is sourced from the current directory
211# if we were invoked as "sh bootstrap".
212case "$0" in
213 */*) test -r "$0.conf" && . "$0.conf" ;;
214 *) test -r "$0.conf" && . ./"$0.conf" ;;
215esac
216
3b2942e6 217
6d8e724d
PE
218if test "$vc_ignore" = auto; then
219 vc_ignore=
220 test -d .git && vc_ignore=.gitignore
221 test -d CVS && vc_ignore="$vc_ignore .cvsignore"
222fi
223
3b2942e6
PE
224# Translate configuration into internal form.
225
1f65350a
PE
226# Parse options.
227
228for option
229do
230 case $option in
231 --help)
e3ddc1e3 232 usage
1f65350a
PE
233 exit;;
234 --gnulib-srcdir=*)
f0a43dd1 235 GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
1f65350a
PE
236 --skip-po)
237 SKIP_PO=t;;
e3ddc1e3 238 --force)
bbb44d83 239 checkout_only_file=;;
46356ea4
PE
240 --copy)
241 copy=true;;
1f65350a
PE
242 *)
243 echo >&2 "$0: $option: unknown option"
244 exit 1;;
245 esac
246done
247
bbb44d83 248if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
10f429ef 249 echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
e3ddc1e3
PE
250 exit 1
251fi
252
f0a43dd1 253# If $STR is not already on a line by itself in $FILE, insert it,
bbb44d83
PE
254# sorting the new contents of the file and replacing $FILE with the result.
255insert_sorted_if_absent() {
256 file=$1
257 str=$2
6d8e724d 258 test -f $file || touch $file
f0a43dd1 259 echo "$str" | sort -u - $file | cmp - $file > /dev/null \
bbb44d83
PE
260 || echo "$str" | sort -u - $file -o $file \
261 || exit 1
262}
263
264# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
265found_aux_dir=no
266grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
267 >/dev/null && found_aux_dir=yes
268grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
269 >/dev/null && found_aux_dir=yes
270if test $found_aux_dir = no; then
271 echo "$0: expected line not found in configure.ac. Add the following:" >&2
6d8e724d
PE
272 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
273 exit 1
bbb44d83
PE
274fi
275
276# If $build_aux doesn't exist, create it now, otherwise some bits
277# below will malfunction. If creating it, also mark it as ignored.
278if test ! -d $build_aux; then
279 mkdir $build_aux
6d8e724d
PE
280 for dot_ig in x $vc_ignore; do
281 test $dot_ig = x && continue
86996fca 282 insert_sorted_if_absent $dot_ig $build_aux
bbb44d83
PE
283 done
284fi
285
f0a43dd1
JD
286# Note this deviates from the version comparison in automake
287# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
288# but this should suffice as we won't be specifying old
289# version formats or redundant trailing .0 in bootstrap.conf.
290# If we did want full compatibility then we should probably
291# use m4_version_compare from autoconf.
292sort_ver() { # sort -V is not generally available
293 ver1="$1"
294 ver2="$2"
295
296 # split on '.' and compare each component
297 i=1
298 while : ; do
299 p1=$(echo "$ver1" | cut -d. -f$i)
300 p2=$(echo "$ver2" | cut -d. -f$i)
301 if [ ! "$p1" ]; then
302 echo "$1 $2"
303 break
304 elif [ ! "$p2" ]; then
305 echo "$2 $1"
306 break
307 elif [ ! "$p1" = "$p2" ]; then
308 if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
309 echo "$2 $1"
310 elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
311 echo "$1 $2"
312 else # numeric, then lexicographic comparison
313 lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
314 if [ "$lp" = "$p2" ]; then
315 echo "$1 $2"
316 else
317 echo "$2 $1"
318 fi
319 fi
320 break
321 fi
322 i=$(($i+1))
323 done
324}
1f65350a 325
f0a43dd1
JD
326get_version() {
327 app=$1
328
329 $app --version >/dev/null 2>&1 || return 1
330
331 $app --version 2>&1 |
332 sed -n '# extract version within line
333 s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
334 t done
335
336 # extract version at start of line
337 s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
338 t done
339
340 d
341
342 :done
343 #the following essentially does s/5.005/5.5/
344 s/\.0*\([1-9]\)/.\1/g
345 p
346 q'
e10a80ee
PE
347}
348
f0a43dd1
JD
349check_versions() {
350 ret=0
351
352 while read app req_ver; do
86996fca
PE
353 # We only need libtoolize from the libtool package.
354 if test "$app" = libtool; then
355 app=libtoolize
356 fi
f0a43dd1 357 # Honor $APP variables ($TAR, $AUTOCONF, etc.)
86996fca 358 appvar=`echo $app | tr '[a-z]-' '[A-Z]_'`
f0a43dd1
JD
359 test "$appvar" = TAR && appvar=AMTAR
360 eval "app=\${$appvar-$app}"
361 inst_ver=$(get_version $app)
362 if [ ! "$inst_ver" ]; then
363 echo "Error: '$app' not found" >&2
364 ret=1
365 elif [ ! "$req_ver" = "-" ]; then
366 latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
367 if [ ! "$latest_ver" = "$inst_ver" ]; then
368 echo "Error: '$app' version == $inst_ver is too old" >&2
369 echo " '$app' version >= $req_ver is required" >&2
370 ret=1
371 fi
372 fi
373 done
374
375 return $ret
376}
fee2ed87 377
f0a43dd1
JD
378print_versions() {
379 echo "Program Min_version"
380 echo "----------------------"
86996fca 381 printf %s "$buildreq"
f0a43dd1
JD
382 echo "----------------------"
383 # can't depend on column -t
384}
385
86996fca
PE
386use_libtool=0
387# We'd like to use grep -E, to see if any of LT_INIT,
388# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
389# but that's not portable enough (e.g., for Solaris).
390grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
391 && use_libtool=1
392grep '^[ ]*LT_INIT' configure.ac >/dev/null \
393 && use_libtool=1
394if test $use_libtool = 1; then
395 find_tool LIBTOOLIZE glibtoolize libtoolize
396fi
397
f0a43dd1 398if ! printf "$buildreq" | check_versions; then
86996fca
PE
399 echo >&2
400 if test -f README-prereq; then
401 echo "See README-prereq for how to get the prerequisite programs" >&2
402 else
403 echo "Please install the prerequisite programs" >&2
404 fi
f0a43dd1
JD
405 exit 1
406fi
407
408echo "$0: Bootstrapping from checked-out $package sources..."
409
410# See if we can use gnulib's git-merge-changelog merge driver.
fee2ed87
PB
411if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
412 if git config merge.merge-changelog.driver >/dev/null ; then
413 :
414 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
415 echo "initializing git-merge-changelog driver"
416 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
417 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
418 else
419 echo "consider installing git-merge-changelog from gnulib"
420 fi
421fi
422
f0a43dd1
JD
423
424cleanup_gnulib() {
425 status=$?
86996fca 426 rm -fr "$gnulib_path"
f0a43dd1
JD
427 exit $status
428}
429
430git_modules_config () {
431 test -f .gitmodules && git config --file .gitmodules "$@"
432}
433
86996fca
PE
434gnulib_path=`git_modules_config submodule.gnulib.path`
435: ${gnulib_path=gnulib}
436
1f65350a
PE
437# Get gnulib files.
438
439case ${GNULIB_SRCDIR--} in
440-)
f0a43dd1 441 if git_modules_config submodule.gnulib.url >/dev/null; then
1f65350a 442 echo "$0: getting gnulib files..."
f0a43dd1
JD
443 git submodule init || exit $?
444 git submodule update || exit $?
1f65350a 445
86996fca 446 elif [ ! -d "$gnulib_path" ]; then
f0a43dd1 447 echo "$0: getting gnulib files..."
1f65350a 448
e10a80ee
PE
449 trap cleanup_gnulib 1 2 13 15
450
86996fca
PE
451 shallow=
452 git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
453 git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
e10a80ee 454 cleanup_gnulib
1f65350a 455
e10a80ee 456 trap - 1 2 13 15
1f65350a 457 fi
86996fca 458 GNULIB_SRCDIR=$gnulib_path
f0a43dd1
JD
459 ;;
460*)
86996fca 461 # Use GNULIB_SRCDIR as a reference.
f0a43dd1
JD
462 if test -d "$GNULIB_SRCDIR"/.git && \
463 git_modules_config submodule.gnulib.url >/dev/null; then
f0a43dd1 464 echo "$0: getting gnulib files..."
86996fca
PE
465 if git submodule -h|grep -- --reference > /dev/null; then
466 # Prefer the one-liner available in git 1.6.4 or newer.
467 git submodule update --init --reference "$GNULIB_SRCDIR" \
468 "$gnulib_path" || exit $?
469 else
470 # This fallback allows at least git 1.5.5.
471 if test -f "$gnulib_path"/gnulib-tool; then
472 # Since file already exists, assume submodule init already complete.
473 git submodule update || exit $?
474 else
475 # Older git can't clone into an empty directory.
476 rmdir "$gnulib_path" 2>/dev/null
477 git clone --reference "$GNULIB_SRCDIR" \
478 "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
479 && git submodule init && git submodule update \
480 || exit $?
481 fi
482 fi
483 GNULIB_SRCDIR=$gnulib_path
f0a43dd1
JD
484 fi
485 ;;
1f65350a
PE
486esac
487
284d8a13
PE
488gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
489<$gnulib_tool || exit
1f65350a 490
1f65350a
PE
491# Get translations.
492
6d8e724d 493download_po_files() {
5a2baae7
PE
494 subdir=$1
495 domain=$2
6d8e724d
PE
496 echo "$0: getting translations into $subdir for $domain..."
497 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
498 eval "$cmd"
499}
5a2baae7 500
86996fca 501# Mirror .po files to $po_dir/.reference and copy only the new
6d8e724d 502# or modified ones into $po_dir. Also update $po_dir/LINGUAS.
86996fca
PE
503# Note po files that exist locally only are left in $po_dir but will
504# not be included in LINGUAS and hence will not be distributed.
6d8e724d
PE
505update_po_files() {
506 # Directory containing primary .po files.
507 # Overwrite them only when we're sure a .po file is new.
508 po_dir=$1
509 domain=$2
510
86996fca 511 # Mirror *.po files into this dir.
6d8e724d
PE
512 # Usually contains *.s1 checksum files.
513 ref_po_dir="$po_dir/.reference"
514
515 test -d $ref_po_dir || mkdir $ref_po_dir || return
516 download_po_files $ref_po_dir $domain \
517 && ls "$ref_po_dir"/*.po 2>/dev/null |
86996fca 518 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
6d8e724d 519
f0a43dd1
JD
520 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
521 test "$langs" = '*' && langs=x
522 for po in $langs; do
523 case $po in x) continue;; esac
524 new_po="$ref_po_dir/$po.po"
525 cksum_file="$ref_po_dir/$po.s1"
526 if ! test -f "$cksum_file" ||
527 ! test -f "$po_dir/$po.po" ||
528 ! $SHA1SUM -c --status "$cksum_file" \
529 < "$new_po" > /dev/null; then
530 echo "updated $po_dir/$po.po..."
531 cp "$new_po" "$po_dir/$po.po" \
532 && $SHA1SUM < "$new_po" > "$cksum_file"
533 fi
6d8e724d 534 done
5a2baae7
PE
535}
536
1f65350a
PE
537case $SKIP_PO in
538'')
bbb44d83 539 if test -d po; then
6d8e724d 540 update_po_files po $package || exit
bbb44d83 541 fi
f7ab6a50 542
3b2942e6 543 if test -d runtime-po; then
6d8e724d 544 update_po_files runtime-po $package-runtime || exit
3b2942e6 545 fi;;
1f65350a
PE
546esac
547
6d8e724d 548symlink_to_dir()
e70f46d1 549{
6d8e724d
PE
550 src=$1/$2
551 dst=${3-$2}
e70f46d1
PE
552
553 test -f "$src" && {
6d8e724d 554
86996fca
PE
555 # If the destination directory doesn't exist, create it.
556 # This is required at least for "lib/uniwidth/cjk.h".
557 dst_dir=`dirname "$dst"`
558 if ! test -d "$dst_dir"; then
559 mkdir -p "$dst_dir"
560
561 # If we've just created a directory like lib/uniwidth,
562 # tell version control system(s) it's ignorable.
563 # FIXME: for now, this does only one level
564 parent=`dirname "$dst_dir"`
565 for dot_ig in x $vc_ignore; do
566 test $dot_ig = x && continue
567 ig=$parent/$dot_ig
568 insert_sorted_if_absent $ig `echo "$dst_dir"|sed 's,.*/,,'`
569 done
570 fi
6d8e724d 571
46356ea4
PE
572 if $copy; then
573 {
f0a43dd1
JD
574 test ! -h "$dst" || {
575 echo "$0: rm -f $dst" &&
576 rm -f "$dst"
577 }
46356ea4
PE
578 } &&
579 test -f "$dst" &&
580 cmp -s "$src" "$dst" || {
f0a43dd1
JD
581 echo "$0: cp -fp $src $dst" &&
582 cp -fp "$src" "$dst"
46356ea4
PE
583 }
584 else
585 test -h "$dst" &&
586 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
587 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
588 test "$src_i" = "$dst_i" || {
f0a43dd1
JD
589 dot_dots=
590 case $src in
591 /*) ;;
592 *)
593 case /$dst/ in
594 *//* | */../* | */./* | /*/*/*/*/*/)
595 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
596 exit 1;;
597 /*/*/*/*/) dot_dots=../../../;;
598 /*/*/*/) dot_dots=../../;;
599 /*/*/) dot_dots=../;;
600 esac;;
601 esac
602
603 echo "$0: ln -fs $dot_dots$src $dst" &&
604 ln -fs "$dot_dots$src" "$dst"
46356ea4
PE
605 }
606 fi
e70f46d1
PE
607 }
608}
609
3b2942e6
PE
610cp_mark_as_generated()
611{
612 cp_src=$1
613 cp_dst=$2
1f65350a 614
e70f46d1 615 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
6d8e724d
PE
616 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
617 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
618 symlink_to_dir $local_gl_dir "$cp_dst"
e70f46d1
PE
619 else
620 case $cp_dst in
621 *.[ch]) c1='/* '; c2=' */';;
622 *.texi) c1='@c '; c2= ;;
623 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
624 *) c1= ; c2= ;;
625 esac
1f65350a 626
86996fca
PE
627 # If the destination directory doesn't exist, create it.
628 # This is required at least for "lib/uniwidth/cjk.h".
629 dst_dir=`dirname "$cp_dst"`
630 test -d "$dst_dir" || mkdir -p "$dst_dir"
631
e70f46d1
PE
632 if test -z "$c1"; then
633 cmp -s "$cp_src" "$cp_dst" || {
f0a43dd1
JD
634 # Copy the file first to get proper permissions if it
635 # doesn't already exist. Then overwrite the copy.
636 echo "$0: cp -f $cp_src $cp_dst" &&
637 rm -f "$cp_dst" &&
638 cp "$cp_src" "$cp_dst-t" &&
639 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
640 mv -f "$cp_dst-t" "$cp_dst"
e70f46d1
PE
641 }
642 else
643 # Copy the file first to get proper permissions if it
644 # doesn't already exist. Then overwrite the copy.
645 cp "$cp_src" "$cp_dst-t" &&
646 (
f0a43dd1
JD
647 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
648 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
649 sed "s!$bt_regex/!!g" "$cp_src"
e70f46d1
PE
650 ) > $cp_dst-t &&
651 if cmp -s "$cp_dst-t" "$cp_dst"; then
f0a43dd1 652 rm -f "$cp_dst-t"
e70f46d1 653 else
f0a43dd1
JD
654 echo "$0: cp $cp_src $cp_dst # with edits" &&
655 mv -f "$cp_dst-t" "$cp_dst"
e70f46d1
PE
656 fi
657 fi
658 fi
3b2942e6 659}
1f65350a 660
10f429ef
PE
661version_controlled_file() {
662 dir=$1
663 file=$2
664 found=no
665 if test -d CVS; then
666 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
f0a43dd1 667 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
10f429ef 668 elif test -d .git; then
f0a43dd1
JD
669 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
670 elif test -d .svn; then
671 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
10f429ef
PE
672 else
673 echo "$0: no version control for $dir/$file?" >&2
674 fi
675 test $found = yes
676}
677
3b2942e6
PE
678slurp() {
679 for dir in . `(cd $1 && find * -type d -print)`; do
680 copied=
681 sep=
6d8e724d
PE
682 for file in `ls -a $1/$dir`; do
683 case $file in
684 .|..) continue;;
86996fca
PE
685 # FIXME: should all file names starting with "." be ignored?
686 .*) continue;;
6d8e724d
PE
687 esac
688 test -d $1/$dir/$file && continue
3b2942e6 689 for excluded_file in $excluded_files; do
f0a43dd1 690 test "$dir/$file" = "$excluded_file" && continue 2
3b2942e6 691 done
86996fca 692 if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then
f0a43dd1
JD
693 copied=$copied${sep}$gnulib_mk; sep=$nl
694 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
86996fca
PE
695 sed "$remove_intl" $1/$dir/$file |
696 cmp - $dir/$gnulib_mk > /dev/null || {
f0a43dd1
JD
697 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
698 rm -f $dir/$gnulib_mk &&
86996fca
PE
699 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk &&
700 gnulib_mk_hook $dir/$gnulib_mk
f0a43dd1 701 }
e70f46d1 702 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
f0a43dd1
JD
703 version_controlled_file $dir $file; then
704 echo "$0: $dir/$file overrides $1/$dir/$file"
3b2942e6 705 else
f0a43dd1
JD
706 copied=$copied$sep$file; sep=$nl
707 if test $file = gettext.m4; then
708 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
709 rm -f $dir/$file
710 sed '
711 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
86996fca 712 AC_DEFUN([AM_INTL_SUBDIR], [])
f0a43dd1
JD
713 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
714 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
715 $a\
716 AC_DEFUN([gl_LOCK_EARLY], [])
717 ' $1/$dir/$file >$dir/$file
718 else
719 cp_mark_as_generated $1/$dir/$file $dir/$file
720 fi
3b2942e6
PE
721 fi || exit
722 done
723
6d8e724d
PE
724 for dot_ig in x $vc_ignore; do
725 test $dot_ig = x && continue
5691bf57 726 ig=$dir/$dot_ig
6d8e724d 727 if test -n "$copied"; then
86996fca 728 insert_sorted_if_absent $ig "$copied"
f0a43dd1
JD
729 # If an ignored file name ends with .in.h, then also add
730 # the name with just ".h". Many gnulib headers are generated,
731 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
732 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
86996fca
PE
733 f=`echo "$copied" |
734 sed '
735 s/\.in\.h$/.h/
736 s/\.sin$/.sed/
737 s/\.y$/.c/
738 s/\.gperf$/.h/
739 '
740 `
741 insert_sorted_if_absent $ig "$f"
f0a43dd1
JD
742
743 # For files like sys_stat.in.h and sys_time.in.h, record as
744 # ignorable the directory we might eventually create: sys/.
745 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
86996fca 746 insert_sorted_if_absent $ig "$f"
5691bf57
PE
747 fi
748 done
3b2942e6
PE
749 done
750}
1f65350a
PE
751
752
3b2942e6 753# Create boot temporary directories to import from gnulib and gettext.
3b2942e6
PE
754rm -fr $bt $bt2 &&
755mkdir $bt $bt2 || exit
756
757# Import from gnulib.
758
759gnulib_tool_options="\
760 --import\
761 --no-changelog\
bbb44d83 762 --aux-dir $bt/$build_aux\
f0a43dd1 763 --doc-base $bt/$doc_base\
bbb44d83 764 --lib $gnulib_name\
f0a43dd1
JD
765 --m4-base $bt/$m4_base/\
766 --source-base $bt/$source_base/\
767 --tests-base $bt/$tests_base\
6d8e724d 768 --local-dir $local_gl_dir\
f0a43dd1 769 $gnulib_tool_option_extras\
3b2942e6 770"
86996fca
PE
771if test $use_libtool = 1; then
772 case "$gnulib_tool_options " in
773 *' --libtool '*) ;;
774 *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
775 esac
776fi
3b2942e6
PE
777echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
778$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
779slurp $bt || exit
780
781for file in $gnulib_files; do
6d8e724d 782 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
3b2942e6 783done
1f65350a 784
e23d0dd7 785
3b2942e6 786# Import from gettext.
bbb44d83
PE
787with_gettext=yes
788grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
789 with_gettext=no
62a9592d 790
bbb44d83 791if test $with_gettext = yes; then
f0a43dd1 792 echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
bbb44d83 793 cp configure.ac $bt2 &&
f0a43dd1 794 (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
bbb44d83 795 slurp $bt2 $bt || exit
6d8e724d 796fi
f0a43dd1
JD
797rm -fr $bt $bt2 || exit
798
799# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
800# gnulib-populated directories. Such .m4 files would cause aclocal to fail.
801# The following requires GNU find 4.2.3 or newer. Considering the usual
802# portability constraints of this script, that may seem a very demanding
803# requirement, but it should be ok. Ignore any failure, which is fine,
804# since this is only a convenience to help developers avoid the relatively
805# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
806# between successive runs of this script.
807find "$m4_base" "$source_base" \
808 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
809 -type l -xtype l -delete > /dev/null 2>&1
3b2942e6
PE
810
811# Reconfigure, getting other files.
62a9592d 812
f0a43dd1
JD
813# Skip autoheader if it's not needed.
814grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
815 AUTOHEADER=true
816
62a9592d 817for command in \
bbb44d83 818 libtool \
86996fca 819 "${ACLOCAL-aclocal} --force -I m4 $ACLOCAL_FLAGS" \
f0a43dd1
JD
820 "${AUTOCONF-autoconf} --force" \
821 "${AUTOHEADER-autoheader} --force" \
822 "${AUTOMAKE-automake} --add-missing --copy --force-missing"
62a9592d 823do
bbb44d83 824 if test "$command" = libtool; then
f0a43dd1
JD
825 test $use_libtool = 0 \
826 && continue
827 command="${LIBTOOLIZE-libtoolize} -c -f"
bbb44d83 828 fi
62a9592d
PE
829 echo "$0: $command ..."
830 $command || exit
831done
832
833
3b2942e6 834# Get some extra files from gnulib, overriding existing files.
3b2942e6 835for file in $gnulib_extra_files; do
3b2942e6 836 case $file in
e70f46d1 837 */INSTALL) dst=INSTALL;;
6d8e724d 838 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
e70f46d1 839 *) dst=$file;;
3b2942e6 840 esac
6d8e724d 841 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
3b2942e6
PE
842done
843
bbb44d83
PE
844if test $with_gettext = yes; then
845 # Create gettext configuration.
846 echo "$0: Creating po/Makevars from po/Makevars.template ..."
847 rm -f po/Makevars
3b2942e6 848 sed '
bbb44d83 849 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
86996fca
PE
850 /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
851 /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
bbb44d83
PE
852 /^XGETTEXT_OPTIONS *=/{
853 s/$/ \\/
854 a\
f0a43dd1 855 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
bbb44d83 856 }
86996fca 857 ' po/Makevars.template >po/Makevars || exit 1
3b2942e6 858
bbb44d83
PE
859 if test -d runtime-po; then
860 # Similarly for runtime-po/Makevars, but not quite the same.
861 rm -f runtime-po/Makevars
862 sed '
863 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
864 /^subdir *=.*/s/=.*/= runtime-po/
865 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
866 /^XGETTEXT_OPTIONS *=/{
f0a43dd1
JD
867 s/$/ \\/
868 a\
869 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
bbb44d83 870 }
86996fca 871 ' po/Makevars.template >runtime-po/Makevars || exit 1
bbb44d83
PE
872
873 # Copy identical files from po to runtime-po.
874 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
875 fi
3b2942e6 876fi
1f65350a 877
f0a43dd1
JD
878bootstrap_epilogue
879
1f65350a 880echo "$0: done. Now you can run './configure'."
f0a43dd1 881
86996fca
PE
882# Local variables:
883# eval: (add-hook 'write-file-hooks 'time-stamp)
884# time-stamp-start: "scriptversion="
885# time-stamp-format: "%:y-%02m-%02d.%02H"
886# time-stamp-time-zone: "UTC"
887# time-stamp-end: "; # UTC"
f0a43dd1 888# End: