|  | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | 
|  | "http://www.w3.org/TR/html4/strict.dtd"> | 
|  | <html> | 
|  | <head> | 
|  | <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | 
|  | <title>Clang - Universal Driver</title> | 
|  | <link type="text/css" rel="stylesheet" href="menu.css"> | 
|  | <link type="text/css" rel="stylesheet" href="content.css"> | 
|  | </head> | 
|  | <body> | 
|  |  | 
|  | <!--#include virtual="menu.html.incl"--> | 
|  |  | 
|  | <div id="content"> | 
|  |  | 
|  | <h1>The Clang Universal Driver Project</h1> | 
|  |  | 
|  | <p>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.</p> | 
|  |  | 
|  | <p>We would like to solve this problem by defining a new model for how cross | 
|  | compilation is done, based on the idea of a <i>universal driver</i>. The key | 
|  | point of this model is that the user would always access the compiler through a | 
|  | single entry point (e.g., <tt>/usr/bin/cc</tt>) and provide an argument | 
|  | specifying the <i>configuration</i> 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.</p> | 
|  |  | 
|  | <p>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).</p> | 
|  |  | 
|  | <p>This project is in the very early (i.e., thought experiment) stages of | 
|  | development. Stay tuned for more information, and of course, patches | 
|  | welcome!</p> | 
|  |  | 
|  | <p>See also <a href="https://llvm.org/PR4127">PR4127</a>.</p> | 
|  |  | 
|  | <h2>Existing Solutions and Related Work</h2> | 
|  |  | 
|  | <ul> | 
|  | <li>gcc's command line arguments <tt>-V</tt>, <tt>-B</tt>, <tt>-b</tt> are | 
|  | generic but limited solutions to related problems. Similarly, <tt>-m32</tt> | 
|  | and <tt>-m64</tt> solve a small subset of the problem for specific | 
|  | architectures.</li> | 
|  |  | 
|  | <li>gcc's <a href="https://www.airs.com/ian/configure/configure_8.html">multilibs</a> | 
|  | solve the part of the problem that relates to finding appropriate libraries | 
|  | and include files based on particular feature support (soft float, | 
|  | etc.).</li> | 
|  |  | 
|  | <li>Apple's "driver driver" supported by gcc and clang solve a subset of the | 
|  | problem by supporting <tt>-arch</tt>. Apple also provides a tool chain which | 
|  | supports <a href="https://en.wikipedia.org/wiki/Universal_binary">universal | 
|  | binaries</a> and object files which may include data for multiple | 
|  | architectures. See <a href="https://developer.apple.com/library/archive/technotes/tn2005/tn2137.html">TN2137</a> | 
|  | for an example of how this is used.</li> | 
|  |  | 
|  | <li>Many operating systems and environments solve the problem by installing | 
|  | complete development environments (including the IDE, tools, header files, | 
|  | and libraries) for a single tool chain. This is cumbersome for users and | 
|  | does not match well with tools which are inherently capable of cross | 
|  | compiling.</li> | 
|  |  | 
|  | <li>The Debian <a href="https://wiki.debian.org/ArmEabiPort">ArmEabiPort</a> | 
|  | wiki page for their work to support the ARM EABI provide an interesting | 
|  | glimpse into how related issues impact the operating system distribution.</li> | 
|  |  | 
|  | <li><a href="https://icculus.org/fatelf/">FatELF</a> is a proposal for bringing | 
|  | Mac OS X like "Universal Binary" support to ELF based platforms.</li> | 
|  |  | 
|  | </ul> | 
|  |  | 
|  | </div> | 
|  | </body> | 
|  | </html> |