blob: 1228e4a364a8ef5347311d1969d723f5f06d0b14 [file] [log] [blame] [view]
OpenTitan `//third_party`
==========
OpenTitan depends on a number of third party components. This directory consists of:
- Bazel files describing how to acquire them from the Internet, and incorporate them
into the OpenTitan workspace.
- Glue code for plugging dependencies into first-party software.
Every dependency lives in a subdirectory; each subdirectory consists of at least three
files:
1. A (usually empty) `BUILD` file to specify that file as a Bazel package.
2. A `repos.bzl`, which exports a macro called `blah_repos()` that can be called in the
`WORKSPACE` to declare the remote repositories required for the dependency.
3. A `deps.bzl`, which exports a macro called `blah_deps()` that uses the repositories
created by `blah_repos()` to set up any other requirements of the dependency. It must
be called in the `WORKSPACE` file after `blah_repos()` is called. Some dependencies
can skip this step.
Thus, for each third party dependency, a stanza like the following should appear in the
`WORKSPACE`:
```bazel
load("//third_party/<dep>/repos.bzl", "<dep>_repos")
<dep>_repos()
load("//third_party/<dep>/deps.bzl", "<dep>_deps")
<dep>_deps()
```
In some cases, the `BUILD` file for the dependency will declare rules for tests, such as
`rv-compliance`. As a rule of thumb, if a dependency is being pulled in specifically for
some kind of test suite, the test rules should live in `//third_party`, where they can depend
on other parts of the tree.
## Third-party Silicon IP
Currently, silicon uses a separate vendoring mechanism: `util/vendor.py`. There are no
concrete plans to migrate off of this script for hardware. This script should not be
used for new software dependencies; instead, use the `//third_party` directory and Bazel
repositories instead.