The Clang Universal Driver Project

Clang is inherently a cross compiler, in that it is always capable of building code for targets which are a different architecture or even operating system from the one running the compiler. However, actually cross compiling in practice involves much more than just generating the right assembly code for a target, it also requires having an appropriate tool chain (assemblers, linkers), access to header files and libraries for the target, and many other details (for example, the calling convention or whether software floating point is in use). Traditionally, compilers and development environments provide little assistance with this process, so users do not have easy access to the powerful underlying cross-compilation abilities of clang.

We would like to solve this problem by defining a new model for how cross compilation is done, based on the idea of a universal driver. The key point of this model is that the user would always access the compiler through a single entry point (e.g., /usr/bin/cc) and provide an argument specifying the configuration they would like to target. Under the hood this entry point (the universal driver) would have access to all the information that the driver, compiler, and other tools need to build applications for that target.

This is a large and open-ended project. It's eventual success depends not just on implementing the model, but also on getting buy-in from compiler developers, operating system distribution vendors and the development community at large. Our plan is to begin by defining a clear list of the problems we want to solve and a proposed implementation (from the user perspective).

This project is in the very early (i.e., thought experiment) stages of development. Stay tuned for more information, and of course, patches welcome!

See also PR4127.

Existing Solutions and Related Work