Building and Installing
=======================

For the impatient:

  $ ./configure
  $ make
  $ make check
  $ make install

Alternatively (and recommended), use a remote build directory:

  $ mkdir build
  $ cd build
  $ ../configure
  $ make
  $ make check
  $ make install

If you can't seem to find configure then you probably downloaded the
source, you'll need to "bootstrap" your development environment with:

  $ ./bootstrap

There are numerous configuration options that might be applicable to
you. Check them out via:

  $ ./configure --help

The specific options that might be relevant include:

  --disable-java          don't build Java bindings
  --disable-python        don't build Python bindings
  --disable-webui         don't build webui (requires Python 2.6)
  --disable-optimize      don't try to compile with optimizations
  --without-included-zookeeper
                          excludes building and using the included ZooKeeper
                          package in lieu of a system installed version (note,
                          however, that no attempt is made to find the package
                          and explicitly setting CPPFLAGS and LDFLAGS as
                          appropriate may be necessary)

And the specific environment variables that might be relevant are:

  JAVA_HOME   location of Java Development Kit (JDK)
  JAVA_CPPFLAGS
              preprocessor flags for JDK
  JAVA_LDFLAGS
              linker flags for JDK
  PYTHON      which Python interpreter to use


Java
====

During configuraiton we attempt to determine a suitable location for
JDK so that we can build JNI based libraries. If we can not do so, you
may need to try setting JAVA_HOME, JAVA_CPPFLAGS, or JAVA_LDFLAGS
manually.

The resulting libmesos.a/so/dylib will include the Java bindings (JNI)
if they are enabled (which they are by default, and can be disabled
with the '--disable-java' configuration option). The Mesos JAR can be
found in [build]/src (where [build] represents a remote build
directory if any).


Python
======

We build a Python egg that can be included in the PYTHONPATH when
running Python based frameworks. The Python egg is built in
[build]/src/python/dist (where [build] represents a remote build
directory if any).


Running Mesos before Installing
===============================

After running 'make' but before running 'make install' you can run any
of the binaries but certain environment variables must be set up first
(see [build]/bin/mesos-build-env.sh.in). It's advisable to run the
binaries by using the wrapper scripts provided in [build]/bin. Note
that these scripts also have a GDB variant that starts the binaries in
GDB when you want to debug.


Examples and Tests
==================

After running 'make check' there will be a collection of examples and
tests that get built. Check out [build]/src/examples and
[build]/src/examples/java and [build]/src/examples/python. In
addition, see [build]/bin for scripts that can run the tests and also
launch the tests in GDB.


Hadoop
======

Included in the distribution is a runnable tutorial on using Hadoop on
Mesos (./hadoop/TUTORIAL.sh). Try it out!

You can also "build" a self-contained distribution of Hadoop with the
necessary Mesos components by doing 'make hadoop-0.20.205.0' or 'make
hadoop-0.20.2-cdh3u3' from within [build]/hadoop (this uses the
tutorial mentioned above).


Installing
==========

You can install the binaries and libraries with:

  $ make install

Note that this may require superuser privileges. You can change the
installation prefix during configure by using the --prefix option, for
example:

  $ ./configure --prefix=/home/benh/mesos

Then installation will occur in /home/benh/mesos.


Running a Mesos Cluster
==========================

Included in an installation are some "deploy" scripts that can be used
to start and stop a Mesos cluster. The scripts can only be used after
installation (see the previous section on how to install without
superuser privileges), and are installed by default in [prefix]/sbin
(unless you set --sbindir or --exec-prefix during configuration). Note
that the scripts expect the same installation directories on each host
in the cluster. The scripts DO NOT copy any Mesos binaries, libraries,
configuration files (or themselves) to other hosts in the cluster
(it's expected that you'll do the installation yourself).

The scripts assume the presence of a 'masters' and a 'slaves' file in
[prefix]/var/mesos/deploy by default (unless you set --localstatedir
during configuration). These files should contain a list of
hostnames/IPs to be used (one per line) for running master(s) and
slave(s) respectively.

Configuration options for either the mesos-master or mesos-slave are
expected to be set on each host before trying to start a cluster. The
deploy scripts assume the configuration file will be located at
[prefix]/var/mesos/conf/mesos.conf on all hosts. Note that you'll need
to at least set the '--master' option on slave hosts!

Options specific to running the "deploy" scripts (e.g., whether to use
sudo, what ssh options to use when connecting to each host) can be set
in [prefix]/var/mesos/deploy/mesos-deploy-env.sh.

Once you've populated the 'masters' and 'slaves' file and set up
configuration options on each host as appropriate you can start a
cluster by doing:

  $ [prefix]/sbin/mesos-start-cluster.sh

And you can stop the cluster by doing:

  $ [prefix]/sbin/mesos-stop-cluster.sh


======================================================================

As always, if you run into any issues please email:

  mesos-dev@incubator.apache.org

(Remember to include as much debug information as possible.)
