# Building

## Build Options
* ``MCPI_BUILD_MODE``
  * ``arm``: Only Build ARM Components
  * ``native``: Only Build Native Components
  * ``both`` (Default): Build Both ARM And Native Components For ARM
* ``MCPI_SERVER_MODE``
  * ``ON``: Enable Server Mode
  * ``OFF`` (Default): Disable Server Mode
* ``MCPI_HEADLESS_MODE``
  * ``ON`` (Default In Server Mode): Enable Headless Mode
  * ``OFF`` (Default In Client Mode): Disable Headless Mode
* ``MCPI_USE_MEDIA_LAYER_PROXY``
  * ``ON``: Enable The Media Layer Proxy
  * ``OFF`` (Default): Disable The Media Layer Proxy

## Build Dependencies
* Common
  * ARM Compiler
  * Host Compiler (Clang)
  * CMake
* Host Architecture Dependencies
  * Client Mode Only
    * GLFW
    * FreeImage
    * OpenAL

## Runtime Dependencies
* Non-ARM Host Architectures
  * QEMU User-Mode Static
* Host Architecture Dependencies
  * CLient Mode Only
    * OpenGL ES 1.1
    * GLFW
    * FreeImage
    * OpenAL
    * Zenity

## Two-Step Build
Use this when the host architecture is not ARM.

```sh
# Install dependencies
ARM_PACKAGES_SUPPORTED=1 ./scripts/install-dependencies.sh

# Create Build Directory
mkdir build && cd build

# Build ARM Components
mkdir arm && cd arm
cmake -DMCPI_BUILD_MODE=arm ../..
make -j$(nproc) && sudo make install
cd ../

# Build Native Components
mkdir native && cd native
cmake -DMCPI_BUILD_MODE=native ../..
make -j$(nproc) && sudo make install
cd ../../
```

This will most likely not compile by itself. You will want to enable either server mode or the Media Layer Proxy.

## One-Step Build
Use this when the host architecture is ARM.

```sh
# Install dependencies
./scripts/install-dependencies.sh

# Create Build Directory
mkdir build && cd build

# Build
cmake ..
make -j$(nproc) && sudo make install
cd ../
```

## Docker Build
Alternatively, if you have Docker installed you can build Reborn in a Docker container.

```sh
./scripts/ci/simulate.sh
```
