Unless you really need to build Codon for whatever reason, we strongly
recommend using pre-built binaries if possible.

# Dependencies

Codon uses an LLVM fork based on LLVM 17. To build it, you can do:

``` bash
git clone --depth 1 -b codon https://github.com/exaloop/llvm-project
cmake -S llvm-project/llvm -B llvm-project/build \
    -DCMAKE_BUILD_TYPE=Release \
    -DLLVM_INCLUDE_TESTS=OFF \
    -DLLVM_ENABLE_RTTI=ON \
    -DLLVM_ENABLE_ZLIB=OFF \
    -DLLVM_ENABLE_ZSTD=OFF \
    -DLLVM_ENABLE_TERMINFO=OFF \
    -DLLVM_TARGETS_TO_BUILD=all
cmake --build llvm-project/build
cmake --install llvm-project/build --prefix=llvm-project/install
```

You can also add `-DLLVM_ENABLE_PROJECTS=clang` if you do not have `clang` installed
on your system. We also recommend setting a local prefix during installation to
avoid clashes with the system LLVM.

# Build

Codon requires `libgfortran`, the parent directory of which must be specified via the
`CODON_SYSTEM_LIBRARIES` environment variable. For example, on macOS, with a
`brew`-installed `libgfortran` (obtainable via `brew install gcc`):

```bash
export CODON_SYSTEM_LIBRARIES=/opt/homebrew/opt/gcc/lib/gcc/current
```

On Linux:

```bash
export CODON_SYSTEM_LIBRARIES=/usr/lib/x86_64-linux-gnu
```

Then, the following can generally be used to build Codon. The build process
will automatically download and build several smaller dependencies.

```bash
cmake -S . -B build \
    -DCMAKE_BUILD_TYPE=Release \
    -DLLVM_DIR=$(llvm-config --cmakedir) \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_CXX_COMPILER=clang++
cmake --build build --config Release
cmake --install build --prefix=install
```

This will produce the `codon` executable in the `install/bin` directory, as
well as `codon_test` in the `build` directory which runs the test suite.
Additionally, a number of shared libraries are produced in `install/lib/codon`:

- `libcodonc`: The compiler library used by the `codon` command-line tool.
- `libcodonrt`: The runtime library used during execution.
- `libomp`: OpenMP runtime used to execute parallel code.

{% hint style="warning" %}
Make sure the `llvm-config` being used corresponds to Codon's LLVM. You can also use
`-DLLVM_DIR=llvm-project/install/lib/cmake/llvm` on the first `cmake` command if you
followed the instructions above for compiling LLVM.
{% endhint %}

# GPU support

Add `-DCODON_GPU=ON` to the first `cmake` command above to enable GPU support.

# Jupyter support

To enable Jupyter support, you will need to build the Jupyter plugin:

```bash
# Linux version:
cmake -S jupyter -B jupyter/build \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DLLVM_DIR=$(llvm-config --cmakedir) \
    -DCODON_PATH=install \
    -DOPENSSL_ROOT_DIR=$(openssl version -d | cut -d' ' -f2 | tr -d '"') \
    -DOPENSSL_CRYPTO_LIBRARY=/usr/lib64/libssl.so \
    -DXEUS_USE_DYNAMIC_UUID=ON
# n.b. OPENSSL_CRYPTO_LIBRARY might differ on your system.

# On macOS, do this instead:
OPENSSL_ROOT_DIR=/usr/local/opt/openssl cmake -S jupyter -B jupyter/build \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DLLVM_DIR=$(llvm-config --cmakedir) \
    -DCODON_PATH=install

# Then:
cmake --build jupyter/build
cmake --install jupyter/build
```