# Getting Meson

Meson is implemented in Python 3, and requires 3.6 or newer. If your
operating system provides a package manager, you should install it
with that. For platforms that don't have a package manager, you need
to download it from [Python's home page]. See below for
[platform-specific Python3 quirks](#platformspecific-install-quirks).

## Downloading Meson

Meson releases can be downloaded from the [GitHub release page], and
you can run `./meson.py` from inside a release or the git repository
itself without doing anything special.

On Windows, if you did not install Python with the installer options
that make Python scripts executable, you will have to run `python
/path/to/meson.py`, where `python` is Python 3.6 or newer.

The newest development code can be obtained directly from [Git], and
we strive to ensure that it will always be working and usable. All
commits go through a pull-request process that runs CI and tests
several platforms.

## Installing Meson with pip

Meson is available in the [Python Package Index] and can be installed
with `pip3 install --user meson`. This does not require any special
privileges. This will install the package in `~/.local/`, so you will
have to add `~/.local/bin` to your `PATH`. If you are using Meson only
for local development this should be all you need.

If you need to install your project in system directories, this
approach will not work as executable installed in this way are not
available when `sudo` is used. You can install Meson so it can be used
by every user with `sudo pip3 install meson`. It is generally not
recommended to do this, but instead use the version provided by distro
packages.

If you must install Meson with `sudo pip3` make sure to uninstall any
distro version first. Having multiple versions of any program in
system directories can lead to problems.

## Installing Meson and Ninja with the MSI installer

We provide an MSI installer on the [GitHub release page] that can be
used to install both Meson and Ninja at once for Windows. It also
contains an embedded copy of Python, so scripts that use the [Python
module](Python-module.md) and do not have any external dependencies
will continue to work as expected.

Please note that this is a new feature, so bug reports are expected
and welcome!

## Dependencies

In the most common case, you will need the [Ninja executable] for
using the `ninja` backend, which is the default in Meson. This backend
can be used on all platforms and with all toolchains, including GCC,
Clang, Visual Studio, MinGW, ICC, ARMCC, etc.

You can use the version provided by your package manager if possible,
otherwise download the binary executable from the [Ninja project's
release page](https://github.com/ninja-build/ninja/releases).

If you will only use the Visual Studio backend (`--backend=vs`) to
generate Visual Studio solutions on Windows or the XCode backend
(`--backend=xcode`) to generate XCode projects on macOS, you do not
need Ninja.

# Platform-specific install quirks

## Windows Python3 quirks

When installing Python 3, it is highly recommended (but not required)
that you select the installer options as follows:

![installer step 1](images/py3-install-1.png "Enable 'Add Python 3.6 to PATH' and click 'Customize installation'")
![installer step 2](images/py3-install-2.png "Optional Features: ensure 'pip' is enabled")
![installer step 3](images/py3-install-3.png "Advanced Options: enable 'Install for all users'")

With this, you will have `python` and `pip` in `PATH`, and you can
install Meson with pip. You will also be able to directly run `meson`
in any shell on Windows instead of having to run `py -3` with the full
path to the `meson.py` script.

## MSYS2 Python3 quirks

If you are using MSYS2 on Windows as your development environment,
please make sure that you **do not use** the `msys/python` package to
provide Python 3. Use either `mingw32/mingw-w64-i686-python3` or
`mingw64/mingw-w64-x86_64-python3` depending on which MinGW target you
are building for.

  [GitHub release page]: https://github.com/mesonbuild/meson/releases
  [Python Package Index]: https://pypi.python.org/pypi/meson/
  [Git]: https://github.com/mesonbuild/meson
  [Python's home page]: https://www.python.org/downloads/
  [Ninja executable]: https://ninja-build.org/
