On Jun 7, 2012, at 6:27 PM, Richard Smith wrote:

> On Thu, Jun 7, 2012 at 5:12 PM, Douglas Gregor <[email protected]> wrote:
> 
> On May 22, 2012, at 3:36 PM, Richard Smith wrote:
> 
> > Hi,
> >
> > Some popular open-source projects have a code layout which looks something 
> > like this:
> >
> > project/
> >   libs/
> >     some_third_party_lib/
> >     my_own_lib/
> >   foo/my_code/
> >   bar/my_code/
> >
> > ... with a single include path pointing at the root of the project. When 
> > rolling out new warnings to such projects, warnings in the project's own 
> > code should be fixed, and warnings in third-party headers should typically 
> > be ignored. However, this is currently hard to achieve.
> >
> > The natural way to suppress warnings from third-party headers would be to 
> > treat them as system headers, but we only have two ways to achieve this: 
> > -isystem (which doesn't work for this file layout), and #pragma 
> > system_header (which requires updating *all* the third_party headers). 
> > Neither of these seems to be a good solution to the problem.
> >
> > The attached patch addresses this by adding two command-line arguments: 
> > -isystem-prefix FOO/ treats all #include "FOO/..." directives as including 
> > a system header, and -ino-system-prefix FOO/BAR/ treats all #include 
> > "FOO/BAR/..." directives as not including a system header. The 
> > latest-specified argument wins, and the overrides only apply to files which 
> > are found relative to a header search path (and not ones which are found 
> > relative to the current file, or by absolute path).
> >
> > Is this OK for mainline Clang? The implementation is currently not 
> > optimized for the case of large numbers of such arguments -- we can deal 
> > with that later if it becomes an issue.
> 
> We had run into precisely this problem at the framework level and (fairly 
> recently) added a framework-only hack that allows a framework's headers to be 
> treated as system headers. It was a kludge; your solution seems somewhat more 
> general.
> 
> I was a little surprised to see that it's based on the style of include 
> (<Foo/>) rather than on a particular subdirectory. Was that a specific design 
> decision or was it a more expedient implementation approach?
> 
> It was deliberate: if the system header area contains a symlink which leads 
> out of the system header area, then we want files found through that symlink 
> to still be treated as system headers. Thus the check is based on how the 
> #include line is written, rather than where the located file lives within the 
> file system. I considered a mechanism for attaching the prefixes to specific 
> include paths (to make them more akin to specifying a directory), but I was 
> reluctant to add such complexity without a motivating use case; the source 
> file names for a #include directive are a single global namespace anyway (at 
> least in the case where the file is found via an include path).


Okay, that makes sense.

        - Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to