autogen.sh 8.39 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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
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.
126

127
if $do_autoconf; then
128

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

132
  missing=
133

134
  for prog in $progs; do
135

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

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

    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
157
        eval ${sprog}_why=\""$stat"\"
158 159
    fi

160
  done
161 162


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

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

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

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

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


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

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

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

        echo "$prog ($why)"
    done

188
    echo '
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
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

211
autoreconf -fi -I m4
212 213 214

instead of this script.

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

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


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

236
git_was_ok=true
237

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

247

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

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
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.
280

281 282 283 284
git_config diff.elisp.xfuncname \
	   '^\(def[^[:space:]]+[[:space:]]+([^()[:space:]]+)'
git_config diff.texinfo.xfuncname \
	   '^@node[[:space:]]+([^,[:space:]][^,]+)'
285 286


287
# Install Git hooks.
288

289 290
tailored_hooks=
sample_hooks=
291

292 293
for hook in commit-msg pre-commit; do
    cmp build-aux/git-hooks/$hook .git/hooks/$hook >/dev/null 2>&1 ||
294
	tailored_hooks="$tailored_hooks $hook"
295 296 297 298
done
for hook in applypatch-msg pre-applypatch; do
    src=.git/hooks/$hook.sample
    cmp "$src" .git/hooks/$hook >/dev/null 2>&1 ||
299
	sample_hooks="$sample_hooks $hook"
300
done
301

302 303
if test -n "$tailored_hooks$sample_hooks"; then
    if $do_git; then
304 305 306 307
	echo "Installing git hooks..."

	if test -n "$tailored_hooks"; then
	    for hook in $tailored_hooks; do
308 309 310
		dst=.git/hooks/$hook
		cp $cp_options build-aux/git-hooks/$hook "$dst" || exit
		chmod a-w "$dst" || exit
311 312 313 314 315 316 317 318 319
	    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
320 321
    else
	git_was_ok=false
322 323 324
    fi
fi

325 326 327 328 329 330 331 332
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
333 334 335 336

exit 0

### autogen.sh ends here