diff options
Diffstat (limited to 'sources/shiboken2/ApiExtractor/apiextractor.cpp')
-rw-r--r-- | sources/shiboken2/ApiExtractor/apiextractor.cpp | 124 |
1 files changed, 35 insertions, 89 deletions
diff --git a/sources/shiboken2/ApiExtractor/apiextractor.cpp b/sources/shiboken2/ApiExtractor/apiextractor.cpp index 371ccf559..404e0bea6 100644 --- a/sources/shiboken2/ApiExtractor/apiextractor.cpp +++ b/sources/shiboken2/ApiExtractor/apiextractor.cpp @@ -32,25 +32,19 @@ #include <QDir> #include <QDebug> #include <QTemporaryFile> +#include <algorithm> #include <iostream> +#include <iterator> #include "reporthandler.h" #include "typesystem.h" #include "fileout.h" -#include "parser/rpp/pp.h" #include "abstractmetabuilder.h" #include "typedatabase.h" #include "typesystem.h" -static bool preprocess(const QString& sourceFile, - QFile& targetFile, - const QStringList& includes); - ApiExtractor::ApiExtractor() : m_builder(0) { - static bool qrcInitialized = false; - if (!qrcInitialized) - Q_INIT_RESOURCE(generator); // Environment TYPESYSTEMPATH QString envTypesystemPaths = QFile::decodeName(getenv("TYPESYSTEMPATH")); if (!envTypesystemPaths.isEmpty()) @@ -69,16 +63,16 @@ void ApiExtractor::addTypesystemSearchPath (const QString& path) void ApiExtractor::addTypesystemSearchPath(const QStringList& paths) { - foreach (const QString &path, paths) + for (const QString &path : paths) addTypesystemSearchPath(path); } -void ApiExtractor::addIncludePath(const QString& path) +void ApiExtractor::addIncludePath(const HeaderPath& path) { m_includePaths << path; } -void ApiExtractor::addIncludePath(const QStringList& paths) +void ApiExtractor::addIncludePath(const HeaderPaths& paths) { m_includePaths << paths; } @@ -174,8 +168,9 @@ QSet<QString> ApiExtractor::qtMetaTypeDeclaredTypeNames() const static const AbstractMetaEnum* findEnumOnClasses(AbstractMetaClassList metaClasses, const EnumTypeEntry* typeEntry) { const AbstractMetaEnum* result = 0; - foreach (const AbstractMetaClass* metaClass, metaClasses) { - foreach (const AbstractMetaEnum* metaEnum, metaClass->enums()) { + for (const AbstractMetaClass* metaClass : qAsConst(metaClasses)) { + const AbstractMetaEnumList &enums = metaClass->enums(); + for (const AbstractMetaEnum *metaEnum : enums) { if (metaEnum->typeEntry() == typeEntry) { result = metaEnum; break; @@ -192,7 +187,8 @@ const AbstractMetaEnum* ApiExtractor::findAbstractMetaEnum(const EnumTypeEntry* { if (!typeEntry) return 0; - foreach (AbstractMetaEnum* metaEnum, m_builder->globalEnums()) { + const AbstractMetaEnumList &globalEnums = m_builder->globalEnums(); + for (AbstractMetaEnum* metaEnum : globalEnums) { if (metaEnum->typeEntry() == typeEntry) return metaEnum; } @@ -235,93 +231,43 @@ bool ApiExtractor::run() if (m_builder) return false; - if (m_typeSystemFileName.isEmpty()) { - std::cerr << "You must specify a Type System file." << std::endl; - return false; - } else if (!TypeDatabase::instance()->parseFile(m_typeSystemFileName)) { + if (!TypeDatabase::instance()->parseFile(m_typeSystemFileName)) { std::cerr << "Cannot parse file: " << qPrintable(m_typeSystemFileName); return false; } - QTemporaryFile ppFile; -#ifndef NDEBUG - ppFile.setAutoRemove(false); -#endif + const QString pattern = QDir::tempPath() + QLatin1Char('/') + + QFileInfo(m_cppFileName).baseName() + QStringLiteral("_XXXXXX.hpp"); + QTemporaryFile ppFile(pattern); + bool autoRemove = !qEnvironmentVariableIsSet("KEEP_TEMP_FILES"); // make sure that a tempfile can be written if (!ppFile.open()) { - std::cerr << "could not create tempfile in " << qPrintable(QDir::tempPath()); - return false; - } - - // run rpp pre-processor - if (!preprocess(m_cppFileName, ppFile, m_includePaths)) { - std::cerr << "Preprocessor failed on file: " << qPrintable(m_cppFileName); + std::cerr << "could not create tempfile " << qPrintable(pattern) + << ": " << qPrintable(ppFile.errorString()) << '\n'; return false; } - ppFile.seek(0); + ppFile.write("#include \""); + ppFile.write(m_cppFileName.toLocal8Bit()); + ppFile.write("\"\n"); + const QString preprocessedCppFileName = ppFile.fileName(); + ppFile.close(); m_builder = new AbstractMetaBuilder; m_builder->setLogDirectory(m_logDirectory); m_builder->setGlobalHeader(m_cppFileName); - m_builder->build(&ppFile); - - return true; -} - -static bool preprocess(const QString& sourceFile, - QFile& targetFile, - const QStringList& includes) -{ - rpp::pp_environment env; - rpp::pp preprocess(env); - - rpp::pp_null_output_iterator null_out; - - const char *ppconfig = ":/trolltech/generator/pp-qt-configuration"; - - const QString fileName = QLatin1String(ppconfig); - QFile file(fileName); - if (!file.open(QFile::ReadOnly)) { - std::cerr << "Preprocessor configuration file not found " << ppconfig << std::endl; - return false; - } - - QByteArray ba = file.readAll(); - file.close(); - preprocess.operator()(ba.constData(), ba.constData() + ba.size(), null_out); - - preprocess.push_include_path("."); - foreach (const QString &include, includes) - preprocess.push_include_path(QDir::toNativeSeparators(include).toStdString()); - preprocess.push_include_path("/usr/include"); - - QString currentDir = QDir::current().absolutePath(); - QFileInfo sourceInfo(sourceFile); - if (!sourceInfo.exists()) { - std::cerr << "File not found " << qPrintable(sourceFile) << std::endl; - return false; + QByteArrayList arguments; + arguments.reserve(m_includePaths.size() + 1); + for (const HeaderPath &headerPath : qAsConst(m_includePaths)) + arguments.append(HeaderPath::includeOption(headerPath)); + arguments.append(QFile::encodeName(preprocessedCppFileName)); + qCDebug(lcShiboken) << __FUNCTION__ << arguments; + const bool result = m_builder->build(arguments); + if (!result) + autoRemove = false; + if (!autoRemove) { + ppFile.setAutoRemove(false); + std::cerr << "Keeping temporary file: " << qPrintable(QDir::toNativeSeparators(preprocessedCppFileName)) << '\n'; } - QDir::setCurrent(sourceInfo.absolutePath()); - - std::string result; - result.reserve(20 * 1024); // 20K - - result += "# 1 \"builtins\"\n"; - result += "# 1 \""; - result += sourceFile.toStdString(); - result += "\"\n"; - - preprocess.file(sourceInfo.fileName().toStdString(), - rpp::pp_output_iterator<std::string> (result)); - - QDir::setCurrent(currentDir); - - if (!targetFile.open(QIODevice::ReadWrite | QIODevice::Text)) { - std::cerr << "Failed to write preprocessed file: " << qPrintable(targetFile.fileName()) << std::endl; - return false; - } - - targetFile.write(result.c_str(), result.length()); - return true; + return result; } #ifndef QT_NO_DEBUG_STREAM |