| # Rules Rust - Architecture |
| |
| In this file we describe how we think about the architecture |
| of `rules_rust`. Its goal is to help contributors orient themselves, and to |
| document code restrictions and assumptions. |
| |
| In general we try to follow the common standard defined by |
| https://docs.bazel.build/versions/master/skylark/deploying.html. |
| |
| ## //rust |
| |
| This is the core package of the rules. It contains all the core rules such as |
| `rust_binary` and `rust_library`. It also contains `rust_common`, a Starlark |
| struct providing all rules_rust APIs that one might need when writing custom |
| rules integrating with rules_rust. |
| |
| `//rust` and all its subpackages have to be standalone. Users who only need |
| the core rules should be able to ignore all other packages. |
| |
| `//rust:defs.bzl` is the file that all users of `rules_rust` will be using. |
| Everything in this file can be used (depended on) and is supported (though |
| stability is not currently guaranteed across commits, see |
| [#600](https://github.com/bazelbuild/rules_rust/issues/600)). Typically this |
| file re-exports definitions from other files, typically from `//rust/private`. |
| Also other packages in `rules_rust` should access core rules through the public |
| API only. We expect dogfooding our own APIs increases their |
| quality. |
| |
| `//rust/private` package contains code for rule implementation. This file can only |
| depend on `//rust` and its subpackages. Exceptions are Bazel's builtin packages |
| and public APIs of other rules (such as `rules_cc`). Depending on |
| `//rust/private` from packages other than `//rust` is not supported, we reserve |
| the right to change anything there and not tell anybody. |
| |
| When core rules need custom tools (such as process wrapper, launcher, test |
| runner, and so on), they should be stored in `//rust/tools` (for public tools) |
| or in `//rust/private/tools` (for private tools). These should: |
| |
| * be essential (it does not make sense to have core rules without them) |
| * have few or no third party dependencies, and their third party dependencies |
| should be checked in. |
| * be usable for cross compilation |
| * have only essential requirements on the host system (requiring that a custom |
| library is installed on the system is frowned upon) |
| |
| ## //examples (@examples) |
| |
| Examples package is actually a local repository. This repository can have |
| additional dependencies on anything that helps demonstrate an example. Non |
| trivial examples should have an accompanying README.md file. |
| |
| The goal of examples is to demonstrate usage of `rules_rust`, not to test code. |
| Use `//test` for testing. |
| |
| ## //test |
| |
| Contains unit (in `//test/unit`) and integration tests. CI configuration is |
| stored in .bazelci. |