]> git.saurik.com Git - bison.git/blame - bootstrap
yysyntax_error: adjust prior fixes for branch-2.5's lalr1.cc.
[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
2f3fd8f9
JD
264# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
265# insert_sorted_if_absent.
266insert_vc_ignore() {
267 vc_ignore_file="$1"
268 pattern="$2"
269 case $vc_ignore_file in
270 *.gitignore)
271 # A .gitignore entry that does not start with `/' applies
272 # recursively to subdirectories, so prepend `/' to every
273 # .gitignore entry.
274 pattern=`echo "$pattern" | sed s,^,/,`;;
275 esac
276 insert_sorted_if_absent "$vc_ignore_file" "$pattern"
277}
278
bbb44d83
PE
279# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
280found_aux_dir=no
281grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
282 >/dev/null && found_aux_dir=yes
283grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
284 >/dev/null && found_aux_dir=yes
285if test $found_aux_dir = no; then
286 echo "$0: expected line not found in configure.ac. Add the following:" >&2
6d8e724d
PE
287 echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
288 exit 1
bbb44d83
PE
289fi
290
291# If $build_aux doesn't exist, create it now, otherwise some bits
292# below will malfunction. If creating it, also mark it as ignored.
293if test ! -d $build_aux; then
294 mkdir $build_aux
6d8e724d
PE
295 for dot_ig in x $vc_ignore; do
296 test $dot_ig = x && continue
2f3fd8f9 297 insert_vc_ignore $dot_ig $build_aux
bbb44d83
PE
298 done
299fi
300
f0a43dd1
JD
301# Note this deviates from the version comparison in automake
302# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
303# but this should suffice as we won't be specifying old
304# version formats or redundant trailing .0 in bootstrap.conf.
305# If we did want full compatibility then we should probably
306# use m4_version_compare from autoconf.
307sort_ver() { # sort -V is not generally available
308 ver1="$1"
309 ver2="$2"
310
311 # split on '.' and compare each component
312 i=1
313 while : ; do
314 p1=$(echo "$ver1" | cut -d. -f$i)
315 p2=$(echo "$ver2" | cut -d. -f$i)
316 if [ ! "$p1" ]; then
317 echo "$1 $2"
318 break
319 elif [ ! "$p2" ]; then
320 echo "$2 $1"
321 break
322 elif [ ! "$p1" = "$p2" ]; then
323 if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
324 echo "$2 $1"
325 elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
326 echo "$1 $2"
327 else # numeric, then lexicographic comparison
328 lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
329 if [ "$lp" = "$p2" ]; then
330 echo "$1 $2"
331 else
332 echo "$2 $1"
333 fi
334 fi
335 break
336 fi
337 i=$(($i+1))
338 done
339}
1f65350a 340
f0a43dd1
JD
341get_version() {
342 app=$1
343
344 $app --version >/dev/null 2>&1 || return 1
345
346 $app --version 2>&1 |
347 sed -n '# extract version within line
348 s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
349 t done
350
351 # extract version at start of line
352 s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
353 t done
354
355 d
356
357 :done
358 #the following essentially does s/5.005/5.5/
359 s/\.0*\([1-9]\)/.\1/g
360 p
361 q'
e10a80ee
PE
362}
363
f0a43dd1
JD
364check_versions() {
365 ret=0
366
367 while read app req_ver; do
86996fca
PE
368 # We only need libtoolize from the libtool package.
369 if test "$app" = libtool; then
370 app=libtoolize
371 fi
f0a43dd1 372 # Honor $APP variables ($TAR, $AUTOCONF, etc.)
86996fca 373 appvar=`echo $app | tr '[a-z]-' '[A-Z]_'`
f0a43dd1
JD
374 test "$appvar" = TAR && appvar=AMTAR
375 eval "app=\${$appvar-$app}"
376 inst_ver=$(get_version $app)
377 if [ ! "$inst_ver" ]; then
378 echo "Error: '$app' not found" >&2
379 ret=1
380 elif [ ! "$req_ver" = "-" ]; then
381 latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
382 if [ ! "$latest_ver" = "$inst_ver" ]; then
383 echo "Error: '$app' version == $inst_ver is too old" >&2
384 echo " '$app' version >= $req_ver is required" >&2
385 ret=1
386 fi
387 fi
388 done
389
390 return $ret
391}
fee2ed87 392
f0a43dd1
JD
393print_versions() {
394 echo "Program Min_version"
395 echo "----------------------"
86996fca 396 printf %s "$buildreq"
f0a43dd1
JD
397 echo "----------------------"
398 # can't depend on column -t
399}
400
86996fca
PE
401use_libtool=0
402# We'd like to use grep -E, to see if any of LT_INIT,
403# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
404# but that's not portable enough (e.g., for Solaris).
405grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
406 && use_libtool=1
407grep '^[ ]*LT_INIT' configure.ac >/dev/null \
408 && use_libtool=1
409if test $use_libtool = 1; then
410 find_tool LIBTOOLIZE glibtoolize libtoolize
411fi
412
f0a43dd1 413if ! printf "$buildreq" | check_versions; then
86996fca
PE
414 echo >&2
415 if test -f README-prereq; then
416 echo "See README-prereq for how to get the prerequisite programs" >&2
417 else
418 echo "Please install the prerequisite programs" >&2
419 fi
f0a43dd1
JD
420 exit 1
421fi
422
423echo "$0: Bootstrapping from checked-out $package sources..."
424
425# See if we can use gnulib's git-merge-changelog merge driver.
fee2ed87
PB
426if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
427 if git config merge.merge-changelog.driver >/dev/null ; then
428 :
429 elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
430 echo "initializing git-merge-changelog driver"
431 git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
432 git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
433 else
434 echo "consider installing git-merge-changelog from gnulib"
435 fi
436fi
437
f0a43dd1
JD
438
439cleanup_gnulib() {
440 status=$?
86996fca 441 rm -fr "$gnulib_path"
f0a43dd1
JD
442 exit $status
443}
444
445git_modules_config () {
446 test -f .gitmodules && git config --file .gitmodules "$@"
447}
448
86996fca
PE
449gnulib_path=`git_modules_config submodule.gnulib.path`
450: ${gnulib_path=gnulib}
451
1f65350a
PE
452# Get gnulib files.
453
454case ${GNULIB_SRCDIR--} in
455-)
f0a43dd1 456 if git_modules_config submodule.gnulib.url >/dev/null; then
1f65350a 457 echo "$0: getting gnulib files..."
f0a43dd1
JD
458 git submodule init || exit $?
459 git submodule update || exit $?
1f65350a 460
86996fca 461 elif [ ! -d "$gnulib_path" ]; then
f0a43dd1 462 echo "$0: getting gnulib files..."
1f65350a 463
e10a80ee
PE
464 trap cleanup_gnulib 1 2 13 15
465
86996fca
PE
466 shallow=
467 git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
468 git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
e10a80ee 469 cleanup_gnulib
1f65350a 470
e10a80ee 471 trap - 1 2 13 15
1f65350a 472 fi
86996fca 473 GNULIB_SRCDIR=$gnulib_path
f0a43dd1
JD
474 ;;
475*)
86996fca 476 # Use GNULIB_SRCDIR as a reference.
f0a43dd1
JD
477 if test -d "$GNULIB_SRCDIR"/.git && \
478 git_modules_config submodule.gnulib.url >/dev/null; then
f0a43dd1 479 echo "$0: getting gnulib files..."
86996fca
PE
480 if git submodule -h|grep -- --reference > /dev/null; then
481 # Prefer the one-liner available in git 1.6.4 or newer.
482 git submodule update --init --reference "$GNULIB_SRCDIR" \
483 "$gnulib_path" || exit $?
484 else
485 # This fallback allows at least git 1.5.5.
486 if test -f "$gnulib_path"/gnulib-tool; then
487 # Since file already exists, assume submodule init already complete.
488 git submodule update || exit $?
489 else
490 # Older git can't clone into an empty directory.
491 rmdir "$gnulib_path" 2>/dev/null
492 git clone --reference "$GNULIB_SRCDIR" \
493 "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
494 && git submodule init && git submodule update \
495 || exit $?
496 fi
497 fi
498 GNULIB_SRCDIR=$gnulib_path
f0a43dd1
JD
499 fi
500 ;;
1f65350a
PE
501esac
502
284d8a13
PE
503gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
504<$gnulib_tool || exit
1f65350a 505
1f65350a
PE
506# Get translations.
507
6d8e724d 508download_po_files() {
5a2baae7
PE
509 subdir=$1
510 domain=$2
6d8e724d
PE
511 echo "$0: getting translations into $subdir for $domain..."
512 cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
513 eval "$cmd"
514}
5a2baae7 515
86996fca 516# Mirror .po files to $po_dir/.reference and copy only the new
6d8e724d 517# or modified ones into $po_dir. Also update $po_dir/LINGUAS.
86996fca
PE
518# Note po files that exist locally only are left in $po_dir but will
519# not be included in LINGUAS and hence will not be distributed.
6d8e724d
PE
520update_po_files() {
521 # Directory containing primary .po files.
522 # Overwrite them only when we're sure a .po file is new.
523 po_dir=$1
524 domain=$2
525
86996fca 526 # Mirror *.po files into this dir.
6d8e724d
PE
527 # Usually contains *.s1 checksum files.
528 ref_po_dir="$po_dir/.reference"
529
530 test -d $ref_po_dir || mkdir $ref_po_dir || return
531 download_po_files $ref_po_dir $domain \
532 && ls "$ref_po_dir"/*.po 2>/dev/null |
86996fca 533 sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
6d8e724d 534
f0a43dd1
JD
535 langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
536 test "$langs" = '*' && langs=x
537 for po in $langs; do
538 case $po in x) continue;; esac
539 new_po="$ref_po_dir/$po.po"
540 cksum_file="$ref_po_dir/$po.s1"
541 if ! test -f "$cksum_file" ||
542 ! test -f "$po_dir/$po.po" ||
543 ! $SHA1SUM -c --status "$cksum_file" \
544 < "$new_po" > /dev/null; then
545 echo "updated $po_dir/$po.po..."
546 cp "$new_po" "$po_dir/$po.po" \
547 && $SHA1SUM < "$new_po" > "$cksum_file"
548 fi
6d8e724d 549 done
5a2baae7
PE
550}
551
1f65350a
PE
552case $SKIP_PO in
553'')
bbb44d83 554 if test -d po; then
6d8e724d 555 update_po_files po $package || exit
bbb44d83 556 fi
f7ab6a50 557
3b2942e6 558 if test -d runtime-po; then
6d8e724d 559 update_po_files runtime-po $package-runtime || exit
3b2942e6 560 fi;;
1f65350a
PE
561esac
562
6d8e724d 563symlink_to_dir()
e70f46d1 564{
6d8e724d
PE
565 src=$1/$2
566 dst=${3-$2}
e70f46d1
PE
567
568 test -f "$src" && {
6d8e724d 569
86996fca
PE
570 # If the destination directory doesn't exist, create it.
571 # This is required at least for "lib/uniwidth/cjk.h".
572 dst_dir=`dirname "$dst"`
573 if ! test -d "$dst_dir"; then
574 mkdir -p "$dst_dir"
575
576 # If we've just created a directory like lib/uniwidth,
577 # tell version control system(s) it's ignorable.
578 # FIXME: for now, this does only one level
579 parent=`dirname "$dst_dir"`
580 for dot_ig in x $vc_ignore; do
581 test $dot_ig = x && continue
582 ig=$parent/$dot_ig
2f3fd8f9 583 insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'`
86996fca
PE
584 done
585 fi
6d8e724d 586
46356ea4
PE
587 if $copy; then
588 {
f0a43dd1
JD
589 test ! -h "$dst" || {
590 echo "$0: rm -f $dst" &&
591 rm -f "$dst"
592 }
46356ea4
PE
593 } &&
594 test -f "$dst" &&
595 cmp -s "$src" "$dst" || {
f0a43dd1
JD
596 echo "$0: cp -fp $src $dst" &&
597 cp -fp "$src" "$dst"
46356ea4
PE
598 }
599 else
600 test -h "$dst" &&
601 src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
602 dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
603 test "$src_i" = "$dst_i" || {
f0a43dd1
JD
604 dot_dots=
605 case $src in
606 /*) ;;
607 *)
608 case /$dst/ in
609 *//* | */../* | */./* | /*/*/*/*/*/)
610 echo >&2 "$0: invalid symlink calculation: $src -> $dst"
611 exit 1;;
612 /*/*/*/*/) dot_dots=../../../;;
613 /*/*/*/) dot_dots=../../;;
614 /*/*/) dot_dots=../;;
615 esac;;
616 esac
617
618 echo "$0: ln -fs $dot_dots$src $dst" &&
619 ln -fs "$dot_dots$src" "$dst"
46356ea4
PE
620 }
621 fi
e70f46d1
PE
622 }
623}
624
3b2942e6
PE
625cp_mark_as_generated()
626{
627 cp_src=$1
628 cp_dst=$2
1f65350a 629
e70f46d1 630 if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
6d8e724d
PE
631 symlink_to_dir "$GNULIB_SRCDIR" "$cp_dst"
632 elif cmp -s "$cp_src" "$local_gl_dir/$cp_dst"; then
633 symlink_to_dir $local_gl_dir "$cp_dst"
e70f46d1
PE
634 else
635 case $cp_dst in
636 *.[ch]) c1='/* '; c2=' */';;
637 *.texi) c1='@c '; c2= ;;
638 *.m4|*/Make*|Make*) c1='# ' ; c2= ;;
639 *) c1= ; c2= ;;
640 esac
1f65350a 641
86996fca
PE
642 # If the destination directory doesn't exist, create it.
643 # This is required at least for "lib/uniwidth/cjk.h".
644 dst_dir=`dirname "$cp_dst"`
645 test -d "$dst_dir" || mkdir -p "$dst_dir"
646
e70f46d1
PE
647 if test -z "$c1"; then
648 cmp -s "$cp_src" "$cp_dst" || {
f0a43dd1
JD
649 # Copy the file first to get proper permissions if it
650 # doesn't already exist. Then overwrite the copy.
651 echo "$0: cp -f $cp_src $cp_dst" &&
652 rm -f "$cp_dst" &&
653 cp "$cp_src" "$cp_dst-t" &&
654 sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
655 mv -f "$cp_dst-t" "$cp_dst"
e70f46d1
PE
656 }
657 else
658 # Copy the file first to get proper permissions if it
659 # doesn't already exist. Then overwrite the copy.
660 cp "$cp_src" "$cp_dst-t" &&
661 (
f0a43dd1
JD
662 echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
663 echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
664 sed "s!$bt_regex/!!g" "$cp_src"
e70f46d1
PE
665 ) > $cp_dst-t &&
666 if cmp -s "$cp_dst-t" "$cp_dst"; then
f0a43dd1 667 rm -f "$cp_dst-t"
e70f46d1 668 else
f0a43dd1
JD
669 echo "$0: cp $cp_src $cp_dst # with edits" &&
670 mv -f "$cp_dst-t" "$cp_dst"
e70f46d1
PE
671 fi
672 fi
673 fi
3b2942e6 674}
1f65350a 675
10f429ef
PE
676version_controlled_file() {
677 dir=$1
678 file=$2
679 found=no
680 if test -d CVS; then
681 grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
f0a43dd1 682 grep '^/[^/]*/[0-9]' > /dev/null && found=yes
10f429ef 683 elif test -d .git; then
f0a43dd1
JD
684 git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
685 elif test -d .svn; then
686 svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
10f429ef
PE
687 else
688 echo "$0: no version control for $dir/$file?" >&2
689 fi
690 test $found = yes
691}
692
3b2942e6
PE
693slurp() {
694 for dir in . `(cd $1 && find * -type d -print)`; do
695 copied=
696 sep=
6d8e724d
PE
697 for file in `ls -a $1/$dir`; do
698 case $file in
699 .|..) continue;;
86996fca
PE
700 # FIXME: should all file names starting with "." be ignored?
701 .*) continue;;
6d8e724d
PE
702 esac
703 test -d $1/$dir/$file && continue
3b2942e6 704 for excluded_file in $excluded_files; do
f0a43dd1 705 test "$dir/$file" = "$excluded_file" && continue 2
3b2942e6 706 done
86996fca 707 if test $file = Makefile.am && test "X$gnulib_mk" != XMakefile.am; then
f0a43dd1
JD
708 copied=$copied${sep}$gnulib_mk; sep=$nl
709 remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
86996fca
PE
710 sed "$remove_intl" $1/$dir/$file |
711 cmp - $dir/$gnulib_mk > /dev/null || {
f0a43dd1
JD
712 echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
713 rm -f $dir/$gnulib_mk &&
86996fca
PE
714 sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk &&
715 gnulib_mk_hook $dir/$gnulib_mk
f0a43dd1 716 }
e70f46d1 717 elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
f0a43dd1
JD
718 version_controlled_file $dir $file; then
719 echo "$0: $dir/$file overrides $1/$dir/$file"
3b2942e6 720 else
f0a43dd1
JD
721 copied=$copied$sep$file; sep=$nl
722 if test $file = gettext.m4; then
723 echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
724 rm -f $dir/$file
725 sed '
726 /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
86996fca 727 AC_DEFUN([AM_INTL_SUBDIR], [])
f0a43dd1
JD
728 /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
729 AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
730 $a\
731 AC_DEFUN([gl_LOCK_EARLY], [])
732 ' $1/$dir/$file >$dir/$file
733 else
734 cp_mark_as_generated $1/$dir/$file $dir/$file
735 fi
3b2942e6
PE
736 fi || exit
737 done
738
6d8e724d
PE
739 for dot_ig in x $vc_ignore; do
740 test $dot_ig = x && continue
5691bf57 741 ig=$dir/$dot_ig
6d8e724d 742 if test -n "$copied"; then
2f3fd8f9 743 insert_vc_ignore $ig "$copied"
f0a43dd1
JD
744 # If an ignored file name ends with .in.h, then also add
745 # the name with just ".h". Many gnulib headers are generated,
746 # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
747 # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
86996fca
PE
748 f=`echo "$copied" |
749 sed '
750 s/\.in\.h$/.h/
751 s/\.sin$/.sed/
752 s/\.y$/.c/
753 s/\.gperf$/.h/
754 '
755 `
2f3fd8f9 756 insert_vc_ignore $ig "$f"
f0a43dd1
JD
757
758 # For files like sys_stat.in.h and sys_time.in.h, record as
759 # ignorable the directory we might eventually create: sys/.
760 f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
2f3fd8f9 761 insert_vc_ignore $ig "$f"
5691bf57
PE
762 fi
763 done
3b2942e6
PE
764 done
765}
1f65350a
PE
766
767
3b2942e6 768# Create boot temporary directories to import from gnulib and gettext.
3b2942e6
PE
769rm -fr $bt $bt2 &&
770mkdir $bt $bt2 || exit
771
772# Import from gnulib.
773
774gnulib_tool_options="\
775 --import\
776 --no-changelog\
bbb44d83 777 --aux-dir $bt/$build_aux\
f0a43dd1 778 --doc-base $bt/$doc_base\
bbb44d83 779 --lib $gnulib_name\
f0a43dd1
JD
780 --m4-base $bt/$m4_base/\
781 --source-base $bt/$source_base/\
782 --tests-base $bt/$tests_base\
6d8e724d 783 --local-dir $local_gl_dir\
f0a43dd1 784 $gnulib_tool_option_extras\
3b2942e6 785"
86996fca
PE
786if test $use_libtool = 1; then
787 case "$gnulib_tool_options " in
788 *' --libtool '*) ;;
789 *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
790 esac
791fi
3b2942e6
PE
792echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
793$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
794slurp $bt || exit
795
796for file in $gnulib_files; do
6d8e724d 797 symlink_to_dir "$GNULIB_SRCDIR" $file || exit
3b2942e6 798done
1f65350a 799
e23d0dd7 800
3b2942e6 801# Import from gettext.
bbb44d83
PE
802with_gettext=yes
803grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
804 with_gettext=no
62a9592d 805
bbb44d83 806if test $with_gettext = yes; then
f0a43dd1 807 echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
bbb44d83 808 cp configure.ac $bt2 &&
f0a43dd1 809 (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
bbb44d83 810 slurp $bt2 $bt || exit
6d8e724d 811fi
f0a43dd1
JD
812rm -fr $bt $bt2 || exit
813
814# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
815# gnulib-populated directories. Such .m4 files would cause aclocal to fail.
816# The following requires GNU find 4.2.3 or newer. Considering the usual
817# portability constraints of this script, that may seem a very demanding
818# requirement, but it should be ok. Ignore any failure, which is fine,
819# since this is only a convenience to help developers avoid the relatively
820# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
821# between successive runs of this script.
822find "$m4_base" "$source_base" \
823 -depth \( -name '*.m4' -o -name '*.[ch]' \) \
824 -type l -xtype l -delete > /dev/null 2>&1
3b2942e6
PE
825
826# Reconfigure, getting other files.
62a9592d 827
f0a43dd1
JD
828# Skip autoheader if it's not needed.
829grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
830 AUTOHEADER=true
831
62a9592d 832for command in \
bbb44d83 833 libtool \
86996fca 834 "${ACLOCAL-aclocal} --force -I m4 $ACLOCAL_FLAGS" \
f0a43dd1
JD
835 "${AUTOCONF-autoconf} --force" \
836 "${AUTOHEADER-autoheader} --force" \
837 "${AUTOMAKE-automake} --add-missing --copy --force-missing"
62a9592d 838do
bbb44d83 839 if test "$command" = libtool; then
f0a43dd1
JD
840 test $use_libtool = 0 \
841 && continue
842 command="${LIBTOOLIZE-libtoolize} -c -f"
bbb44d83 843 fi
62a9592d
PE
844 echo "$0: $command ..."
845 $command || exit
846done
847
848
3b2942e6 849# Get some extra files from gnulib, overriding existing files.
3b2942e6 850for file in $gnulib_extra_files; do
3b2942e6 851 case $file in
e70f46d1 852 */INSTALL) dst=INSTALL;;
6d8e724d 853 build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
e70f46d1 854 *) dst=$file;;
3b2942e6 855 esac
6d8e724d 856 symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
3b2942e6
PE
857done
858
bbb44d83
PE
859if test $with_gettext = yes; then
860 # Create gettext configuration.
861 echo "$0: Creating po/Makevars from po/Makevars.template ..."
862 rm -f po/Makevars
3b2942e6 863 sed '
bbb44d83 864 /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
86996fca
PE
865 /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
866 /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
bbb44d83
PE
867 /^XGETTEXT_OPTIONS *=/{
868 s/$/ \\/
869 a\
f0a43dd1 870 '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
bbb44d83 871 }
86996fca 872 ' po/Makevars.template >po/Makevars || exit 1
3b2942e6 873
bbb44d83
PE
874 if test -d runtime-po; then
875 # Similarly for runtime-po/Makevars, but not quite the same.
876 rm -f runtime-po/Makevars
877 sed '
878 /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
879 /^subdir *=.*/s/=.*/= runtime-po/
880 /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
881 /^XGETTEXT_OPTIONS *=/{
f0a43dd1
JD
882 s/$/ \\/
883 a\
884 '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
bbb44d83 885 }
86996fca 886 ' po/Makevars.template >runtime-po/Makevars || exit 1
bbb44d83
PE
887
888 # Copy identical files from po to runtime-po.
889 (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
890 fi
3b2942e6 891fi
1f65350a 892
f0a43dd1
JD
893bootstrap_epilogue
894
1f65350a 895echo "$0: done. Now you can run './configure'."
f0a43dd1 896
86996fca
PE
897# Local variables:
898# eval: (add-hook 'write-file-hooks 'time-stamp)
899# time-stamp-start: "scriptversion="
900# time-stamp-format: "%:y-%02m-%02d.%02H"
901# time-stamp-time-zone: "UTC"
902# time-stamp-end: "; # UTC"
f0a43dd1 903# End: