forked from qt-creator/qt-creator
implement proper vpath handling for qt4 projects
this also removes the bogus special casing of various filename-containing variables inside the pro parser.
This commit is contained in:
@@ -182,9 +182,6 @@ public:
|
||||
QString propertyValue(const QString &val) const;
|
||||
|
||||
bool isActiveConfig(const QString &config, bool regex = false);
|
||||
QStringList expandPattern(const QString &pattern);
|
||||
void expandPatternHelper(const QString &relName, const QString &absName,
|
||||
QStringList &sources_out);
|
||||
QStringList expandVariableReferences(const QString &value);
|
||||
void doVariableReplace(QString *str);
|
||||
QStringList evaluateExpandFunction(const QString &function, const QString &arguments);
|
||||
@@ -844,32 +841,6 @@ void ProFileEvaluator::Private::visitProValue(ProValue *value)
|
||||
m_prevLineNo = m_lineNo;
|
||||
m_prevProFile = currentProFile();
|
||||
|
||||
// The following two blocks fix bug 180128 by making all "interesting"
|
||||
// file name absolute in each .pro file, not just the top most one
|
||||
if (varName == QLatin1String("SOURCES")
|
||||
|| varName == QLatin1String("OBJECTIVE_SOURCES")
|
||||
|| varName == QLatin1String("HEADERS")
|
||||
|| varName == QLatin1String("INTERFACES")
|
||||
|| varName == QLatin1String("FORMS")
|
||||
|| varName == QLatin1String("FORMS3")
|
||||
|| varName == QLatin1String("RESOURCES")
|
||||
|| varName == QLatin1String("LEXSOURCES")
|
||||
|| varName == QLatin1String("YACCSOURCES")){
|
||||
// matches only existent files, expand certain(?) patterns
|
||||
QStringList vv;
|
||||
for (int i = v.count(); --i >= 0; )
|
||||
vv << expandPattern(v[i]);
|
||||
v = vv;
|
||||
}
|
||||
|
||||
if (varName == QLatin1String("TRANSLATIONS")) {
|
||||
// also matches non-existent files, but does not expand pattern
|
||||
QString dir = QFileInfo(currentFileName()).absolutePath();
|
||||
dir += QLatin1Char('/');
|
||||
for (int i = v.count(); --i >= 0; )
|
||||
v[i] = QFileInfo(dir, v[i]).absoluteFilePath();
|
||||
}
|
||||
|
||||
switch (m_variableOperator) {
|
||||
case ProVariable::SetOperator: // =
|
||||
if (!m_cumulative) {
|
||||
@@ -2495,82 +2466,6 @@ bool ProFileEvaluator::Private::evaluateFeatureFile(const QString &fileName)
|
||||
return ok;
|
||||
}
|
||||
|
||||
void ProFileEvaluator::Private::expandPatternHelper(const QString &relName, const QString &absName,
|
||||
QStringList &sources_out)
|
||||
{
|
||||
const QStringList vpaths = values(QLatin1String("VPATH"))
|
||||
+ values(QLatin1String("QMAKE_ABSOLUTE_SOURCE_PATH"))
|
||||
+ values(QLatin1String("DEPENDPATH"))
|
||||
+ values(QLatin1String("VPATH_SOURCES"));
|
||||
|
||||
QFileInfo fi(absName);
|
||||
bool found = fi.exists();
|
||||
// Search in all vpaths
|
||||
if (!found) {
|
||||
foreach (const QString &vpath, vpaths) {
|
||||
fi.setFile(vpath + QDir::separator() + relName);
|
||||
if (fi.exists()) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
sources_out += fi.absoluteFilePath(); // Not resolving symlinks
|
||||
} else {
|
||||
QString val = relName;
|
||||
QString dir;
|
||||
QString wildcard = val;
|
||||
QString real_dir;
|
||||
if (wildcard.lastIndexOf(QLatin1Char('/')) != -1) {
|
||||
dir = wildcard.left(wildcard.lastIndexOf(QLatin1Char('/')) + 1);
|
||||
real_dir = dir;
|
||||
wildcard = wildcard.right(wildcard.length() - dir.length());
|
||||
}
|
||||
|
||||
if (real_dir.isEmpty() || QFileInfo(real_dir).exists()) {
|
||||
QStringList files = QDir(real_dir).entryList(QStringList(wildcard));
|
||||
if (files.isEmpty()) {
|
||||
q->logMessage(format("Failure to find %1").arg(val));
|
||||
} else {
|
||||
QString a;
|
||||
for (int i = files.count() - 1; i >= 0; --i) {
|
||||
if (files[i] == QLatin1String(".") || files[i] == QLatin1String(".."))
|
||||
continue;
|
||||
a = dir + files[i];
|
||||
sources_out += a;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
q->logMessage(format("Cannot match %1/%2, as %3 does not exist.")
|
||||
.arg(real_dir).arg(wildcard).arg(real_dir));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Lookup of files are done in this order:
|
||||
* 1. look in pwd
|
||||
* 2. look in vpaths
|
||||
* 3. expand wild card files relative from the profiles folder
|
||||
**/
|
||||
|
||||
// FIXME: This code supports something that I'd consider a flaw in .pro file syntax
|
||||
// which is not even documented. So arguably this can be ditched completely...
|
||||
QStringList ProFileEvaluator::Private::expandPattern(const QString& pattern)
|
||||
{
|
||||
if (!currentProFile())
|
||||
return QStringList();
|
||||
|
||||
QStringList sources_out;
|
||||
const QString absName = QDir::cleanPath(QDir::current().absoluteFilePath(pattern));
|
||||
|
||||
expandPatternHelper(pattern, absName, sources_out);
|
||||
return sources_out;
|
||||
}
|
||||
|
||||
QString ProFileEvaluator::Private::format(const char *fmt) const
|
||||
{
|
||||
ProFile *pro = currentProFile();
|
||||
@@ -2621,6 +2516,59 @@ QStringList ProFileEvaluator::values(const QString &variableName, const ProFile
|
||||
return fixEnvVariables(d->values(variableName, pro));
|
||||
}
|
||||
|
||||
QStringList ProFileEvaluator::absolutePathValues(
|
||||
const QString &variable, const QString &baseDirectory) const
|
||||
{
|
||||
QStringList result;
|
||||
foreach (const QString &el, values(variable)) {
|
||||
const QFileInfo info = QFileInfo(baseDirectory, el);
|
||||
if (info.isDir())
|
||||
result << QDir::cleanPath(info.absoluteFilePath());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QStringList ProFileEvaluator::absoluteFileValues(
|
||||
const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,
|
||||
const ProFile *pro) const
|
||||
{
|
||||
QStringList result;
|
||||
foreach (const QString &el, pro ? values(variable, pro) : values(variable)) {
|
||||
QFileInfo info(el);
|
||||
if (info.isAbsolute()) {
|
||||
if (info.exists()) {
|
||||
result << QDir::cleanPath(el);
|
||||
goto next;
|
||||
}
|
||||
} else {
|
||||
foreach (const QString &dir, searchDirs) {
|
||||
QFileInfo info(dir, el);
|
||||
if (info.isFile()) {
|
||||
result << QDir::cleanPath(info.filePath());
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
if (baseDirectory.isEmpty())
|
||||
goto next;
|
||||
info = QFileInfo(baseDirectory, el);
|
||||
}
|
||||
{
|
||||
QFileInfo baseInfo(info.absolutePath());
|
||||
if (baseInfo.exists()) {
|
||||
QString wildcard = info.fileName();
|
||||
if (wildcard.contains(QLatin1Char('*')) || wildcard.contains(QLatin1Char('?'))) {
|
||||
QDir theDir(QDir::cleanPath(baseInfo.filePath()));
|
||||
foreach (const QString &fn, theDir.entryList(QStringList(wildcard)))
|
||||
if (fn != QLatin1String(".") && fn != QLatin1String(".."))
|
||||
result << theDir.absoluteFilePath(fn);
|
||||
} // else if (acceptMissing)
|
||||
}
|
||||
}
|
||||
next: ;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
ProFileEvaluator::TemplateType ProFileEvaluator::templateType()
|
||||
{
|
||||
QStringList templ = values(QLatin1String("TEMPLATE"));
|
||||
|
||||
Reference in New Issue
Block a user