Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does Rust's lack of incremental compilation mean, exactly?

This question was asked before Rust officially supported incremental compilation. Rust 1.24.0 and later enable incremental compilation by default for development (debug) builds.

I'm an outsider trying to see if Rust is appropriate for my projects.

I've read that Rust lacks incremental compilation (beta features notwithstanding).

  1. Is this similar to having everything be implemented in the headers in C++ (like in much of Boost)?

  2. If the above is correct, does this limit Rust to rather small projects with small dependencies? (If, say, Qt or KDE were header-only libraries, then programs using them would be extremely painful to develop, since you'd effectively recompile Qt/KDE every time you want to compile your own code.)

like image 588
MWB Avatar asked Feb 04 '23 08:02

MWB


1 Answers

In C and C++, a compilation unit is usually a source file and all the header files it transitively includes. An application or library is usually comprised of multiple compilation units that are linked together. An application or library can additionally be linked with other libraries. This means that changing a source file requires recompiling that source file only and then relinking, changing an external library only requires relinking, but changing a header file (whether it's part of the project or external; the compiler can't tell the difference) requires recompiling all source files that use it and then relinking.

In Rust, the crate is the compilation unit. (A crate can be an application or a library.) Rust doesn't use header files; instead, the equivalent information is stored as metadata in the compiled crates (which is faster to parse, and has the same effect as precompiled headers in C/C++). A crate can additionally be linked with other crates. This means that changing any of the source files for a crate requires recompiling the whole crate, and changing a crate requires recompiling all crates that depend on it (currently, this means recompiling from source, even if the API happens to not have changed).

To answer your questions, no, Rust doesn't recompile all dependencies every time you recompile your project; quite the opposite in fact.

Incremental compilation in Rust is about reusing the work done in previous compilations of a crate to speed up compilation times. For example, if you change a module and it doesn't affect the other modules, the compiler would be able to reuse the data that was generated when the other modules were compiled last time. The lack of incremental compilation is usually only a problem with large or complex crates (e.g. those who make heavy use of macros).

like image 177
Francis Gagné Avatar answered Feb 08 '23 16:02

Francis Gagné