QmakeProjectManager: Support wildcards in INSTALLS again

This functionality was (accidentally?) lost in some semi-recent
refactoring in the pro file evaluation code. Note that only the "*" and
"?" globs are supported.

Task-number: QTCREATORBUG-17935
Change-Id: I9ade940f4dbf9c5836cd8b5fab2d85d10f42ad9a
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
This commit is contained in:
Christian Kandeler
2017-10-26 14:29:43 +02:00
parent f2ea25f0cb
commit 9e32603c3d
3 changed files with 30 additions and 9 deletions

View File

@@ -1419,7 +1419,7 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input)
result->newVarValues[Variable::CumulativeResource] = fileListForVar(cumulativeSourceFiles, QLatin1String("RESOURCES")); result->newVarValues[Variable::CumulativeResource] = fileListForVar(cumulativeSourceFiles, QLatin1String("RESOURCES"));
result->newVarValues[Variable::PkgConfig] = exactReader->values(QLatin1String("PKGCONFIG")); result->newVarValues[Variable::PkgConfig] = exactReader->values(QLatin1String("PKGCONFIG"));
result->newVarValues[Variable::PrecompiledHeader] = ProFileEvaluator::sourcesToFiles(exactReader->fixifiedValues( result->newVarValues[Variable::PrecompiledHeader] = ProFileEvaluator::sourcesToFiles(exactReader->fixifiedValues(
QLatin1String("PRECOMPILED_HEADER"), input.projectDir, input.buildDirectory.toString())); QLatin1String("PRECOMPILED_HEADER"), input.projectDir, input.buildDirectory.toString(), false));
result->newVarValues[Variable::LibDirectories] = libDirectories(exactReader); result->newVarValues[Variable::LibDirectories] = libDirectories(exactReader);
result->newVarValues[Variable::Config] = exactReader->values(QLatin1String("CONFIG")); result->newVarValues[Variable::Config] = exactReader->values(QLatin1String("CONFIG"));
result->newVarValues[Variable::QmlImportPath] = exactReader->absolutePathValues( result->newVarValues[Variable::QmlImportPath] = exactReader->absolutePathValues(
@@ -1657,7 +1657,8 @@ QStringList QmakeProFile::includePaths(QtSupport::ProFileReader *reader, const F
} }
foreach (const ProFileEvaluator::SourceFile &el, foreach (const ProFileEvaluator::SourceFile &el,
reader->fixifiedValues(QLatin1String("INCLUDEPATH"), projectDir, buildDir.toString())) { reader->fixifiedValues(QLatin1String("INCLUDEPATH"), projectDir, buildDir.toString(),
false)) {
paths << sysrootify(el.fileName, sysroot.toString(), projectDir, buildDir.toString()); paths << sysrootify(el.fileName, sysroot.toString(), projectDir, buildDir.toString());
} }
// 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
@@ -1814,7 +1815,7 @@ InstallsList QmakeProFile::installsList(const QtSupport::ProFileReader *reader,
result.targetPath = itemPath; result.targetPath = itemPath;
} else { } else {
const auto &itemFiles = reader->fixifiedValues( const auto &itemFiles = reader->fixifiedValues(
item + QLatin1String(".files"), projectDir, buildDir); item + QLatin1String(".files"), projectDir, buildDir, true);
result.items << InstallsItem(itemPath, itemFiles, active); result.items << InstallsItem(itemPath, itemFiles, active);
} }
} }

View File

@@ -77,7 +77,8 @@ QStringList ProFileEvaluator::values(const QString &variableName) const
} }
QVector<ProFileEvaluator::SourceFile> ProFileEvaluator::fixifiedValues( QVector<ProFileEvaluator::SourceFile> ProFileEvaluator::fixifiedValues(
const QString &variable, const QString &baseDirectory, const QString &buildDirectory) const const QString &variable, const QString &baseDirectory, const QString &buildDirectory,
bool expandWildcards) const
{ {
QVector<SourceFile> result; QVector<SourceFile> result;
foreach (const ProString &str, d->values(ProKey(variable))) { foreach (const ProString &str, d->values(ProKey(variable))) {
@@ -86,13 +87,31 @@ QVector<ProFileEvaluator::SourceFile> ProFileEvaluator::fixifiedValues(
result << SourceFile{QDir::cleanPath(el), str.sourceFile()}; result << SourceFile{QDir::cleanPath(el), str.sourceFile()};
} else { } else {
QString fn = QDir::cleanPath(baseDirectory + QLatin1Char('/') + el); QString fn = QDir::cleanPath(baseDirectory + QLatin1Char('/') + el);
if (IoUtils::exists(fn)) if (IoUtils::exists(fn)) {
result << SourceFile{fn, str.sourceFile()}; result << SourceFile{fn, str.sourceFile()};
else } else {
QStringRef fileNamePattern;
if (expandWildcards) {
fileNamePattern = IoUtils::fileName(fn);
expandWildcards = fileNamePattern.contains('*')
|| fileNamePattern.contains('?');
}
if (expandWildcards) {
const QString patternBaseDir = IoUtils::pathName(fn).toString();
const QDir::Filters filters = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot;
for (const QString &fileName : QDir(patternBaseDir).entryList(
QStringList(fileNamePattern.toString()), filters)) {
const QString fullFilePath
= QDir::cleanPath(patternBaseDir + '/' + fileName);
result << SourceFile({fullFilePath, str.sourceFile()});
}
} else {
result << SourceFile{QDir::cleanPath(buildDirectory + QLatin1Char('/') + el), result << SourceFile{QDir::cleanPath(buildDirectory + QLatin1Char('/') + el),
str.sourceFile()}; str.sourceFile()};
} }
} }
}
}
return result; return result;
} }

View File

@@ -81,7 +81,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;
QVector<SourceFile> fixifiedValues( QVector<SourceFile> fixifiedValues(
const QString &variable, const QString &baseDirectory, const QString &buildDirectory) const; const QString &variable, const QString &baseDirectory, const QString &buildDirectory,
bool expandWildcards) const;
QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const; QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const;
QVector<SourceFile> absoluteFileValues( QVector<SourceFile> absoluteFileValues(
const QString &variable, const QString &baseDirectory, const QStringList &searchDirs, const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,