autogen.sh 8.72 KB
Newer Older
1
#!/bin/sh
2
### autogen.sh - tool to help build Emacs from a repository checkout
3

Paul Eggert's avatar
Paul Eggert committed
4
## Copyright (C) 2011-2016 Free Software Foundation, Inc.
5

6
## Author: Glenn Morris <rgm@gnu.org>
7
## Maintainer: emacs-devel@gnu.org
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

## This file is part of GNU Emacs.

## GNU Emacs 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.

## GNU Emacs 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

### Commentary:

26 27
## The Emacs repository does not include the configure script (and
## associated helpers).  The first time you fetch Emacs from the repo,
28
## run this script to generate the necessary files.
29
## For more details, see the file INSTALL.REPO.
30 31 32 33

### Code:

## Tools we need:
34
## Note that we respect the values of AUTOCONF etc, like autoreconf does.
35
progs="autoconf automake"
36 37

## Minimum versions we need:
38
autoconf_min=`sed -n 's/^ *AC_PREREQ(\([0-9\.]*\)).*/\1/p' configure.ac`
39

Glenn Morris's avatar
Glenn Morris committed
40 41 42
## This will need improving if more options are ever added to the
## AM_INIT_AUTOMAKE call.
automake_min=`sed -n 's/^ *AM_INIT_AUTOMAKE(\([0-9\.]*\)).*/\1/p' configure.ac`
43 44 45 46 47 48 49 50 51


## $1 = program, eg "autoconf".
## Echo the version string, eg "2.59".
## FIXME does not handle things like "1.4a", but AFAIK those are
## all old versions, so it is OK to fail there.
## Also note that we do not handle micro versions.
get_version ()
{
52
    ## Remove eg "./autogen.sh: line 50: autoconf: command not found".
Glenn Morris's avatar
Glenn Morris committed
53
    $1 --version 2>&1 | sed -e '/not found/d' -e 's/.* //' -n -e '1 s/\([0-9][0-9\.]*\).*/\1/p'
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
}

## $1 = version string, eg "2.59"
## Echo the major version, eg "2".
major_version ()
{
    echo $1 | sed -e 's/\([0-9][0-9]*\)\..*/\1/'
}

## $1 = version string, eg "2.59"
## Echo the minor version, eg "59".
minor_version ()
{
    echo $1 | sed -e 's/[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/'
}

