autogen.sh 9.6 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-2017 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_check=true
107
do_autoconf=true
108 109
do_git=false

110
for arg; do
111 112 113
    case $arg in
      --help)
	exec echo "$0: usage: $0 [all|autoconf|git]";;
114
      --no-check)
115
        do_check=false;;
116
      all)
117
	test -e .git && do_git=true;;
118
      autoconf)
119
	true;;
120
      git)
121
	do_autoconf=false
122 123 124 125 126 127 128 129
	do_git=true;;
      *)
	echo >&2 "$0: $arg: unknown argument"; exit 1;;
    esac
done


# Generate Autoconf and Automake related files, if requested.
130

131
if $do_autoconf; then
132

133 134 135
  if $do_check; then

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

138
    missing=
139

140
    for prog in $progs; do
141

142
      sprog=`echo "$prog" | sed 's/-/_/g'`
Glenn Morris's avatar
Glenn Morris committed
143

144
      eval min=\$${sprog}_min
145

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

148
      check_version $prog $min
149

150
      retval=$?
151

152 153 154 155 156 157
      case $retval in
          0) stat="ok" ;;
          1) stat="missing" ;;
          2) stat="too old" ;;
          *) stat="unable to check" ;;
      esac
158

159
      echo $stat
160

161 162 163 164
      if [ $retval -ne 0 ]; then
          missing="$missing $prog"
          eval ${sprog}_why=\""$stat"\"
      fi
165

166
    done
167 168


169
    if [ x"$missing" != x ]; then
170

171
      echo '
172
Building Emacs from the repository requires the following specialized programs:'
173

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

177
          eval min=\$${sprog}_min
178

179 180
          echo "$prog (minimum version $min)"
      done
181 182


183
      echo '
184
Your system seems to be missing the following tool(s):'
185

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

189
          eval why=\$${sprog}_why
190

191 192
          echo "$prog ($why)"
      done
193

194
      echo '
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
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
215 216
script has made an error, then you can simply re-run this script with
the --no-check option.
217

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

220 221 222 223
      exit 1
    fi

    echo 'Your system has the required tools.'
224

225
  fi                            # do_check
226

227 228
  ## Create nt/gnulib.mk if it doesn't exist, as autoreconf will need it.
  if test ! -f nt/gnulib.mk; then
229
      echo 'Inferring nt/gnulib.mk from lib/gnulib.mk ...'
Paul Eggert's avatar
Paul Eggert committed
230 231
      metascript='/^[^#]/s|^.*$|/^## begin  *gnulib module &/,/^## end  *gnulib module &/d|p'
      script=`sed -n "$metascript" nt/gnulib-modules-to-delete.cfg` || exit
232
      sed "$script" lib/gnulib.mk > nt/gnulib.mk || exit
233 234 235
  fi

  echo "Running 'autoreconf -fi -I m4' ..."
236 237 238 239 240 241 242 243

  ## 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
244 245 246
fi


247
# True if the Git setup was OK before autogen.sh was run.
248

249
git_was_ok=true
250

251 252 253 254 255 256 257 258
if $do_git; then
    case `cp --help 2>/dev/null` in
      *--backup*--verbose*)
	cp_options='--backup=numbered --verbose';;
      *)
	cp_options='-f';;
    esac
fi
259

260

261 262
# Like 'git config NAME VALUE' but verbose on change and exiting on failure.
# Also, do not configure unless requested.
263

264 265 266 267 268 269 270 271 272 273 274
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=*)
275 276
		    config=$git_common_dir/config
		    cp $cp_options --force -- "$config" "$config" || exit;;
277 278 279 280 281 282 283 284 285 286 287
		esac
	    fi
	    echo "git config $name '$value'"
	    git config "$name" "$value" || exit
	fi
	git_was_ok=false
    }
}

## Configure Git, if requested.

288 289 290
# Get location of Git's common configuration directory.  For older Git
# versions this is just '.git'.  Newer Git versions support worktrees.

Paul Eggert's avatar
Paul Eggert committed
291 292 293 294
{ test -e .git &&
  git_common_dir=`git rev-parse --no-flags --git-common-dir 2>/dev/null` &&
  test -n "$git_common_dir"
} || git_common_dir=.git
295 296
hooks=$git_common_dir/hooks

297 298 299 300 301 302
# Check hashes when transferring objects among repositories.

git_config transfer.fsckObjects true


# Configure 'git diff' hunk header format.
303

304 305
git_config diff.elisp.xfuncname \
	   '^\(def[^[:space:]]+[[:space:]]+([^()[:space:]]+)'
306 307 308 309 310
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:]_]*=)'
311 312
git_config diff.texinfo.xfuncname \
	   '^@node[[:space:]]+([^,[:space:]][^,]+)'
313 314


315
# Install Git hooks.
316

317 318
tailored_hooks=
sample_hooks=
319

320
for hook in commit-msg pre-commit; do
321
    cmp -- build-aux/git-hooks/$hook "$hooks/$hook" >/dev/null 2>&1 ||
322
	tailored_hooks="$tailored_hooks $hook"
323 324
done
for hook in applypatch-msg pre-applypatch; do
325
    cmp -- "$hooks/$hook.sample" "$hooks/$hook" >/dev/null 2>&1 ||
326
	sample_hooks="$sample_hooks $hook"
327
done
328

329 330
if test -n "$tailored_hooks$sample_hooks"; then
    if $do_git; then
331 332 333 334
	echo "Installing git hooks..."

	if test -n "$tailored_hooks"; then
	    for hook in $tailored_hooks; do
335 336 337
		dst=$hooks/$hook
		cp $cp_options -- build-aux/git-hooks/$hook "$dst" || exit
		chmod -- a-w "$dst" || exit
338 339 340 341 342
	    done
	fi

	if test -n "$sample_hooks"; then
	    for hook in $sample_hooks; do
343 344 345
		dst=$hooks/$hook
		cp $cp_options -- "$dst.sample" "$dst" || exit
		chmod -- a-w "$dst" || exit
346 347
	    done
	fi
348 349
    else
	git_was_ok=false
350 351 352
    fi
fi

353 354
if test ! -f configure; then
    echo "You can now run '$0 autoconf'."
355
elif test -e .git && test $git_was_ok = false && test $do_git = false; then
356 357 358 359 360
    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
361 362 363 364

exit 0

### autogen.sh ends here