From eadd51fa751fb3effc23c9099a7fbccc3d499971 Mon Sep 17 00:00:00 2001 From: dt Date: Wed, 6 Oct 2010 13:47:01 +0200 Subject: [PATCH] Qt4ProjectBuildConfiguration: Handle env vars in working dir correctly. Task-Nr: QTCREATORBUG-2618 Reviewed-By: hunger --- .../qt4buildconfiguration.cpp | 34 ++++++++++++++++--- .../qt4projectmanager/qt4buildconfiguration.h | 3 ++ .../qt4projectconfigwidget.cpp | 16 ++++++--- .../qt4projectconfigwidget.h | 1 + 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 06c3b153383..a4964e035cc 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -175,11 +175,24 @@ void Qt4BuildConfiguration::ctor() if (m_buildDirectory == target()->project()->projectDirectory()) m_shadowBuild = false; + m_lastEmmitedBuildDirectory = buildDirectory(); + + connect(this, SIGNAL(environmentChanged()), + this, SLOT(emitBuildDirectoryChanged())); + QtVersionManager *vm = QtVersionManager::instance(); connect(vm, SIGNAL(qtVersionsChanged(QList)), this, SLOT(qtVersionsChanged(QList))); } +void Qt4BuildConfiguration::emitBuildDirectoryChanged() +{ + if (buildDirectory() != m_lastEmmitedBuildDirectory) { + m_lastEmmitedBuildDirectory = buildDirectory(); + emit buildDirectoryChanged(); + } +} + void Qt4BuildConfiguration::pickValidQtVersion() { QList versions = QtVersionManager::instance()->versionsForTargetId(qt4Target()->id()); @@ -198,7 +211,10 @@ Utils::Environment Qt4BuildConfiguration::baseEnvironment() const { Utils::Environment env = BuildConfiguration::baseEnvironment(); qtVersion()->addToEnvironment(env); - env.set(QLatin1String("BUILDDIR"), QDir::toNativeSeparators(buildDirectory())); + + // We can't call buildDirectory() since that uses environment() to expand, + // thus calling baseEnvironment() again + env.set(QLatin1String("BUILDDIR"), QDir::toNativeSeparators(env.expandVariables(rawBuildDirectory()))); ToolChain *tc = toolChain(); if (tc) @@ -206,8 +222,8 @@ Utils::Environment Qt4BuildConfiguration::baseEnvironment() const return env; } -/// returns the build directory -QString Qt4BuildConfiguration::buildDirectory() const +/// returns the unexpanded build directory +QString Qt4BuildConfiguration::rawBuildDirectory() const { QString workingDirectory; if (m_shadowBuild) { @@ -221,6 +237,12 @@ QString Qt4BuildConfiguration::buildDirectory() const return workingDirectory; } +/// returns the build directory +QString Qt4BuildConfiguration::buildDirectory() const +{ + return QDir::cleanPath(environment().expandVariables(rawBuildDirectory())); +} + /// If only a sub tree should be build this function returns which sub node /// should be build /// \see Qt4BuildConfiguration::setSubNodeBuild @@ -261,7 +283,7 @@ QString Qt4BuildConfiguration::shadowBuildDirectory() const void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory) { QtVersion *version = qtVersion(); - QString directoryToSet = QDir::fromNativeSeparators(buildDirectory); + QString directoryToSet = buildDirectory; bool toSet = (shadowBuild && version->isValid() && version->supportsShadowBuilds()); if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet) return; @@ -270,7 +292,7 @@ void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const Q m_buildDirectory = directoryToSet; emit environmentChanged(); - emit buildDirectoryChanged(); + emitBuildDirectoryChanged(); emit proFileEvaluateNeeded(this); } @@ -346,6 +368,7 @@ void Qt4BuildConfiguration::setQtVersion(QtVersion *version) emit proFileEvaluateNeeded(this); emit qtVersionChanged(); emit environmentChanged(); + emitBuildDirectoryChanged(); } void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type) @@ -359,6 +382,7 @@ void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolCha emit proFileEvaluateNeeded(this); emit toolChainTypeChanged(); emit environmentChanged(); + emitBuildDirectoryChanged(); } ProjectExplorer::ToolChain::ToolChainType Qt4BuildConfiguration::toolChainType() const diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index 135518558c3..ee990a24496 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -133,6 +133,7 @@ signals: private slots: void qtVersionsChanged(const QList &changedVersions); + void emitBuildDirectoryChanged(); protected: Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source); @@ -142,9 +143,11 @@ protected: private: void ctor(); void pickValidQtVersion(); + QString rawBuildDirectory() const; bool m_shadowBuild; QString m_buildDirectory; + QString m_lastEmmitedBuildDirectory; int m_qtVersionId; int m_toolChainType; QtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration; diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 3734bcad1a8..ccf79c9b057 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -100,6 +100,9 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Project *project) connect(m_ui->manageQtVersionPushButtons, SIGNAL(clicked()), this, SLOT(manageQtVersions())); + connect(project, SIGNAL(environmentChanged()), + this, SLOT(environmentChanged())); + connect(project, SIGNAL(buildDirectoryInitialized()), this, SLOT(updateImportLabel())); } @@ -135,6 +138,11 @@ void Qt4ProjectConfigWidget::updateDetails() } } +void Qt4ProjectConfigWidget::environmentChanged() +{ + m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment()); +} + void Qt4ProjectConfigWidget::updateShadowBuildUi() { m_ui->shadowBuildCheckBox->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds()); @@ -173,6 +181,7 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc) this, SLOT(toolChainTypeChanged())); } m_buildConfiguration = static_cast(bc); + m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment()); connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()), this, SLOT(buildDirectoryChanged())); @@ -268,7 +277,7 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked) bool b = m_ui->shadowBuildCheckBox->isChecked(); m_ignoreChange = true; - m_buildConfiguration->setShadowBuildAndDirectory(b, QDir::cleanPath(m_ui->shadowBuildDirEdit->path())); + m_buildConfiguration->setShadowBuildAndDirectory(b, m_ui->shadowBuildDirEdit->rawPath()); m_ignoreChange = false; updateDetails(); @@ -277,11 +286,10 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked) void Qt4ProjectConfigWidget::shadowBuildEdited() { - if (m_buildConfiguration->shadowBuildDirectory() == m_ui->shadowBuildDirEdit->path()) + if (m_buildConfiguration->shadowBuildDirectory() == m_ui->shadowBuildDirEdit->rawPath()) return; m_ignoreChange = true; - m_buildConfiguration->setShadowBuildAndDirectory(m_buildConfiguration->shadowBuild(), - QDir::cleanPath(m_ui->shadowBuildDirEdit->path())); + m_buildConfiguration->setShadowBuildAndDirectory(m_buildConfiguration->shadowBuild(), m_ui->shadowBuildDirEdit->rawPath()); m_ignoreChange = false; // if the directory already exists diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h index 7aabd98b389..a93d5dd3326 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h @@ -77,6 +77,7 @@ private slots: void buildDirectoryChanged(); void toolChainTypeChanged(); void updateImportLabel(); + void environmentChanged(); private: void updateDetails(); void updateToolChainCombo();