Re: A Demo of rust-in-base
- Reply: Alan Somers : "Re: A Demo of rust-in-base"
- In reply to: Alan Somers : "A Demo of rust-in-base"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 29 Aug 2024 20:21:20 UTC
Hey Alan et al, I apologize for the silence on my end. It has been a busier two months than anticipated. In that time, I've been entertaining some thoughts on Rust in base support. ${LIFE} is starting to calm down again, and I do believe I'll be able to start the research in time in September. I will be splitting my free time between this and studying for my OSCP cert. So, to those thoughts, in list form (in no particular order): 1. Use of Rust compiler toolchain support will be for userland components in an opt-in fashion. Meaning, all userland components written in Rust will be optional. 2. It does not make sense to perform a vendor import of the Rust compiler toolchain and standard libraries. All Rust code in the src tree must be built from an external toolchain. 3. I believe the notion of an external toolchain could be abstracted such that we can support any optional userland component written in a language supported by that external toolchain. This would imply that other alternative languages could be supported with minimal work (Zig, TypeScript, Python, Java, etc.) 4. We could provide auto-detection mechanisms for determining which external toolchains are available, their language support, etc. The initial proof-of-concept would likely be limited to Rust to save on time and complexity. 5. As the work matures, and perhaps as a requisite for eventual inclusion, we could land support for more than Rust. This might be a step too far, but hey, it's one of the thoughts I had. 6. So all of this wrapped up means that: A. This is NOT a call to rewrite everything in Rust. This work will only permit NEW, OPTIONAL components to be written. B. Other languages/toolchains/ecosystems could be supported, not just Rust. C. Initial focus is on userland components. Rust in the kernel is out of scope for this initial proof-of-concept. D. I would like to see Rust in the kernel. That would be a good next area of focus once userland support reaches some level of maturity. My first goal will be to get a better understanding of src.git/Makefile and src.git/Makefile.inc1. As I study that, I'll also study your work, Alan. I really appreciate the time you have taken. I might reach out to you and Warner directly for further questions. Thanks, -- Shawn Webb Cofounder / Security Engineer HardenedBSD Tor-ified Signal: +1 303-901-1600 / shawn_webb_opsec.50 https://git.hardenedbsd.org/hardenedbsd/pubkeys/-/raw/master/Shawn_Webb/03A4CBEBB82EA5A67D9F3853FF2E67A277F8E1FA.pub.asc On Sun, Aug 04, 2024 at 11:55:26AM UTC, Alan Somers wrote: > Due to all of the recent discussion of using Rust for code in the > FreeBSD base, I've put together a demo of what it might look like. It > demonstrates: > > * Interspersing Rust crates through the tree (usr.bin/nfs-exporter, > cddl/usr.bin/ztop, etc) rather than in some special directory. > * Build integration for all Rust crates. You can build them all with > a single "cargo build" command from the top level, and test them all > with a single "cargo test". > * Wholly new programs written from scratch in Rust (ztop plus three > Prometheus exporters) > * Old programs rewritten in Rust with substantial new features (gstat and fsx) > * Libs (freebsd-libgeom and freebsd-libgeom-sys) > * Commits that reconcile the dependencies of multiple crates, so as to > minimize duplicate dependency versions (5764fb383d4 and 1edf2e19e50) > * Vendoring all dependencies, direct and transitive, to ensure > internet-independent and reproducible builds (37ef9ffb6a6). This > process is automated and requires almost no manual effort. Note: > don't panic if you look in the "vendor" directory and see a bunch of > crates with "windows" in the name. They're all just empty stubs. > * All Rust object files get stored in the "target" directory rather > than /usr/obj. Today, if you want them to be stored in /usr/obj the > best way is to use a symlink, though there's WIP to add > MAKEOBJDIRPREFIX-like functionality to Cargo. > > It does NOT demonstrate: > > * Integrating the Rust build system with Make. Warner has some ideas > about how to do that. > * Pulling rustc into contrib. This tree requires an external Rust toolchain. > * Building any cdylib libraries with Rust. That's useful if you want > a C program to call a Rust library, but I don't have any good examples > for it. > * kernel modules. As already discussed, those are hard. > * Any Rust crates that involve private APIs, like CTL stuff. Those > are among the most tantalizing programs to move from ports to base, > but nobody's written any yet, because Rust-in-base doesn't exist yet. > > Also, I want to address a question that's popped up a few times: > backwards-compatibility. There is a fear that Rust code needs to be > updated for each new toolchain release. But that's not true. It > hasn't been true for most crates since Rust 1.0 was released about a > decade ago. A few exotic crates required "nightly" features after > that, but they are very few in number these days, and none of them are > included in this branch's vendored sources. What Rust _does_ do is it > releases a new toolchain about every six weeks. Each new release > typically includes a few new features in the standard library and they > often add more compiler warnings, too. Sometimes they include wholly > new compiler features, but they are _always_ backwards compatible with > existing syntax. Roughly every three years, Rust publishes a new > "Edition". Rust Editions are very similar to C++ versions. i.e. Rust > 2018 is to Rust 2021 as C++14 is to C++17. New editions can include > backwards-incompatible syntax changes, but each crate always knows > which Edition it uses. Crates of different Editions can be linked > together in the same build. This branch, for example, contains crates > using Editions 2015, 2018, and 2021. > > If you have any questions about what Rust in Base would look like, > please examine this branch. And if you've never used Rust before, I > highly encourage you to try it. It really is the best new > systems-program language for decades. IMHO, it's the only one that's > a compelling replacement for C++ in all new applications, and C in > most. > > https://github.com/asomers/freebsd-src/tree/rust-in-base-demo >