77 lines
2.9 KiB
Text
77 lines
2.9 KiB
Text
|
|
= Usage
|
||
|
|
:page-pagination: next
|
||
|
|
|
||
|
|
Using `zilch-cli-rust`, you can compile Rust code incrementally crate-by-crate:
|
||
|
|
|
||
|
|
[,console]
|
||
|
|
----
|
||
|
|
$ git clone https://github.com/BurntSushi/ripgrep
|
||
|
|
|
||
|
|
$ zilch-cli-rust --crate-dir ripgrep/ <1>
|
||
|
|
…
|
||
|
|
ripgrep rg bin /nix/store/pxvqbn65lv2f4r3x1cszv5pr5l5mjwh9-rustc-bin-rg-link
|
||
|
|
grep grep lib not a binary
|
||
|
|
grep-cli grep_cli lib not a binary
|
||
|
|
globset globset lib not a binary
|
||
|
|
…
|
||
|
|
|
||
|
|
$ zilch-cli-rust --crate-dir ripgrep/ rg <2>
|
||
|
|
…
|
||
|
|
ripgrep rg bin /nix/store/pxvqbn65lv2f4r3x1cszv5pr5l5mjwh9-rustc-bin-rg-link
|
||
|
|
----
|
||
|
|
<1> Building all binary targets in a crate
|
||
|
|
<2> Building a specifically targeted target in a crate
|
||
|
|
|
||
|
|
Right now, the daemon has to be able to build `x86_64-linux` derivations, and
|
||
|
|
only the `x86_64-unknown-linux-gnu` Rust target is supported.
|
||
|
|
|
||
|
|
== Replacing dependencies
|
||
|
|
As part of Zilch, it's also possible to quickly build a crate with one of its
|
||
|
|
(transitive) dependencies replaced:
|
||
|
|
|
||
|
|
[,console]
|
||
|
|
----
|
||
|
|
$ git clone https://github.com/BurntSushi/bstr
|
||
|
|
$ zilch-cli-rust --crate-dir ripgrep/ --replace bstr/ rg
|
||
|
|
…
|
||
|
|
ripgrep rg bin /nix/store/6rf4r69sp8ijg2xrdglbnx8smphfg6fr-rustc-bin-rg-link
|
||
|
|
----
|
||
|
|
|
||
|
|
After editing a file any of the replaced dependencies, if this crate is used in
|
||
|
|
the final build, Zilch will apply early-cutoff where possible.
|
||
|
|
|
||
|
|
[IMPORTANT]
|
||
|
|
.Limitations in dependency selection
|
||
|
|
====
|
||
|
|
Zilch will never select dependencies that aren't found in the lockfile of the
|
||
|
|
primary crate. If there is no lockfile, or the dependencies have changed, it is
|
||
|
|
necessary to manually run `cargo generate-lockfile` to make sure all
|
||
|
|
dependencies can be found. See xref:./library.adoc#limits[The resolver's limitations] for more info.
|
||
|
|
====
|
||
|
|
|
||
|
|
== Build script overrides
|
||
|
|
Many Rust projects use build scripts that require external dependencies. To add
|
||
|
|
support for these, you can use a JSON file.
|
||
|
|
|
||
|
|
This file consists of a JSON object, where the key is the name of a crate, and
|
||
|
|
the value is an object with the following keys:
|
||
|
|
|
||
|
|
- `buildScript`: Overrides to apply when executing the build script for this
|
||
|
|
crate
|
||
|
|
- `buildScriptDependency`: Overrides to apply when executing the build script
|
||
|
|
for any crate that depends on this crate.
|
||
|
|
- `rustc`: Environment variables to add to the `rustc` invocation for this
|
||
|
|
crate.
|
||
|
|
|
||
|
|
Each of these keys contains a map of key to a Nix expression evaluated inside
|
||
|
|
`nixpkgs`. If multiple overrides apply to a single crate, each value is
|
||
|
|
concatenated, separated with a `:`. Zilch's runner supports `_zilch_pkgconfig`
|
||
|
|
as an environment variable as special case to add both `lib/pkgconfig` and
|
||
|
|
`share/pkgconfig`, as well as the paths inside all the `propagated-build-inputs`
|
||
|
|
of each store path, making `pkg-config` work. See
|
||
|
|
https://puck.moe/git/zilch/tree/cli/overrides.json[the default overrides] for
|
||
|
|
more examples on real-life crates.
|
||
|
|
|
||
|
|
If this mechanism is not expressive enough, it's possible to use Zilch's Rust
|
||
|
|
support directly, as a Scheme library.
|