summaryrefslogtreecommitdiffstats
path: root/src/tools/qdoc/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/qdoc/main.cpp')
-rw-r--r--src/tools/qdoc/main.cpp301
1 files changed, 150 insertions, 151 deletions
diff --git a/src/tools/qdoc/main.cpp b/src/tools/qdoc/main.cpp
index 8998a27081..d0c3a0295a 100644
--- a/src/tools/qdoc/main.cpp
+++ b/src/tools/qdoc/main.cpp
@@ -63,6 +63,8 @@
#ifndef QT_BOOTSTRAPPED
# include "qcoreapplication.h"
#endif
+#include "qcommandlineoption.h"
+#include "qcommandlineparser.h"
#include <algorithm>
@@ -78,6 +80,7 @@ static bool highlighting = false;
static bool showInternal = false;
static bool redirectDocumentationToDevNull = false;
static bool noLinkErrors = false;
+static bool autolinkErrors = false;
static bool obsoleteLinks = false;
static QStringList defines;
static QStringList dependModules;
@@ -85,55 +88,6 @@ static QStringList indexDirs;
static QString currentDir;
static QString prevCurrentDir;
-/*!
- Print the help message to \c stdout.
- */
-static void printHelp()
-{
- Location::information(QCoreApplication::translate("QDoc", "Usage: qdoc [options] file1.qdocconf ...\n"
- "Options:\n"
- " -D<name> "
- "Define <name> as a macro while parsing sources\n"
- " -depends "
- "Specify dependent modules\n"
- " -help "
- "Display this information and exit\n"
- " -highlighting "
- "Turn on syntax highlighting (makes qdoc run slower)\n"
- " -indexdir "
- "Specify a directory where QDoc should search for index files to load\n"
- " -installdir "
- "Specify the directory where the output will be after running \"make install\"\n"
- " -no-examples "
- "Do not generate documentation for examples\n"
- " -no-link-errors "
- "Do not print link errors (i.e. missing targets)\n"
- " -obsoletelinks "
- "Report links from obsolete items to non-obsolete items\n"
- " -outputdir "
- "Specify output directory, overrides setting in qdocconf file\n"
- " -outputformat "
- "Specify output format, overrides setting in qdocconf file\n"
- " -prepare "
- "Run qdoc only to generate an index file, not the docs\n"
- " -generate "
- "Run qdoc to read the index files and generate the docs\n"
- " -showinternal "
- "Include content marked internal\n"
- " -redirect-documentation-to-dev-null "
- "Save all documentation content to /dev/null. Useful if someone is interested in qdoc errors only.\n"
- " -version "
- "Display version of qdoc and exit\n") );
-}
-
-/*!
- Prints the qdoc version number to stdout.
- */
-static void printVersion()
-{
- QString s = QCoreApplication::translate("QDoc", "qdoc version %1").arg(QT_VERSION_STR);
- Location::information(s);
-}
static void loadIndexFiles(Config& config)
{
@@ -275,6 +229,7 @@ static void processQdocconfFile(const QString &fileName)
config.setStringList(CONFIG_SHOWINTERNAL, QStringList(showInternal ? "true" : "false"));
config.setStringList(CONFIG_REDIRECTDOCUMENTATIONTODEVNULL, QStringList(redirectDocumentationToDevNull ? "true" : "false"));
config.setStringList(CONFIG_NOLINKERRORS, QStringList(noLinkErrors ? "true" : "false"));
+ config.setStringList(CONFIG_AUTOLINKERRORS, QStringList(autolinkErrors ? "true" : "false"));
config.setStringList(CONFIG_OBSOLETELINKS, QStringList(obsoleteLinks ? "true" : "false"));
/*
@@ -289,7 +244,8 @@ static void processQdocconfFile(const QString &fileName)
currentDir = QFileInfo(fileName).path();
Location::initialize(config);
config.load(fileName);
-
+ QString project = config.getString(CONFIG_PROJECT).toLower();
+ //qDebug() << "\nStart project:" << project;
/*
Add the defines to the configuration variables.
*/
@@ -363,7 +319,11 @@ static void processQdocconfFile(const QString &fileName)
Location outputFormatsLocation = config.lastLocation();
//if (!Generator::runPrepareOnly())
+ Generator::debug(" loading index files");
loadIndexFiles(config);
+ qdb->newPrimaryTree(config.getString(CONFIG_PROJECT));
+ qdb->setSearchOrder();
+ Generator::debug(" done loading index files");
QSet<QString> excludedDirs;
QSet<QString> excludedFiles;
@@ -372,7 +332,7 @@ static void processQdocconfFile(const QString &fileName)
QStringList excludedDirsList;
QStringList excludedFilesList;
- Generator::debugSegfault("Reading excludedirs");
+ Generator::debug("Reading excludedirs");
excludedDirsList = config.getCanonicalPathList(CONFIG_EXCLUDEDIRS);
foreach (const QString &excludeDir, excludedDirsList) {
QString p = QDir::fromNativeSeparators(excludeDir);
@@ -381,14 +341,14 @@ static void processQdocconfFile(const QString &fileName)
excludedDirs.insert(p);
}
- Generator::debugSegfault("Reading excludefiles");
- excludedFilesList = config.getCleanPathList(CONFIG_EXCLUDEFILES);
+ Generator::debug("Reading excludefiles");
+ excludedFilesList = config.getCanonicalPathList(CONFIG_EXCLUDEFILES);
foreach (const QString& excludeFile, excludedFilesList) {
QString p = QDir::fromNativeSeparators(excludeFile);
excludedFiles.insert(p);
}
- Generator::debugSegfault("Reading headerdirs");
+ Generator::debug("Reading headerdirs");
headerList = config.getAllFiles(CONFIG_HEADERS,CONFIG_HEADERDIRS,excludedDirs,excludedFiles);
QMap<QString,QString> headers;
QMultiMap<QString,QString> headerFileNames;
@@ -402,7 +362,7 @@ static void processQdocconfFile(const QString &fileName)
headerFileNames.insert(t,t);
}
- Generator::debugSegfault("Reading sourcedirs");
+ Generator::debug("Reading sourcedirs");
sourceList = config.getAllFiles(CONFIG_SOURCES,CONFIG_SOURCEDIRS,excludedDirs,excludedFiles);
QMap<QString,QString> sources;
QMultiMap<QString,QString> sourceFileNames;
@@ -419,7 +379,7 @@ static void processQdocconfFile(const QString &fileName)
Find all the qdoc files in the example dirs, and add
them to the source files to be parsed.
*/
- Generator::debugSegfault("Reading exampledirs");
+ Generator::debug("Reading exampledirs");
QStringList exampleQdocList = config.getExampleQdocFiles(excludedDirs, excludedFiles);
for (int i=0; i<exampleQdocList.size(); ++i) {
if (!sources.contains(exampleQdocList[i])) {
@@ -429,7 +389,7 @@ static void processQdocconfFile(const QString &fileName)
}
}
- Generator::debugSegfault("Adding doc/image dirs found in exampledirs to imagedirs");
+ Generator::debug("Adding doc/image dirs found in exampledirs to imagedirs");
QSet<QString> exampleImageDirs;
QStringList exampleImageList = config.getExampleImageFiles(excludedDirs, excludedFiles);
for (int i=0; i<exampleImageList.size(); ++i) {
@@ -448,13 +408,14 @@ static void processQdocconfFile(const QString &fileName)
*/
QSet<CodeParser *> usedParsers;
- Generator::debugSegfault("Parsing header files");
+ Generator::debug("Parsing header files");
int parsed = 0;
QMap<QString,QString>::ConstIterator h = headers.constBegin();
while (h != headers.constEnd()) {
CodeParser *codeParser = CodeParser::parserForHeaderFile(h.key());
if (codeParser) {
++parsed;
+ Generator::debug(QString("Parsing " + h.key()));
codeParser->parseHeaderFile(config.location(), h.key());
usedParsers.insert(codeParser);
}
@@ -465,22 +426,26 @@ static void processQdocconfFile(const QString &fileName)
codeParser->doneParsingHeaderFiles();
usedParsers.clear();
+ qdb->resolveInheritance();
+
/*
Parse each source text file in the set using the appropriate parser and
add it to the big tree.
*/
parsed = 0;
- Generator::debugSegfault("Parsing source files");
+ Generator::debug("Parsing source files");
QMap<QString,QString>::ConstIterator s = sources.constBegin();
while (s != sources.constEnd()) {
CodeParser *codeParser = CodeParser::parserForSourceFile(s.key());
if (codeParser) {
++parsed;
+ Generator::debug(QString("Parsing " + s.key()));
codeParser->parseSourceFile(config.location(), s.key());
usedParsers.insert(codeParser);
}
++s;
}
+ Generator::debug(QString("Parsing done."));
foreach (CodeParser *codeParser, usedParsers)
codeParser->doneParsingSourceFiles();
@@ -490,7 +455,7 @@ static void processQdocconfFile(const QString &fileName)
source files. Resolve all the class names, function names,
targets, URLs, links, and other stuff that needs resolving.
*/
- Generator::debugSegfault("Resolving stuff prior to generating docs");
+ Generator::debug("Resolving stuff prior to generating docs");
qdb->resolveIssues();
/*
@@ -499,19 +464,21 @@ static void processQdocconfFile(const QString &fileName)
documentation output. More than one output format can be
requested. The tree is traversed for each one.
*/
- Generator::debugSegfault("Generating docs");
+ Generator::debug("Generating docs");
QSet<QString>::ConstIterator of = outputFormats.constBegin();
while (of != outputFormats.constEnd()) {
Generator* generator = Generator::generatorForFormat(*of);
if (generator == 0)
outputFormatsLocation.fatal(QCoreApplication::translate("QDoc", "Unknown output format '%1'").arg(*of));
- generator->generateTree();
+ generator->generateDocs();
++of;
}
//Generator::writeOutFileNames();
- Generator::debugSegfault("Shutting down qdoc");
+ Generator::debug("Shutting down qdoc");
+ if (Generator::debugging())
+ Generator::stopDebugging(project);
QDocDatabase::qdocDB()->setVersion(QString());
Generator::terminate();
@@ -532,7 +499,7 @@ static void processQdocconfFile(const QString &fileName)
#ifdef DEBUG_SHUTDOWN_CRASH
qDebug() << "main(): qdoc database deleted";
#endif
- Generator::debugSegfault("qdoc finished!");
+ Generator::debug("qdoc finished!");
}
extern Q_CORE_EXPORT QBasicAtomicInt qt_qhash_seed;
@@ -544,8 +511,9 @@ int main(int argc, char **argv)
#ifndef QT_BOOTSTRAPPED
qt_qhash_seed.testAndSetRelaxed(-1, 0); // set the hash seed to 0 if it wasn't set yet
- QCoreApplication app(argc, argv);
#endif
+ QCoreApplication app(argc, argv);
+ app.setApplicationVersion(QStringLiteral(QT_VERSION_STR));
/*
Create code parsers for the languages to be parsed,
@@ -567,93 +535,124 @@ int main(int argc, char **argv)
HtmlGenerator htmlGenerator;
DitaXmlGenerator ditaxmlGenerator;
- QStringList qdocFiles;
- QString opt;
- int i = 1;
-
- while (i < argc) {
- opt = argv[i++];
-
- if (opt == "-help") {
- printHelp();
- return EXIT_SUCCESS;
- }
- else if (opt == "-version") {
- printVersion();
- return EXIT_SUCCESS;
- }
- else if (opt == "--") {
- while (i < argc)
- qdocFiles.append(argv[i++]);
- }
- else if (opt.startsWith("-D")) {
- QString define = opt.mid(2);
- defines += define;
- }
- else if (opt == "-depends") {
- dependModules += argv[i];
- i++;
- }
- else if (opt == "-highlighting") {
- highlighting = true;
- }
- else if (opt == "-showinternal") {
- showInternal = true;
- }
- else if (opt == "-redirect-documentation-to-dev-null") {
- redirectDocumentationToDevNull = true;
- }
- else if (opt == "-no-examples") {
- Config::generateExamples = false;
- }
- else if (opt == "-indexdir") {
- if (QFile::exists(argv[i])) {
- indexDirs += argv[i];
- }
- else {
- qDebug() << "Cannot find index directory" << argv[i];
- }
- i++;
- }
- else if (opt == "-installdir") {
- Config::installDir = argv[i];
- i++;
- }
- else if (opt == "-obsoletelinks") {
- obsoleteLinks = true;
- }
- else if (opt == "-outputdir") {
- Config::overrideOutputDir = argv[i];
- i++;
- }
- else if (opt == "-outputformat") {
- Config::overrideOutputFormats.insert(argv[i]);
- i++;
- }
- else if (opt == "-no-link-errors") {
- noLinkErrors = true;
- }
- else if (opt == "-debug") {
- Generator::setDebugSegfaultFlag(true);
- }
- else if (opt == "-prepare") {
- Generator::setQDocPass(Generator::Prepare);
- }
- else if (opt == "-generate") {
- Generator::setQDocPass(Generator::Generate);
- }
- else if (opt == "-log-progress") {
- Location::startLoggingProgress();
- }
- else {
- qdocFiles.append(opt);
- }
- }
-
- if (qdocFiles.isEmpty()) {
- printHelp();
- return EXIT_FAILURE;
+ QCommandLineParser parser;
+ parser.setApplicationDescription(QCoreApplication::translate("qdoc", "Qt documentation generator"));
+ parser.addHelpOption();
+ parser.addVersionOption();
+
+ parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
+
+ parser.addPositionalArgument("file1.qdocconf ...", QCoreApplication::translate("qdoc", "Input files"));
+
+ QCommandLineOption defineOption(QStringList() << QStringLiteral("D"));
+ defineOption.setDescription(QCoreApplication::translate("qdoc", "Define the argument as a macro while parsing sources"));
+ defineOption.setValueName(QStringLiteral("macro[=def]"));
+ parser.addOption(defineOption);
+
+ QCommandLineOption dependsOption(QStringList() << QStringLiteral("depends"));
+ dependsOption.setDescription(QCoreApplication::translate("qdoc", "Specify dependent modules"));
+ dependsOption.setValueName(QStringLiteral("module"));
+ parser.addOption(dependsOption);
+
+ QCommandLineOption highlightingOption(QStringList() << QStringLiteral("highlighting"));
+ highlightingOption.setDescription(QCoreApplication::translate("qdoc", "Turn on syntax highlighting (makes qdoc run slower)"));
+ parser.addOption(highlightingOption);
+
+ QCommandLineOption showInternalOption(QStringList() << QStringLiteral("showinternal"));
+ showInternalOption.setDescription(QCoreApplication::translate("qdoc", "Include content marked internal"));
+ parser.addOption(showInternalOption);
+
+ QCommandLineOption redirectDocumentationToDevNullOption(QStringList() << QStringLiteral("redirect-documentation-to-dev-null"));
+ redirectDocumentationToDevNullOption.setDescription(QCoreApplication::translate("qdoc", "Save all documentation content to /dev/null. Useful if someone is interested in qdoc errors only."));
+ parser.addOption(redirectDocumentationToDevNullOption);
+
+ QCommandLineOption noExamplesOption(QStringList() << QStringLiteral("no-examples"));
+ noExamplesOption.setDescription(QCoreApplication::translate("qdoc", "Do not generate documentation for examples"));
+ parser.addOption(noExamplesOption);
+
+ QCommandLineOption indexDirOption(QStringList() << QStringLiteral("indexdir"));
+ indexDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify a directory where QDoc should search for index files to load"));
+ indexDirOption.setValueName(QStringLiteral("dir"));
+ parser.addOption(indexDirOption);
+
+ QCommandLineOption installDirOption(QStringList() << QStringLiteral("installdir"));
+ installDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify the directory where the output will be after running \"make install\""));
+ installDirOption.setValueName(QStringLiteral("dir"));
+ parser.addOption(installDirOption);
+
+ QCommandLineOption obsoleteLinksOption(QStringList() << QStringLiteral("obsoletelinks"));
+ obsoleteLinksOption.setDescription(QCoreApplication::translate("qdoc", "Report links from obsolete items to non-obsolete items"));
+ parser.addOption(obsoleteLinksOption);
+
+ QCommandLineOption outputDirOption(QStringList() << QStringLiteral("outputdir"));
+ outputDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify output directory, overrides setting in qdocconf file"));
+ outputDirOption.setValueName(QStringLiteral("dir"));
+ parser.addOption(outputDirOption);
+
+ QCommandLineOption outputFormatOption(QStringList() << QStringLiteral("outputformat"));
+ outputFormatOption.setDescription(QCoreApplication::translate("qdoc", "Specify output format, overrides setting in qdocconf file"));
+ outputFormatOption.setValueName(QStringLiteral("format"));
+ parser.addOption(outputFormatOption);
+
+ QCommandLineOption noLinkErrorsOption(QStringList() << QStringLiteral("no-link-errors"));
+ noLinkErrorsOption.setDescription(QCoreApplication::translate("qdoc", "Do not print link errors (i.e. missing targets)"));
+ parser.addOption(noLinkErrorsOption);
+
+ QCommandLineOption autoLinkErrorsOption(QStringList() << QStringLiteral("autolink-errors"));
+ autoLinkErrorsOption.setDescription(QCoreApplication::translate("qdoc", "Show errors when automatic linking fails"));
+ parser.addOption(autoLinkErrorsOption);
+
+ QCommandLineOption debugOption(QStringList() << QStringLiteral("debug"));
+ debugOption.setDescription(QCoreApplication::translate("qdoc", "Enable debug output"));
+ parser.addOption(debugOption);
+
+ QCommandLineOption prepareOption(QStringList() << QStringLiteral("prepare"));
+ prepareOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc only to generate an index file, not the docs"));
+ parser.addOption(prepareOption);
+
+ QCommandLineOption generateOption(QStringList() << QStringLiteral("generate"));
+ generateOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc to read the index files and generate the docs"));
+ parser.addOption(generateOption);
+
+ QCommandLineOption logProgressOption(QStringList() << QStringLiteral("log-progress"));
+ logProgressOption.setDescription(QCoreApplication::translate("qdoc", "Log progress on stderr."));
+ parser.addOption(logProgressOption);
+
+ parser.process(app);
+
+ defines += parser.values(defineOption);
+ dependModules += parser.values(dependsOption);
+ highlighting = parser.isSet(highlightingOption);
+ showInternal = parser.isSet(showInternalOption);
+ redirectDocumentationToDevNull = parser.isSet(redirectDocumentationToDevNullOption);
+ Config::generateExamples = !parser.isSet(noExamplesOption);
+ foreach (const QString &indexDir, parser.values(indexDirOption)) {
+ if (QFile::exists(indexDir))
+ indexDirs += indexDir;
+ else
+ qDebug() << "Cannot find index directory" << indexDir;
}
+ if (parser.isSet(installDirOption))
+ Config::installDir = parser.value(installDirOption);
+ obsoleteLinks = parser.isSet(obsoleteLinksOption);
+ if (parser.isSet(outputDirOption))
+ Config::overrideOutputDir = parser.value(outputDirOption);
+ foreach (const QString &format, parser.values(outputFormatOption))
+ Config::overrideOutputFormats.insert(format);
+ noLinkErrors = parser.isSet(noLinkErrorsOption);
+ autolinkErrors = parser.isSet(autoLinkErrorsOption);
+ if (parser.isSet(debugOption))
+ Generator::startDebugging(QString("command line"));
+ if (parser.isSet(prepareOption))
+ Generator::setQDocPass(Generator::Prepare);
+ if (parser.isSet(generateOption))
+ Generator::setQDocPass(Generator::Generate);
+ if (parser.isSet(logProgressOption))
+ Location::startLoggingProgress();
+
+ const QStringList qdocFiles = parser.positionalArguments();
+ if (qdocFiles.isEmpty())
+ parser.showHelp();
/*
Main loop.