:title: Mason Guide: *Building and Running*

.. _building-and-running:
        
Building and Running
~~~~~~~~~~~~~~~~~~~~

When invoked, ``mason build [ options ]`` will do the following:

    - Run update to make sure any manual manifest edits are reflected in the dependency code.
    - Build ``MyPackage.chpl`` in the ``src/`` directory.
    - All packages are compiled into binaries and placed into ``target/``
    - To forward options to the Chapel compiler(``chpl``), separate them with a double dash
       - e.g., mason build --force -- --savec tmpdir

``mason run [ options ]`` will, in turn:

    - Run the executable built above out of ``target/``, if it exists.
    - All options not recognized by ``mason`` will be forwarded to the executable.

For example, after ``mason run --build [ options ]``, the package directory appears as follows::

  MyPackage/
   │
   ├── Mason.lock
   ├── Mason.toml
   ├── example/
   ├── src/
   │   └── myPackage.chpl
   ├── target/
   │   ├── debug/
   │   │   └── myPackage
   │   ├── example/
   │   └── test/
   └── test/


As you can see, new files have been added to the package, the first of which
is the ``Mason.lock``. You can think of this file as a snapshot of a single
run of the program. This file "locks" in the settings in which the program
was built upon invocation of ``mason build``. This file can be generated manually
with the ``mason update`` command. ``mason update`` will read the ``Mason.toml``,
resolve dependencies, and generate the ``Mason.lock`` based on it's contents.

The ``target/`` directory is where Mason stores all the binaries related to your package.
These could be binaries for the main source code as well as examples and tests. There are two types of
targets for building. The default location of a package binary is ``target/debug/``, as shown in the
example above. However, if a final version of an application or library is
being produced, the ``--release`` flag can be thrown as follows:

.. code-block:: sh

   mason build --release --force
   
   OR
   
   mason run --build --release --force

The ``--release`` option adds the ``--fast`` argument to the compilation step.

The argument ``--force`` is included as Mason will only build the package if
the package has been modified. Throwing the ``--release`` flag will result in
the following package structure::

  MyPackage/
   │
   ├── Mason.lock
   ├── Mason.toml
   ├── example/
   ├── src/
   │   └── myPackage.chpl
   ├── target/
   │   ├── debug/
   │   │   └── myPackage
   │   ├── example/
   │   ├── release/
   │   │   └── myPackage
   │   └── test/
   └── test/

As you can see there are now two binaries of ``MyPackage``, one under ``debug/`` and
one under ``release``.  To remove the ``target/`` directory along with all of the binaries
for your package, use the ``mason clean`` command.

