# What is `rattler-build`?
`rattler-build` is a tool to build and package software so that it can be
installed on any operating system – with any compatible package manager such as
`mamba`, `conda`, or `rattler`. We are also intending for `rattler-build` to be
used as a library to drive builds of packages from any other recipe format in
the future.
### How does `rattler-build` work?
Building of packages consists of several steps. It all begins with a
`recipe.yaml` file that specifies how the package is to be built and what the
dependencies are. From the recipe file, `rattler-build` executes several steps:
1. **Rendering**:
Parse the recipe file and evaluate conditionals, Jinja expressions, and
variables, and variants.
2. **Fetch source**:
Retrieve specified source files, such as `.tar.gz` files, `git` repositories, local paths.
Additionally, this step will apply patches that can be specified alongside the source file.
3. **Install build environments**:
Download and install dependencies into temporary "host" and "build" workspaces.
Any dependencies that are needed at build time are installed in this step.
4. **Build source**:
Execute the build script to _build/compile_ the source code and _install_ it into the host environment.
5. **Prepare package files**:
Collect _all_ files that are new in the "host" environment and apply some transformations if necessary;
specifically, we edit the `rpath` on `Linux` and `macOS` to make binaries relocatable.
6. **Package**:
Bundle all the files in a package and write out any additional metadata into the `info/index.json`, `info/about.json`, and `info/paths.json` files.
This also creates the test files that are bundled with the package.
7. **Test**:
Run any tests specified in the recipe.
The package is considered _done_ if it passes all the tests, otherwise its moved to `broken/` in the output directory.
After this process, a package is created. This package can be uploaded to somewhere like a custom [prefix.dev](https://prefix.dev) private or public channel.
### How to run `rattler-build`
Running `rattler-build` is straightforward. It can be done on the command line:
```sh
rattler-build build --recipe myrecipe/recipe.yaml
```
A custom channel that is not conda-forge (the default) can be specified like so:
```sh
rattler-build build -c robostack --recipe myrecipe/recipe.yaml
```
You can also use the `--recipe-dir` argument if you want to build all the packages in a directory:
```sh
rattler-build build --recipe-dir myrecipes/
```
### Overview of a `recipe.yaml`
A `recipe.yaml` file is separated into multiple sections and can conditionally
include or exclude sections. Recipe files also support a limited amount of
string interpolation with Jinja (specifically `minijinja` in our case).
A simple example of a recipe file for the `zlib` package would look as follows:
```yaml title="recipe.yaml"
# variables from the context section can be used in the rest of the recipe
# in jinja expressions
context:
version: 1.2.13
package:
name: zlib
version: ${{ version }}
source:
url: http://zlib.net/zlib-${{ version }}.tar.gz
sha256: b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30
build:
# build numbers can be set arbitrarily
number: 0
script:
# build script to install the package into the $PREFIX (host prefix)
- if: unix
then:
- ./configure --prefix=$PREFIX
- make -j$CPU_COUNT
- if: win
then:
- cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=%LIBRARY_PREFIX%
- ninja install
requirements:
build:
# compiler is a special function.
- ${{ compiler("c") }}
# The following two dependencies are only needed on Windows,
# and thus conditionally selected
- if: win
then:
- cmake
- ninja
- if: unix
then:
- make
```
The sections of a recipe are:
| `context` | Defines variables that can be used in the Jinja context later in the recipe (e.g. name and version are commonly interpolated in strings) |
| `package` | This section defines the name and version of the package you are currently building and will be the name of the final output |
| `source` | Defines where the source code is going to be downloaded from and checksums |
| `build` | Settings for the build and the build script |
| `requirements` | Allows the definition of build, host, run and run-constrained dependencies |