Project:Rust/rust-dev

= About =

The  overlay is a prototype experiment for building crates as individual crate units.

This overlay handles each crate similarly to how non-binary programming languages like Perl, Python and Ruby work, by installing (possibly augmented) copies of the extracted crate archives, constructing a local directory registry source as described in source replacement in the cargo book, while deferring actual binary compilation to the relevant target leaves, leveraging slot-operator deps for automatic rebuilds.

But its currently a very complicated mountain of work and not quite ready for prime-time.

= Repositories =


 * main repo: https://github.com/kentnl-gentoo-rust
 * kentnl's work-in-progress: https://github.com/kentfredric/rust-dev-overlay

= Common Pitfalls =

denied warnings
Many crates employ a rust attribute macro of some variation of:

#[deny(warnings)]

This makes all warnings fatal, but this is only typically visible when directly compiling or testing a crate, as cargo automatically passes  when building dependencies.

Typically, you can circumvent this issue with something like

src_test { RUSTFLAGS="${RUSTFLAGS} --cap-lints warn" rust-crate_src_test }

Which will usually turn them back into just loud warnings.

further caveats
However, due to a few rust bugs, this approach does not work. More over, some of these warnings may eventually become fatal in future rusts, so its pertinent to see them and possibly get them fixed upstream. This means in some cases one has to patch out the relevant  lines to allow tests to pass / binaries to compile. But in some cases, one may instead wish to patch out the reasons for the warnings and get it fixed upstream.

Relevant bugs:
 * capping lints does not work for rustdoc
 * rustdoc --test mis-reports origins of

apparently required non-target dependencies
Standard crates have several kinds of dependency grades:


 * with
 * specific verisions of the above
 * specific verisions of the above
 * specific verisions of the above
 * specific verisions of the above

But unfortunately, depending on aspects of the crate, all of these can be required to satisfy the  section of the crate, which invokes :

ecargo package --allow-dirty --no-metadata --no-verify

( to re-roll the patched sources back into a cargo-repository compatible format )

Removing non-essential binaries
One of the thing that causes spurious dependencies to be deemed "mandatory" are binary asepcts, namely:


 * installable executables
 * examples
 * tests ( which are compiled executables )

These can take a variety of forms:


 * sections in
 * sections in
 * Any file called,  , or
 * Any file called  under

For the most part, I've just opted to remove these binary aspects entirely, as its usually examples which trigger this, and also patch out any relevant lines in, including pruning any   that are proven to only be needed for examples.

Very few crates have actual binaries that need to be installed, and doing that while keeping dependencies slim is a bit of a mess right now, so look at this example case for now

Removing non-target platform dependencies
Many crates have target-specific dependencies using prefixes like:

[target."cfg(target_os = \"fuchsia\")".dependencies.fuchsia-zircon] version = "0.3.2" [target."cfg(target_os = \"fuchsia\")".dependencies.fuchsia-zircon-sys] version = "0.3.2" [target."cfg(unix)".dependencies.libc] version = "0.2.42" [target."cfg(windows)".dependencies.kernel32-sys] version = "0.2" [target."cfg(windows)".dependencies.miow] version = "0.2.1" [target."cfg(windows)".dependencies.winapi] version = "0.2.6"

Unfortunately, the way cargo works is it can require these crates to be present in the registry in order to build, which is presently rediculous as our dominant audience is served by  , and if these dependencies are shipped, it lends to massive dependency graphs.

Its simpler to simply cull those sections with a patch, so only dependencies which would be used on unix are included (eg: leaving  intact).

= Conventions =

Version Mapping
I've been using an approach that closely maps upstream version declarations in Cargo.toml to Gentoo compatible dependency syntax, as this allows at least some level of "version changes == slot changes == dependents rebuild automatically".

Caret versions
Cargo Specification

"Caret" versions are defined as either:


 * ( "Bare" representation )

Major or greater
When major is  or greater, ( that is,   where    ),   implies a supported range   and

In ebuilds, I translate this as:

( =dev-rust/cratename-x*:= >=dev-rust/cratename-x.y.z )

As  supports the range from , and the second part limits the minimum version.

When upstream declares it as the simpler form:



Then it can be translated adequately with simply

