INSTALL - Installation of Vim on different machines.

This file contains instructions for compiling Vim. If you already have an
executable version of Vim, you don't need this.

Contents:
1. Generic
2. Unix
3. OS/2 (with EMX 0.9b)
4. Atari MiNT

See INSTALLami.txt              for Amiga
See INSTALLmac.txt              for Macintosh
See INSTALLpc.txt               for PC (MS-DOS, Windows 95/98/NT/XP)
See INSTALLvms.txt              for VMS
See INSTALLx.txt		for cross-compiling on Unix
See ../README_390.txt           for OS/390 Unix
See ../runtime/doc/os_beos.txt  for BeBox


1. Generic
==========

If you compile Vim without specifying anything, you will get the default
behaviour as is documented, which should be fine for most people.

For features that you can't enable/disable in another way, you can edit the
file "feature.h" to match your preferences.


2. Unix
=======

Summary:
1. make			run configure, compile and link
2. make install		installation in /usr/local

This will include the GUI and X11 libraries, if you have them.  If you want a
version of Vim that is small and starts up quickly, see the Makefile for how
to disable the GUI and X11.  If you don't have GUI libraries and/or X11, these
features will be disabled automatically.

See the start of Makefile for more detailed instructions about how to compile
Vim.

If you need extra compiler and/or linker arguments, set $CFLAGS and/or $LIBS
before starting configure.  Example:

	env  CFLAGS=-I/usr/local/include  LIBS=-lm  make

This is only needed for things that configure doesn't offer a specific argument
for or figures out by itself.  First try running configure without extra
arguments.

GNU Autoconf and a few other tools have been used to make Vim work on many
different Unix systems.  The advantage of this is that Vim should compile
on most systems without any adjustments.  The disadvantage is that when
adjustments are required, it takes some time to understand what is happening.

If configure finds all library files and then complains when linking that some
of them can't be found, your linker doesn't return an error code for missing
libraries.  Vim should be linked fine anyway, mostly you can just ignore these
errors.

If you run configure by hand (not using the Makefile), remember that any
changes in the Makefile have no influence on configure.  This may be what you
want, but maybe not!

The advantage of running configure separately, is that you can write a script
to build Vim, without changing the Makefile or feature.h.  Example (using sh):

	CFLAGS=-DCOMPILER_FLAG ./configure --enable-gui=motif

One thing to watch out for: If the configure script itself changes, running
"make" will execute it again, but without your arguments.  Do "make clean" and
run configure again.

If you are compiling Vim for several machines, for each machine:
  a.    make shadow
  b.    mv shadow machine_name
  c.    cd machine_name
  d.    make; make install

