rustc_driver and rustc_interface

rustc_driver

The rustc_driver is essentially rustc's main function. It acts as the glue for running the various phases of the compiler in the correct order, using the interface defined in the rustc_interface crate. Where possible, using rustc_driver rather than rustc_interface is recommended.

The main entry point of rustc_driver is rustc_driver::RunCompiler. This builder accepts the same command-line args as rustc as well as an implementation of Callbacks and a couple of other optional options. Callbacks is a trait that allows for custom compiler configuration, as well as allowing custom code to run after different phases of the compilation.

rustc_interface

The rustc_interface crate provides a low level API to external users for manually driving the compilation process, allowing third parties to effectively use rustc's internals as a library for analyzing a crate or for ad hoc emulating of the compiler for cases where rustc_driver is not flexible enough (i.e. rustdoc compiling code and serving output).

The main entry point of rustc_interface (rustc_interface::run_compiler) takes a configuration variable for the compiler and a closure taking a yet unresolved Compiler. run_compiler creates a Compiler from the configuration and passes it to the closure. Inside the closure you can use the Compiler to call various functions to compile a crate and get the results. You can see a minimal example of how to use rustc_interface here.

You can see an example of how to use the various functions using rustc_interface needs by looking at the rustc_driver implementation, specifically rustc_driver_impl::run_compiler (not to be confused with rustc_interface::run_compiler).

Warning: By its very nature, the internal compiler APIs are always going to be unstable. That said, we do try not to break things unnecessarily.