[cmake-developers] Bug in Visual Studio generators

Josh Green inbilla at gmail.com
Tue Apr 8 20:13:13 EDT 2014


I have gone back and re-read the commit message of the commit that I
linked earlier:

> Most CMake generators produce relative paths within the build tree and
> full paths to files outside the build tree.  Make VS 10 and VS 11
> project files consistent with this approach except for paths forced to
> be relative to work around a VS 10 bug.

This commit message actually demonstrates a misunderstanding of why
visual studio build files were using absolute paths.
Visual Studio needs absolute paths by default in order to handle the
deep hierarchies that occur in many larger projects.
The code that fixes a bug in Vs10 is meant to detect the situation
when an absolute path may be made into a shorter relative path and
thus avoid a bug that was in that version involving property sheets.
The fix for this bug is unaffected by my change, and in fact, the fix
for that bug assumes the paths are absolute by default (otherwise why
would they need to 'forceRelative' them? since they're currently
already always relative)

Again from my previous message:

> The reason I need absolute paths is because in visual studio a 260
> character limit applies to file paths, and relative files mean that
> limit is reached much earlier than necessary. (because the relative
> path + the build file location must be < 260 chars).

> Currently CMAKE is generating relative paths in my projects of 160
> characters length (with 6 ../../ on the front). These paths are then
> appended to my build file location (100chars in length).
> Causing the problem that visual studio cannot find these files.

I have attached a patch that applies the relevant fix, and a comment
to explain the reason why and avoid future regressions.

Thanks for your time

Josh

On Wed, Apr 9, 2014 at 8:29 AM, Josh Green <inbilla at gmail.com> wrote:
> Hi Brad,
>
> Sorry, I think I failed to communicate what the problem was. (Sorry
> for caps, just emphasising the keywords)
> Please read my full e-mail
> I do NOT want to have a relocatable build file.
> I do NOT want to set CMAKE_USE_RELATIVE_PATHS to "True" (the default is False).
>
> I NEED absolute paths in my build files.
> I believe cmake intends to supply absolute paths in my case (and
> indeed reading the code, the writer expects this to be the case).
> But it currently does NOT. The fact that it doesn't, is why I am
> emailing with a fix!
>
> The problem is that the Visual studio generators currently ALWAYS
> Generate RELATIVE paths.
>
> Sorry to take so much of your time, but I genuinely believe this is a
> bug, and your previous e-mail has dismissed it as by design, I can
> almost guarantee you that it is not CMAKE's intention to be always
> generating relative paths in VisualStudio generators. I'm sure you
> will agree with that statement.
> If you read below, I hope you will agree this is a bug, and can be fixed easily!
>
> For an explanation why Visual Studio project files should have
> absolute files when possible, see the bottom of this email: (I think
> you already know this though)
>
> If you read the code for cmVisualStudio10TargetGenerator::writeSource
> You will notice that it is written assuming that absolute paths are
> always generated by default, and that under some circumstances it will
> force the path to relative.
> This assumption is broken!!
>
> Please look at this commit:
> http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4248132e59a8401a96d9c20ef155d80e439e7346
>
> In that commit, the function "convertPath" is created to choose
> between relative/absolute.
> The bug is that this new "convertPath" function ALWAYS chooses
> relative! The original code that it is replacing it my reason for
> wanting this change, it said:
>
> - if(relative)
> -    {
> -    // custom command sources must use relative paths or they will
> -    // not show up in the GUI.
> -    sourceFile = cmSystemTools::RelativePath(
> -      this->Makefile->GetCurrentOutputDirectory(),
> -      sourceFile.c_str());
> -    }
> -  else
> -    {
> -    // do not use a relative path here because it means that you
> -    // can not use as long a path to the file.
> -    }
>
> The "Else" here is exactly why I need absolute paths and I'm sure it
> is the intention of Cmake to use them.
>
> If you look at the contents of this new "ConvertPath"
>
> +std::string
> +cmVisualStudio10TargetGenerator::ConvertPath(std::string const& path,
> +                                             bool forceRelative)
> +{
> +  return forceRelative
> +    ? cmSystemTools::RelativePath(
> +      this->Makefile->GetCurrentOutputDirectory(), path.c_str())
> +    : this->LocalGenerator->Convert(path.c_str(),
> +                                    cmLocalGenerator::START_OUTPUT,
> +                                    cmLocalGenerator::UNCHANGED);
> +}
>
> So, if forceRelative == True, then we will generate a relative path.
> if forceRelative == False, then:
>
> this->LocalGenerator->Convert(path.c_str(),
>                                     cmLocalGenerator::START_OUTPUT,
>                                     cmLocalGenerator::UNCHANGED);
>
> This function will ALWAYS generate a relative path when called like
> this!!! (because the default parameter "optional" is set to "false" by
> default)
>
> We need to change it to be:
>
> this->LocalGenerator->Convert(path.c_str(),
>                                     cmLocalGenerator::START_OUTPUT,
>                                     cmLocalGenerator::UNCHANGED,
>                                     true);
>
> (To tell it that the conversion is optional).
>
> Thanks for your time, sorry I have been so verbose, but your previous
> e-mail dismissing the issue meant that I needed to try to be as clear
> as possible.
>
> Joshua Green
>
> @Appendix:
>
> The reason I need absolute paths is because in visual studio a 260
> character limit applies to file paths, and relative files mean that
> limit is reached much earlier than necessary. (because the relative
> path + the build file location must be < 260 chars).
>
> Currently CMAKE is generating relative paths in my projects of 160
> characters length (with 6 ../../ on the front). These paths are then
> appended to my build file location (100chars in length).
> Causing the problem that visual studio cannot find these files.
>
> On Wed, Apr 9, 2014 at 3:32 AM, Brad King <brad.king at kitware.com> wrote:
>> On 04/08/2014 04:58 AM, Josh Green wrote:
>>> I've got an issue with Cmake 2.8.12.2.
>>> The Visual Studio Generators do not abide by the
>>> "CMAKE_USE_RELATIVE_PATHS" setting.
>>
>> This option is not fully implemented or supported.  The documentation
>> says that it does not fully work:
>>
>>  http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_USE_RELATIVE_PATHS.html
>>
>> CMake is not intended to generate re-locatable or re-distributable
>> build files.  If you *really* need them then you can use
>> -DCMAKE_SUPPRESS_REGENERATION=1 and post-process the generated
>> files to fix paths.
>>
>> -Brad
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For more information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vs_260CharLimit_abs_path_fix.patch
Type: application/octet-stream
Size: 1903 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20140409/9d542429/attachment-0002.obj>


More information about the cmake-developers mailing list