forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user