[cfe-dev] Relative Paths in Compilation Database
Manuel Klimek
klimek at google.com
Mon Apr 6 06:37:18 PDT 2015
On Mon, Apr 6, 2015, 3:27 AM Kim Gräsman <kim.grasman at gmail.com> wrote:
Hey all,
This sounds like a good development, and I'd like to throw in my 2 cents.
I looked at a related problem before, and I think it boils down to the
same challenge -- Manuel and I discussed it on the bug here:
http://llvm.org/bugs/show_bug.cgi?id=19687
I ran out of steam before I got around to any real implementation, but
I think the primary challenge is that CMake and Ninja (or other
compdb-producers) don't necessarily have the arguments in list form
either. They usually seem to just have a command-line.
Which should be fine if we allow both.
So the complexity of splitting the command-line into arguments can
either go in all the world's generators, or in the single consumer in
LibTooling.
Or we add a little complexity to libtooling to allow both.
- Kim
On Mon, Apr 6, 2015 at 10:41 AM, Laszlo Nagy
<rizsotto.mailinglist at gmail.com> wrote:
> hi there,
>
> i'm also writing a tool (Bear) which generate the compilation database.
and
> had a few bugs in my code about escaping the command. if it's not too
late i
> would also propose a format for the problem. ;)
>
> {
> directory: "/my/path"
> cmd: ["path to binary", "-c", "filename"],
> ...
> }
>
> which would reformat the command field as a JSON array. would still give
the
> readability of the command and keep the order of the arguments. (i'm not
> sure that the recommended multiple "argument" key would be correct JSON.)
>
> how does it sound for you?
>
> regards,
> Laszlo
>
>
> On Mon, Apr 6, 2015 at 1:11 AM, Manuel Klimek <klimek at google.com> wrote:
>>
>> Also, I think we want to introduce a new keyword for the binary.
>> So both of these should work:
>> {
>> directory: "/my/path"
>> binary: "path to binary"
>> argument: "-c"
>> argument: "filename"
>> ...
>> }
>> or the shell-escaped command inside the json escaped string:
>> {
>> directory: "/my/path"
>> command: "path\\ to\\ binary -c filename"
>> ...
>> }
>> The thing to note is that both shell escaping and shell unescaping are
>> sufficiently hard on non-unix platforms, and even on unix platforms it's
>> just not nice to go from one to the other.
>>
>> Cheers,
>> /Manuel
>>
>> On Sun, Apr 5, 2015 at 4:01 PM Manuel Klimek <klimek at google.com> wrote:
>>>
>>> Yes, I think it's easy enough to make compatible
>>>
>>>
>>> On Sun, Apr 5, 2015, 8:42 AM Daniel Dilts <diltsman at gmail.com> wrote:
>>>>
>>>> I like that a lot better. I will look at what that is going to take.
>>>>
>>>> If it goes that direction, will it be necessary to also support the
>>>> older format? I know there are tools, like CMake, that can produce
this
>>>> file format.
>>>>
>>>> On Sun, Apr 5, 2015 at 8:26 AM, Manuel Klimek <klimek at google.com>
wrote:
>>>>>
>>>>> On Sun, Apr 5, 2015 at 8:19 AM Daniel Dilts <diltsman at gmail.com>
wrote:
>>>>>>
>>>>>> So, escape the backslashes once for JSON and a second time for Clang?
>>>>>
>>>>>
>>>>> Well, a second time for "shell".
>>>>> A different idea that has come up was to just add (optional) 'arg'
>>>>> fields to the json, instead of the shell escaping, which seems much
more
>>>>> pleasant to work with across platforms, like this:
>>>>> {
>>>>> directory: '/my/path'
>>>>> command: 'just the exec'
>>>>> argument: '-c'
>>>>> argument: 'filename'
>>>>> ...
>>>>> }
>>>>> Patches for that would be welcome :)
>>>>>
>>>>>>
>>>>>>
>>>>>> If this is going to be necessary on Windows, it probably ought to be
>>>>>> added to the documentation for the compilation database file format.
>>>>>>
>>>>>> On Fri, Apr 3, 2015 at 7:49 PM, Manuel Klimek <klimek at google.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> Why not escape the backslashes when writing the compilation db?
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Apr 3, 2015, 1:54 PM Daniel Dilts <diltsman at gmail.com>
wrote:
>>>>>>>>
>>>>>>>> I finally had the opportunity to look into this.
>>>>>>>>
>>>>>>>> CommandLineArgumentParser in JSONCompilationDatabase.cpp deals with
>>>>>>>> escapes by discarding all backslash characters. I imagine that
this works
>>>>>>>> pretty well on Linux, not perfectly, but well enough.
>>>>>>>>
>>>>>>>> Windows uses backslash as a separator in file paths, so this breaks
>>>>>>>> most file paths on Windows.
>>>>>>>>
>>>>>>>> How would one go about fixing this so it works on both Windows and
>>>>>>>> Linux? Obviously the different escape sequences need to be
implemented.
>>>>>>>> What I really mean is, how do you make it so that it uses the
correct set of
>>>>>>>> escapes depending on platform?
>>>>>>>>
>>>>>>>>
>>>>>>>> On Tue, Mar 17, 2015 at 12:57 PM, Manuel Klimek <klimek at google.com>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> I haven't had time to look.
>>>>>>>>>
>>>>>>>>> On Tue, Mar 17, 2015 at 6:06 PM Daniel Dilts <diltsman at gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>> What appears to be the exact problem? Are relative paths just
not
>>>>>>>>>> properly implemented, or is the problem more specific than that?
>>>>>>>>>>
>>>>>>>>>> On Tue, Mar 17, 2015 at 4:07 AM, Manuel Klimek <klimek at google.com
>
>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> I think this is a known problem. Patches very welcome :)
>>>>>>>>>>>
>>>>>>>>>>> On Tue, Mar 17, 2015 at 1:14 AM Daniel Dilts <diltsman at gmail.com
>
>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> I am calling runClangTidy using a JSONCompilationDatabase that
I
>>>>>>>>>>>> generate from a string. Everything works perfectly until I
have a relative
>>>>>>>>>>>> path.
>>>>>>>>>>>>
>>>>>>>>>>>> With the following database I use
>>>>>>>>>>>> "D:\\CMakeTest\\bld\\..\\src\\main.cpp" as the file to open:
>>>>>>>>>>>> [
>>>>>>>>>>>> {
>>>>>>>>>>>> "directory": "D:\\CMakeTest\\bld\\",
>>>>>>>>>>>> "command" : "D:/llvm/build/Debug/bin/clang.exe
>>>>>>>>>>>> -I\"C:\\Program Files (x86)\\Microsoft Visual Studio
12.0\\VC\\include\"
>>>>>>>>>>>> -I\"C:\\Program Files (x86)\\Microsoft Visual Studio
>>>>>>>>>>>> 12.0\\VC\\atlmfc\\include\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\um\" -I\"C:\\Program Files (x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\shared\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\winrt\" -I\"C:\\Program Files
(x86)\\Microsoft Visual
>>>>>>>>>>>> Studio 12.0\\VC\\include\" -I\"C:\\Program Files
(x86)\\Microsoft Visual
>>>>>>>>>>>> Studio 12.0\\VC\\atlmfc\\include\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\um\" -I\"C:\\Program Files (x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\shared\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\winrt\" -DWIN32 -D_WINDOWS -D_DEBUG
>>>>>>>>>>>> -DCMAKE_INTDIR=\"Debug\" ..\\src\\main.cpp",
>>>>>>>>>>>> "file" : "..\\src\\main.cpp"
>>>>>>>>>>>> },
>>>>>>>>>>>> ]
>>>>>>>>>>>>
>>>>>>>>>>>> This gives me an output of "Error while processing
>>>>>>>>>>>> D:\\CMakeTest\\bld\\..\\src\\main.cpp."
>>>>>>>>>>>>
>>>>>>>>>>>> When I use the following database with
>>>>>>>>>>>> "D:\\CMakeTest\\src\\main.cpp" as the file to open, everything
works.
>>>>>>>>>>>>
>>>>>>>>>>>> [
>>>>>>>>>>>> {
>>>>>>>>>>>> "directory": "D:\\CMakeTest\\src\\",
>>>>>>>>>>>> "command" : "D:/llvm/build/Debug/bin/clang.exe
>>>>>>>>>>>> -I\"C:\\Program Files (x86)\\Microsoft Visual Studio
12.0\\VC\\include\"
>>>>>>>>>>>> -I\"C:\\Program Files (x86)\\Microsoft Visual Studio
>>>>>>>>>>>> 12.0\\VC\\atlmfc\\include\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\um\" -I\"C:\\Program Files (x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\shared\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\winrt\" -I\"C:\\Program Files
(x86)\\Microsoft Visual
>>>>>>>>>>>> Studio 12.0\\VC\\include\" -I\"C:\\Program Files
(x86)\\Microsoft Visual
>>>>>>>>>>>> Studio 12.0\\VC\\atlmfc\\include\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\um\" -I\"C:\\Program Files (x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\shared\" -I\"C:\\Program Files
(x86)\\Windows
>>>>>>>>>>>> Kits\\8.1\\Include\\winrt\" -DWIN32 -D_WINDOWS -D_DEBUG
>>>>>>>>>>>> -DCMAKE_INTDIR=\"Debug\" main.cpp",
>>>>>>>>>>>> "file" : "main.cpp"
>>>>>>>>>>>> },
>>>>>>>>>>>> ]
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Is there something that I am doing wrong? The only changes
>>>>>>>>>>>> between the two compilation databases are the directory and
file entries.
>>>>>>>>>>>> Both should refer to the same absolute path.
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> cfe-dev mailing list
>>>>>>>>>>>> cfe-dev at cs.uiuc.edu
>>>>>>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150406/2898df33/attachment.html>
More information about the cfe-dev
mailing list