mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-02-19 22:02:21 +02:00
variable was sometimes used without being initialized. This messed up the installation of the INSTALL file in some cases.
476 lines
12 KiB
Bash
Executable File
476 lines
12 KiB
Bash
Executable File
#! /bin/sh
|
|
|
|
# Bootstrap this package from CVS.
|
|
|
|
# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2, or (at your option)
|
|
# any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
# 02110-1301, USA.
|
|
|
|
# Written by Paul Eggert.
|
|
|
|
nl='
|
|
'
|
|
|
|
# Ensure file names are sorted consistently across platforms.
|
|
# Also, ensure diagnostics are in English, e.g., "wget --help" below.
|
|
LC_ALL=C
|
|
export LC_ALL
|
|
|
|
usage() {
|
|
echo >&2 "\
|
|
Usage: $0 [OPTION]...
|
|
Bootstrap this package from the CVS sources.
|
|
|
|
Options:
|
|
--gnulib-srcdir=DIRNAME Specify the local directory where gnulib
|
|
sources reside. Use this if you already
|
|
have gnulib sources on your machine, and
|
|
do not want to waste your bandwidth dowloading
|
|
them again.
|
|
--copy Copy files instead of creating symbolic links.
|
|
--force Bootstrap even if the sources didn't come from CVS.
|
|
--skip-po Do not download po files.
|
|
--cvs-user=USERNAME Set the CVS username to be used when accessing
|
|
the gnulib repository.
|
|
|
|
If the file .bootstrap.conf exists in the current working directory, its
|
|
contents are read as shell variables to configure the bootstrap.
|
|
|
|
Running without arguments will suffice in most cases.
|
|
"
|
|
}
|
|
|
|
# Configuration.
|
|
|
|
# List of gnulib modules needed.
|
|
gnulib_modules=
|
|
|
|
# Any gnulib files needed that are not in modules.
|
|
gnulib_files=
|
|
|
|
# Translation Project URL, for the registry of all projects
|
|
# and for the translation-team master directory.
|
|
TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
|
|
TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'
|
|
|
|
extract_package_name='
|
|
/^AC_INIT(/{
|
|
/.*,.*,.*,/{
|
|
s///
|
|
s/[][]//g
|
|
p
|
|
q
|
|
}
|
|
s/AC_INIT(\[*//
|
|
s/]*,.*//
|
|
s/^GNU //
|
|
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
|
|
s/[^A-Za-z0-9_]/-/g
|
|
p
|
|
}
|
|
'
|
|
package=`sed -n "$extract_package_name" configure.ac` || exit
|
|
|
|
# Extra files from gnulib, which override files from other sources.
|
|
gnulib_extra_files='
|
|
build-aux/install-sh
|
|
build-aux/missing
|
|
build-aux/mdate-sh
|
|
build-aux/texinfo.tex
|
|
build-aux/depcomp
|
|
build-aux/config.guess
|
|
build-aux/config.sub
|
|
doc/INSTALL
|
|
'
|
|
|
|
# Other locale categories that need message catalogs.
|
|
EXTRA_LOCALE_CATEGORIES=
|
|
|
|
# Additional xgettext options to use. Use "\\\newline" to break lines.
|
|
XGETTEXT_OPTIONS='\\\
|
|
--flag=_:1:pass-c-format\\\
|
|
--flag=N_:1:pass-c-format\\\
|
|
--flag=error:3:c-format --flag=error_at_line:5:c-format\\\
|
|
'
|
|
|
|
# Files we don't want to import.
|
|
excluded_files=
|
|
|
|
# File that should exist with CVS checkout, but not with
|
|
# the distributed version.
|
|
CVS_only_file=CVS
|
|
|
|
# Whether to use copies instead of symlinks.
|
|
copy=false
|
|
|
|
# Override the default configuration, if necessary.
|
|
test -r bootstrap.conf && . ./bootstrap.conf
|
|
|
|
# Translate configuration into internal form.
|
|
|
|
# Parse options.
|
|
|
|
for option
|
|
do
|
|
case $option in
|
|
--help)
|
|
usage
|
|
exit;;
|
|
--gnulib-srcdir=*)
|
|
GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
|
|
--cvs-user=*)
|
|
CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
|
|
--skip-po)
|
|
SKIP_PO=t;;
|
|
--force)
|
|
CVS_only_file=;;
|
|
--copy)
|
|
copy=true;;
|
|
*)
|
|
echo >&2 "$0: $option: unknown option"
|
|
exit 1;;
|
|
esac
|
|
done
|
|
|
|
if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
|
|
echo "$0: Bootstrapping from a non-CVS distribution is a bit risky." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "$0: Bootstrapping CVS $package..."
|
|
|
|
cleanup_gnulib() {
|
|
status=$?
|
|
rm -fr gnulib
|
|
exit $status
|
|
}
|
|
|
|
# Get gnulib files.
|
|
|
|
case ${GNULIB_SRCDIR--} in
|
|
-)
|
|
if [ ! -d gnulib ]; then
|
|
echo "$0: getting gnulib files..."
|
|
|
|
case ${CVS_AUTH-pserver} in
|
|
pserver)
|
|
CVS_PREFIX=':pserver:anonymous@';;
|
|
ssh)
|
|
CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
|
|
*)
|
|
echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
|
|
exit 1;;
|
|
esac
|
|
|
|
case $CVS_RSH in
|
|
'') CVS_RSH=ssh; export CVS_RSH;;
|
|
esac
|
|
|
|
trap cleanup_gnulib 1 2 13 15
|
|
|
|
cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
|
|
cleanup_gnulib
|
|
|
|
trap - 1 2 13 15
|
|
fi
|
|
GNULIB_SRCDIR=gnulib
|
|
esac
|
|
|
|
gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
|
|
<$gnulib_tool || exit
|
|
|
|
# Get translations.
|
|
|
|
get_translations() {
|
|
subdir=$1
|
|
domain=$2
|
|
|
|
case $WGET_COMMAND in
|
|
'')
|
|
echo "$0: wget not available; skipping translations";;
|
|
?*)
|
|
echo "$0: getting translations into $subdir for $domain..." &&
|
|
|
|
(cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
|
|
$WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&
|
|
|
|
sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
|
|
sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
|
|
awk -F. '
|
|
{ if (lang && $1 != lang) print lang, ver }
|
|
{ lang = $1; ver = substr($0, index($0, ".") + 1) }
|
|
END { if (lang) print lang, ver }
|
|
' | awk -v domain="$domain" -v subdir="$subdir" '
|
|
{
|
|
lang = $1
|
|
ver = $2
|
|
urlfmt = ""
|
|
printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
|
|
printf " msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
|
|
printf " echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
|
|
printf " rm -f %s/%s.po; }; } &&\n", subdir, lang
|
|
}
|
|
END { print ":" }
|
|
' | WGET_COMMAND="$WGET_COMMAND" sh;;
|
|
esac &&
|
|
ls "$subdir"/*.po 2>/dev/null |
|
|
sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
|
|
rm -f "$subdir/$domain.html"
|
|
}
|
|
|
|
case $SKIP_PO in
|
|
'')
|
|
case `wget --help` in
|
|
*'--no-cache'*)
|
|
WGET_COMMAND='wget -nv --no-cache';;
|
|
*'--cache=on/off'*)
|
|
WGET_COMMAND='wget -nv --cache=off';;
|
|
*'--non-verbose'*)
|
|
WGET_COMMAND='wget -nv';;
|
|
*)
|
|
WGET_COMMAND='';;
|
|
esac
|
|
|
|
get_translations po $package || exit
|
|
|
|
if test -d runtime-po; then
|
|
get_translations runtime-po $package-runtime || exit
|
|
fi;;
|
|
esac
|
|
|
|
symlink_to_gnulib()
|
|
{
|
|
src=$GNULIB_SRCDIR/$1
|
|
dst=${2-$1}
|
|
|
|
test -f "$src" && {
|
|
if $copy; then
|
|
{
|
|
test ! -h "$dst" || {
|
|
echo "$0: rm -f $dst" &&
|
|
rm -f "$dst"
|
|
}
|
|
} &&
|
|
test -f "$dst" &&
|
|
cmp -s "$src" "$dst" || {
|
|
echo "$0: cp -fp $src $dst" &&
|
|
cp -fp "$src" "$dst"
|
|
}
|
|
else
|
|
test -h "$dst" &&
|
|
src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
|
|
dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
|
|
test "$src_i" = "$dst_i" || {
|
|
dot_dots=
|
|
case $src in
|
|
/*) ;;
|
|
*)
|
|
case /$dst/ in
|
|
*//* | */../* | */./* | /*/*/*/*/*/)
|
|
echo >&2 "$0: invalid symlink calculation: $src -> $dst"
|
|
exit 1;;
|
|
/*/*/*/*/) dot_dots=../../../;;
|
|
/*/*/*/) dot_dots=../../;;
|
|
/*/*/) dot_dots=../;;
|
|
esac;;
|
|
esac
|
|
|
|
echo "$0: ln -fs $dot_dots$src $dst" &&
|
|
ln -fs "$dot_dots$src" "$dst"
|
|
}
|
|
fi
|
|
}
|
|
}
|
|
|
|
cp_mark_as_generated()
|
|
{
|
|
cp_src=$1
|
|
cp_dst=$2
|
|
|
|
if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
|
|
symlink_to_gnulib "$cp_dst"
|
|
else
|
|
case $cp_dst in
|
|
*.[ch]) c1='/* '; c2=' */';;
|
|
*.texi) c1='@c '; c2= ;;
|
|
*.m4|*/Make*|Make*) c1='# ' ; c2= ;;
|
|
*) c1= ; c2= ;;
|
|
esac
|
|
|
|
if test -z "$c1"; then
|
|
cmp -s "$cp_src" "$cp_dst" || {
|
|
echo "$0: cp -f $cp_src $cp_dst" &&
|
|
cp -f "$cp_src" "$cp_dst"
|
|
}
|
|
else
|
|
# Copy the file first to get proper permissions if it
|
|
# doesn't already exist. Then overwrite the copy.
|
|
cp "$cp_src" "$cp_dst-t" &&
|
|
(
|
|
echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
|
|
echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
|
|
cat "$cp_src"
|
|
) > $cp_dst-t &&
|
|
if cmp -s "$cp_dst-t" "$cp_dst"; then
|
|
rm -f "$cp_dst-t"
|
|
else
|
|
echo "$0: cp $cp_src $cp_dst # with edits" &&
|
|
mv -f "$cp_dst-t" "$cp_dst"
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
slurp() {
|
|
for dir in . `(cd $1 && find * -type d -print)`; do
|
|
copied=
|
|
sep=
|
|
for file in `ls $1/$dir`; do
|
|
test -d $1/$dir/$file && continue
|
|
for excluded_file in $excluded_files; do
|
|
test "$dir/$file" = "$excluded_file" && continue 2
|
|
done
|
|
if test $file = Makefile.am; then
|
|
copied=$copied${sep}gnulib.mk; sep=$nl
|
|
remove_intl='/^[^#].*\/intl/s/^/#/'
|
|
sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
|
|
echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
|
|
rm -f $dir/gnulib.mk &&
|
|
sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
|
|
}
|
|
elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
|
|
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
|
|
grep -q '^/[^/]*/[0-9]'; then
|
|
echo "$0: $dir/$file overrides $1/$dir/$file"
|
|
else
|
|
copied=$copied$sep$file; sep=$nl
|
|
if test $file = gettext.m4; then
|
|
echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
|
|
rm -f $dir/$file
|
|
sed '
|
|
/^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
|
|
AC_DEFUN([AM_INTL_SUBDIR], [
|
|
/^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
|
|
AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
|
|
$a\
|
|
AC_DEFUN([gl_LOCK_EARLY], [])
|
|
' $1/$dir/$file >$dir/$file
|
|
else
|
|
cp_mark_as_generated $1/$dir/$file $dir/$file
|
|
fi
|
|
fi || exit
|
|
done
|
|
|
|
ig=$dir/.cvsignore
|
|
if test -n "$copied" && test -f $ig; then
|
|
echo "$copied" | sort -u - $ig | cmp -s - $ig ||
|
|
echo "$copied" | sort -u - $ig -o $ig || exit
|
|
fi
|
|
done
|
|
}
|
|
|
|
|
|
# Create boot temporary directories to import from gnulib and gettext.
|
|
|
|
bt='.#bootmp'
|
|
bt2=${bt}2
|
|
rm -fr $bt $bt2 &&
|
|
mkdir $bt $bt2 || exit
|
|
|
|
# Import from gnulib.
|
|
|
|
gnulib_tool_options="\
|
|
--import\
|
|
--no-changelog\
|
|
--aux-dir $bt/build-aux\
|
|
--doc-base $bt/doc\
|
|
--lib lib$package\
|
|
--m4-base $bt/m4/\
|
|
--source-base $bt/lib/\
|
|
--tests-base $bt/tests\
|
|
--local-dir gl\
|
|
"
|
|
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
|
|
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
|
|
slurp $bt || exit
|
|
|
|
for file in $gnulib_files; do
|
|
symlink_to_gnulib $file || exit
|
|
done
|
|
|
|
|
|
# Import from gettext.
|
|
|
|
echo "$0: (cd $bt2; autopoint) ..."
|
|
cp configure.ac $bt2 &&
|
|
(cd $bt2 && autopoint && rm configure.ac) &&
|
|
slurp $bt2 $bt || exit
|
|
|
|
rm -fr $bt $bt2 || exit
|
|
|
|
|
|
# Reconfigure, getting other files.
|
|
|
|
for command in \
|
|
'aclocal --force -I m4' \
|
|
'autoconf --force' \
|
|
'autoheader --force' \
|
|
'automake --add-missing --copy --force-missing';
|
|
do
|
|
echo "$0: $command ..."
|
|
$command || exit
|
|
done
|
|
|
|
|
|
# Get some extra files from gnulib, overriding existing files.
|
|
|
|
for file in $gnulib_extra_files; do
|
|
case $file in
|
|
*/INSTALL) dst=INSTALL;;
|
|
*) dst=$file;;
|
|
esac
|
|
symlink_to_gnulib $file $dst || exit
|
|
done
|
|
|
|
|
|
# Create gettext configuration.
|
|
echo "$0: Creating po/Makevars from po/Makevars.template ..."
|
|
rm -f po/Makevars
|
|
sed '
|
|
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
|
|
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
|
|
/^XGETTEXT_OPTIONS *=/{
|
|
s/$/ \\/
|
|
a\
|
|
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
|
|
}
|
|
' po/Makevars.template >po/Makevars
|
|
|
|
if test -d runtime-po; then
|
|
# Likewise for runtime-po/Makevars, except also change a few other parameters.
|
|
rm -f runtime-po/Makevars
|
|
sed '
|
|
s/^\(DOMAIN\) *=.*/\1 = '"$package"'-runtime/
|
|
s/^\(subdir\) *=.*/\1 = runtime-po/
|
|
s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = '"$XGETTEXT_OPTIONS_RUNTIME"'/
|
|
' <po/Makevars >runtime-po/Makevars
|
|
|
|
# Copy identical files from po to runtime-po.
|
|
(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
|
|
fi
|
|
|
|
echo "$0: done. Now you can run './configure'."
|