From bac2d18405dfc37573df01a5e77798c8bd7da2b1 Mon Sep 17 00:00:00 2001
From: Ulf Hermann <ulf.hermann@qt.io>
Date: Mon, 8 Aug 2016 18:35:32 +0200
Subject: [PATCH] ProjectExplorer: Resolve any CurrentProject:<foo> in default
 build path

If ProjectMacroExpander doesn't resolve it we fall back to the generic
ProjectExplorer resolution, which is likely to pick the wrong project.

Task-number: QTCREATORBUG-16724
Change-Id: I201b722c5fe184905f744a1f344ec46941f92ae3
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
---
 src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp | 2 +-
 src/plugins/nim/project/nimbuildconfigurationfactory.cpp    | 2 +-
 src/plugins/projectexplorer/projectmacroexpander.cpp        | 6 +++++-
 src/plugins/projectexplorer/projectmacroexpander.h          | 4 ++--
 src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp     | 2 +-
 src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp | 2 +-
 6 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index a013083c57..bbc006607f 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -193,7 +193,7 @@ FileName CMakeBuildConfiguration::shadowBuildDirectory(const FileName &projectFi
         return FileName();
 
     const QString projectName = projectFilePath.parentDir().fileName();
-    ProjectMacroExpander expander(projectName, k, bcName, buildType);
+    ProjectMacroExpander expander(projectFilePath.toString(), projectName, k, bcName, buildType);
     QDir projectDir = QDir(Project::projectDirectory(projectFilePath).toString());
     QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
     return FileName::fromUserInput(projectDir.absoluteFilePath(buildPath));
diff --git a/src/plugins/nim/project/nimbuildconfigurationfactory.cpp b/src/plugins/nim/project/nimbuildconfigurationfactory.cpp
index bd75e16c7c..44485c664a 100644
--- a/src/plugins/nim/project/nimbuildconfigurationfactory.cpp
+++ b/src/plugins/nim/project/nimbuildconfigurationfactory.cpp
@@ -180,7 +180,7 @@ FileName NimBuildConfigurationFactory::defaultBuildDirectory(const Kit *k,
 {
     QFileInfo projectFileInfo(projectFilePath);
 
-    ProjectMacroExpander expander(projectFileInfo.baseName(), k, bc, buildType);
+    ProjectMacroExpander expander(projectFilePath, projectFileInfo.baseName(), k, bc, buildType);
     QString buildDirectory = expander.expand(Core::DocumentManager::buildDirectory());
 
     if (FileUtils::isAbsolutePath(buildDirectory))
diff --git a/src/plugins/projectexplorer/projectmacroexpander.cpp b/src/plugins/projectexplorer/projectmacroexpander.cpp
index 9bffc43b9b..83aaf2d5fb 100644
--- a/src/plugins/projectexplorer/projectmacroexpander.cpp
+++ b/src/plugins/projectexplorer/projectmacroexpander.cpp
@@ -29,10 +29,14 @@
 
 namespace ProjectExplorer {
 
-ProjectMacroExpander::ProjectMacroExpander(const QString &projectName,
+ProjectMacroExpander::ProjectMacroExpander(const QString &mainFilePath, const QString &projectName,
                                            const Kit *kit, const QString &bcName,
                                            BuildConfiguration::BuildType buildType)
 {
+    registerFileVariables(Constants::VAR_CURRENTPROJECT_PREFIX,
+                     QCoreApplication::translate("ProjectExplorer", "Main file of current project"),
+                     [mainFilePath]() -> QString { return mainFilePath; });
+
     registerVariable(Constants::VAR_CURRENTPROJECT_NAME,
                      QCoreApplication::translate("ProjectExplorer", "Name of current project"),
                      [projectName] { return projectName; });
diff --git a/src/plugins/projectexplorer/projectmacroexpander.h b/src/plugins/projectexplorer/projectmacroexpander.h
index e36d0bf98d..351081c97e 100644
--- a/src/plugins/projectexplorer/projectmacroexpander.h
+++ b/src/plugins/projectexplorer/projectmacroexpander.h
@@ -37,8 +37,8 @@ class Kit;
 class PROJECTEXPLORER_EXPORT ProjectMacroExpander : public Utils::MacroExpander
 {
 public:
-    ProjectMacroExpander(const QString &projectName, const Kit *kit, const QString &bcName,
-                         BuildConfiguration::BuildType buildType);
+    ProjectMacroExpander(const QString &mainFilePath, const QString &projectName, const Kit *kit,
+                         const QString &bcName, BuildConfiguration::BuildType buildType);
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
index 2ce88634ba..2136b2fe0d 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
@@ -398,7 +398,7 @@ static Utils::FileName defaultBuildDirectory(const QString &projectFilePath, con
                                              BuildConfiguration::BuildType buildType)
 {
     const QString projectName = QFileInfo(projectFilePath).completeBaseName();
-    ProjectMacroExpander expander(projectName, k, bcName, buildType);
+    ProjectMacroExpander expander(projectFilePath, projectName, k, bcName, buildType);
     QString projectDir = Project::projectDirectory(Utils::FileName::fromString(projectFilePath)).toString();
     QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
     return Utils::FileName::fromString(Utils::FileUtils::resolvePath(projectDir, buildPath));
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
index 426d5cac31..99b673003d 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
@@ -78,7 +78,7 @@ QString QmakeBuildConfiguration::shadowBuildDirectory(const QString &proFilePath
         return QString();
 
     const QString projectName = QFileInfo(proFilePath).completeBaseName();
-    ProjectMacroExpander expander(projectName, k, suffix, buildType);
+    ProjectMacroExpander expander(proFilePath, projectName, k, suffix, buildType);
     QString projectDir = Project::projectDirectory(FileName::fromString(proFilePath)).toString();
     QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
     return FileUtils::resolvePath(projectDir, buildPath);
-- 
GitLab