diff options
author | Stephen Kelly <steveire@gmail.com> | 2012-06-18 17:59:33 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2012-06-19 07:01:28 (GMT) |
commit | e30d46e20ee71d57e09f83fafa39b7e464efe110 (patch) | |
tree | c2a4ed0ea02f844272200031ca19a19462205573 | |
parent | 1d8199ffecbd8881c38e0e63ee07844a50abac49 (diff) | |
download | CMake-e30d46e20ee71d57e09f83fafa39b7e464efe110.zip CMake-e30d46e20ee71d57e09f83fafa39b7e464efe110.tar.gz CMake-e30d46e20ee71d57e09f83fafa39b7e464efe110.tar.bz2 |
Use full paths in compile_commands.json for out of source builds.
Clang tooling requires that paths in the directory and file JSON
fields are relative to the directory field, but clang doesn't normalize
the paths already. The result is that clang doesn't find the relevant
entry for files which begin with ../.
-rw-r--r-- | Source/cmGlobalNinjaGenerator.cxx | 11 | ||||
-rw-r--r-- | Source/cmNinjaTargetGenerator.cxx | 9 |
2 files changed, 19 insertions, 1 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 40348e6..f21cddb 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -644,13 +644,22 @@ void cmGlobalNinjaGenerator::AddCXXCompileCommand( *this->CompileCommandsStream << "," << std::endl; } + std::string sourceFileName = sourceFile; + if (!cmSystemTools::FileIsFullPath(sourceFileName.c_str())) + { + sourceFileName = cmSystemTools::CollapseFullPath( + sourceFileName.c_str(), + this->GetCMakeInstance()->GetHomeOutputDirectory()); + } + + *this->CompileCommandsStream << "\n{\n" << " \"directory\": \"" << cmGlobalGenerator::EscapeJSON(buildFileDir) << "\",\n" << " \"command\": \"" << cmGlobalGenerator::EscapeJSON(commandLine) << "\",\n" << " \"file\": \"" - << cmGlobalGenerator::EscapeJSON(sourceFile) << "\"\n" + << cmGlobalGenerator::EscapeJSON(sourceFileName) << "\"\n" << "}"; } diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index a362d13..0c8ae8d 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -492,6 +492,15 @@ cmNinjaTargetGenerator std::string escapedSourceFileName = this->LocalGenerator->ConvertToOutputFormat( sourceFileName.c_str(), cmLocalGenerator::SHELL); + + if (!cmSystemTools::FileIsFullPath(escapedSourceFileName.c_str())) + { + escapedSourceFileName = cmSystemTools::CollapseFullPath( + escapedSourceFileName.c_str(), + this->GetGlobalGenerator()->GetCMakeInstance()->GetHomeOutputDirectory()); + } + + compileObjectVars.Source = escapedSourceFileName.c_str(); compileObjectVars.Object = objectFileName.c_str(); compileObjectVars.Flags = vars["FLAGS"].c_str(); |