[cfe-commits] [PATCH] Implements support to run standalone tools

Marshall Clow mclow.lists at gmail.com
Thu Mar 29 11:22:12 PDT 2012


On Mar 29, 2012, at 10:51 AM, Manuel Klimek wrote:

> On Thu, Mar 29, 2012 at 7:41 PM, Marshall Clow <mclow.lists at gmail.com> wrote:
>> On Mar 29, 2012, at 10:21 AM, Manuel Klimek wrote:
>> 
>>> On Mar 29, 2012 5:25 PM, "Marshall Clow" <mclow.lists at gmail.com> wrote:
>>>> 
>>>> On Mar 29, 2012, at 4:49 AM, Manuel Klimek wrote:
>>>> 
>>>>> Updated patch: now injecting the CompilationDatabase into the
>>>>> ClangTool, plus some clean ups.
>>>>> 
>>>>> Please let me know
>>>>> - if that's in line with what you thought
>>>> 
>>>> Yes, this is more in line with what I was thinking.
>>>> 
>>>> But… ;-)
>>>> 
>>>> I think that:
>>>> 
>>>> 1)
>>>> +  /// FIXME: Currently only supports JSON compilation databases, which
>>>> +  /// are named 'compile_commands.json' in the given directory. Extend this
>>>> +  /// for other build types (like ninja build files).
>>>> +  static CompilationDatabase *loadFromDirectory(StringRef BuildDirectory,
>>>> +                                                std::string &ErrorMessage);
>>>> 
>>>> doesn't belong in CompilationDatabase.
>>>> The reason is that in my suggested usage, there will not be a "build directory" to load the compilation database from.
>>>> I agree that JSONCompilationDatabase and "MakefileCompilationDatabase" (or whatever) need this, but for simple tools, I'd like to be able to specify all of the options on the command line.
>>>> Things like:
>>>>        find . -name \*.cpp -exec tool -option1 -option2 -option3 {} \;
>>> 
>>> I'm not clear whether you're saying the design I proposed a few mails
>>> ago is not a good goal (which is pretty much what I now implemented,
>>> re-pasting to make sure we're talking about the same reference):
>>> <define tool command lines>
>>> int main(...) {
>>>   // Make argc and argv references so we can change them? Kind of
>>> yuck, alternative ideas welcome.
>>>   llvm::OwningPtr<CompilationDatabase>
>>> Database(createSimpleCompilationDatabase(argc, argv));
>>>   <do llvm command line parsing on rest of argc, argv>
>>>   if (!Database) {
>>>     Database.reset(loadCompilationDatabase(BuildDirectory));
>>>   }
>>>   ClangTool Tool(Database.get(), Filenames);
>>> }
>> 
>> Nope. Not saying that.
>> I'm happy with this.
>> 
>> 
>>> ... or whether you're saying that I should implement the
>>> "createSimpleCompilationDatabase(argc, argv)" right away? (which I'm
>>> fine with, but I don't want to bloat this patch with more features)
>> 
>> Nope. Not saying that either.
>> You (or I) can write createSimpleCompilationDatabase(argc, argv) later.
>> 
>>> The reason I think the creation of the SimpleCompilationDatabase (I'm
>>> not happy with the name yet) should be different from the
>>> CompilationDatabase::loadFromDirectory(...) is that I want to keep the
>>> normal llvm command line parsing outside of the CompilationDatabase,
>>> as otherwise it gets hard to add extra parameters when writing a tool,
>>> which is pretty common.
>> 
>> That's fine with me, too.
>> 
>> My point was that given:
>> 1)  that we're going to have a SimpleCompilationDatabase (possibly with a different name) sometime down the road, and
>> 2) that "loadFromDirectory" doesn't really make sense when you're getting everything from the command line,
>> 
>> then, does loadFromDirectory really belong in the base class?
>> [ because then SimpleCompilationDatabase will have to implement it - even if it just returns an error ]
> 
> Ah, but loadFromDirectory is just a static factory method - none of
> the children have to implement this.

Ah - missed that somehow.
Sorry.

> If this is not a common enough pattern in llvm, I'm happy to pull the
> method out.
> The reasoning I had to put it in is that it's basically the
> "canonical" factory for CompilationDatabases and that when somebody
> implements a new CompilationDatabase subclass, I want them to consider
> adding a detection into this factory method (so coupling is strong).
> Also, I think SimpleCompilationDatabase is the odd special case - I
> expect the majority of CompilationDatabases to come from a build
> system.
> 

>> It's an interface question, more than an architecture question.
>> 
>> Hopefully this is clearer.
> 
> Yep, thanks for clarifying. And thanks for the discussion, I'm really
> happy with the path this is taking design-wise.

Me, too.
Thanks!

-- Marshall

Marshall Clow     Idio Software   <mailto:mclow.lists at gmail.com>

A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
        -- Yu Suzuki





More information about the cfe-commits mailing list