From c883498e3bc440a9dff473156cc739441e05d482 Mon Sep 17 00:00:00 2001
From: Joerg Bornemann <joerg.bornemann@digia.com>
Date: Wed, 24 Jul 2013 16:47:02 +0200
Subject: [PATCH] let "build file" only run one build step

For example, C++ source files will be compiled but the build
stops before linking.

Task-number: QBS-283

Change-Id: If0573ea58b9a047980aab0fd8e4828f3d0c315b8
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 .../qbsprojectmanager/qbsbuildconfiguration.cpp    | 10 ++++++++++
 .../qbsprojectmanager/qbsbuildconfiguration.h      |  4 ++++
 src/plugins/qbsprojectmanager/qbsbuildstep.cpp     |  2 ++
 src/plugins/qbsprojectmanager/qbsbuildstep.h       |  1 +
 .../qbsprojectmanager/qbsprojectmanagerplugin.cpp  | 14 +++++++++++---
 .../qbsprojectmanager/qbsprojectmanagerplugin.h    |  4 +++-
 6 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
index 35769432c98..7f8ed0cb6fe 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
@@ -193,6 +193,16 @@ QStringList QbsBuildConfiguration::changedFiles() const
     return m_changedFiles;
 }
 
+void QbsBuildConfiguration::setActiveFileTags(const QStringList &fileTags)
+{
+    m_activeFileTags = fileTags;
+}
+
+QStringList QbsBuildConfiguration::activeFileTags() const
+{
+    return m_activeFileTags;
+}
+
 void QbsBuildConfiguration::setProducts(const QStringList &products)
 {
     m_products = products;
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
index 6304bf7adcc..022165b7fe6 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h
@@ -73,6 +73,9 @@ public:
     void setChangedFiles(const QStringList &files);
     QStringList changedFiles() const;
 
+    void setActiveFileTags(const QStringList &fileTags);
+    QStringList activeFileTags() const;
+
     void setProducts(const QStringList &products);
     QStringList products() const;
 
@@ -99,6 +102,7 @@ private:
     bool m_parsingError;
     Utils::FileName m_buildDirectory;
     QStringList m_changedFiles;
+    QStringList m_activeFileTags;
     QStringList m_products;
 
     friend class QbsBuildConfigurationFactory;
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
index 9c6a4ceb0ea..d5762397686 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
@@ -107,6 +107,7 @@ bool QbsBuildStep::init()
         m_parser->appendOutputParser(parser);
 
     m_changedFiles = bc->changedFiles();
+    m_activeFileTags = bc->activeFileTags();
     m_products = bc->products();
 
     connect(m_parser, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat)),
@@ -124,6 +125,7 @@ void QbsBuildStep::run(QFutureInterface<bool> &fi)
     QbsProject *pro = static_cast<QbsProject *>(project());
     qbs::BuildOptions options(m_qbsBuildOptions);
     options.setChangedFiles(m_changedFiles);
+    options.setActiveFileTags(m_activeFileTags);
 
     m_job = pro->build(options, m_products);
 
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h
index fce407b6584..a6e6827da94 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.h
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h
@@ -100,6 +100,7 @@ private:
 
     // Temporary data:
     QStringList m_changedFiles;
+    QStringList m_activeFileTags;
     QStringList m_products;
 
     QFutureInterface<bool> *m_fi;
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
index bb32ff93379..ebd9bb589b1 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
@@ -301,7 +301,7 @@ void QbsProjectManagerPlugin::buildFileContextMenu()
     QTC_ASSERT(m_currentNode, return);
     QTC_ASSERT(m_currentProject, return);
 
-    buildFiles(m_currentProject, QStringList(m_currentNode->path()));
+    buildSingleFile(m_currentProject, m_currentNode->path());
 }
 
 void QbsProjectManagerPlugin::buildFile()
@@ -316,7 +316,7 @@ void QbsProjectManagerPlugin::buildFile()
     if (!project || file.isEmpty())
         return;
 
-    buildFiles(project, QStringList(file));
+    buildSingleFile(project, file);
 }
 
 void QbsProjectManagerPlugin::buildProductContextMenu()
@@ -345,7 +345,8 @@ void QbsProjectManagerPlugin::buildProduct()
     buildProducts(project, QStringList(product->displayName()));
 }
 
-void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList &files)
+void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList &files,
+                                         const QStringList &activeFileTags)
 {
     QTC_ASSERT(project, return);
     QTC_ASSERT(!files.isEmpty(), return);
@@ -362,6 +363,7 @@ void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList
         return;
 
     bc->setChangedFiles(files);
+    bc->setActiveFileTags(activeFileTags);
     bc->setProducts(QStringList());
 
     const Core::Id buildStep = Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
@@ -372,6 +374,12 @@ void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList
     bc->setChangedFiles(QStringList());
 }
 
+void QbsProjectManagerPlugin::buildSingleFile(QbsProject *project, const QString &file)
+{
+    buildFiles(project, QStringList(file), QStringList()
+               << QLatin1String("obj") << QLatin1String("hpp"));
+}
+
 void QbsProjectManagerPlugin::buildProducts(QbsProject *project, const QStringList &products)
 {
     QTC_ASSERT(project, return);
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h
index 9951f30a2fa..807b29b5d4e 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.h
@@ -80,7 +80,9 @@ private slots:
     void reparseCurrentProject();
 
 private:
-    void buildFiles(QbsProject *project, const QStringList &files);
+    void buildFiles(QbsProject *project, const QStringList &files,
+                    const QStringList &activeFileTags);
+    void buildSingleFile(QbsProject *project, const QString &file);
     void buildProducts(QbsProject *project, const QStringList &products);
 
     QbsManager *m_manager;
-- 
GitLab