[Don't use a path for machine_name, just a directory name, otherwise the links
that "make shadow" creates won't work.]


Unix: COMPILING WITH/WITHOUT GUI

NOTE: This is incomplete, look in Makefile for more info.

These configure arguments can be used to select which GUI to use:
--enable-gui=gtk      or: gtk2, motif, athena or auto
--disable-gtk-check
--disable-motif-check
--disable-athena-check

--enable-gui defaults to "auto", so it will automatically look for a GUI (in
the order of GTK, Motif, then Athena).  If one is found, then is uses it and
does not proceed to check any of the remaining ones.  Otherwise, it moves on
to the next one.

--enable-{gtk,gtk2,kde,motif,athena}-check all default to "yes", such that if
--enable-gui is "auto" (which it is by default), GTK, Motif, and Athena will
be checked for.  If you want to *exclude* a certain check, then you use
--disable-{gtk,gtk2,kde,motif,athena}-check.

For example, if --enable-gui is set to "auto", but you don't want it look for
Motif, you then also specify --disable-motif-check.  This results in only
checking for GTK and Athena.

Lastly, if you know which one you want to use, then you can just do
--enable-gui={gtk,gtk2,kde,motif,athena}.  So if you wanted to only use Motif,
then you'd specify --enable-gui=motif.  Once you specify what you want, the
--enable-{gtk,gtk2,kde,motif,athena}-check options are ignored.

On Linux you usually need GUI "-devel" packages.  You may already have GTK
libraries installed, but that doesn't mean you can compile Vim with GTK, you
also need the header files.

For compiling with the GTK+ GUI, you need a recent version of glib and gtk+.
Configure checks for at least version 1.1.16.  An older version is not selected
automatically.  If you want to use it anyway, run configure with
"--disable-gtktest".
GTK requires an ANSI C compiler.  If you fail to compile Vim with GTK+ (it
is the preferred choice), try selecting another one in the Makefile.
If you are sure you have GTK installed, but for some reason configure says you
do not, you may have left-over header files and/or library files from an older
(and incompatible) version of GTK.  if this is the case, please check
auto/config.log for any error messages that may give you a hint as to what's
happening.

There used to be a KDE version of Vim, using Qt libraries, but since it didn't
work very well and there was no maintainer it was dropped.


Unix: COMPILING WITH MULTI-BYTE

When you want to compile with the multi-byte features enabled, make sure you
compile on a machine where the locale settings actually work, otherwise the
configure tests may fail.  You need to compile with "big" features:

    ./configure --with-features=big

Unix: COMPILING ON LINUX

On Linux, when using -g to compile (which is default for gcc), the executable
will probably be statically linked.  If you don't want this, remove the -g
option from CFLAGS.

Unix: PUTTING vimrc IN /etc

Some Linux distributions prefer to put the global vimrc file in /etc, and the
Vim runtime files in /usr.  This can be done with:
	./configure --prefix=/usr
	make VIMRCLOC=/etc VIMRUNTIMEDIR=/usr/share/vim MAKE="make -e"

Unix: COMPILING ON NeXT

Add the "-posix" argument to the compiler by using one of these commands:
	setenv CC 'cc -posix' (csh)
	export CC='cc -posix' (sh)
And run configure with "--disable-motif-check".

Unix: LOCAL HEADERS AND LIBRARIES NOT IN /usr/local

Sometimes it is necessary to search different path than /usr/local for locally
installed headers (/usr/local/include) and libraries (/usr/local/lib).
To search /stranger/include and /stranger/lib for locally installed
headers and libraries, use:
	./configure --with-local-dir=/stranger
And to not search for locally installed headers and libraries at all, use:
	./configure --without-local-dir


3. OS/2
=======

OS/2 support was removed in patch 7.4.1008


4. Atari MiNT
=============

[NOTE: this is quite old, it might not work anymore]

To compile Vim for MiNT you may either copy Make_mint.mak to Makefile or use
the Unix Makefile adapted for the MiNT configuration.

Now proceed as described in the Unix section.

Prerequisites:

You need a curses or termcap library that supports non-alphanumeric
termcap names. If you don't have any, link with termlib.o.

-----------------------------------------------------------------------------

The rest of this file is based on the INSTALL file that comes with GNU
autoconf 2.12. Not everything applies to Vim. Read Makefile too!


Basic Installation
==================

   These are generic installation instructions.

   The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation.  It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions.  Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').

   If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release.  If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.

   The file `configure.in' is used to create `configure' by a program
called `autoconf'.  You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.

The simplest way to compile this package is:

  1. `cd' to the directory containing the package's source code and type
     `./configure' to configure the package for your system.  If you're
     using `csh' on an old version of System V, you might need to type
     `sh ./configure' instead to prevent `csh' from trying to execute
     `configure' itself.

     Running `configure' takes awhile.  While running, it prints some
     messages telling which features it is checking for.

  2. Type `make' to compile the package.

  3. Optionally, type `make check' to run any self-tests that come with
     the package.

  4. Type `make install' to install the programs and any data files and
     documentation.

  5. You can remove the program binaries and object files from the
     source code directory by typing `make clean'.  To also remove the
     files that `configure' created (so you can compile the package for
     a different kind of computer), type `make distclean'.  There is
     also a `make maintainer-clean' target, but that is intended mainly
     for the package's developers.  If you use it, you may have to get
     all sorts of other programs in order to regenerate files that came
     with the distribution.

Compilers and Options
=====================

   Some systems require unusual options for compilation or linking that
the `configure' script does not know about.  You can give `configure'
initial values for variables by setting them in the environment.  Using
a Bourne-compatible shell, you can do that on the command line like
this:
     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure

Or on systems that have the `env' program, you can do it like this:
     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure

Compiling For Multiple Architectures
====================================

   You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory.  To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'.  `cd' to the
directory where you want the object files and executables to go and run
the `configure' script.  `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.

   If you have to use a `make' that does not support the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory.  After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.

Installation Names
==================

   By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc.  You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.

   You can specify separate installation prefixes for
architecture-specific files and architecture-independent files.  If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.

   In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files.  Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.

   If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.

Optional Features
=================

   Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System).  The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.

   For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.

Specifying the System Type
==========================

   There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on.  Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option.  TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
     CPU-COMPANY-SYSTEM

See the file `config.sub' for the possible values of each field.  If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.

   If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.

Sharing Defaults
================

   If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists.  Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.

Operation Controls
==================

   `configure' recognizes the following options to control how it
operates.

`--cache-file=FILE'
     Use and save the results of the tests in FILE instead of
     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
     debugging `configure'.

`--help'
     Print a summary of the options to `configure', and exit.

`--quiet'
`--silent'
`-q'
     Do not print messages saying which checks are being made.  To
     suppress all normal output, redirect it to `/dev/null' (any error
     messages will still be shown).

`--srcdir=DIR'
     Look for the package's source code in directory DIR.  Usually
     `configure' can determine that directory automatically.

`--version'
     Print the version of Autoconf used to generate the `configure'
     script, and exit.

`configure' also accepts some other, not widely useful, options.
