autogen.sh now configures git only on request

* autogen.sh (do_autoconf, do_git): New vars.
Support new arguments --help, all, autoconf, git.
By default, just do autoconf-related configuration, not git.
Prefer 'echo' to 'cat <<EOF ...', as this tends to avoid temp files.
If GNU cp is available, use it to backup .git/config before
changing it.  When configuring git, chatter about what is being
done, and configure git to check hashes.  Avoid some duplicate
file name specification when creating git hooks.

* GNUmakefile (ALL_IF_GIT): New macro.
(configure): Use it.
* INSTALL.REPO: Suggest './autogen.sh all'.
This commit is contained in:
Paul Eggert 2016-02-02 23:11:36 -08:00
parent b50075dd05
commit aca31e3815
3 changed files with 125 additions and 61 deletions

View file

@ -62,10 +62,13 @@ default $(ORDINARY_GOALS): Makefile
# Execute in sequence, so that multiple user goals don't conflict.
.NOTPARALLEL:
# 'all' if a .git subdirectory is present, empty otherwise.
ALL_IF_GIT = $(subst .git,all,$(wildcard .git))
configure:
@echo >&2 'There seems to be no "configure" file in this directory.'
@echo >&2 'Running ./autogen.sh ...'
./autogen.sh
@echo >&2 Running ./autogen.sh $(ALL_IF_GIT) ...
./autogen.sh $(ALL_IF_GIT)
@echo >&2 '"configure" file built.'
Makefile: configure

View file

@ -18,9 +18,10 @@ makeinfo - not strictly necessary, but highly recommended, so that
you can build the manuals.
To use the autotools, run the following shell command to generate the
'configure' script and some related files:
'configure' script and some related files, and to set up your git
configuration:
$ ./autogen.sh
$ ./autogen.sh all
You can then configure your build as follows:

View file

@ -103,12 +103,31 @@ check_version ()
return 2
}
do_autoconf=false
do_git=false
cat <<EOF
Checking whether you have the necessary tools...
(Read INSTALL.REPO for more details on building Emacs)
for arg in ${*-autoconf}; do
case $arg in
--help)
exec echo "$0: usage: $0 [all|autoconf|git]";;
all)
do_autoconf=true do_git=true;;
autoconf)
do_autoconf=true;;
git)
do_git=true;;
*)
echo >&2 "$0: $arg: unknown argument"; exit 1;;
esac
done
EOF
# Generate Autoconf and Automake related files, if requested.
if $do_autoconf; then
echo 'Checking whether you have the necessary tools...
(Read INSTALL.REPO for more details on building Emacs)'
missing=
@ -143,10 +162,8 @@ done
if [ x"$missing" != x ]; then
cat <<EOF
Building Emacs from the repository requires the following specialized programs:
EOF
echo '
Building Emacs from the repository requires the following specialized programs:'
for prog in $progs; do
sprog=`echo "$prog" | sed 's/-/_/g'`
@ -157,10 +174,8 @@ EOF
done
cat <<EOF
Your system seems to be missing the following tool(s):
EOF
echo '
Your system seems to be missing the following tool(s):'
for prog in $missing; do
sprog=`echo "$prog" | sed 's/-/_/g'`
@ -170,8 +185,7 @@ EOF
echo "$prog ($why)"
done
cat <<EOF
echo '
If you think you have the required tools, please add them to your PATH
and re-run this script.
@ -198,8 +212,7 @@ autoreconf -fi -I m4
instead of this script.
Please report any problems with this script to bug-gnu-emacs@gnu.org .
EOF
Please report any problems with this script to bug-gnu-emacs@gnu.org .'
exit 1
fi
@ -215,17 +228,60 @@ autoreconf -fi -I m4 || exit $?
## Create a timestamp, so that './autogen.sh; make' doesn't
## cause 'make' to needlessly run 'autoheader'.
echo timestamp > src/stamp-h.in || exit
fi
## Configure Git, if using Git.
if test -d .git && (git status -s) >/dev/null 2>&1; then
# True if the Git setup was OK before autogen.sh was run.
git_was_ok=true
if $do_git; then
case `cp --help 2>/dev/null` in
*--backup*--verbose*)
cp_options='--backup=numbered --verbose';;
*)
cp_options='-f';;
esac
fi
# Like 'git config NAME VALUE' but verbose on change and exiting on failure.
# Also, do not configure unless requested.
git_config ()
{
name=$1
value=$2
ovalue=`git config --get "$name"` && test "$ovalue" = "$value" || {
if $do_git; then
if $git_was_ok; then
echo 'Configuring local git repository...'
case $cp_options in
--backup=*)
cp $cp_options --force .git/config .git/config || exit;;
esac
fi
echo "git config $name '$value'"
git config "$name" "$value" || exit
fi
git_was_ok=false
}
}
## Configure Git, if requested.
# Check hashes when transferring objects among repositories.
git_config transfer.fsckObjects true
# Configure 'git diff' hunk header format.
git config 'diff.elisp.xfuncname' \
'^\(def[^[:space:]]+[[:space:]]+([^()[:space:]]+)' || exit
git config 'diff.texinfo.xfuncname' \
'^@node[[:space:]]+([^,[:space:]][^,]+)' || exit
git_config diff.elisp.xfuncname \
'^\(def[^[:space:]]+[[:space:]]+([^()[:space:]]+)'
git_config diff.texinfo.xfuncname \
'^@node[[:space:]]+([^,[:space:]][^,]+)'
# Install Git hooks.
@ -238,25 +294,20 @@ if test -d .git && (git status -s) >/dev/null 2>&1; then
tailored_hooks="$tailored_hooks $hook"
done
for hook in applypatch-msg pre-applypatch; do
test ! -r .git/hooks/$hook.sample ||
cmp .git/hooks/$hook.sample .git/hooks/$hook >/dev/null 2>&1 ||
src=.git/hooks/$hook.sample
cmp "$src" .git/hooks/$hook >/dev/null 2>&1 ||
sample_hooks="$sample_hooks $hook"
done
if test -n "$tailored_hooks$sample_hooks"; then
if $do_git; then
echo "Installing git hooks..."
case `cp --help 2>/dev/null` in
*--backup*--verbose*)
cp_options='--backup=numbered --verbose';;
*)
cp_options='-f';;
esac
if test -n "$tailored_hooks"; then
for hook in $tailored_hooks; do
cp $cp_options build-aux/git-hooks/$hook .git/hooks || exit
chmod a-w .git/hooks/$hook || exit
dst=.git/hooks/$hook
cp $cp_options build-aux/git-hooks/$hook "$dst" || exit
chmod a-w "$dst" || exit
done
fi
@ -266,10 +317,19 @@ if test -d .git && (git status -s) >/dev/null 2>&1; then
chmod a-w .git/hooks/$hook || exit
done
fi
else
git_was_ok=false
fi
fi
if test ! -f configure; then
echo "You can now run '$0 autoconf'."
elif test -d .git && test $git_was_ok = false && test $do_git = false; then
echo "You can now run '$0 git'."
elif test ! -f config.status ||
test -n "`find src/stamp-h.in -newer config.status`"; then
echo "You can now run './configure'."
fi
exit 0