Qt4ProjectBuildConfiguration: Handle env vars in working dir correctly.

Task-Nr: QTCREATORBUG-2618

Reviewed-By: hunger
This commit is contained in:
dt
2010-10-06 13:47:01 +02:00
parent 1e15e030b9
commit eadd51fa75
4 changed files with 45 additions and 9 deletions

View File

@@ -175,11 +175,24 @@ void Qt4BuildConfiguration::ctor()
if (m_buildDirectory == target()->project()->projectDirectory()) if (m_buildDirectory == target()->project()->projectDirectory())
m_shadowBuild = false; m_shadowBuild = false;
m_lastEmmitedBuildDirectory = buildDirectory();
connect(this, SIGNAL(environmentChanged()),
this, SLOT(emitBuildDirectoryChanged()));
QtVersionManager *vm = QtVersionManager::instance(); QtVersionManager *vm = QtVersionManager::instance();
connect(vm, SIGNAL(qtVersionsChanged(QList<int>)), connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
this, SLOT(qtVersionsChanged(QList<int>))); this, SLOT(qtVersionsChanged(QList<int>)));
} }
void Qt4BuildConfiguration::emitBuildDirectoryChanged()
{
if (buildDirectory() != m_lastEmmitedBuildDirectory) {
m_lastEmmitedBuildDirectory = buildDirectory();
emit buildDirectoryChanged();
}
}
void Qt4BuildConfiguration::pickValidQtVersion() void Qt4BuildConfiguration::pickValidQtVersion()
{ {
QList<QtVersion *> versions = QtVersionManager::instance()->versionsForTargetId(qt4Target()->id()); QList<QtVersion *> versions = QtVersionManager::instance()->versionsForTargetId(qt4Target()->id());
@@ -198,7 +211,10 @@ Utils::Environment Qt4BuildConfiguration::baseEnvironment() const
{ {
Utils::Environment env = BuildConfiguration::baseEnvironment(); Utils::Environment env = BuildConfiguration::baseEnvironment();
qtVersion()->addToEnvironment(env); 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(); ToolChain *tc = toolChain();
if (tc) if (tc)
@@ -206,8 +222,8 @@ Utils::Environment Qt4BuildConfiguration::baseEnvironment() const
return env; return env;
} }
/// returns the build directory /// returns the unexpanded build directory
QString Qt4BuildConfiguration::buildDirectory() const QString Qt4BuildConfiguration::rawBuildDirectory() const
{ {
QString workingDirectory; QString workingDirectory;
if (m_shadowBuild) { if (m_shadowBuild) {
@@ -221,6 +237,12 @@ QString Qt4BuildConfiguration::buildDirectory() const
return workingDirectory; 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 /// If only a sub tree should be build this function returns which sub node
/// should be build /// should be build
/// \see Qt4BuildConfiguration::setSubNodeBuild /// \see Qt4BuildConfiguration::setSubNodeBuild
@@ -261,7 +283,7 @@ QString Qt4BuildConfiguration::shadowBuildDirectory() const
void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory) void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory)
{ {
QtVersion *version = qtVersion(); QtVersion *version = qtVersion();
QString directoryToSet = QDir::fromNativeSeparators(buildDirectory); QString directoryToSet = buildDirectory;
bool toSet = (shadowBuild && version->isValid() && version->supportsShadowBuilds()); bool toSet = (shadowBuild && version->isValid() && version->supportsShadowBuilds());
if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet) if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet)
return; return;
@@ -270,7 +292,7 @@ void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const Q
m_buildDirectory = directoryToSet; m_buildDirectory = directoryToSet;
emit environmentChanged(); emit environmentChanged();
emit buildDirectoryChanged(); emitBuildDirectoryChanged();
emit proFileEvaluateNeeded(this); emit proFileEvaluateNeeded(this);
} }
@@ -346,6 +368,7 @@ void Qt4BuildConfiguration::setQtVersion(QtVersion *version)
emit proFileEvaluateNeeded(this); emit proFileEvaluateNeeded(this);
emit qtVersionChanged(); emit qtVersionChanged();
emit environmentChanged(); emit environmentChanged();
emitBuildDirectoryChanged();
} }
void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type) void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type)
@@ -359,6 +382,7 @@ void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolCha
emit proFileEvaluateNeeded(this); emit proFileEvaluateNeeded(this);
emit toolChainTypeChanged(); emit toolChainTypeChanged();
emit environmentChanged(); emit environmentChanged();
emitBuildDirectoryChanged();
} }
ProjectExplorer::ToolChain::ToolChainType Qt4BuildConfiguration::toolChainType() const ProjectExplorer::ToolChain::ToolChainType Qt4BuildConfiguration::toolChainType() const