=dev-rust/cratename-x*:=

Where the  binds the slot ( which for all packages using , defaults to "${PV}/${PR}" ) such that when any crate with a version already in that range, gets upgraded to another version in that range, will trigger a rebuild ( but only at depth 1, because there's currently no mechanism in portage for transitive propagation of slot-op changes )

Major Minor   or greater
When upstream indicates a dependency version in the form:



( that is,  where   )

This implies a supported range from  to

This can be thought of similar to the major form, but shifted one place to the right.

So that,  translates as:

( =dev-rust/cratename-0.x*:= >=dev-rust/cratename-0.x.y )

And as with the major form, when  is 0, it can be written as simply:

=dev-rust/cratename-0.x*:=

And the implicit slot binding magic again works within the same ranges.

Major Minor
Rust's implementation of semver in regards to caret versions is that versions in the form  are not API-compatible with any other value of X.

This in effect is basically the same as, but shifted right once yet again.

Presently I don't know what happens if somebody ships something like, because I've never seen rust versions with 4 parts, but I suspect all versions of   are inter-compatible.

So I tend to write these as:

=dev-rust/cratename-0.0.x*:=

just in case there's some mechanism to ship sub-versions, ( even if they may only be gentoo-side subversions )

Bare (unprefixed) versions
Versions with no special prefixes or modifiers are just caret versions, treat them the same

Cargo Specification

Tilde versions
Cargo Specification

Tilde versions are mostly equivalent to the same dependency spec in portage, suffixed by "*".

That is, the number of specified components is the significant part, and the missing components are effectively wildcarded.


 * &rarr;
 * &rarr;
 * &rarr;

Wildcard versions
Cargo Specification

= Running Tests =

Running tests through portage with rust is especially painful to do at scale, due to many crates incurring circular dependencies in their test dependency graph.

There usually isn't much circularity between a crate and itself at depth 1, but beyond that, it gets messy, with things like  having test dependencies, which in turn, have a test dependency on.

Subsequently a global  of any kind is completely impossible.

A demonstration
Just so you can see how terrible this is, here's what portage does for  with global   (after appeasing a dozen USE changes)

[ebuild N     ] dev-rust/syn-1.0.7:1.0.7/r0::rust-dev  USE="printing proc-macro test" 0 KiB [ebuild N     ]  dev-rust/proc-macro2-1.0.5:1.0.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/unicode-xid-0.2.0:0.2.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/quote-1.0.2:1.0.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/rustversion-0.1.4:0.1.4/r0::rust-dev  USE="test" 12 KiB [ebuild N     ]    dev-rust/trybuild-1.0.17:1.0.17/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/glob-0.3.0:0.3.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/tempdir-0.3.7:0.3.7/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/rand-0.4.6:0.4.6/r0::rust-dev  USE="std test" 0 KiB [ebuild N     ]        dev-rust/libc-0.2.65:0.2.65/r0::rust-dev  USE="test -rustc-dep-of-std" 0 KiB [ebuild N     ]         dev-rust/rustc-std-workspace-core-1.0.0:1.0.0/r0::rust-dev  USE="test" 1 KiB [ebuild N     ]       dev-rust/remove_dir_all-0.5.2:0.5.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/doc-comment-0.3.1:0.3.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/lazy_static-1.4.0:1.4.0/r0::rust-dev  USE="test -spin-no-std" 0 KiB [ebuild N     ]      dev-rust/spin-0.5.2:0.5.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/serde-1.0.101:1.0.101/r0::rust-dev  USE="derive test" 0 KiB [ebuild N     ]      dev-rust/serde_derive-1.0.89-r1:1.0.89/r1::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/proc-macro2-0.4.30:0.4.30/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/unicode-xid-0.1.0:0.1.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/quote-0.6.13:0.6.13/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/syn-0.15.29-r1:0.15.29/r1::rust-dev  USE="printing proc-macro test" 0 KiB [ebuild N     ]     dev-rust/serde_json-1.0.41:1.0.41/r0::rust-dev  USE="test -indexmap" 0 KiB [ebuild N     ]      dev-rust/itoa-0.4.4:0.4.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/ryu-1.0.1:1.0.1/r0::rust-dev  USE="test -no-panic" 0 KiB [ebuild N     ]       dev-rust/num_cpus-1.10.1:1.10.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/rand-0.5.6:0.5.6/r0::rust-dev  USE="std test -log -serde1" 0 KiB [ebuild N     ]        dev-rust/rand_core-0.3.1:0.3.1/r0::rust-dev  USE="serde1 test" 0 KiB [ebuild N     ]         dev-rust/rand_core-0.4.2:0.4.2/r0::rust-dev  USE="serde1 test" 0 KiB [ebuild N     ]        dev-rust/bincode-1.2.0:1.2.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/byteorder-1.3.2:1.3.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]          dev-rust/quickcheck-0.8.5:0.8.5/r0::rust-dev  USE="regex test use-logging" 0 KiB [ebuild N     ]           dev-rust/rand-0.6.5:0.6.5/r0::rust-dev  USE="std test -serde1" 0 KiB [ebuild N     ]            dev-rust/rand_chacha-0.1.1:0.1.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/autocfg-0.1.6:0.1.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/rand_hc-0.1.0:0.1.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/rand_isaac-0.1.1:0.1.1/r0::rust-dev  USE="serde1 test" 0 KiB [ebuild N     ]            dev-rust/rand_jitter-0.1.4:0.1.4/r0::rust-dev  USE="test -log" 0 KiB [ebuild N     ]             dev-rust/log-0.4.8:0.4.8/r0::rust-dev  USE="test -serde -sval" 0 KiB [ebuild N     ]              dev-rust/cfg-if-0.1.10:0.1.10/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/sval-0.4.7:0.4.7/r0::rust-dev  USE="test -arbitrary-depth -derive -serde" 0 KiB [ebuild N     ]               dev-rust/quickcheck-0.9.0:0.9.0/r0::rust-dev  USE="regex test use-logging" 0 KiB [ebuild N     ]                dev-rust/rand-0.7.2:0.7.2/r0::rust-dev  USE="std test -log -serde1 -small_rng" 0 KiB [ebuild N     ]                 dev-rust/rand_core-0.5.1:0.5.1/r0::rust-dev  USE="serde1 std test" 0 KiB [ebuild N     ]                  dev-rust/getrandom-0.1.13:0.1.13/r0::rust-dev  USE="test -log" 0 KiB [ebuild N     ]                 dev-rust/rand_chacha-0.2.1:0.2.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                  dev-rust/c2-chacha-0.2.3:0.2.3/r0::rust-dev  USE="rustcrypto-api test" 0 KiB [ebuild N     ]                   dev-rust/ppv-lite86-0.2.6:0.2.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                   dev-rust/stream-cipher-0.3.2:0.3.2/r0::rust-dev  USE="test -dev" 0 KiB [ebuild N     ]                    dev-rust/generic-array-0.12.3:0.12.3/r0::rust-dev  USE="test -serde" 0 KiB [ebuild N     ]                     dev-rust/typenum-1.11.2:1.11.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                    dev-rust/blobby-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                   dev-rust/hex-literal-0.2.1:0.2.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                    dev-rust/hex-literal-impl-0.2.1:0.2.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                     dev-rust/proc-macro-hack-0.5.11:0.5.11/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]                 dev-rust/rand_hc-0.2.0:0.2.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/rand_pcg-0.2.1:0.2.1/r0::rust-dev  USE="test -serde1" 0 KiB [ebuild N     ]                dev-rust/env_logger-0.6.2:0.6.2/r0::rust-dev  USE="atty humantime regex termcolor test" 0 KiB [ebuild N     ]                 dev-rust/atty-0.2.13:0.2.13/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/humantime-1.3.0:1.3.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                  dev-rust/quick-error-1.2.2:1.2.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                  dev-rust/time-0.1.42:0.1.42/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]                 dev-rust/regex-1.3.1:1.3.1/r0::rust-dev  USE="perf-cache perf-literal test" 0 KiB [ebuild N     ]                  dev-rust/regex-syntax-0.6.12:0.6.12/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                  dev-rust/aho-corasick-0.7.6:0.7.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                   dev-rust/memchr-2.2.1:2.2.1/r0::rust-dev  USE="test -libc" 0 KiB [ebuild N     ]                  dev-rust/thread_local-0.3.6:0.3.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/termcolor-1.0.5:1.0.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/smallvec-0.6.10:0.6.10/r0::rust-dev  USE="test -serde" 0 KiB [ebuild N     ]               dev-rust/sval_derive-0.4.7:0.4.7/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/serde_test-1.0.102:1.0.102/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/rand_pcg-0.1.2:0.1.2/r0::rust-dev  USE="test -serde1" 0 KiB [ebuild N     ]            dev-rust/rand_xorshift-0.1.1:0.1.1/r0::rust-dev  USE="serde1 test" 0 KiB [ebuild N     ]            dev-rust/rand_os-0.1.3:0.1.3/r0::rust-dev  USE="test -log" 0 KiB [ebuild N     ]            dev-rust/average-0.9.4:0.9.4/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]             dev-rust/conv-0.3.3:0.3.3/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]              dev-rust/custom_derive-0.1.7:0.1.7/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/rustc-serialize-0.3.24:0.3.24/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/rand-0.3.23:0.3.23/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/float-ord-0.2.0:0.2.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/num-integer-0.1.41:0.1.41/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/num-traits-0.2.8:0.2.8/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/rand_xoshiro-0.1.0:0.1.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/serde_bytes-0.11.2:0.11.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/no-panic-0.1.11:0.1.11/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]      dev-rust/indexmap-1.3.0:1.3.0/r0::rust-dev  USE="-rayon -serde -test" 0 KiB [ebuild N     ]     dev-rust/toml-0.5.3:0.5.3/r0::rust-dev  USE="test -preserve-order" 0 KiB [ebuild N     ]      dev-rust/linked-hash-map-0.5.2:0.5.2/r0::rust-dev  USE="test -heapsize-impl -serde-impl" 0 KiB [ebuild N     ]       dev-rust/heapsize-0.4.2:0.4.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]  dev-rust/insta-0.11.0:0.11.0/r0::rust-dev  USE="test -redactions -ron" 0 KiB [ebuild N     ]   dev-rust/console-0.8.0:0.8.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/clicolors-control-1.0.1:1.0.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/unicode-width-0.1.6:0.1.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/termios-0.3.1:0.3.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/difference-2.0.0:2.0.0/r0::rust-dev  USE="test -bin" 0 KiB [ebuild N     ]    dev-rust/getopts-0.2.21:0.2.21/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/quickcheck-0.4.1:0.4.1/r0::rust-dev  USE="test use-logging" 0 KiB [ebuild N     ]     dev-rust/env_logger-0.3.5:0.3.5/r0::rust-dev  USE="regex test" 0 KiB [ebuild N     ]      dev-rust/log-0.3.9:0.3.9/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/regex-0.1.80:0.1.80/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/aho-corasick-0.5.3:0.5.3/r0::rust-dev  USE="test -dot" 0 KiB [ebuild N     ]        dev-rust/memchr-0.1.11:0.1.11/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/quickcheck-0.2.27:0.2.27/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/thread_local-0.2.7:0.2.7/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/thread-id-2.0.0:2.0.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/kernel32-sys-0.2.2:0.2.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]          dev-rust/winapi-0.2.8:0.2.8/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]          dev-rust/winapi-build-0.1.1:0.1.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/regex-syntax-0.3.9:0.3.9/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/utf8-ranges-0.1.3:0.1.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/lazy_static-0.1.16:0.1.16/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/term-0.2.14:0.2.14/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/serde_yaml-0.8.11:0.8.11/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/dtoa-0.4.4:0.4.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/yaml-rust-0.4.3:0.4.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/quickcheck-0.7.2:0.7.2/r0::rust-dev  USE="regex test use-logging" 0 KiB [ebuild N     ]      dev-rust/rand_core-0.2.2:0.2.2/r0::rust-dev  USE="test -serde1" 0 KiB [ebuild N     ]      dev-rust/env_logger-0.5.13:0.5.13/r0::rust-dev  USE="regex test" 0 KiB [ebuild N     ]    dev-rust/unindent-0.1.5:0.1.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/uuid-0.7.4:0.7.4/r0::rust-dev  USE="serde test v4 -slog -u128 -v3 -v5" 0 KiB [ebuild N     ]    dev-rust/md5-0.6.1:0.6.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/sha1-0.6.0:0.6.0/r0::rust-dev  USE="-serde -test" 0 KiB [ebuild N     ]    dev-rust/slog-2.5.2:2.5.2/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]   dev-rust/pest-2.1.2:2.1.2/r0::rust-dev  USE="test -pretty-print" 0 KiB [ebuild N     ]    dev-rust/ucd-trie-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/pest_derive-2.1.0:2.1.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/pest_generator-2.1.1:2.1.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/pest_meta-2.1.2:2.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/maplit-1.0.2:1.0.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/sha_1-0.8.1:0.8.1/r0::rust-dev  USE="test -asm" 0 KiB [ebuild N     ]       dev-rust/block-buffer-0.7.3:0.7.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/block-padding-0.1.4:0.1.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/byte-tools-0.3.1:0.3.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/digest-0.8.1:0.8.1/r0::rust-dev  USE="dev test" 0 KiB [ebuild N     ]       dev-rust/fake-simd-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/opaque-debug-0.2.3:0.2.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/sha1-asm-0.4.3:0.4.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/cc-1.0.46:1.0.46/r0::rust-dev  USE="-bin -parallel -test" 0 KiB [ebuild N     ]       dev-rust/hex-literal-0.1.4:0.1.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/hex-literal-impl-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/proc-macro-hack-0.4.2:0.4.2/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]          dev-rust/proc-macro-hack-impl-0.4.2:0.4.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/ron-0.5.1:0.5.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/base64-0.10.1:0.10.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/bitflags-1.2.1:1.2.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/serde_bytes-0.10.4:0.10.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/bincode-0.8.0:0.8.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/num-traits-0.1.43:0.1.43/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]  dev-rust/rayon-1.2.0:1.2.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/crossbeam-deque-0.7.1:0.7.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/crossbeam-epoch-0.7.2:0.7.2/r0::rust-dev  USE="std test" 0 KiB [ebuild N     ]     dev-rust/arrayvec-0.4.12:0.4.12/r0::rust-dev  USE="test -serde-1" 0 KiB [ebuild N     ]      dev-rust/nodrop-0.1.14:0.1.14/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/matches-0.1.8:0.1.8/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]     dev-rust/crossbeam-utils-0.6.6:0.6.6/r0::rust-dev  USE="std test" 0 KiB [ebuild N     ]     dev-rust/memoffset-0.5.1:0.5.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]      dev-rust/rustc_version-0.2.3:0.2.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]       dev-rust/semver-0.9.0:0.9.0/r0::rust-dev  USE="test -ci" 0 KiB [ebuild N     ]        dev-rust/semver-parser-0.7.0:0.7.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]        dev-rust/crates-index-0.5.1:0.5.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/git2-0.6.11:0.6.11/r0::rust-dev  USE="curl https ssh test" 0 KiB [ebuild N     ]          dev-rust/bitflags-0.9.1:0.9.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]          dev-rust/libgit2-sys-0.6.19:0.6.19/r0::rust-dev  USE="curl https ssh test" 0 KiB [ebuild N     ]           dev-rust/libz-sys-1.0.25:1.0.25/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/pkg-config-0.3.16:0.3.16/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/cmake-0.1.42:0.1.42/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/curl-sys-0.4.23:0.4.23/r0::rust-dev  USE="ssl test -http2 -mesalink -static-ssl" 0 KiB [ebuild N     ]            dev-rust/openssl-sys-0.9.52:0.9.52/r0::rust-dev  USE="test vendored" 0 KiB [ebuild N     ]             dev-rust/openssl-src-111.6.0:111.6.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/libnghttp2-sys-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/mesalink-1.1.0:1.1.0/r0::rust-dev  USE="test -jemalloc-allocator" 0 KiB [ebuild N     ]             dev-rust/enum_to_u8_slice_derive-0.1.1:0.1.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/quote-0.3.15:0.3.15/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/syn-0.11.11:0.11.11/r0::rust-dev  USE="parsing printing test" 0 KiB [ebuild N     ]               dev-rust/unicode-xid-0.0.4:0.0.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/synom-0.11.3:0.11.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/parking_lot-0.9.0:0.9.0/r0::rust-dev  USE="test -deadlock-detection -owning-ref -serde" 0 KiB [ebuild N     ]              dev-rust/lock_api-0.3.1:0.3.1/r0::rust-dev  USE="owning-ref serde test" 0 KiB [ebuild N     ]               dev-rust/scopeguard-1.0.0:1.0.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/owning_ref-0.4.0:0.4.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/stable_deref_trait-1.1.1:1.1.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/parking_lot_core-0.6.2:0.6.2/r0::rust-dev  USE="deadlock-detection test" 0 KiB [ebuild N     ]               dev-rust/petgraph-0.4.13:0.4.13/r0::rust-dev  USE="graphmap test -all -serde-1" 0 KiB [ebuild N     ]                dev-rust/fixedbitset-0.1.9:0.1.9/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/ordermap-0.3.5:0.3.5/r0::rust-dev  USE="test -serde-1" 0 KiB [ebuild N     ]                 dev-rust/fnv-1.0.6:1.0.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/itertools-0.7.11:0.7.11/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]                  dev-rust/either-1.5.3:1.5.3/r0::rust-dev  USE="test -serde" 0 KiB [ebuild N     ]                 dev-rust/quickcheck-0.6.2:0.6.2/r0::rust-dev  USE="regex test use-logging" 0 KiB [ebuild N     ]                dev-rust/defmac-0.1.3:0.1.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/odds-0.2.26:0.2.26/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]               dev-rust/thread-id-3.3.0:3.3.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/backtrace-0.3.38:0.3.38/r0::rust-dev  USE="libbacktrace test -cpp-demangle -gimli-symbolize -serialize-rustc -serialize-serde" 0 KiB [ebuild N     ]                dev-rust/rustc-demangle-0.1.16:0.1.16/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/backtrace-sys-0.1.31:0.1.31/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/cpp_demangle-0.2.13:0.2.13/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]                dev-rust/addr2line-0.10.0:0.10.0/r0::rust-dev  USE="cpp-demangle rustc-demangle std-object -test" 0 KiB [ebuild N     ]                 dev-rust/fallible-iterator-0.2.0:0.2.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/gimli-0.19.0:0.19.0/r0::rust-dev  USE="write -test" 0 KiB [ebuild N     ]                 dev-rust/intervaltree-0.2.4:0.2.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/lazycell-1.2.1:1.2.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                 dev-rust/object-0.12.0:0.12.0/r0::rust-dev  USE="compression test wasm" 0 KiB [ebuild N     ]                  dev-rust/goblin-0.0.22:0.0.22/r0::rust-dev  USE="alloc test" 0 KiB [ebuild N     ]                   dev-rust/scroll-0.9.2:0.9.2/r0::rust-dev  USE="derive test" 0 KiB [ebuild N     ]                    dev-rust/scroll_derive-0.9.5:0.9.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                   dev-rust/plain-0.2.3:0.2.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                  dev-rust/flate2-1.0.13:1.0.13/r0::rust-dev  USE="rust-backend -test" 0 KiB [ebuild N     ]                   dev-rust/crc32fast-1.2.0:1.2.0/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]                   dev-rust/futures-0.1.29:0.1.29/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                   dev-rust/miniz_oxide-0.3.5:0.3.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                    dev-rust/adler32-1.0.4:1.0.4/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                  dev-rust/parity-wasm-0.38.0:0.38.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/findshlibs-0.5.0:0.5.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/goblin-0.0.24:0.0.24/r0::rust-dev  USE="alloc test" 0 KiB [ebuild N     ]                dev-rust/memmap-0.7.0:0.7.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/ring-0.16.9:0.16.9/r0::rust-dev  USE="dev-urandom-fallback test" 0 KiB [ebuild N     ]              dev-rust/untrusted-0.7.0:0.7.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/rustls-0.16.0:0.16.0/r0::rust-dev  USE="logging test" 0 KiB [ebuild N     ]              dev-rust/sct-0.6.0:0.6.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/webpki-0.21.0:0.21.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/base64-0.9.3:0.9.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/safemem-0.3.3:0.3.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/tempfile-3.1.0:3.1.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/webpki-roots-0.17.0:0.17.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/walkdir-2.2.9:2.2.9/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/same-file-1.0.5:1.0.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/jemallocator-0.3.2:0.3.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/jemalloc-sys-0.3.2:0.3.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/fs_extra-1.1.0:1.1.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]              dev-rust/jemalloc-ctl-0.3.3:0.3.3/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]               dev-rust/paste-0.1.6:0.1.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]                dev-rust/paste-impl-0.1.6:0.1.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/libssh2-sys-0.2.13:0.2.13/r0::rust-dev  USE="test -vendored-openssl" 0 KiB [ebuild N     ]          dev-rust/url-1.7.2:1.7.2/r0::rust-dev  USE="test -heap-size -query-encoding -rustc-serialize -serde" 0 KiB [ebuild N     ]           dev-rust/idna-0.1.5:0.1.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/unicode-bidi-0.3.4:0.3.4/r0::rust-dev  USE="test -with-serde" 0 KiB [ebuild N     ]            dev-rust/unicode-normalization-0.1.8:0.1.8/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/rustc-test-0.3.0:0.3.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]             dev-rust/term-0.4.6:0.4.6/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/percent-encoding-1.0.1:1.0.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/encoding-0.2.33:0.2.33/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/encoding-index-singlebyte-1.20141219.5:1.20141219.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/encoding-index-korean-1.20141219.5:1.20141219.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/encoding-index-japanese-1.20141219.5:1.20141219.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/encoding-index-simpchinese-1.20141219.5:1.20141219.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/encoding-index-tradchinese-1.20141219.5:1.20141219.5/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/serde-0.8.23:0.8.23/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]           dev-rust/serde_json-0.8.6:0.8.6/r0::rust-dev  USE="-test" 0 KiB [ebuild N     ]            dev-rust/itoa-0.1.1:0.1.1/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]            dev-rust/dtoa-0.2.2:0.2.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]          dev-rust/openssl-probe-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]         dev-rust/glob-0.2.11:0.2.11/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/rayon-core-1.6.0:1.6.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/crossbeam-queue-0.1.2:0.1.2/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]    dev-rust/scoped-tls-1.0.0:1.0.0/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]  dev-rust/ref-cast-0.2.7:0.2.7/r0::rust-dev  USE="test" 0 KiB [ebuild N     ]   dev-rust/ref-cast-impl-0.2.7:0.2.7/r0::rust-dev  USE="test" 0 KiB

