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 <tobias.hunger@qt.io>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Oswald Buddenhagen
2016-10-24 21:01:22 +02:00
parent 5e29347d9d
commit c42b12c98e
4 changed files with 30 additions and 21 deletions

View File

@@ -1932,7 +1932,8 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input)
} }
result->targetInformation = targetInformation(input.readerExact, readerBuildPass, result->targetInformation = targetInformation(input.readerExact, readerBuildPass,
input.buildDirectory, input.projectFilePath.toString()); 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 // update other variables
result->newVarValues[DefinesVar] = input.readerExact->values(QLatin1String("DEFINES")); 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, result->newVarValues[ExactResourceVar] = fileListForVar(input.readerExact, 0,
QLatin1String("RESOURCES"), input.projectDir, input.buildDirectory); QLatin1String("RESOURCES"), input.projectDir, input.buildDirectory);
result->newVarValues[PkgConfigVar] = input.readerExact->values(QLatin1String("PKGCONFIG")); result->newVarValues[PkgConfigVar] = input.readerExact->values(QLatin1String("PKGCONFIG"));
result->newVarValues[PrecompiledHeaderVar] = result->newVarValues[PrecompiledHeaderVar] = input.readerExact->fixifiedValues(
input.readerExact->absoluteFileValues(QLatin1String("PRECOMPILED_HEADER"), QLatin1String("PRECOMPILED_HEADER"), input.projectDir, input.buildDirectory);
input.projectDir,
QStringList() << input.projectDir,
0);
result->newVarValues[LibDirectoriesVar] = libDirectories(input.readerExact); result->newVarValues[LibDirectoriesVar] = libDirectories(input.readerExact);
result->newVarValues[ConfigVar] = input.readerExact->values(QLatin1String("CONFIG")); result->newVarValues[ConfigVar] = input.readerExact->values(QLatin1String("CONFIG"));
result->newVarValues[QmlImportPathVar] = input.readerExact->absolutePathValues( result->newVarValues[QmlImportPathVar] = input.readerExact->absolutePathValues(
@@ -2308,7 +2306,7 @@ QStringList QmakeProFileNode::includePaths(QtSupport::ProFileReader *reader, con
paths.append(cxxflags.mid(2)); 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 // 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 // except if those directories don't exist at the time of parsing
// thus we add those directories manually (without checking for existence) // thus we add those directories manually (without checking for existence)
@@ -2415,7 +2413,8 @@ TargetInformation QmakeProFileNode::targetInformation() const
return m_qmakeTargetInformation; 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; InstallsList result;
if (!reader) if (!reader)
@@ -2438,21 +2437,11 @@ InstallsList QmakeProFileNode::installsList(const QtSupport::ProFileReader *read
} }
itemPath = itemPaths.last(); itemPath = itemPaths.last();
const QStringList &itemFiles
= reader->absoluteFileValues(item + QLatin1String(".files"),
projectDir, QStringList() << projectDir, 0);
if (item == QLatin1String("target")) { if (item == QLatin1String("target")) {
result.targetPath = itemPath; result.targetPath = itemPath;
} else { } else {
if (itemFiles.isEmpty()) { const QStringList &itemFiles = reader->fixifiedValues(
// TODO: Fix QMAKE_SUBSTITUTES handling in pro file reader, then uncomment again item + QLatin1String(".files"), projectDir, buildDir);
// 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;
}
result.items << InstallsItem(itemPath, itemFiles); result.items << InstallsItem(itemPath, itemFiles);
} }
} }

View File

@@ -398,7 +398,7 @@ private:
static Utils::FileNameList subDirsPaths(QtSupport::ProFileReader *reader, const QString &projectDir, QStringList *subProjectsNotToDeploy, QStringList *errors); 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 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_validParse = false;
bool m_parseInProgress = true; bool m_parseInProgress = true;

View File

@@ -102,6 +102,24 @@ QString ProFileEvaluator::sysrootify(const QString &path, const QString &baseDir
return isHostSystemPath ? path : option->sysroot + path; 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( QStringList ProFileEvaluator::absolutePathValues(
const QString &variable, const QString &baseDirectory) const const QString &variable, const QString &baseDirectory) const
{ {

View File

@@ -82,6 +82,8 @@ public:
QString value(const QString &variableName) const; QString value(const QString &variableName) const;
QStringList values(const QString &variableName) const; QStringList values(const QString &variableName) const;
QStringList values(const QString &variableName, const ProFile *pro) 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 absolutePathValues(const QString &variable, const QString &baseDirectory) const;
QStringList absoluteFileValues( QStringList absoluteFileValues(
const QString &variable, const QString &baseDirectory, const QStringList &searchDirs, const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,