From c42b12c98e1b27ac7146c31fdcdbe53915cab2c8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 24 Oct 2016 21:01:22 +0200 Subject: [PATCH] introduce ProFileReader::fixifiedValues() ... and use it for PRECOMPILED_HEADER, INCLUDEPATH, and install target collection, instead of abusing ProFileReader::absoluteFileValues(). specifically, this falls back to a location in the build directory when the path is relative and the file cannot be found. in qmake, this somewhat weird behavior ensures that chaining extra compilers actually works (and also ensures a lot of frustration with non-clean source dirs ...). this also fixes INSTALLS with .CONFIG no_check_exists. Task-number: QTCREATORBUG-14848 Change-Id: Iaf9483c0c4586c464bd10a2aea7cbac7e0df1ec5 Reviewed-by: Tobias Hunger Reviewed-by: Christian Kandeler --- .../qmakeprojectmanager/qmakenodes.cpp | 29 ++++++------------- src/plugins/qmakeprojectmanager/qmakenodes.h | 2 +- src/shared/proparser/profileevaluator.cpp | 18 ++++++++++++ src/shared/proparser/profileevaluator.h | 2 ++ 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 878553e96b3..0390f8ef6bc 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -1932,7 +1932,8 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input) } result->targetInformation = targetInformation(input.readerExact, readerBuildPass, input.buildDirectory, input.projectFilePath.toString()); - result->installsList = installsList(readerBuildPass, input.projectFilePath.toString(), input.projectDir); + result->installsList = installsList(readerBuildPass, input.projectFilePath.toString(), + input.projectDir, input.buildDirectory); // update other variables result->newVarValues[DefinesVar] = input.readerExact->values(QLatin1String("DEFINES")); @@ -1955,11 +1956,8 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input) result->newVarValues[ExactResourceVar] = fileListForVar(input.readerExact, 0, QLatin1String("RESOURCES"), input.projectDir, input.buildDirectory); result->newVarValues[PkgConfigVar] = input.readerExact->values(QLatin1String("PKGCONFIG")); - result->newVarValues[PrecompiledHeaderVar] = - input.readerExact->absoluteFileValues(QLatin1String("PRECOMPILED_HEADER"), - input.projectDir, - QStringList() << input.projectDir, - 0); + result->newVarValues[PrecompiledHeaderVar] = input.readerExact->fixifiedValues( + QLatin1String("PRECOMPILED_HEADER"), input.projectDir, input.buildDirectory); result->newVarValues[LibDirectoriesVar] = libDirectories(input.readerExact); result->newVarValues[ConfigVar] = input.readerExact->values(QLatin1String("CONFIG")); result->newVarValues[QmlImportPathVar] = input.readerExact->absolutePathValues( @@ -2308,7 +2306,7 @@ QStringList QmakeProFileNode::includePaths(QtSupport::ProFileReader *reader, con paths.append(cxxflags.mid(2)); } - paths.append(reader->absolutePathValues(QLatin1String("INCLUDEPATH"), projectDir)); + paths.append(reader->fixifiedValues(QLatin1String("INCLUDEPATH"), projectDir, buildDir)); // paths already contains moc dir and ui dir, due to corrrectly parsing uic.prf and moc.prf // except if those directories don't exist at the time of parsing // thus we add those directories manually (without checking for existence) @@ -2415,7 +2413,8 @@ TargetInformation QmakeProFileNode::targetInformation() const return m_qmakeTargetInformation; } -InstallsList QmakeProFileNode::installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, const QString &projectDir) +InstallsList QmakeProFileNode::installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, + const QString &projectDir, const QString &buildDir) { InstallsList result; if (!reader) @@ -2438,21 +2437,11 @@ InstallsList QmakeProFileNode::installsList(const QtSupport::ProFileReader *read } itemPath = itemPaths.last(); - const QStringList &itemFiles - = reader->absoluteFileValues(item + QLatin1String(".files"), - projectDir, QStringList() << projectDir, 0); if (item == QLatin1String("target")) { result.targetPath = itemPath; } else { - if (itemFiles.isEmpty()) { - // TODO: Fix QMAKE_SUBSTITUTES handling in pro file reader, then uncomment again -// if (!reader->values(item + QLatin1String(".CONFIG")) -// .contains(QLatin1String("no_check_exist"))) { -// qDebug("%s: Ignoring INSTALLS item '%s', because it has no files.", -// qPrintable(m_projectFilePath), qPrintable(item)); -// } - continue; - } + const QStringList &itemFiles = reader->fixifiedValues( + item + QLatin1String(".files"), projectDir, buildDir); result.items << InstallsItem(itemPath, itemFiles); } } diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h index 32d3034470a..18462eef7ea 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.h +++ b/src/plugins/qmakeprojectmanager/qmakenodes.h @@ -398,7 +398,7 @@ private: static Utils::FileNameList subDirsPaths(QtSupport::ProFileReader *reader, const QString &projectDir, QStringList *subProjectsNotToDeploy, QStringList *errors); static TargetInformation targetInformation(QtSupport::ProFileReader *reader, QtSupport::ProFileReader *readerBuildPass, const QString &buildDir, const QString &projectFilePath); - static InstallsList installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, const QString &projectDir); + static InstallsList installsList(const QtSupport::ProFileReader *reader, const QString &projectFilePath, const QString &projectDir, const QString &buildDir); bool m_validParse = false; bool m_parseInProgress = true; diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 50bf4a89cfc..e164a6cebcb 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -102,6 +102,24 @@ QString ProFileEvaluator::sysrootify(const QString &path, const QString &baseDir return isHostSystemPath ? path : option->sysroot + path; } +QStringList ProFileEvaluator::fixifiedValues( + const QString &variable, const QString &baseDirectory, const QString &buildDirectory) const +{ + QStringList result; + foreach (const QString &el, values(variable)) { + if (IoUtils::isAbsolutePath(el)) { + result << sysrootify(el, baseDirectory); + } else { + QString fn = QDir::cleanPath(baseDirectory + QLatin1Char('/') + el); + if (IoUtils::exists(fn)) + result << fn; + else + result << QDir::cleanPath(buildDirectory + QLatin1Char('/') + el); + } + } + return result; +} + QStringList ProFileEvaluator::absolutePathValues( const QString &variable, const QString &baseDirectory) const { diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h index 27b26081b0d..59285bea256 100644 --- a/src/shared/proparser/profileevaluator.h +++ b/src/shared/proparser/profileevaluator.h @@ -82,6 +82,8 @@ public: QString value(const QString &variableName) const; QStringList values(const QString &variableName) const; QStringList values(const QString &variableName, const ProFile *pro) const; + QStringList fixifiedValues( + const QString &variable, const QString &baseDirectory, const QString &buildDirectory) const; QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const; QStringList absoluteFileValues( const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,