From a700e625ef8dd53246d44a6293c54fd9e48ae6a5 Mon Sep 17 00:00:00 2001 From: Tom Deblauwe Date: Mon, 29 Dec 2014 16:53:20 +0100 Subject: [PATCH] cmake: Fix finding corresponding source directory from build directory When trying to find the corresponding source directory for a build directory, it is better to just read it out of the CMakeDirectoryInformation.cmake file found in the CMakeFiles subdirectory of the build directory, instead of guessing it using the relative paths. Change-Id: Ie96b3255a27f46bcd7f0ab1566dfb91ac52f3be9 Reviewed-by: Daniel Teske --- .../cmakeprojectmanager/cmakeproject.cpp | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 0dcf8ddc444..6a87c17da78 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -1057,10 +1057,28 @@ void CMakeCbpParser::parseBuildTargetOption() m_buildTarget.targetType = TargetType(value.toInt()); } else if (attributes().hasAttribute(QLatin1String("working_dir"))) { m_buildTarget.workingDirectory = attributes().value(QLatin1String("working_dir")).toString(); - QDir dir(m_buildDirectory); - QString relative = dir.relativeFilePath(m_buildTarget.workingDirectory); - m_buildTarget.sourceDirectory - = Utils::FileName::fromString(m_sourceDirectory).appendPath(relative).toString(); + + QFile cmakeSourceInfoFile(m_buildTarget.workingDirectory + + QStringLiteral("/CMakeFiles/CMakeDirectoryInformation.cmake")); + if (cmakeSourceInfoFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&cmakeSourceInfoFile); + const QLatin1String searchSource("SET(CMAKE_RELATIVE_PATH_TOP_SOURCE \""); + while (!stream.atEnd()) { + const QString lineTopSource = stream.readLine().trimmed(); + if (lineTopSource.startsWith(searchSource)) { + m_buildTarget.sourceDirectory = lineTopSource.mid(searchSource.size()); + m_buildTarget.sourceDirectory.chop(2); // cut off ") + break; + } + } + } + + if (m_buildTarget.sourceDirectory.isEmpty()) { + QDir dir(m_buildDirectory); + const QString relative = dir.relativeFilePath(m_buildTarget.workingDirectory); + m_buildTarget.sourceDirectory + = Utils::FileName::fromString(m_sourceDirectory).appendPath(relative).toString(); + } } while (!atEnd()) { readNext();