View File

@@ -133,6 +133,7 @@ signals:
private slots: private slots:
void qtVersionsChanged(const QList<int> &changedVersions); void qtVersionsChanged(const QList<int> &changedVersions);
void emitBuildDirectoryChanged();
protected: protected:
Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source); Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source);
@@ -142,9 +143,11 @@ protected:
private: private:
void ctor(); void ctor();
void pickValidQtVersion(); void pickValidQtVersion();
QString rawBuildDirectory() const;
bool m_shadowBuild; bool m_shadowBuild;
QString m_buildDirectory; QString m_buildDirectory;
QString m_lastEmmitedBuildDirectory;
int m_qtVersionId; int m_qtVersionId;
int m_toolChainType; int m_toolChainType;
QtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration; QtVersion::QmakeBuildConfigs m_qmakeBuildConfiguration;

View File

@@ -100,6 +100,9 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Project *project)
connect(m_ui->manageQtVersionPushButtons, SIGNAL(clicked()), connect(m_ui->manageQtVersionPushButtons, SIGNAL(clicked()),
this, SLOT(manageQtVersions())); this, SLOT(manageQtVersions()));
connect(project, SIGNAL(environmentChanged()),
this, SLOT(environmentChanged()));
connect(project, SIGNAL(buildDirectoryInitialized()), connect(project, SIGNAL(buildDirectoryInitialized()),
this, SLOT(updateImportLabel())); this, SLOT(updateImportLabel()));
} }
@@ -135,6 +138,11 @@ void Qt4ProjectConfigWidget::updateDetails()
} }
} }
void Qt4ProjectConfigWidget::environmentChanged()
{
m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment());
}
void Qt4ProjectConfigWidget::updateShadowBuildUi() void Qt4ProjectConfigWidget::updateShadowBuildUi()
{ {
m_ui->shadowBuildCheckBox->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds()); m_ui->shadowBuildCheckBox->setEnabled(m_buildConfiguration->qtVersion()->supportsShadowBuilds());
@@ -173,6 +181,7 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
this, SLOT(toolChainTypeChanged())); this, SLOT(toolChainTypeChanged()));
} }
m_buildConfiguration = static_cast<Qt4BuildConfiguration *>(bc); m_buildConfiguration = static_cast<Qt4BuildConfiguration *>(bc);
m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment());
connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()), connect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()),
this, SLOT(buildDirectoryChanged())); this, SLOT(buildDirectoryChanged()));
@@ -268,7 +277,7 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked)
bool b = m_ui->shadowBuildCheckBox->isChecked(); bool b = m_ui->shadowBuildCheckBox->isChecked();
m_ignoreChange = true; m_ignoreChange = true;
m_buildConfiguration->setShadowBuildAndDirectory(b, QDir::cleanPath(m_ui->shadowBuildDirEdit->path())); m_buildConfiguration->setShadowBuildAndDirectory(b, m_ui->shadowBuildDirEdit->rawPath());
m_ignoreChange = false; m_ignoreChange = false;
updateDetails(); updateDetails();
@@ -277,11 +286,10 @@ void Qt4ProjectConfigWidget::shadowBuildClicked(bool checked)
void Qt4ProjectConfigWidget::shadowBuildEdited() void Qt4ProjectConfigWidget::shadowBuildEdited()
{ {
if (m_buildConfiguration->shadowBuildDirectory() == m_ui->shadowBuildDirEdit->path()) if (m_buildConfiguration->shadowBuildDirectory() == m_ui->shadowBuildDirEdit->rawPath())
return; return;
m_ignoreChange = true; m_ignoreChange = true;
m_buildConfiguration->setShadowBuildAndDirectory(m_buildConfiguration->shadowBuild(), m_buildConfiguration->setShadowBuildAndDirectory(m_buildConfiguration->shadowBuild(), m_ui->shadowBuildDirEdit->rawPath());
QDir::cleanPath(m_ui->shadowBuildDirEdit->path()));
m_ignoreChange = false; m_ignoreChange = false;
// if the directory already exists // if the directory already exists

View File

@@ -77,6 +77,7 @@ private slots:
void buildDirectoryChanged(); void buildDirectoryChanged();
void toolChainTypeChanged(); void toolChainTypeChanged();
void updateImportLabel(); void updateImportLabel();
void environmentChanged();
private: private:
void updateDetails(); void updateDetails();
void updateToolChainCombo(); void updateToolChainCombo();