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 (Windows 95/98/NT/XP/Vista/7/8/10)
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.
