Skip to content
Snippets Groups Projects
Commit 45fbbba2 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Improved a little bit the example and show how to compute the deps for all the files in QtCore.

parent 483449e4
No related branches found
No related tags found
No related merge requests found
...@@ -17,12 +17,16 @@ class MakeDepend: public Client ...@@ -17,12 +17,16 @@ class MakeDepend: public Client
{ {
Environment *env; Environment *env;
QList<QDir> systemDirs; QList<QDir> systemDirs;
QStringList included;
public: public:
MakeDepend(Environment *env) MakeDepend(Environment *env)
: env(env) : env(env)
{ } { }
QStringList includedFiles() const
{ return included; }
void addSystemDir(const QDir &dir) void addSystemDir(const QDir &dir)
{ systemDirs.append(dir); } { systemDirs.append(dir); }
...@@ -32,17 +36,22 @@ public: ...@@ -32,17 +36,22 @@ public:
virtual void macroAdded(const Macro &) virtual void macroAdded(const Macro &)
{ } { }
virtual void sourceNeeded(QString &fileName, IncludeType mode, unsigned) void addInclude(const QString &absoluteFilePath)
{ included.append(absoluteFilePath); }
virtual void sourceNeeded(QString &fileName, IncludeType mode, unsigned line)
{ {
// ### cache
const QString currentFile = QFile::decodeName(env->currentFile);
if (mode == IncludeLocal) { if (mode == IncludeLocal) {
// ### cache const QFileInfo currentFileInfo(currentFile);
const QFileInfo currentFile(QFile::decodeName(env->currentFile)); const QDir dir = currentFileInfo.dir();
const QDir dir = currentFile.dir();
// ### cleanup
QFileInfo fileInfo(dir, fileName); QFileInfo fileInfo(dir, fileName);
if (fileInfo.exists()) { if (fileInfo.exists()) {
fileName = fileInfo.absoluteFilePath(); addInclude(fileInfo.absoluteFilePath());
std::cout << ' ' << qPrintable(fileName);
return; return;
} }
} }
...@@ -50,13 +59,15 @@ public: ...@@ -50,13 +59,15 @@ public:
foreach (const QDir &dir, systemDirs) { foreach (const QDir &dir, systemDirs) {
QFileInfo fileInfo(dir, fileName); QFileInfo fileInfo(dir, fileName);
if (fileInfo.exists() && fileInfo.isFile()) { if (fileInfo.exists() && fileInfo.isFile()) {
fileName = fileInfo.absoluteFilePath(); addInclude(fileInfo.absoluteFilePath());
std::cout << ' ' << qPrintable(fileName);
return; return;
} }
} }
std::cerr << "file '" << qPrintable(fileName) << "' not found" << std::endl; #ifdef PP_WITH_DIAGNOSTICS
std::cerr << qPrintable(currentFile) << ':' << line << ": error: "
<< qPrintable(fileName) << ": No such file or directory" << std::endl;
#endif
} }
virtual void startExpandingMacro(unsigned, const Macro &, virtual void startExpandingMacro(unsigned, const Macro &,
...@@ -76,22 +87,51 @@ public: ...@@ -76,22 +87,51 @@ public:
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
Environment env; QCoreApplication app(argc, argv);
MakeDepend client(&env);
QStringList todo = app.arguments();
todo.removeFirst();
if (todo.isEmpty())
todo.append(qgetenv("QTDIR") + "/include/QtCore/QtCore");
QMap<QString, QStringList> processed;
while (! todo.isEmpty()) {
const QString fn = todo.takeFirst();
if (processed.contains(fn))
continue;
client.addSystemDir(QLatin1String("/usr/include")); QStringList deps;
Preprocessor preproc(&client, &env);
for (int i = 1; i < argc; ++i) { QFile file(fn);
const QByteArray fileName = argv[i];
std::cout << fileName.constData() << ':';
QFile file(QFile::decodeName(fileName));
if (file.open(QFile::ReadOnly)) { if (file.open(QFile::ReadOnly)) {
// ### we should QTextStream here. // ### we should QTextStream here.
const QByteArray code = file.readAll(); const QByteArray code = file.readAll();
preproc.preprocess(fileName, code, /*result = */ 0);
Environment env;
MakeDepend client(&env);
client.addSystemDir(qgetenv("QTDIR") + "/include");
Preprocessor preproc(&client, &env);
preproc.preprocess(QFile::encodeName(fn), code, /*result = */ 0);
deps = client.includedFiles();
todo += deps;
} }
std::cout << std::endl;
processed.insert(fn, deps);
}
QMapIterator<QString, QStringList> it(processed);
while (it.hasNext()) {
it.next();
if (it.value().isEmpty())
continue; // no deps, nothing to do.
std::cout << qPrintable(it.key()) << ": \\\n " << qPrintable(it.value().join(QLatin1String(" \\\n ")))
<< std::endl << std::endl;
} }
return 0; return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment