[tor-bugs] #25639 [Core Tor/Tor]: think about Rust crate boundaries

Tor Bug Tracker & Wiki blackhole at torproject.org
Tue Apr 3 01:25:05 UTC 2018


#25639: think about Rust crate boundaries
--------------------------+----------------------------------
 Reporter:  Hello71       |          Owner:  Hello71
     Type:  enhancement   |         Status:  assigned
 Priority:  High          |      Milestone:
Component:  Core Tor/Tor  |        Version:  Tor: unspecified
 Severity:  Normal        |     Resolution:
 Keywords:  rust          |  Actual Points:
Parent ID:                |         Points:
 Reviewer:                |        Sponsor:
--------------------------+----------------------------------

Comment (by Hello71):

 yeah, I found https://github.com/rust-lang/rfcs/pull/2318. I haven't gone
 through the comments yet, but:

 I have heard that Rust people want it to be really easy to use both Rust
 and C together in the same project, at least during a (potentially
 extended) migration. For projects that actually test though (hopefully all
 of them!), interlanguage testing needs to be really solid. In particular,
 the majority of C projects (i.e. the ones that are medium-sized like Tor
 and not huge like Gecko) have semantic rather than strictly-defined module
 separation. Tor is certainly modular, but (as far as I know) they have
 many cyclic dependencies that get worked out by the magic of static
 archives. This doesn't work in the following case though (AFAIK): suppose
 there are Rust crates A and B and C blob C. A and B don't depend on each
 other, but C depends on both. We want to test A. If we just add C to link,
 it doesn't work, because C has a hidden dependency on B. But if we add our
 Rust blob (we call it `tor_rust`), then we get multiple definition errors.
 Maybe I'm doing it wrong, but I think this is a key use case for Rust
 (gradual migration from full-C/C++ projects), so I feel like this should
 be really easy and not require that I re-architect all my C module
 boundaries or give up and just write tests in C.

 > Applying this to Tor, the way to make it work would be to have a single
 toplevel crate, which optionally includes some testing crates which export
 test symbols that get called from a C test file for whatever framework
 y'all use. This isn't great; I'm hoping in the future cargo test will be
 better at this (we're working on custom test frameworks which should make
 this easier).

 I considered doing this; I assume this involves some sort of custom macro
 or (minor) boilerplate though, and either way we'd have to write or find a
 non-"standard" test framework, when we really just want to link in a few
 extra libraries. Really I was hoping that I could just do `rustc --crate-
 type staticlib --test` and have it actually work (the output would have a
 `main` or `_start` or whatever Rust does), and just link that normally.
 That would require `--print native-static-libs` to work through Cargo
 though.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/25639#comment:10>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list