aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor/apiextractor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2/ApiExtractor/apiextractor.cpp')
-rw-r--r--sources/shiboken2/ApiExtractor/apiextractor.cpp124
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