📄 profileevaluator.cpp
字号:
ok = false; break; } QRegExp regx(args[1]); const QStringList &l = values(args.first()); if(args.count() == 2) { for(int i = 0; i < l.size(); ++i) { const QString val = l[i]; if(regx.exactMatch(val) || val == args[1]) { cond = true; break; } } } else { const QStringList mutuals = args[2].split('|'); for(int i = l.size()-1; i >= 0; i--) { const QString val = l[i]; for(int mut = 0; mut < mutuals.count(); mut++) { if(val == mutuals[mut].trimmed()) { cond = (regx.exactMatch(val) || val == args[1]); break; } } } } break; } case CF_COUNT: { if(args.count() != 2 && args.count() != 3) { logMessage(QString::fromAscii("count(var, count) requires at least two arguments.\n"), MT_DebugLevel1); ok = false; break; } if(args.count() == 3) { QString comp = args[2]; if(comp == ">" || comp == "greaterThan") { cond = values(args.first()).count() > args[1].toInt(); } else if(comp == ">=") { cond = values(args.first()).count() >= args[1].toInt(); } else if(comp == "<" || comp == "lessThan") { cond = values(args.first()).count() < args[1].toInt(); } else if(comp == "<=") { cond = values(args.first()).count() <= args[1].toInt(); } else if(comp == "equals" || comp == "isEqual" || comp == "=" || comp == "==") { cond = values(args.first()).count() == args[1].toInt(); } else { ok = false; logMessage(QString::fromAscii("unexpected modifier to count(%2)\n").arg( comp), MT_DebugLevel1); } break; } cond = values(args.first()).count() == args[1].toInt(); break; } case CF_INCLUDE: { QString parseInto; if(args.count() == 2) { parseInto = args[1]; } else if(args.count() != 1) { logMessage(QString::fromAscii("include(file) requires one argument.\n"), MT_DebugLevel1); ok = false; break; } ok = evaluateFile(args.first(), &ok); break; } case CF_LOAD: { QString parseInto; bool ignore_error = false; if(args.count() == 2) { QString sarg = args[1]; ignore_error = (sarg.toLower() == "true" || sarg.toInt()); } else if(args.count() != 1) { logMessage(QString::fromAscii("load(feature) requires one argument.\n"), MT_DebugLevel1); ok = false; break; } ok = evaluateFeatureFile( args.first(), &cond); break; } case CF_MESSAGE: { if(args.count() != 1) { logMessage(QString::fromAscii("%2(message) requires one argument.\n").arg( QString(function)), MT_DebugLevel1); ok = false; break; } QString msg = args.first(); bool isError = (function == "error"); logMessage(QString::fromAscii("%2\n").arg(msg), isError ? MT_ProError : MT_ProMessage); break; } case CF_SYSTEM: { if(args.count() != 1) { logMessage(QString::fromAscii("system(exec) requires one argument.\n"), MT_DebugLevel1); ok = false; break; } ok = system(args.first().toLatin1().constData()) == 0; break; } case CF_ISEMPTY: { if(args.count() != 1) { logMessage(QString::fromAscii("isEmpty(var) requires one argument.\n"), MT_DebugLevel1); ok = false; break; } QStringList sl = values(args.first()); if (sl.count() == 0) { cond = true; }else if (sl.count() > 0) { QString var = sl.first(); cond = (var.isEmpty()); } break; } case CF_EXISTS: { if(args.count() != 1) { logMessage(QString::fromAscii("exists(file) requires one argument.\n"), MT_DebugLevel1); ok = false; break; } QString file = args.first(); file = QDir::cleanPath(file); if (QFile::exists(file)) { cond = true; break; } //regular expression I guess QString dirstr = getcwd(); int slsh = file.lastIndexOf(Option::dir_sep); if(slsh != -1) { dirstr = file.left(slsh+1); file = file.right(file.length() - slsh - 1); } cond = QDir(dirstr).entryList(QStringList(file)).count(); break; } } if (result) *result = cond; return ok;}bool ProFileEvaluator::contains(const QString &variableName) const{ return m_valuemap.contains(variableName.toAscii());}QStringList ProFileEvaluator::values(const QString &variableName) const{ if (variableName == QLatin1String("PWD")) { return QStringList(getcwd()); } return m_valuemap.value(variableName.toAscii());}bool ProFileEvaluator::evaluateFile(const QString &fileName, bool *result){ bool ok = true; QString fn = fileName; QFileInfo fi(fn); if (fi.exists()) { logMessage(QString::fromAscii("Reading %2\n").arg(fileName), MT_DebugLevel3); ProFile *pro = queryProFile(fi.absoluteFilePath()); if (pro) { m_profileStack.push_back(pro); ok &= currentProFile() ? pro->Accept(this) : false; if (ok) { if (m_profileStack.count() > 0) { ProFile *pro = m_profileStack.pop(); releaseProFile(pro); } } } if (result) *result = true; }else{ if (result) *result = false; }/* if (ok && readFeatures) { QStringList configs = values("CONFIG"); QSet<QString> processed; for (QStringList::iterator it = configs.begin(); it != configs.end(); ++it) { QString fn = *it; if (!processed.contains(fn)) { processed.insert(fn); evaluateFeatureFile(fn, 0); } } } */ return ok;}bool ProFileEvaluator::evaluateFeatureFile(const QString &fileName, bool *result){ QString fn; QStringList feature_paths = qmake_feature_paths(); for(QStringList::ConstIterator it = feature_paths.begin(); it != feature_paths.end(); ++it) { QString fname = *it + QLatin1Char('/') + fileName; if (QFileInfo(fname).exists()) { fn = fname; break; } fname += QLatin1String(".prf"); if (QFileInfo(fname).exists()) { fn = fname; break; } } return fn.isEmpty() ? false : evaluateFile(fn, result);}ProFileEvaluator::TemplateType ProFileEvaluator::templateType(){ QStringList templ = m_valuemap.value("TEMPLATE"); if (templ.count() >= 1) { QByteArray t = templ.last().toAscii().toLower(); if (t == "app") return TT_Application; if (t == "lib") return TT_Library; if (t == "subdirs") return TT_Subdirs; } return TT_Unknown;}/* * 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 **/QStringList ProFileEvaluator::absFileNames(const QString &variableName){ QStringList vpaths = values(QLatin1String("VPATH")) + values(QLatin1String("QMAKE_ABSOLUTE_SOURCE_PATH")) + values(QLatin1String("DEPENDPATH")) + values(QLatin1String("VPATH_SOURCES")); QStringList sources_out; QStringList sources = values(variableName); QFileInfo fi(m_origfile); QDir dir(fi.absoluteDir()); for (int i = 0; i < sources.count(); ++i) { QString fn = sources[i]; QString absName = QDir::cleanPath(dir.absoluteFilePath(sources[i])); QFileInfo fi(absName); bool found = fi.exists(); // Search in all vpaths for(QStringList::Iterator vpath_it = vpaths.begin(); vpath_it != vpaths.end() && !found; ++vpath_it) { QDir vpath(*vpath_it); fi.setFile(*vpath_it + QDir::separator() + fn); if (fi.exists()) { absName = fi.absoluteFilePath(); found = true; break; } } if (found) { sources_out+=fi.canonicalFilePath(); } else { QString val = fn; QString dir, regex = val, real_dir; if(regex.lastIndexOf(QLatin1Char('/')) != -1) { dir = regex.left(regex.lastIndexOf(QLatin1Char('/')) + 1); real_dir = dir; regex = regex.right(regex.length() - dir.length()); } if(real_dir.isEmpty() || QFileInfo(real_dir).exists()) { QStringList files = QDir(real_dir).entryList(QStringList(regex)); if(files.isEmpty()) { logMessage(MT_DebugLevel2, "%s:%d Failure to find %s", __FILE__, __LINE__, val.toLatin1().constData()); } else { QString a; for(int i = (int)files.count()-1; i >= 0; i--) { if(files[i] == "." || files[i] == "..") continue; a = dir + files[i]; sources_out+=a; } } } else { logMessage(MT_DebugLevel2, "%s:%d Cannot match %s%c%s, as %s does not exist.", __FILE__, __LINE__, real_dir.toLatin1().constData(), '/', regex.toLatin1().constData(), real_dir.toLatin1().constData()); } } } return sources_out;}ProFile *ProFileEvaluator::queryProFile(const QString &filename){ ProReader pr; pr.setEnableBackSlashFixing(false); ProFile *pro = pr.read(filename); if (!pro) { LogMessage msg; msg.m_msg = QLatin1String("parse failure."); msg.m_filename = filename; msg.m_linenumber = pr.currentLine(); msg.m_type = MT_Error; logMessage(msg); } return pro;}void ProFileEvaluator::releaseProFile(ProFile *pro){ delete pro;}QString ProFileEvaluator::propertyValue(const QString &val) const{ return getPropertyValue(val);}void ProFileEvaluator::logMessage(const ProFileEvaluator::LogMessage &msg){ QByteArray locstr = QString("%1(%2):").arg(msg.m_filename).arg(msg.m_linenumber).toAscii(); QByteArray text = msg.m_msg.toAscii(); switch (msg.m_type) { case MT_DebugLevel3: fprintf(stderr, "%s profileevaluator information: %s", locstr.data(), text.data()); break; case MT_DebugLevel2: fprintf(stderr, "%s profileevaluator warning: %s", locstr.data(), text.data()); break; case MT_DebugLevel1: fprintf(stderr, "%s profileevaluator critical error: %s", locstr.data(), text.data()); break; case MT_ProMessage: fprintf(stderr, "%s Project MESSAGE: %s", locstr.data(), text.data()); break; case MT_ProError: fprintf(stderr, "%s Project ERROR: %s", locstr.data(), text.data()); break; case MT_Error: fprintf(stderr, "%s ERROR: %s", locstr.data(), text.data()); break; }}void ProFileEvaluator::logMessage(const QString &message, MessageType mt){ LogMessage msg; msg.m_msg = message; msg.m_type = mt; ProFile *pro = currentProFile(); if (pro) { msg.m_filename = pro->fileName(); msg.m_linenumber = m_lineNo; } else { msg.m_filename = "Not a file"; msg.m_linenumber = 0; } logMessage(msg);}void ProFileEvaluator::logMessage(MessageType mt, const char *msg, ...){#define MAX_MESSAGE_LENGTH 1024 char buf[MAX_MESSAGE_LENGTH]; va_list ap; va_start(ap, msg); // use variable arg list qvsnprintf(buf, MAX_MESSAGE_LENGTH - 1, msg, ap); va_end(ap); buf[MAX_MESSAGE_LENGTH - 1] = '\0'; logMessage(QString::fromAscii(buf), mt);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -