<div dir="ltr">On Fri, Jul 19, 2013 at 6:36 PM, Joshua Cranmer 🐧 <span dir="ltr"><<a href="mailto:Pidgeot18@gmail.com" target="_blank">Pidgeot18@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">On 7/17/2013 11:36 PM, Sean Silva wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
tl;dr: compiler embeds compilation db info in object files; you can then collect it afterwards with simple tools. Good idea?<br>
<br>
It seems like for a while now, we have been looking for a way that clang can assist users in creating JSON compilation databases, but solutions seem limited to specific build systems or platforms. I came up with a neat little hack that may be a viable way for clang to help create compilation databases "everywhere clang runs", with fairly good user experience.<br>

<br>
I believe the following user experience is achievable "everywhere clang runs":<br>
1. Add some option to the compiler command line.<br>
2. Rebuild.<br>
3. Feed all of your built object files/executables to a small tool we ship and out comes a compilation database.<br>
</blockquote>
<br></div>
Quite frankly, I don't see this as being a superior user-experience to the following scenario:<br>
1. Add an option to the compiler command line to dump the database to a file.<br>
2. Rebuild.<br>
3. You have your compilation database automatically!<br>
<br>
The primary difficulty of this approach from an implementation perspective is locking the database for writing when compiling with make -jN.</blockquote><div><br></div>That approach may simply not be achievable in the case where the compilations are happening on physically distinct machines that do not share an underlying filesystem. I consider 'achievable "everywhere clang runs"' to be an important property; it's easy to come up with many far-superior user experiences by restricting consideration to particular build environments.</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">Also, I believe that should someone want to integrate the compilation database into an automated build process, the "update a random database file specified on command line" approach has serious issues since the nature of its dependency on other parts of the build process is difficult to describe within the semantics of existing build systems. For example, Ninja is fundamentally based on "run this command with these files as input to get these files as output", and it's not clear how to express "this file is updated by running these commands, with such and such invalidation/staleness semantics etc." within that semantic model. Embedding the compilation database information in build products integrates well with build systems since the compilation database information is simply another aspect of the compiler's output and follows the same dependency rules.</div>
<div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">I've seen concerns about impact on build-times for this, but considering natural variation in compilation times (since not all files are the same size), and the fact that we're already rebuilding world anyways, there should be very little contention for this file in the grand scheme of things.<span class=""><font color="#888888"><br>

<br>
-- <br>
Joshua Cranmer<br>
Thunderbird and DXR developer<br>
Source code archæologist</font></span><div class=""><div class="h5"><br>
<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div></div>