From 3e6fcd6063157dfda5ec49bd924b749de932cf18 Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@digia.com>
Date: Fri, 6 Sep 2013 14:39:11 +0200
Subject: [PATCH] QbsProjectManager: Support using an installed qbs.

Distributions will want to make Creator work with
their qbs package instead of adding it a second time
via the submodule, so we support that by checking for
the QBS_INSTALL_DIR environment variable.
This supersedes the current mechanism using QBS_SOURCE_DIR
and QBS_BUILD_DIR.

Change-Id: I2cff651cd23ea47b1a1434e33f80cb74ca0fc96b
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 src/plugins/plugins.pro                       |  3 ++-
 src/plugins/qbsprojectmanager/qbsproject.cpp  | 16 +++++++-------
 src/plugins/qbsprojectmanager/qbsproject.h    |  2 +-
 .../qbsprojectmanager/qbsprojectmanager.pro   | 21 +++++++++----------
 .../qbsprojectmanager/qbsprojectmanager.qbs   | 18 +++++++++-------
 src/src.qbs                                   |  5 ++---
 6 files changed, 34 insertions(+), 31 deletions(-)

diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 56194aa4758..592481aac10 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -49,7 +49,8 @@ SUBDIRS   = \
     qnx \
     clearcase
 
-exists(../shared/qbs/qbs.pro): \
+isEmpty(QBS_INSTALL_DIR): QBS_INSTALL_DIR = $$(QBS_INSTALL_DIR)
+exists(../shared/qbs/qbs.pro)|!isEmpty(QBS_INSTALL_DIR): \
     SUBDIRS += \
         qbsprojectmanager
 
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index b0e0d44bcca..8f6cde4fc8d 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -423,9 +423,9 @@ void QbsProject::parse(const QVariantMap &config, const Environment &env, const
     params.setIgnoreDifferentProjectFilePath(false);
     params.setEnvironment(env.toProcessEnvironment());
     qbs::Preferences *prefs = QbsManager::preferences();
-    const QString buildDir = qbsBuildDir();
-    params.setSearchPaths(prefs->searchPaths(buildDir));
-    params.setPluginPaths(prefs->pluginPaths(buildDir));
+    const QString qbsDir = qbsDirectory();
+    params.setSearchPaths(prefs->searchPaths(qbsDir));
+    params.setPluginPaths(prefs->pluginPaths(qbsDir));
 
     // Do the parsing:
     prepareForParsing();
@@ -658,12 +658,12 @@ void QbsProject::updateDeploymentInfo(const qbs::Project *project)
     activeTarget()->setDeploymentData(deploymentData);
 }
 
-QString QbsProject::qbsBuildDir() const
+QString QbsProject::qbsDirectory() const
 {
-    QString buildDir = Environment::systemEnvironment().value(QLatin1String("QBS_BUILD_DIR"));
-    if (buildDir.isEmpty())
-        buildDir = ICore::resourcePath() + QLatin1String("/qbs");
-    return buildDir;
+    const QString qbsInstallDir = QLatin1String(QBS_INSTALL_DIR);
+    if (!qbsInstallDir.isEmpty())
+        return qbsInstallDir;
+    return ICore::resourcePath() + QLatin1String("/qbs");
 }
 
 } // namespace Internal
diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h
index 53f07f40f4e..96f3eaa8975 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.h
+++ b/src/plugins/qbsprojectmanager/qbsproject.h
@@ -130,7 +130,7 @@ private:
     void updateQmlJsCodeModel(const qbs::ProjectData &prj);
     void updateApplicationTargets(const qbs::ProjectData &projectData);
     void updateDeploymentInfo(const qbs::Project *project);
-    QString qbsBuildDir() const;
+    QString qbsDirectory() const;
 
     QbsManager *const m_manager;
     const QString m_projectName;
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro
index 2c99bc78086..e1d9c9c5266 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro
@@ -1,18 +1,17 @@
 include(../../qtcreatorplugin.pri)
 
 # Look for qbs in the environment
