1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-24 07:20:37 +00:00

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,16 +103,35 @@ 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
missing=
# Generate Autoconf and Automake related files, if requested.
for prog in $progs; do
if $do_autoconf; then
echo 'Checking whether you have the necessary tools...
(Read INSTALL.REPO for more details on building Emacs)'
missing=
for prog in $progs; do
sprog=`echo "$prog" | sed 's/-/_/g'`
@ -138,15 +157,13 @@ for prog in $progs; do
eval ${sprog}_why=\""$stat"\"
fi
done
done
if [ x"$missing" != x ]; then
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,65 +212,102 @@ 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
echo 'Your system has the required tools.'
echo "Running 'autoreconf -fi -I m4' ..."
## Let autoreconf figure out what, if anything, needs doing.
## Use autoreconf's -f option in case autoreconf itself has changed.
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
echo 'Your system has the required tools.'
echo "Running 'autoreconf -fi -I m4' ..."
# 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
## Let autoreconf figure out what, if anything, needs doing.
## Use autoreconf's -f option in case autoreconf itself has changed.
autoreconf -fi -I m4 || exit $?
# Like 'git config NAME VALUE' but verbose on change and exiting on failure.
# Also, do not configure unless requested.
## Create a timestamp, so that './autogen.sh; make' doesn't
## cause 'make' to needlessly run 'autoheader'.
echo timestamp > src/stamp-h.in || exit
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, if using Git.
if test -d .git && (git status -s) >/dev/null 2>&1; then
# Configure 'git diff' hunk header format.
# 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.
# Install Git hooks.
tailored_hooks=
sample_hooks=
tailored_hooks=
sample_hooks=
for hook in commit-msg pre-commit; do
cmp build-aux/git-hooks/$hook .git/hooks/$hook >/dev/null 2>&1 ||
for hook in commit-msg pre-commit; do
cmp build-aux/git-hooks/$hook .git/hooks/$hook >/dev/null 2>&1 ||
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 ||
done
for hook in applypatch-msg pre-applypatch; do
src=.git/hooks/$hook.sample
cmp "$src" .git/hooks/$hook >/dev/null 2>&1 ||
sample_hooks="$sample_hooks $hook"
done
done
if test -n "$tailored_hooks$sample_hooks"; then
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
echo "You can now run './configure'."
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