mirror of
https://github.com/mirror/make.git
synced 2024-12-28 05:40:10 +08:00
274 lines
9.8 KiB
Bash
Executable File
274 lines
9.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# Convenience script for fetching auxiliary files that are omitted from
|
|
# the version control repository of this package.
|
|
|
|
# Copyright (C) 2003-2023 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 3 of the License, 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, see <https://www.gnu.org/licenses/>.
|
|
|
|
# Originally written by Paul Eggert. The canonical version of this
|
|
# script is maintained as top/autopull.sh in gnulib. However, to be
|
|
# useful to your package, you should place a copy of it under version
|
|
# control in the top-level directory of your package. The intent is
|
|
# that all customization can be done with a bootstrap.conf file also
|
|
# maintained in your version control; gnulib comes with a template
|
|
# build-aux/bootstrap.conf to get you started.
|
|
#
|
|
# Alternatively, you can use an autopull.sh script that is specific
|
|
# to your package.
|
|
|
|
scriptversion=2022-07-24.15; # UTC
|
|
|
|
me="$0"
|
|
medir=`dirname "$me"`
|
|
|
|
# Read the function library and the configuration.
|
|
. "$medir"/bootstrap-funclib.sh
|
|
|
|
# Ensure that CDPATH is not set. Otherwise, the output from cd
|
|
# would cause trouble in at least one use below.
|
|
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $me [OPTION]...
|
|
Bootstrap this package from the checked-out sources.
|
|
|
|
Optional environment variables:
|
|
GNULIB_SRCDIR Specifies the local directory where gnulib
|
|
sources reside. Use this if you already
|
|
have gnulib sources on your machine, and
|
|
you want to use these sources.
|
|
GNULIB_REFDIR Specifies the local directory where a gnulib
|
|
repository (with a .git subdirectory) resides.
|
|
Use this if you already have gnulib sources
|
|
and history on your machine, and do not want
|
|
to waste your bandwidth downloading them again.
|
|
GNULIB_URL Cloneable URL of the gnulib repository.
|
|
|
|
Options:
|
|
--bootstrap-sync if this bootstrap script is not identical to
|
|
the version in the local gnulib sources,
|
|
update this script, and then restart it with
|
|
/bin/sh or the shell \$CONFIG_SHELL
|
|
--no-bootstrap-sync do not check whether bootstrap is out of sync
|
|
--force attempt to bootstrap even if the sources seem
|
|
not to have been checked out
|
|
--no-git do not use git to update gnulib. Requires that
|
|
\$GNULIB_SRCDIR or the --gnulib-srcdir option
|
|
points to a gnulib repository with the correct
|
|
revision
|
|
--skip-po do not download po files
|
|
EOF
|
|
bootstrap_print_option_usage_hook
|
|
cat <<EOF
|
|
If the file bootstrap.conf exists in the same directory as this script, its
|
|
contents are read as shell variables to configure the bootstrap.
|
|
|
|
For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
|
|
are honored.
|
|
|
|
Gnulib sources can be fetched in various ways:
|
|
|
|
* If the environment variable GNULIB_SRCDIR is set (either as an
|
|
environment variable or via the --gnulib-srcdir option), then sources
|
|
are fetched from that local directory. If it is a git repository and
|
|
the configuration variable GNULIB_REVISION is set in bootstrap.conf,
|
|
then that revision is checked out.
|
|
|
|
* Otherwise, if this package is in a git repository with a 'gnulib'
|
|
submodule configured, then that submodule is initialized and updated
|
|
and sources are fetched from there. If GNULIB_REFDIR is set (either
|
|
as an environment variable or via the --gnulib-refdir option) and is
|
|
a git repository, then it is used as a reference.
|
|
|
|
* Otherwise, if the 'gnulib' directory does not exist, Gnulib sources
|
|
are cloned into that directory using git from \$GNULIB_URL, defaulting
|
|
to $default_gnulib_url.
|
|
If the configuration variable GNULIB_REVISION is set in bootstrap.conf,
|
|
then that revision is checked out.
|
|
|
|
* Otherwise, the existing Gnulib sources in the 'gnulib' directory are
|
|
used. If it is a git repository and the configuration variable
|
|
GNULIB_REVISION is set in bootstrap.conf, then that revision is
|
|
checked out.
|
|
|
|
If you maintain a package and want to pin a particular revision of the
|
|
Gnulib sources that has been tested with your package, then there are
|
|
two possible approaches: either configure a 'gnulib' submodule with the
|
|
appropriate revision, or set GNULIB_REVISION (and if necessary
|
|
GNULIB_URL) in bootstrap.conf.
|
|
|
|
Running without arguments will suffice in most cases.
|
|
EOF
|
|
}
|
|
|
|
# Parse options.
|
|
|
|
# Use git to update gnulib sources
|
|
use_git=true
|
|
|
|
for option
|
|
do
|
|
case $option in
|
|
--help)
|
|
usage
|
|
exit;;
|
|
--version)
|
|
set -e
|
|
echo "autopull.sh $scriptversion"
|
|
echo "$copyright"
|
|
exit 0
|
|
;;
|
|
--skip-po)
|
|
SKIP_PO=t;;
|
|
--force)
|
|
checkout_only_file=;;
|
|
--bootstrap-sync)
|
|
bootstrap_sync=true;;
|
|
--no-bootstrap-sync)
|
|
bootstrap_sync=false;;
|
|
--no-git)
|
|
use_git=false;;
|
|
*)
|
|
bootstrap_option_hook $option || die "$option: unknown option";;
|
|
esac
|
|
done
|
|
|
|
$use_git || test -n "$GNULIB_SRCDIR" \
|
|
|| die "Error: --no-git requires \$GNULIB_SRCDIR environment variable or --gnulib-srcdir option"
|
|
test -z "$GNULIB_SRCDIR" || test -d "$GNULIB_SRCDIR" \
|
|
|| die "Error: \$GNULIB_SRCDIR environment variable or --gnulib-srcdir option is specified, but does not denote a directory"
|
|
|
|
if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
|
|
die "Running this script from a non-checked-out distribution is risky."
|
|
fi
|
|
|
|
check_build_prerequisites $use_git
|
|
|
|
if $use_gnulib || $bootstrap_sync; then
|
|
prepare_GNULIB_SRCDIR
|
|
if $bootstrap_sync; then
|
|
upgrade_bootstrap
|
|
fi
|
|
fi
|
|
|
|
# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6.
|
|
# Also find the compatible sha1 utility on the BSDs
|
|
if test x"$SKIP_PO" = x; then
|
|
find_tool SHA1SUM sha1sum gsha1sum shasum sha1
|
|
fi
|
|
|
|
# See if we can use gnulib's git-merge-changelog merge driver.
|
|
if $use_git && test -d .git && check_exists git; then
|
|
if git config merge.merge-changelog.driver >/dev/null ; then
|
|
:
|
|
elif check_exists git-merge-changelog; then
|
|
echo "$0: initializing git-merge-changelog driver"
|
|
git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
|
|
git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
|
|
else
|
|
echo "$0: consider installing git-merge-changelog from gnulib"
|
|
fi
|
|
fi
|
|
|
|
# ----------------------------- Get translations. -----------------------------
|
|
|
|
download_po_files() {
|
|
subdir=$1
|
|
domain=$2
|
|
echo "$me: getting translations into $subdir for $domain..."
|
|
cmd=$(printf "$po_download_command_format" "$subdir" "$domain")
|
|
eval "$cmd"
|
|
}
|
|
|
|
# Mirror .po files to $po_dir/.reference and copy only the new
|
|
# or modified ones into $po_dir. Also update $po_dir/LINGUAS.
|
|
# Note po files that exist locally only are left in $po_dir but will
|
|
# not be included in LINGUAS and hence will not be distributed.
|
|
update_po_files() {
|
|
# Directory containing primary .po files.
|
|
# Overwrite them only when we're sure a .po file is new.
|
|
po_dir=$1
|
|
domain=$2
|
|
|
|
# Mirror *.po files into this dir.
|
|
# Usually contains *.s1 checksum files.
|
|
ref_po_dir="$po_dir/.reference"
|
|
|
|
test -d $ref_po_dir || mkdir $ref_po_dir || return
|
|
download_po_files $ref_po_dir $domain \
|
|
&& ls "$ref_po_dir"/*.po 2>/dev/null |
|
|
sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
|
|
|
|
langs=$(cd $ref_po_dir && echo *.po | sed 's/\.po//g')
|
|
test "$langs" = '*' && langs=x
|
|
for po in $langs; do
|
|
case $po in x) continue;; esac
|
|
new_po="$ref_po_dir/$po.po"
|
|
cksum_file="$ref_po_dir/$po.s1"
|
|
if ! test -f "$cksum_file" ||
|
|
! test -f "$po_dir/$po.po" ||
|
|
! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then
|
|
echo "$me: updated $po_dir/$po.po..."
|
|
cp "$new_po" "$po_dir/$po.po" \
|
|
&& $SHA1SUM < "$new_po" > "$cksum_file" || return
|
|
fi
|
|
done
|
|
}
|
|
|
|
case $SKIP_PO in
|
|
'')
|
|
if test -d po; then
|
|
update_po_files po $package || exit
|
|
fi
|
|
|
|
if test -d runtime-po; then
|
|
update_po_files runtime-po $package-runtime || exit
|
|
fi;;
|
|
esac
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
bootstrap_post_pull_hook \
|
|
|| die "bootstrap_post_pull_hook failed"
|
|
|
|
# Don't proceed if there are uninitialized submodules. In particular,
|
|
# autogen.sh will remove dangling links, which might be links into
|
|
# uninitialized submodules.
|
|
# But it's OK if the 'gnulib' submodule is uninitialized, as long as
|
|
# GNULIB_SRCDIR is set.
|
|
if $use_git; then
|
|
# Uninitialized submodules are listed with an initial dash.
|
|
uninitialized=`git submodule | grep '^-' | awk '{ print $2 }'`
|
|
if test -n "$GNULIB_SRCDIR"; then
|
|
uninitialized=`echo "$uninitialized" | grep -v '^gnulib$'`
|
|
fi
|
|
if test -n "$uninitialized"; then
|
|
die "Some git submodules are not initialized: "`echo "$uninitialized" | tr '\n' ',' | sed -e 's|,$|.|'`" Either use option '--no-git', or run 'git submodule update --init' and bootstrap again."
|
|
fi
|
|
fi
|
|
|
|
echo "$0: done. Now you can run './autogen.sh'."
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
# Local Variables:
|
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
|
# time-stamp-start: "scriptversion="
|
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
# time-stamp-time-zone: "UTC0"
|
|
# time-stamp-end: "; # UTC"
|
|
# End:
|