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

4
## Copyright (C) 2011-2014 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 26 27 28

## 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:

## The Emacs bzr repository does not include the configure script
## (and associated helpers).  The first time you fetch Emacs from bzr,
## 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.
Glenn Morris's avatar
Glenn Morris committed
35
progs="autoconf automake pkg-config"
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

Glenn Morris's avatar
Glenn Morris committed
44
pkg_config_min=`sed -n 's/^ *PKG_PROG_PKG_CONFIG(\([0-9\.]*\)).*/\1/p' configure.ac`
45 46 47 48 49 50 51 52

## $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 ()
{
53
    ## Remove eg "./autogen.sh: line 50: autoconf: command not found".
Glenn Morris's avatar
Glenn Morris committed
54
    $1 --version 2>&1 | sed -e '/not found/d' -e 's/.* //' -n -e '1 s/\([0-9][0-9\.]*\).*/\1/p'
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
}

## $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
73
## Return 0 if program is present with version >= minimum version.
74 75 76 77 78
## 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 ()
{
79
    ## Respect eg $AUTOMAKE if it is set, like autoreconf does.
Glenn Morris's avatar
Glenn Morris committed
80
    uprog=`echo $1 | sed -e 's/-/_/g' -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
81 82 83 84 85 86

    eval uprog=\$${uprog}

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

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

    [ 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
}


cat <<EOF
Checking whether you have the necessary tools...
110
(Read INSTALL.REPO for more details on building Emacs)
111 112 113 114 115 116 117

EOF

missing=

for prog in $progs; do

Glenn Morris's avatar
Glenn Morris committed
118 119 120
    sprog=`echo "$prog" | sed 's/-/_/g'`

    eval min=\$${sprog}_min
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138

    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
139
        eval ${sprog}_why=\""$stat"\"
140 141 142 143 144 145 146 147 148 149 150 151 152
    fi

done


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

    cat <<EOF

Building Emacs from Bzr requires the following specialized programs:
EOF

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

        eval min=\$${sprog}_min
156 157 158 159 160 161 162 163 164 165 166

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


    cat <<EOF

Your system seems to be missing the following tool(s):
EOF

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

        eval why=\$${sprog}_why
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

        echo "$prog ($why)"
    done

    cat <<EOF

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

198
autoreconf -fi -I m4
199 200 201 202 203 204

instead of this script.

Please report any problems with this script to bug-gnu-emacs@gnu.org .
EOF

205
    exit 1
206 207
fi

208 209 210 211 212
# If automake is installed in a nonstandard location, find the standard
# location if possible and append it to ACLOCAL_PATH.  That way, it will
# find the pkg.m4 that is installed in the standard location.
echo "Checking for pkg.m4..."
AUTORECONF_ENV=
213
env_space=
214 215 216 217 218 219 220 221 222 223 224
ac_dir=`aclocal --print-ac-dir` || {
    cat <<EOF
There was a problem running 'aclocal --print-ac-dir'.
The aclocal program is part of automake.
Please check your automake installation.
EOF

    exit 1
}

test -n "$ac_dir" && test -r "$ac_dir/pkg.m4" || {
225 226 227 228 229 230 231 232 233 234

  # Maybe ACLOCAL_PATH is already set-up.
  if test -n "$ACLOCAL_PATH"; then
    oIFS=$IFS
    IFS=:
    for dir in $ACLOCAL_PATH; do
      if test -r "$dir/pkg.m4"; then
  	AUTORECONF_ENV="ACLOCAL_PATH='$ACLOCAL_PATH'"
        env_space=' '
  	break
235
      fi
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
    done
    IFS=$oIFS
  fi

  if test -z "$AUTORECONF_ENV"; then
    oIFS=$IFS
    IFS=:
    before_first_aclocal=true
    for dir in $PATH; do
      if test -x "$dir/aclocal"; then
        if $before_first_aclocal; then
          before_first_aclocal=false
        elif ac_dir=`"$dir/aclocal" --print-ac-dir` && test -r "$ac_dir/pkg.m4"
        then
          case $ACLOCAL_PATH in
            '') ACLOCAL_PATH=$ac_dir;;
            ?*) ACLOCAL_PATH=$ACLOCAL_PATH:$ac_dir;;
          esac
          export ACLOCAL_PATH
          AUTORECONF_ENV="ACLOCAL_PATH='$ACLOCAL_PATH'"
          env_space=' '
          break
        fi
      fi
    done
    IFS=$oIFS
  fi
263

264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
  ## OK, maybe pkg-config is in a weird place (eg on hydra).
  if test -z "$AUTORECONF_ENV"; then
    oIFS=$IFS
    IFS=:
    for dir in $PATH; do
      if test -x "$dir/pkg-config"; then
        ac_dir=`echo "$dir" | sed 's|bin$|share/aclocal|'`
        if test -r "$ac_dir/pkg.m4"; then
          case $ACLOCAL_PATH in
            '') ACLOCAL_PATH=$ac_dir;;
            ?*) ACLOCAL_PATH=$ACLOCAL_PATH:$ac_dir;;
          esac
          export ACLOCAL_PATH
          AUTORECONF_ENV="ACLOCAL_PATH='$ACLOCAL_PATH'"
          env_space=' '
          break
        fi
      fi
    done
    IFS=$oIFS
  fi

286 287 288 289 290 291 292 293 294 295 296 297
  if test -z "$AUTORECONF_ENV"; then
    cat <<EOF
The version of aclocal that you are using cannot find the pkg.m4 file that
pkg-config provides.  If it is installed in some unusual directory /FOO/BAR,
set ACLOCAL_PATH='/FOO/BAR' in the environment and run this script again.
EOF
    exit 1
  fi
}
echo ok

echo 'Your system has the required tools.'
298
echo "Running \"$AUTORECONF_ENV${env_space}autoreconf -fi -I m4\" ..."
299 300 301


## Let autoreconf figure out what, if anything, needs doing.
302
## Use autoreconf's -f option in case autoreconf itself has changed.
303
autoreconf -fi -I m4 || exit $?
304

305 306 307 308
## Create a timestamp, so that './autogen.sh; make' doesn't
## cause 'make' to needlessly run 'autoheader'.
echo timestamp > src/stamp-h.in || exit

309
echo "You can now run \"./configure$env_space$AUTORECONF_ENV\"."
310 311 312 313

exit 0

### autogen.sh ends here