diff options
-rw-r--r-- | GNUmakefile | 7 | ||||
-rw-r--r-- | INSTALL.REPO | 5 | ||||
-rwxr-xr-x | autogen.sh | 172 |
3 files changed, 124 insertions, 60 deletions
diff --git a/GNUmakefile b/GNUmakefile index 83bb718a96..e6941b03b3 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -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 diff --git a/INSTALL.REPO b/INSTALL.REPO index 1720758928..7497f1f296 100644 --- a/INSTALL.REPO +++ b/INSTALL.REPO @@ -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: diff --git a/autogen.sh b/autogen.sh index a63c53c903..2ed58e15ae 100755 --- a/autogen.sh +++ b/autogen.sh @@ -103,16 +103,35 @@ check_version () return 2 } +do_autoconf=false +do_git=false + +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 + + +# Generate Autoconf and Automake related files, if requested. -cat <<EOF -Checking whether you have the necessary tools... -(Read INSTALL.REPO for more details on building Emacs) +if $do_autoconf; then -EOF + echo 'Checking whether you have the necessary tools... +(Read INSTALL.REPO for more details on building Emacs)' -missing= + missing= -for prog in $progs; do + 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 - cat <<EOF + if [ x"$missing" != x ]; then -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. -## 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 $? +git_was_ok=true -## Create a timestamp, so that './autogen.sh; make' doesn't -## cause 'make' to needlessly run 'autoheader'. -echo timestamp > src/stamp-h.in || exit +if $do_git; then + case `cp --help 2>/dev/null` in + *--backup*--verbose*) + cp_options='--backup=numbered --verbose';; + *) + cp_options='-f';; + esac +fi -## Configure Git, if using Git. -if test -d .git && (git status -s) >/dev/null 2>&1; then +# Like 'git config NAME VALUE' but verbose on change and exiting on failure. +# Also, do not configure unless requested. - # Configure 'git diff' hunk header format. +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. +# 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 |