[cfe-dev] Relative Paths in Compilation Database

Mehmet Erol Sanliturk m.e.sanliturk at gmail.com
Fri Apr 3 15:32:01 PDT 2015


On Fri, Apr 3, 2015 at 3:07 PM, Daniel Dilts <diltsman at gmail.com> wrote:

> You are correct.  Forward slashes can be substituted for backslashes in
> many cases, but many compilation databases will be generated with
> backslashes.  Either we mandate that only forward slashes can be used, or
> CommandLineArgumentParser must be fixed.
>
> I am willing and able to make the fixes, but I don't know how to test for
> the platform so that the correct set of escapes are used.
>
>


In Unix world , back slash is used for escape character .
In Windows , in file names , back and forward slashes are usable .
Their intersection is forward slash .

My opinion is that enforcing forward slashes in file names is more suitable
.
Otherwise , always will be necessary to use escape back slash for Windows
file names which is not a convenient form ( In Windows  always will be
necessary to clear additional back slashes before submitting it to
operating system routines ) .

Fixing CommandLineArgumentParser also may be a very convenient action : For
file names , forward and backward slashes may be treated equivalent without
using escape back slash .
For back slash used file names , when they are used in Unix environments ,
they may be directly converted to forward slashes .


Lazarus and Free Pascal is using this form since , I think , their starting
time . When this form is used ( forward or back slashes ) , conversion of
them in Unix by the compiler is the most convenient way ( in Windows there
is no any need to such a conversion in sources ) .

I did not use Visual Studio , but , I am compiling sources in Unix (
FreeBSD , Linux ) compilable in Visual Studio without any trouble for
forward slashes ( means Visual Studio is able to accept these , but please
test this for exact decision ) .



Mehmet Erol Sanliturk





> On Fri, Apr 3, 2015 at 2:43 PM, Mehmet Erol Sanliturk <
> m.e.sanliturk at gmail.com> wrote:
>
>>
>>
>> On Fri, Apr 3, 2015 at 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
>>>>>>>
>>>>>>
>>>>>
>>>
>>> _______________________________________________
>>>
>>>
>>
>>
>>
>> In Windows , forward slashes in source files are usable :
>>
>> include '/a/b/....'  ( relative paths can be used such as ../../../  etc.
>> )
>>
>> ( I am using this form , at least since ten years because I am compiling
>> the same program sources in Windows and Unix without any change , in
>> Fortran , Pascal , and C  )
>>
>> but , in Console , only back slashes are accepted :
>>
>> dir \a\b\... /S
>> ren \a\b\d\g.c  h.c
>>
>> because , forward slashes are used for command line options .
>>
>> I did not try forward slashes in quoted form : You may try it ( I do not
>> have any Windows at present ) :
>>
>> dir "/a/b/..." /S
>>
>>
>>
>> Thank you very much .
>>
>>
>>
>> Mehmet Erol Sanliturk
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150403/0dc80135/attachment.html>


More information about the cfe-dev mailing list