aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/mesonprojectmanager
diff options
context:
space:
mode:
authorAlexis Jeandet <alexis.jeandet@member.fsf.org>2020-06-24 09:44:55 +0200
committerAlexis Jeandet <alexis.jeandet@member.fsf.org>2020-06-29 09:12:13 +0000
commit8a2cb794b938fa2e4a620f8649a0305f444645ce (patch)
tree2ed45907710fcd5ac267d8d5fd95c083bcdd44fc /src/plugins/mesonprojectmanager
parent1c8b9e3d48b1fd2b37640473523ab38192f4cb17 (diff)
Meson: fix broken project tree on windows
Change-Id: I88d0e5b6f1547d5fa6fe832d26bafee59e535a4b Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/plugins/mesonprojectmanager')
-rw-r--r--src/plugins/mesonprojectmanager/mesoninfoparser/target.h31
-rw-r--r--src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp17
-rw-r--r--src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp10
3 files changed, 30 insertions, 28 deletions
diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/target.h b/src/plugins/mesonprojectmanager/mesoninfoparser/target.h
index a0cbaaef66..8e8d585313 100644
--- a/src/plugins/mesonprojectmanager/mesoninfoparser/target.h
+++ b/src/plugins/mesonprojectmanager/mesoninfoparser/target.h
@@ -23,14 +23,21 @@
**
****************************************************************************/
#pragma once
+#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/optional.h>
+#include <QDir>
#include <QString>
#include <QVariant>
namespace MesonProjectManager {
namespace Internal {
+inline QStringList cleanPath(QStringList &&paths)
+{
+ return Utils::transform(paths, QDir::cleanPath);
+}
+
struct Target
{
enum class Type {
@@ -58,8 +65,8 @@ struct Target
: language{std::move(language)}
, compiler{std::move(compiler)}
, parameters{std::move(parameters)}
- , sources{std::move(sources)}
- , generatedSources{std::move(generatedSources)}
+ , sources{cleanPath(std::move(sources))}
+ , generatedSources{cleanPath(std::move(generatedSources))}
{}
};
using SourceGroupList = std::vector<SourceGroup>;
@@ -71,17 +78,13 @@ struct Target
const Utils::optional<QString> subproject;
const SourceGroupList sources;
- static inline QString fullName(const Target &target)
+ static inline QString fullName(const Utils::FilePath &srcDir, const Target &target)
{
- // TODO, this is bad, might be moved in a place where src dir is known
- if (target.fileName.first().startsWith("/")) {
- auto fname = target.fileName.first().split('/');
- auto definedIn = target.definedIn.split('/');
- definedIn.pop_back();
- int i = std::min(definedIn.length(), fname.length()) - 1;
- for (; i >= 0 && fname[i] == definedIn[i]; --i)
- ;
- return fname.mid(i + 1).join("/");
+ using namespace Utils;
+ if (FileUtils::isAbsolutePath(target.fileName.first())) {
+ const auto fname = target.fileName.first().split('/').last();
+ QString definedIn = FilePath::fromString(target.definedIn).absolutePath().toString();
+ return definedIn.remove(srcDir.toString()) + '/' + fname;
} else {
return target.fileName.first();
}
@@ -116,8 +119,8 @@ struct Target
: type{toType(type)}
, name{std::move(name)}
, id{std::move(id)}
- , definedIn{std::move(definedIn)}
- , fileName{std::move(fileName)}
+ , definedIn{QDir::cleanPath(definedIn)}
+ , fileName{cleanPath(std::move(fileName))}
, subproject{subproject.isNull() ? Utils::nullopt
: Utils::optional<QString>{std::move(subproject)}}
, sources{std::move(sources)}
diff --git a/src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp b/src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp
index 56d9c0bceb..d062b2c1f0 100644
--- a/src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp
+++ b/src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp
@@ -98,7 +98,7 @@ QStringList toAbsolutePath(const Utils::FilePath &refPath, QStringList &pathList
std::cend(pathList),
std::back_inserter(allAbs),
[refPath](const QString &path) {
- if (path.startsWith("/"))
+ if (Utils::FileUtils::isAbsolutePath(path))
return path;
return refPath.pathAppended(path).toString();
});
@@ -200,11 +200,11 @@ QList<ProjectExplorer::BuildTargetInfo> MesonProjectParser::appsTargets() const
QList<ProjectExplorer::BuildTargetInfo> apps;
std::for_each(std::cbegin(m_parserResult.targets),
std::cend(m_parserResult.targets),
- [&apps](const Target &target) {
+ [&apps, &srcDir = m_srcDir](const Target &target) {
if (target.type == Target::Type::executable) {
ProjectExplorer::BuildTargetInfo bti;
bti.displayName = target.name;
- bti.buildKey = Target::fullName(target);
+ bti.buildKey = Target::fullName(srcDir, target);
bti.displayNameUniquifier = bti.buildKey;
bti.targetFilePath = Utils::FilePath::fromString(target.fileName.first());
bti.workingDirectory
@@ -260,10 +260,9 @@ void MesonProjectParser::update(const QFuture<MesonProjectParser::ParserData *>
m_parserResult = std::move(parserData->data);
m_rootNode = std::move(parserData->rootNode);
m_targetsNames.clear();
- std::transform(std::cbegin(m_parserResult.targets),
- std::cend(m_parserResult.targets),
- std::back_inserter(m_targetsNames),
- Target::fullName);
+ for (const Target &target : m_parserResult.targets) {
+ m_targetsNames.push_back(Target::fullName(m_srcDir, target));
+ }
addMissingTargets(m_targetsNames);
m_targetsNames.sort();
delete data;
@@ -278,11 +277,11 @@ ProjectExplorer::RawProjectPart MesonProjectParser::buildRawPart(
{
ProjectExplorer::RawProjectPart part;
part.setDisplayName(target.name);
- part.setBuildSystemTarget(Target::fullName(target));
+ part.setBuildSystemTarget(Target::fullName(m_srcDir, target));
part.setFiles(sources.sources + sources.generatedSources);
auto flags = splitArgs(sources.parameters);
part.setMacros(flags.macros);
- part.setIncludePaths(toAbsolutePath(this->m_buildDir, flags.includePaths));
+ part.setIncludePaths(toAbsolutePath(m_buildDir, flags.includePaths));
part.setProjectFileLocation(target.definedIn);
if (sources.language == "cpp")
part.setFlagsForCxx({cxxToolChain, flags.args});
diff --git a/src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp b/src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp
index 4842ba4503..bb572c0009 100644
--- a/src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp
+++ b/src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp
@@ -42,14 +42,14 @@ void buildTargetTree(std::unique_ptr<MesonProjectNode> &root, const Target &targ
void addTargetNode(std::unique_ptr<MesonProjectNode> &root, const Target &target)
{
- root->findNode([&target, path = Utils::FilePath::fromString(target.definedIn)](
+ root->findNode([&root, &target, path = Utils::FilePath::fromString(target.definedIn)](
ProjectExplorer::Node *node) {
if (node->filePath() == path.absolutePath()) {
auto asFolder = dynamic_cast<ProjectExplorer::FolderNode *>(node);
if (asFolder) {
- auto targetNode = std::make_unique<MesonTargetNode>(path.absolutePath().pathAppended(
- target.name),
- Target::fullName(target));
+ auto targetNode = std::make_unique<MesonTargetNode>(
+ path.absolutePath().pathAppended(target.name),
+ Target::fullName(Utils::FilePath::fromString(root->path()), target));
targetNode->setDisplayName(target.name);
asFolder->addNode(std::move(targetNode));
}
@@ -84,7 +84,7 @@ std::unique_ptr<MesonProjectNode> ProjectTree::buildTree(const Utils::FilePath &
addTargetNode(root, target);
});
for (Utils::FilePath bsFile : bsFiles) {
- if (!bsFile.startsWith("/"))
+ if (!bsFile.toFileInfo().isAbsolute())
bsFile = srcDir.pathAppended(bsFile.toString());
root->addNestedNode(
std::make_unique<ProjectExplorer::FileNode>(bsFile, ProjectExplorer::FileType::Project));