diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 250a4446a0c1e4a6774f83ecf700cc945bc2cf3d..c3a90a53c899516462304473cdd0521e2ebecd52 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -149,7 +149,19 @@ bool MakeStep::init() // we should stop the clean queue // That is mostly so that rebuild works on a already clean project setIgnoreReturnValue(m_clean); - QStringList args = m_userArgs; + QStringList args; + + ProjectExplorer::ToolChain *toolchain = bc->toolChain(); + + if (bc->subNodeBuild()){ + if(!bc->subNodeBuild()->makefile().isEmpty()) { + args << "-f" << bc->subNodeBuild()->makefile(); + } + } else if (!bc->makefile().isEmpty()) { + args << "-f" << bc->makefile(); + } + + args.append(m_userArgs); if (!m_clean) { if (!bc->defaultMakeTarget().isEmpty()) args << bc->defaultMakeTarget(); @@ -159,7 +171,6 @@ bool MakeStep::init() // FIXME doing this without the user having a way to override this is rather bad // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change - ProjectExplorer::ToolChain *toolchain = bc->toolChain(); if (toolchain) { if (toolchain->type() != ProjectExplorer::ToolChain::MSVC && diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index ec925b201ebebc0ec54a75d1c577ad9054ba3429..bb8c97a36c5359f6b39d8f239521e925151e02ad 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -165,6 +165,7 @@ bool QMakeStep::init() QStringList args = allArguments(); QString workingDirectory; + if (qt4bc->subNodeBuild()) workingDirectory = qt4bc->subNodeBuild()->buildDir(); else @@ -174,10 +175,24 @@ bool QMakeStep::init() // Check whether we need to run qmake m_needToRunQMake = true; - if (QDir(workingDirectory).exists(QLatin1String("Makefile"))) { - QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory); + QString makefile = workingDirectory; + + if (qt4bc->subNodeBuild()) { + if (!qt4bc->subNodeBuild()->makefile().isEmpty()) { + makefile.append(qt4bc->subNodeBuild()->makefile()); + } else { + makefile.append("/Makefile"); + } + } else if (!qt4bc->makefile().isEmpty()) { + makefile.append(qt4bc->makefile()); + } else { + makefile.append("/Makefile"); + } + + if (QFileInfo(makefile).exists()) { + QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile); if (qtVersion->qmakeCommand() == qmakePath) { - m_needToRunQMake = !qt4bc->compareToImportFrom(workingDirectory); + m_needToRunQMake = !qt4bc->compareToImportFrom(makefile); } } diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 1b783a7233814ac94af4969a0f8104e093e474e0..00f4f752051b792636ac89ad1a4968fee79e9513 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -317,6 +317,13 @@ QString Qt4BuildConfiguration::defaultMakeTarget() const return QString(); } +QString Qt4BuildConfiguration::makefile() const +{ + if (qt4Target()->id() == Constants::S60_DEVICE_TARGET_ID) + return QString(); + return qt4Target()->qt4Project()->rootProjectNode()->makefile(); +} + QtVersion *Qt4BuildConfiguration::qtVersion() const { QtVersionManager *vm = QtVersionManager::instance(); @@ -455,21 +462,22 @@ void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &changedVersions) } // returns true if both are equal -bool Qt4BuildConfiguration::compareToImportFrom(const QString &workingDirectory) +bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) { QMakeStep *qs = qmakeStep(); - if (QDir(workingDirectory).exists(QLatin1String("Makefile")) && qs) { - QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory); + if (QFileInfo(makefile).exists() && qs) { + QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile); QtVersion *version = qtVersion(); if (version->qmakeCommand() == qmakePath) { // same qtversion QPair<QtVersion::QmakeBuildConfigs, QStringList> result = - QtVersionManager::scanMakeFile(workingDirectory, version->defaultBuildConfig()); + QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); if (qmakeBuildConfiguration() == result.first) { // The qmake Build Configuration are the same, // now compare arguments lists // we have to compare without the spec/platform cmd argument // and compare that on its own + QString workingDirectory = QFileInfo(makefile).absolutePath(); QString actualSpec = extractSpecFromArgumentList(qs->userArguments(), workingDirectory, version); if (actualSpec.isEmpty()) { // Easy one: the user has chosen not to override the settings diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index 135518558c3bdaee96a3c1081d62af88170c54a3..09584b49e2adbed7a89513d65cf1e46fdd12f56f 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -102,8 +102,9 @@ public: QString makeCommand() const; QString defaultMakeTarget() const; + QString makefile() const; - bool compareToImportFrom(const QString &workingDirectory); + bool compareToImportFrom(const QString &makefile); static QStringList removeQMLInspectorFromArgumentList(const QStringList &old); static QStringList removeSpecFromArgumentList(const QStringList &old); static QString extractSpecFromArgumentList(const QStringList &list, QString directory, QtVersion *version); diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 888c45f26524710eec649affc5b140467e0f8c41..81a2c348fcab483cefb8517eeadbdbf611f8fdcd 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -1208,6 +1208,13 @@ TargetInformation Qt4ProFileNode::targetInformation(const QString &fileName) con return qt4ProFileNode->targetInformation(); } +QString Qt4ProFileNode::makefile() const +{ + if (m_varValues[Makefile].isEmpty()) + return QString(); + return m_varValues[Makefile].first(); +} + /*! \class Qt4ProFileNode Implements abstract ProjectNode class @@ -1593,6 +1600,7 @@ void Qt4ProFileNode::applyEvaluate(bool parseResult, bool async) newVarValues[ConfigVar] = m_readerExact->values(QLatin1String("CONFIG")); newVarValues[QmlImportPathVar] = m_readerExact->absolutePathValues( QLatin1String("QML_IMPORT_PATH"), m_projectDir); + newVarValues[Makefile] = m_readerExact->values("MAKEFILE"); if (m_varValues != newVarValues) { m_varValues = newVarValues; diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index f9bdfd29c50c33633ca86646a3a8fd9a34d029d5..8c7f707a2d223694e82501c519830b8cb8285a2b 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -95,7 +95,8 @@ enum Qt4Variable { PrecompiledHeaderVar, LibDirectoriesVar, ConfigVar, - QmlImportPathVar + QmlImportPathVar, + Makefile }; class Qt4PriFileNode; @@ -278,6 +279,8 @@ public: TargetInformation targetInformation(const QString &fileName) const; TargetInformation targetInformation() const; + QString makefile() const; + void update(); void scheduleUpdate(); diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 3734bcad1a8ea936d87956fa689fb388a99f1fc2..3b542ce76b95ec777f75b450f7144964c1abaa4a 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -299,7 +299,13 @@ void Qt4ProjectConfigWidget::updateImportLabel() QtVersionManager *vm = QtVersionManager::instance(); // we only show if we actually have a qmake and makestep if (m_buildConfiguration->qmakeStep() && m_buildConfiguration->makeStep()) { - QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(m_buildConfiguration->buildDirectory()); + QString makefile = m_buildConfiguration->buildDirectory(); + if (m_buildConfiguration->makefile().isEmpty()) + makefile.append("/Makefile"); + else + makefile.append(m_buildConfiguration->makefile()); + + QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile); QtVersion *version = m_buildConfiguration->qtVersion(); // check that there's a makefile if (!qmakePath.isEmpty()) { @@ -318,7 +324,7 @@ void Qt4ProjectConfigWidget::updateImportLabel() delete newVersion; } else { // check that the qmake flags, arguments match - visible = !m_buildConfiguration->compareToImportFrom(m_buildConfiguration->buildDirectory()); + visible = !m_buildConfiguration->compareToImportFrom(makefile); targetMatches = true; } } else { @@ -377,7 +383,13 @@ void Qt4ProjectConfigWidget::importLabelClicked() return; QString directory = m_buildConfiguration->buildDirectory(); if (!directory.isEmpty()) { - QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(directory); + QString makefile = directory; + if (m_buildConfiguration->makefile().isEmpty()) + makefile.append("/Makefile"); + else + makefile.append(m_buildConfiguration->makefile()); + + QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile); if (!qmakePath.isEmpty()) { QtVersionManager *vm = QtVersionManager::instance(); QtVersion *version = vm->qtVersionForQMakeBinary(qmakePath); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 2e9fb6ce027bb894ff0f71384a537db58067c357..bbaa22eb97c5e0caadecf71b1a96c5e2d50fe112 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -803,12 +803,12 @@ void QtVersion::updateSourcePath() // That is returns the directory // To find out whether we already have a qtversion for that directory call // QtVersion *QtVersionManager::qtVersionForDirectory(const QString directory); -QString QtVersionManager::findQMakeBinaryFromMakefile(const QString &directory) +QString QtVersionManager::findQMakeBinaryFromMakefile(const QString &makefile) { bool debugAdding = false; - QFile makefile(directory + "/Makefile" ); - if (makefile.exists() && makefile.open(QFile::ReadOnly)) { - QTextStream ts(&makefile); + QFile fi(makefile); + if (fi.exists() && fi.open(QFile::ReadOnly)) { + QTextStream ts(&fi); QRegExp r1("QMAKE\\s*=(.*)"); while (!ts.atEnd()) { QString line = ts.readLine(); @@ -854,32 +854,31 @@ void dumpQMakeAssignments(const QList<QMakeAssignment> &list) } } -bool QtVersionManager::makefileIsFor(const QString &directory, const QString &proFile) +bool QtVersionManager::makefileIsFor(const QString &makefile, const QString &proFile) { if (proFile.isEmpty()) return true; - QString line = findQMakeLine(directory, QLatin1String("# Project:")).trimmed(); + QString line = findQMakeLine(makefile, QLatin1String("# Project:")).trimmed(); if (line.isEmpty()) return false; - line = line.mid(line.indexOf(QChar(':')) + 1); line = line.trimmed(); - QFileInfo srcFileInfo(QDir(directory), line); + QFileInfo srcFileInfo(QFileInfo(makefile).absoluteDir(), line); QFileInfo proFileInfo(proFile); return srcFileInfo == proFileInfo; } -QPair<QtVersion::QmakeBuildConfigs, QStringList> QtVersionManager::scanMakeFile(const QString &directory, QtVersion::QmakeBuildConfigs defaultBuildConfig) +QPair<QtVersion::QmakeBuildConfigs, QStringList> QtVersionManager::scanMakeFile(const QString &makefile, QtVersion::QmakeBuildConfigs defaultBuildConfig) { if (debug) qDebug()<<"ScanMakeFile, the gory details:"; QtVersion::QmakeBuildConfigs result = defaultBuildConfig; QStringList result2; - QString line = findQMakeLine(directory, QLatin1String("# Command:")); + QString line = findQMakeLine(makefile, QLatin1String("# Command:")); if (!line.isEmpty()) { if (debug) qDebug()<<"Found line"<<line; @@ -930,11 +929,11 @@ QPair<QtVersion::QmakeBuildConfigs, QStringList> QtVersionManager::scanMakeFile( return qMakePair(result, result2); } -QString QtVersionManager::findQMakeLine(const QString &directory, const QString &key) +QString QtVersionManager::findQMakeLine(const QString &makefile, const QString &key) { - QFile makefile(directory + QLatin1String("/Makefile" )); - if (makefile.exists() && makefile.open(QFile::ReadOnly)) { - QTextStream ts(&makefile); + QFile fi(makefile); + if (fi.exists() && fi.open(QFile::ReadOnly)) { + QTextStream ts(&fi); while (!ts.atEnd()) { const QString line = ts.readLine(); if (line.startsWith(key)) diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 1c90205f0e5f54769f47f0cfaae5d6b1998cbde0..b1bb046bcb27db334149b960e27990a2fc856580 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -250,10 +250,10 @@ public: QSet<QString> supportedTargetIds() const; // Static Methods - static bool makefileIsFor(const QString &directory, const QString &proFile); - static QPair<QtVersion::QmakeBuildConfigs, QStringList> scanMakeFile(const QString &directory, + static bool makefileIsFor(const QString &makefile, const QString &proFile); + static QPair<QtVersion::QmakeBuildConfigs, QStringList> scanMakeFile(const QString &makefile, QtVersion::QmakeBuildConfigs defaultBuildConfig); - static QString findQMakeBinaryFromMakefile(const QString &directory); + static QString findQMakeBinaryFromMakefile(const QString &makefile); bool isValidId(int id) const; signals: diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index a5862f5390ea7af0776074f47474ca223980fe25..26b66811db3c53e0d3eb559424e0d6afdc0d6540 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -379,11 +379,11 @@ TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, con return results; // Check for in-source builds first: - QString qmakeBinary = QtVersionManager::findQMakeBinaryFromMakefile(directory); + QString qmakeBinary = QtVersionManager::findQMakeBinaryFromMakefile(directory + "/Makefile"); QDir dir(directory); // Recurse into subdirectories: - if (qmakeBinary.isNull() || !QtVersionManager::makefileIsFor(directory, proFile)) { + if (qmakeBinary.isNull() || !QtVersionManager::makefileIsFor(directory + "/Makefile", proFile)) { QStringList subDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); foreach (QString subDir, subDirs) results.append(recursivelyCheckDirectoryForBuild(dir.absoluteFilePath(subDir), @@ -409,7 +409,7 @@ TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, con } QPair<QtVersion::QmakeBuildConfigs, QStringList> result = - QtVersionManager::scanMakeFile(directory, info.version->defaultBuildConfig()); + QtVersionManager::scanMakeFile(directory + "/Makefile", info.version->defaultBuildConfig()); info.buildConfig = result.first; info.additionalArguments = Qt4BuildConfiguration::removeSpecFromArgumentList(result.second);