-isEmpty(QBS_SOURCE_DIR): QBS_SOURCE_DIR = $$(QBS_SOURCE_DIR)
-isEmpty(QBS_BUILD_DIR): QBS_BUILD_DIR = $$(QBS_BUILD_DIR)
-# Fallback to the submodule
-isEmpty(QBS_SOURCE_DIR): QBS_SOURCE_DIR = $$PWD/../../shared/qbs
-isEmpty(QBS_BUILD_DIR): QBS_BUILD_DIR = $$IDE_BUILD_TREE/src/shared/qbs
+isEmpty(QBS_INSTALL_DIR): QBS_INSTALL_DIR = $$(QBS_INSTALL_DIR)
+isEmpty(QBS_INSTALL_DIR) {
+    QBS_SOURCE_DIR = $$PWD/../../shared/qbs
+    include($$QBS_SOURCE_DIR/src/lib/use.pri)
+    macx:QMAKE_LFLAGS += -Wl,-rpath,@loader_path/../ # Mac: fix rpath for qbscore soname
+} else {
+    include($${QBS_INSTALL_DIR}/include/qbs/use_installed.pri)
+}
+QBS_INSTALL_DIR_FWD_SLASHES = $$replace(QBS_INSTALL_DIR, \\\\, /)
+DEFINES += QBS_INSTALL_DIR=\\\"$$QBS_INSTALL_DIR_FWD_SLASHES\\\"
 
-include($$QBS_SOURCE_DIR/src/lib/use.pri)
-# Mac: fix rpath for qbscore soname
-macx:QMAKE_LFLAGS += -Wl,-rpath,@loader_path/../
-
-QBS_BUILD_DIR_FWD_SLASHES = $$replace(QBS_BUILD_DIR, \\\\, /)
-DEFINES += QBS_BUILD_DIR=\\\"$$QBS_BUILD_DIR_FWD_SLASHES\\\"
 DEFINES += \
     QBSPROJECTMANAGER_LIBRARY
 
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs
index ec3c3571545..4292d6cdd6c 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs
@@ -5,11 +5,12 @@ import "../QtcPlugin.qbs" as QtcPlugin
 QtcPlugin {
     name: "QbsProjectManager"
 
-    property var externalQbsDefines: project.useExternalQbs
-                                     ? ['QBS_BUILD_DIR="' + project.qbs_build_dir +'"'] : []
-    property var externalQbsIncludes: project.useExternalQbs ? [project.qbs_source_dir + "/src/lib"] : []
-    property var externalQbsLibraryPaths: project.useExternalQbs ? [project.qbs_build_dir + "/lib"] : []
-    property var externalQbsRPaths: project.useExternalQbs ? [project.qbs_build_dir + "/lib"] : []
+    property var externalQbsIncludes: project.useExternalQbs
+            ? [project.qbs_install_dir + "/include/qbs"] : []
+    property var externalQbsLibraryPaths: project.useExternalQbs
+            ? [project.qbs_install_dir + "/lib"] : []
+    property var externalQbsRPaths: project.useExternalQbs
+            ? [project.qbs_install_dir + "/lib"] : []
     property var externalQbsDynamicLibraries: {
         var libs = []
         if (!project.useExternalQbs)
@@ -42,8 +43,11 @@ QtcPlugin {
     }
 
     cpp.defines: base.concat([
-        'QML_BUILD_STATIC_LIB'
-    ]).concat(externalQbsDefines)
+        'QML_BUILD_STATIC_LIB',
+        'QBS_INSTALL_DIR="'
+                + (project.useExternalQbs ? project.qbs_install_dir.split("\\").join("/") : '')
+                + '"'
+    ])
     cpp.includePaths: base.concat(externalQbsIncludes)
     cpp.libraryPaths: base.concat(externalQbsLibraryPaths)
     cpp.rpaths: base.concat(externalQbsRPaths)
diff --git a/src/src.qbs b/src/src.qbs
index 1a9c26b43f1..11853ff7c56 100644
--- a/src/src.qbs
+++ b/src/src.qbs
@@ -12,9 +12,8 @@ Project {
     ]
 
     property bool qbsSubModuleExists: File.exists(qbsProject.qbsBaseDir + "/qbs.qbs")
-    property path qbs_build_dir: qbs.getenv("QBS_BUILD_DIR")
-    property path qbs_source_dir: qbs.getenv("QBS_SOURCE_DIR")
-    property bool useExternalQbs: qbs_build_dir && qbs_source_dir
+    property path qbs_install_dir: qbs.getenv("QBS_INSTALL_DIR")
+    property bool useExternalQbs: qbs_install_dir
     property bool buildQbsProjectManager: useExternalQbs || qbsSubModuleExists
     Project {
         name: "qbs"
-- 
GitLab