## $1 = program
## $2 = minimum version.
Paul Eggert's avatar
Paul Eggert committed
72
## Return 0 if program is present with version >= minimum version.
73 74 75 76 77
## Return 1 if program is missing.
## Return 2 if program is present but too old.
## Return 3 for unexpected error (eg failed to parse version).
check_version ()
{
78
    ## Respect eg $AUTOMAKE if it is set, like autoreconf does.
Glenn Morris's avatar
Glenn Morris committed
79
    uprog=`echo $1 | sed -e 's/-/_/g' -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
80 81 82 83 84 85

    eval uprog=\$${uprog}

    [ x"$uprog" = x ] && uprog=$1

    have_version=`get_version $uprog`
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

    [ x"$have_version" = x ] && return 1

    have_maj=`major_version $have_version`
    need_maj=`major_version $2`

    [ x"$have_maj" != x ] && [ x"$need_maj" != x ] || return 3

    [ $have_maj -gt $need_maj ] && return 0
    [ $have_maj -lt $need_maj ] && return 2

    have_min=`minor_version $have_version`
    need_min=`minor_version $2`

    [ x"$have_min" != x ] && [ x"$need_min" != x ] || return 3

    [ $have_min -ge $need_min ] && return 0
    return 2
}

106
do_autoconf=false
107
test $# -eq 0 && do_autoconf=true
108 109
do_git=false

110
for arg; do
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
    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.
127

128
if $do_autoconf; then
129

130 131
  echo 'Checking whether you have the necessary tools...
(Read INSTALL.REPO for more details on building Emacs)'
132

133
  missing=
134

135
  for prog in $progs; do
136

Glenn Morris's avatar
Glenn Morris committed
137 138 139
    sprog=`echo "$prog" | sed 's/-/_/g'`

    eval min=\$${sprog}_min
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

    echo "Checking for $prog (need at least version $min)..."

    check_version $prog $min

    retval=$?

    case $retval in
        0) stat="ok" ;;
        1) stat="missing" ;;
        2) stat="too old" ;;
        *) stat="unable to check" ;;
    esac

    echo $stat

    if [ $retval -ne 0 ]; then
        missing="$missing $prog"
Glenn Morris's avatar
Glenn Morris committed
158
        eval ${sprog}_why=\""$stat"\"
159 160
    fi

161
  done
162 163


164
  if [ x"$missing" != x ]; then
165

166 167
    echo '
Building Emacs from the repository requires the following specialized programs:'
168 169

    for prog in $progs; do
Glenn Morris's avatar
Glenn Morris committed
170 171 172
        sprog=`echo "$prog" | sed 's/-/_/g'`

        eval min=\$${sprog}_min
173 174 175 176 177

        echo "$prog (minimum version $min)"
    done


178 179
    echo '
Your system seems to be missing the following tool(s):'
180 181

    for prog in $missing; do
Glenn Morris's avatar
Glenn Morris committed
182 183 184
        sprog=`echo "$prog" | sed 's/-/_/g'`

        eval why=\$${sprog}_why
185 186 187 188

        echo "$prog ($why)"
    done

189
    echo '
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
If you think you have the required tools, please add them to your PATH
and re-run this script.

Otherwise, please try installing them.
On systems using rpm and yum, try: "yum install PACKAGE"
On systems using dpkg and apt, try: "apt-get install PACKAGE"
Then re-run this script.

If you do not have permission to do this, or if the version provided
by your system is too old, it is normally straightforward to build
these packages from source.  You can find the sources at:

ftp://ftp.gnu.org/gnu/PACKAGE/

Download the package (make sure you get at least the minimum version
listed above), extract it using tar, then run configure, make,
make install.  Add the installation directory to your PATH and re-run
this script.

If you know that the required versions are in your PATH, but this
script has made an error, then you can simply run

212
autoreconf -fi -I m4
213 214 215

instead of this script.

216
Please report any problems with this script to bug-gnu-emacs@gnu.org .'
217

218
    exit 1
219 220 221 222 223 224 225 226 227 228 229 230 231
  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
232 233 234
fi


235
# True if the Git setup was OK before autogen.sh was run.
236

237
git_was_ok=true
238

239 240 241 242 243 244 245 246
if $do_git; then
    case `cp --help 2>/dev/null` in
      *--backup*--verbose*)
	cp_options='--backup=numbered --verbose';;
      *)
	cp_options='-f';;
    esac
fi
247

248

249 250
# Like 'git config NAME VALUE' but verbose on change and exiting on failure.
# Also, do not configure unless requested.
251

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
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.
281

282 283
git_config diff.elisp.xfuncname \
	   '^\(def[^[:space:]]+[[:space:]]+([^()[:space:]]+)'
284 285 286 287 288
git_config 'diff.m4.xfuncname' '^((m4_)?define|A._DEFUN(_ONCE)?)\([^),]*'
git_config 'diff.make.xfuncname' \
	   '^([$.[:alnum:]_].*:|[[:alnum:]_]+[[:space:]]*([*:+]?[:?]?|!?)=|define .*)'
git_config 'diff.shell.xfuncname' \
	   '^([[:space:]]*[[:alpha:]_][[:alnum:]_]*[[:space:]]*\(\)|[[:alpha:]_][[:alnum:]_]*=)'
289 290
git_config diff.texinfo.xfuncname \
	   '^@node[[:space:]]+([^,[:space:]][^,]+)'
291 292


293
# Install Git hooks.
294

295 296
tailored_hooks=
sample_hooks=
297

298 299
for hook in commit-msg pre-commit; do
    cmp build-aux/git-hooks/$hook .git/hooks/$hook >/dev/null 2>&1 ||
300
	tailored_hooks="$tailored_hooks $hook"
301 302 303 304
done
for hook in applypatch-msg pre-applypatch; do
    src=.git/hooks/$hook.sample
    cmp "$src" .git/hooks/$hook >/dev/null 2>&1 ||
305
	sample_hooks="$sample_hooks $hook"
306
done
307

308 309
if test -n "$tailored_hooks$sample_hooks"; then
    if $do_git; then
310 311 312 313
	echo "Installing git hooks..."

	if test -n "$tailored_hooks"; then
	    for hook in $tailored_hooks; do
314 315 316
		dst=.git/hooks/$hook
		cp $cp_options build-aux/git-hooks/$hook "$dst" || exit
		chmod a-w "$dst" || exit
317 318 319 320 321 322 323 324 325
	    done
	fi

	if test -n "$sample_hooks"; then
	    for hook in $sample_hooks; do
		cp $cp_options .git/hooks/$hook.sample .git/hooks/$hook || exit
		chmod a-w .git/hooks/$hook || exit
	    done
	fi
326 327
    else
	git_was_ok=false
328 329 330
    fi
fi

331 332 333 334 335 336 337 338
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
339 340 341 342

exit 0

### autogen.sh ends here