Total: 256 packages (256 new), Size of downloads: 13 KiB

* Error: circular dependencies:

(dev-rust/quote-1.0.2:1.0.2/r0::rust-dev, ebuild scheduled for merge) depends on (dev-rust/proc-macro2-1.0.5:1.0.5/r0::rust-dev, ebuild scheduled for merge) (buildtime_slot_op) (dev-rust/quote-1.0.2:1.0.2/r0::rust-dev, ebuild scheduled for merge) (buildtime_slot_op)

It might be possible to break this cycle by applying the following change: - dev-rust/proc-macro2-1.0.5 (Change USE: -test)

Cure
Instead, one needs to, for each crate one wants to test, invoke portage as follows.


 * 1) Install the crate with
 * 2) Install the crates test dependencies using
 * 3) Run the crates tests with

This process is what I do when packaging rust crates, in addition to invoking a command to uninstall all crates prior to step 1, and each stage above must complete successfully in order to commit it.

Other testers and maintainers really aught to do the same, and it may help to even write a small script to simplify this, as you'll likely need it a lot

It is also very beneficial to include  in steps 1 and 2, regardless of how many cores you actually have, as the "compile" ( which is just an unpackage, patch, repackage, roll out to dir) for rust crates is incredibly IO bound, and running it quietly allows the graph to be installed in parallel, greatly reducing install time.

Downsides
The biggest downsides of this 3-pronged approach is it does mean that:


 * Only the top level crate gets tested
 * Lower level crates must be installed without testing in order to simply test the top level crate
 * Lots of work must be done fussing with keywords to make it install

But there's currently literally no alternative. Please pursue