diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qdoc/main.cpp | 293 | ||||
-rw-r--r-- | src/qdoc/qdoc.pri | 1 | ||||
-rw-r--r-- | src/qdoc/qdoc.pro | 6 | ||||
-rw-r--r-- | src/qdoc/qdoccommandlineparser.cpp | 219 | ||||
-rw-r--r-- | src/qdoc/qdoccommandlineparser.h | 55 | ||||
-rw-r--r-- | src/qdoc/qdocglobals.cpp | 3 |
6 files changed, 328 insertions, 249 deletions
diff --git a/src/qdoc/main.cpp b/src/qdoc/main.cpp index 9a032011c..a2ba37499 100644 --- a/src/qdoc/main.cpp +++ b/src/qdoc/main.cpp @@ -50,6 +50,7 @@ #include "puredocparser.h" #include "qmlcodemarker.h" #include "qmlcodeparser.h" +#include "qdoccommandlineparser.h" #include "qdocdatabase.h" #include "qdocglobals.h" #include "qtranslator.h" @@ -76,7 +77,7 @@ static QList<Translator> translators; #endif static ClangCodeParser* clangParser_ = nullptr; -Q_GLOBAL_STATIC(QDocGlobals, qdocGlobals) +static QDocGlobals qdocGlobals; /*! Read some XML indexes containing definitions from other @@ -100,8 +101,8 @@ static void loadIndexFiles(Config& config, const QSet<QString> &formats) Location::null.warning(QString("Index file not found: %1").arg(index)); } - qdocGlobals->dependModules() += config.getStringList(CONFIG_DEPENDS); - qdocGlobals->dependModules().removeDuplicates(); + qdocGlobals.dependModules() += config.getStringList(CONFIG_DEPENDS); + qdocGlobals.dependModules().removeDuplicates(); QSet<QString> subDirs; for (const auto &format : formats) { @@ -115,41 +116,41 @@ static void loadIndexFiles(Config& config, const QSet<QString> &formats) } } - if (qdocGlobals->dependModules().size() > 0) { - if (qdocGlobals->indexDirs().size() > 0) { - for (int i = 0; i < qdocGlobals->indexDirs().size(); i++) { - if (qdocGlobals->indexDirs()[i].startsWith("..")) { - const QString prefix(QDir(qdocGlobals->currentDir()).relativeFilePath(qdocGlobals->previousCurrentDir())); + if (qdocGlobals.dependModules().size() > 0) { + if (qdocGlobals.indexDirs().size() > 0) { + for (int i = 0; i < qdocGlobals.indexDirs().size(); i++) { + if (qdocGlobals.indexDirs()[i].startsWith("..")) { + const QString prefix(QDir(qdocGlobals.currentDir()).relativeFilePath(qdocGlobals.previousCurrentDir())); if (!prefix.isEmpty()) - qdocGlobals->indexDirs()[i].prepend(prefix + QLatin1Char('/')); + qdocGlobals.indexDirs()[i].prepend(prefix + QLatin1Char('/')); } } /* Add all subdirectories of the indexdirs as dependModules, when an asterisk is used in the 'depends' list. */ - if (qdocGlobals->dependModules().contains("*")) { - qdocGlobals->dependModules().removeOne("*"); - for (int i = 0; i < qdocGlobals->indexDirs().size(); i++) { - QDir scanDir = QDir(qdocGlobals->indexDirs()[i]); + if (qdocGlobals.dependModules().contains("*")) { + qdocGlobals.dependModules().removeOne("*"); + for (int i = 0; i < qdocGlobals.indexDirs().size(); i++) { + QDir scanDir = QDir(qdocGlobals.indexDirs()[i]); scanDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); QFileInfoList dirList = scanDir.entryInfoList(); for (int j = 0; j < dirList.size(); j++) { if (dirList[j].fileName().toLower() != config.getString(CONFIG_PROJECT).toLower()) - qdocGlobals->dependModules().append(dirList[j].fileName()); + qdocGlobals.dependModules().append(dirList[j].fileName()); } } } - for (int i = 0; i < qdocGlobals->dependModules().size(); i++) { + for (int i = 0; i < qdocGlobals.dependModules().size(); i++) { QString indexToAdd; QList<QFileInfo> foundIndices; // Always look in module-specific subdir, even with *.nosubdirs config - subDirs << qdocGlobals->dependModules()[i]; - for (int j = 0; j < qdocGlobals->indexDirs().size(); j++) { + subDirs << qdocGlobals.dependModules()[i]; + for (int j = 0; j < qdocGlobals.indexDirs().size(); j++) { for (const auto &subDir : subDirs) { - QString fileToLookFor = qdocGlobals->indexDirs()[j] + QString fileToLookFor = qdocGlobals.indexDirs()[j] + QLatin1Char('/') + subDir - + QLatin1Char('/') + qdocGlobals->dependModules()[i] + ".index"; + + QLatin1Char('/') + qdocGlobals.dependModules()[i] + ".index"; if (QFile::exists(fileToLookFor)) { QFileInfo tempFileInfo(fileToLookFor); if (!foundIndices.contains(tempFileInfo)) @@ -157,7 +158,7 @@ static void loadIndexFiles(Config& config, const QSet<QString> &formats) } } } - subDirs.remove(qdocGlobals->dependModules()[i]); + subDirs.remove(qdocGlobals.dependModules()[i]); std::sort(foundIndices.begin(), foundIndices.end(), creationTimeBefore); if (foundIndices.size() > 1) { /* @@ -169,10 +170,10 @@ static void loadIndexFiles(Config& config, const QSet<QString> &formats) for (int k = 0; k < foundIndices.size(); k++) indexPaths << foundIndices[k].absoluteFilePath(); Location::null.warning(QString("Multiple index files found for dependency \"%1\":\n%2").arg( - qdocGlobals->dependModules()[i], indexPaths.join('\n'))); + qdocGlobals.dependModules()[i], indexPaths.join('\n'))); Location::null.warning(QString("Using %1 as index file for dependency \"%2\"").arg( foundIndices[foundIndices.size() - 1].absoluteFilePath(), - qdocGlobals->dependModules()[i])); + qdocGlobals.dependModules()[i])); indexToAdd = foundIndices[foundIndices.size() - 1].absoluteFilePath(); } else if (foundIndices.size() == 1) { @@ -184,7 +185,7 @@ static void loadIndexFiles(Config& config, const QSet<QString> &formats) } else { Location::null.warning(QString("\"%1\" Cannot locate index file for dependency \"%2\"").arg( - config.getString(CONFIG_PROJECT), qdocGlobals->dependModules()[i])); + config.getString(CONFIG_PROJECT), qdocGlobals.dependModules()[i])); } } } @@ -214,19 +215,19 @@ static void processQdocconfFile(const QString &fileName) Config config(QCoreApplication::translate("QDoc", "qdoc")); QHash<QString,QString>::iterator iter; - for (iter = qdocGlobals->defaults().begin(); iter != qdocGlobals->defaults().end(); ++iter) + for (iter = qdocGlobals.defaults().begin(); iter != qdocGlobals.defaults().end(); ++iter) config.setStringList(iter.key(), QStringList() << iter.value()); - config.setStringList(CONFIG_SYNTAXHIGHLIGHTING, QStringList(qdocGlobals->highlighting() ? "true" : "false")); - config.setStringList(CONFIG_SHOWINTERNAL, QStringList(qdocGlobals->showInternal() ? "true" : "false")); - config.setStringList(CONFIG_SINGLEEXEC, QStringList(qdocGlobals->singleExec() ? "true" : "false")); - config.setStringList(CONFIG_WRITEQAPAGES, QStringList(qdocGlobals->writeQaPages() ? "true" : "false")); - config.setStringList(CONFIG_REDIRECTDOCUMENTATIONTODEVNULL, QStringList(qdocGlobals->redirectDocumentationToDevNull() ? "true" : "false")); - config.setStringList(CONFIG_NOLINKERRORS, QStringList(qdocGlobals->noLinkErrors() ? "true" : "false")); - config.setStringList(CONFIG_AUTOLINKERRORS, QStringList(qdocGlobals->autolinkErrors() ? "true" : "false")); - config.setStringList(CONFIG_OBSOLETELINKS, QStringList(qdocGlobals->obsoleteLinks() ? "true" : "false")); + config.setStringList(CONFIG_SYNTAXHIGHLIGHTING, QStringList(qdocGlobals.highlighting() ? "true" : "false")); + config.setStringList(CONFIG_SHOWINTERNAL, QStringList(qdocGlobals.showInternal() ? "true" : "false")); + config.setStringList(CONFIG_SINGLEEXEC, QStringList(qdocGlobals.singleExec() ? "true" : "false")); + config.setStringList(CONFIG_WRITEQAPAGES, QStringList(qdocGlobals.writeQaPages() ? "true" : "false")); + config.setStringList(CONFIG_REDIRECTDOCUMENTATIONTODEVNULL, QStringList(qdocGlobals.redirectDocumentationToDevNull() ? "true" : "false")); + config.setStringList(CONFIG_NOLINKERRORS, QStringList(qdocGlobals.noLinkErrors() ? "true" : "false")); + config.setStringList(CONFIG_AUTOLINKERRORS, QStringList(qdocGlobals.autolinkErrors() ? "true" : "false")); + config.setStringList(CONFIG_OBSOLETELINKS, QStringList(qdocGlobals.obsoleteLinks() ? "true" : "false")); - qdocGlobals->setPreviousCurrentDir(QDir::currentPath()); + qdocGlobals.setPreviousCurrentDir(QDir::currentPath()); /* With the default configuration values in place, load @@ -244,15 +245,15 @@ static void processQdocconfFile(const QString &fileName) /* Add the defines to the configuration variables. */ - QStringList defs = qdocGlobals->defines() + config.getStringList(CONFIG_DEFINES); + QStringList defs = qdocGlobals.defines() + config.getStringList(CONFIG_DEFINES); config.setStringList(CONFIG_DEFINES,defs); - QStringList incs = qdocGlobals->includesPaths() + config.getStringList(CONFIG_INCLUDEPATHS); + QStringList incs = qdocGlobals.includesPaths() + config.getStringList(CONFIG_INCLUDEPATHS); config.setStringList(CONFIG_INCLUDEPATHS, incs); Location::terminate(); - qdocGlobals->setCurrentDir(QFileInfo(fileName).path()); - if (!qdocGlobals->currentDir().isEmpty()) - QDir::setCurrent(qdocGlobals->currentDir()); + qdocGlobals.setCurrentDir(QFileInfo(fileName).path()); + if (!qdocGlobals.currentDir().isEmpty()) + QDir::setCurrent(qdocGlobals.currentDir()); QString phase = " in -"; if (Generator::singleExec()) @@ -360,9 +361,9 @@ static void processQdocconfFile(const QString &fileName) else clangParser_->setModuleHeader(project); - qdocGlobals->dependModules() = config.getStringList(CONFIG_DEPENDS); - qdocGlobals->dependModules().removeDuplicates(); - qdb->setSearchOrder(qdocGlobals->dependModules()); + qdocGlobals.dependModules() = config.getStringList(CONFIG_DEPENDS); + qdocGlobals.dependModules().removeDuplicates(); + qdb->setSearchOrder(qdocGlobals.dependModules()); // Store the title of the index (landing) page NamespaceNode* root = qdb->primaryTreeRoot(); @@ -521,211 +522,11 @@ static void processQdocconfFile(const QString &fileName) Doc::terminate(); Tokenizer::terminate(); Location::terminate(); - QDir::setCurrent(qdocGlobals->previousCurrentDir()); + QDir::setCurrent(qdocGlobals.previousCurrentDir()); qCDebug(lcQdoc, "qdoc classes terminated"); } -class QDocCommandLineParser : public QCommandLineParser -{ -public: - QDocCommandLineParser(); - void process(const QCoreApplication &app); - -private: - QCommandLineOption defineOption, dependsOption, highlightingOption; - QCommandLineOption showInternalOption, redirectDocumentationToDevNullOption; - QCommandLineOption noExamplesOption, indexDirOption, installDirOption; - QCommandLineOption obsoleteLinksOption, outputDirOption, outputFormatOption; - QCommandLineOption noLinkErrorsOption, autoLinkErrorsOption, debugOption; - QCommandLineOption prepareOption, generateOption, logProgressOption; - QCommandLineOption singleExecOption, writeQaPagesOption; - QCommandLineOption includePathOption, includePathSystemOption, frameworkOption; -}; - -QDocCommandLineParser::QDocCommandLineParser() - : QCommandLineParser(), - defineOption(QStringList() << QStringLiteral("D")), - dependsOption(QStringList() << QStringLiteral("depends")), - highlightingOption(QStringList() << QStringLiteral("highlighting")), - showInternalOption(QStringList() << QStringLiteral("showinternal")), - redirectDocumentationToDevNullOption(QStringList() << QStringLiteral("redirect-documentation-to-dev-null")), - noExamplesOption(QStringList() << QStringLiteral("no-examples")), - indexDirOption(QStringList() << QStringLiteral("indexdir")), - installDirOption(QStringList() << QStringLiteral("installdir")), - obsoleteLinksOption(QStringList() << QStringLiteral("obsoletelinks")), - outputDirOption(QStringList() << QStringLiteral("outputdir")), - outputFormatOption(QStringList() << QStringLiteral("outputformat")), - noLinkErrorsOption(QStringList() << QStringLiteral("no-link-errors")), - autoLinkErrorsOption(QStringList() << QStringLiteral("autolink-errors")), - debugOption(QStringList() << QStringLiteral("debug")), - prepareOption(QStringList() << QStringLiteral("prepare")), - generateOption(QStringList() << QStringLiteral("generate")), - logProgressOption(QStringList() << QStringLiteral("log-progress")), - singleExecOption(QStringList() << QStringLiteral("single-exec")), - writeQaPagesOption(QStringList() << QStringLiteral("write-qa-pages")), - includePathOption("I", "Add dir to the include path for header files.", "path"), - includePathSystemOption("isystem", "Add dir to the system include path for header files.", "path"), - frameworkOption("F", "Add macOS framework to the include path for header files.", "framework") -{ - setApplicationDescription(QCoreApplication::translate("qdoc", "Qt documentation generator")); - addHelpOption(); - addVersionOption(); - - setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); - - addPositionalArgument("file1.qdocconf ...", QCoreApplication::translate("qdoc", "Input files")); - - defineOption.setDescription(QCoreApplication::translate("qdoc", "Define the argument as a macro while parsing sources")); - defineOption.setValueName(QStringLiteral("macro[=def]")); - addOption(defineOption); - - dependsOption.setDescription(QCoreApplication::translate("qdoc", "Specify dependent modules")); - dependsOption.setValueName(QStringLiteral("module")); - addOption(dependsOption); - - highlightingOption.setDescription(QCoreApplication::translate("qdoc", "Turn on syntax highlighting (makes qdoc run slower)")); - addOption(highlightingOption); - - showInternalOption.setDescription(QCoreApplication::translate("qdoc", "Include content marked internal")); - addOption(showInternalOption); - - redirectDocumentationToDevNullOption.setDescription(QCoreApplication::translate("qdoc", "Save all documentation content to /dev/null. Useful if someone is interested in qdoc errors only.")); - addOption(redirectDocumentationToDevNullOption); - - noExamplesOption.setDescription(QCoreApplication::translate("qdoc", "Do not generate documentation for examples")); - addOption(noExamplesOption); - - indexDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify a directory where QDoc should search for index files to load")); - indexDirOption.setValueName(QStringLiteral("dir")); - addOption(indexDirOption); - - installDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify the directory where the output will be after running \"make install\"")); - installDirOption.setValueName(QStringLiteral("dir")); - addOption(installDirOption); - - obsoleteLinksOption.setDescription(QCoreApplication::translate("qdoc", "Report links from obsolete items to non-obsolete items")); - addOption(obsoleteLinksOption); - - outputDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify output directory, overrides setting in qdocconf file")); - outputDirOption.setValueName(QStringLiteral("dir")); - addOption(outputDirOption); - - outputFormatOption.setDescription(QCoreApplication::translate("qdoc", "Specify output format, overrides setting in qdocconf file")); - outputFormatOption.setValueName(QStringLiteral("format")); - addOption(outputFormatOption); - - noLinkErrorsOption.setDescription(QCoreApplication::translate("qdoc", "Do not print link errors (i.e. missing targets)")); - addOption(noLinkErrorsOption); - - autoLinkErrorsOption.setDescription(QCoreApplication::translate("qdoc", "Show errors when automatic linking fails")); - addOption(autoLinkErrorsOption); - - debugOption.setDescription(QCoreApplication::translate("qdoc", "Enable debug output")); - addOption(debugOption); - - prepareOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc only to generate an index file, not the docs")); - addOption(prepareOption); - - generateOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc to read the index files and generate the docs")); - addOption(generateOption); - - logProgressOption.setDescription(QCoreApplication::translate("qdoc", "Log progress on stderr.")); - addOption(logProgressOption); - - singleExecOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc once over all the qdoc conf files.")); - addOption(singleExecOption); - - writeQaPagesOption.setDescription(QCoreApplication::translate("qdoc", "Write QA pages.")); - addOption(writeQaPagesOption); - - includePathOption.setFlags(QCommandLineOption::ShortOptionStyle); - addOption(includePathOption); - - addOption(includePathSystemOption); - - frameworkOption.setFlags(QCommandLineOption::ShortOptionStyle); - addOption(frameworkOption); -} - -void QDocCommandLineParser::process(const QCoreApplication &app) -{ - QCommandLineParser::process(app); - - qdocGlobals->addDefine(values(defineOption)); - qdocGlobals->dependModules() += values(dependsOption); - qdocGlobals->enableHighlighting(isSet(highlightingOption)); - qdocGlobals->setShowInternal(isSet(showInternalOption)); - qdocGlobals->setSingleExec(isSet(singleExecOption)); - qdocGlobals->setWriteQaPages(isSet(writeQaPagesOption)); - qdocGlobals->setRedirectDocumentationToDevNull(isSet(redirectDocumentationToDevNullOption)); - Config::generateExamples = !isSet(noExamplesOption); - foreach (const QString &indexDir, values(indexDirOption)) { - if (QFile::exists(indexDir)) - qdocGlobals->appendToIndexDirs(indexDir); - else - qDebug() << "Cannot find index directory" << indexDir; - } - if (isSet(installDirOption)) - Config::installDir = value(installDirOption); - qdocGlobals->setObsoleteLinks(isSet(obsoleteLinksOption)); - if (isSet(outputDirOption)) - Config::overrideOutputDir = value(outputDirOption); - foreach (const QString &format, values(outputFormatOption)) - Config::overrideOutputFormats.insert(format); - qdocGlobals->setNoLinkErrors(isSet(noLinkErrorsOption) || qEnvironmentVariableIsSet("QDOC_NOLINKERRORS")); - qdocGlobals->setAutolinkErrors(isSet(autoLinkErrorsOption)); - if (isSet(debugOption)) - Generator::startDebugging(QString("command line")); - qCDebug(lcQdoc).noquote() << "Arguments :" << QCoreApplication::arguments(); - - if (isSet(prepareOption)) - Generator::setQDocPass(Generator::Prepare); - if (isSet(generateOption)) - Generator::setQDocPass(Generator::Generate); - if (isSet(singleExecOption)) { - Generator::setSingleExec(); - if (isSet(indexDirOption)) - qDebug() << "WARNING: -indexdir option ignored: Index files are not used in -single-exec mode."; - } - if (isSet(writeQaPagesOption)) - Generator::setWriteQaPages(); - if (isSet(logProgressOption)) - Location::startLoggingProgress(); - - QDir currentDir = QDir::current(); - const auto paths = values(includePathOption); - for (const auto &i : paths) - qdocGlobals->addIncludePath("-I ", currentDir.absoluteFilePath(i)); - -#ifdef QDOC_PASS_ISYSTEM - const auto paths2 = values(includePathSystemOption); - for (const auto &i : paths2) - qdocGlobals->addIncludePath("-isystem", currentDir.absoluteFilePath(i)); -#endif - const auto paths3 = values(frameworkOption); - for (const auto &i : paths3) - qdocGlobals->addIncludePath("-F", currentDir.absoluteFilePath(i)); - - /* - The default indent for code is 0. - The default value for false is 0. - The default supported file extensions are cpp, h, qdoc and qml. - The default language is c++. - The default output format is html. - The default tab size is 8. - And those are all the default values for configuration variables. - */ - if (qdocGlobals->defaults().isEmpty()) { - qdocGlobals->defaults().insert(CONFIG_CODEINDENT, QLatin1String("0")); - qdocGlobals->defaults().insert(CONFIG_FALSEHOODS, QLatin1String("0")); - qdocGlobals->defaults().insert(CONFIG_FILEEXTENSIONS, QLatin1String("*.cpp *.h *.qdoc *.qml")); - qdocGlobals->defaults().insert(CONFIG_LANGUAGE, QLatin1String("Cpp")); - qdocGlobals->defaults().insert(CONFIG_OUTPUTFORMATS, QLatin1String("HTML")); - qdocGlobals->defaults().insert(CONFIG_TABSIZE, QLatin1String("8")); - } -} - QT_END_NAMESPACE int main(int argc, char **argv) @@ -763,21 +564,21 @@ int main(int argc, char **argv) // Set the globals declared at the top of this file: QDocCommandLineParser parser; - parser.process(app); + parser.process(app, qdocGlobals); // Get the list of files to act on: QStringList qdocFiles = parser.positionalArguments(); if (qdocFiles.isEmpty()) parser.showHelp(); - if (qdocGlobals->singleExec()) + if (qdocGlobals.singleExec()) qdocFiles = Config::loadMaster(qdocFiles.at(0)); // Main loop (adapted, when needed, to handle single exec mode): if (Generator::singleExec()) Generator::setQDocPass(Generator::Prepare); foreach (const QString &qf, qdocFiles) { - qdocGlobals->dependModules().clear(); + qdocGlobals.dependModules().clear(); processQdocconfFile(qf); } if (Generator::singleExec()) { @@ -785,7 +586,7 @@ int main(int argc, char **argv) QDocDatabase* qdb = QDocDatabase::qdocDB(); qdb->processForest(); foreach (const QString &qf, qdocFiles) { - qdocGlobals->dependModules().clear(); + qdocGlobals.dependModules().clear(); processQdocconfFile(qf); } } diff --git a/src/qdoc/qdoc.pri b/src/qdoc/qdoc.pri index 2ba060d61..3037b36be 100644 --- a/src/qdoc/qdoc.pri +++ b/src/qdoc/qdoc.pri @@ -3,4 +3,5 @@ INCLUDEPATH += $$PWD HEADERS += $$PWD/qdocglobals.h + SOURCES += $$PWD/qdocglobals.cpp diff --git a/src/qdoc/qdoc.pro b/src/qdoc/qdoc.pro index da7693ea7..aae34a1da 100644 --- a/src/qdoc/qdoc.pro +++ b/src/qdoc/qdoc.pro @@ -58,7 +58,8 @@ HEADERS += atom.h \ text.h \ tokenizer.h \ tree.h \ - webxmlgenerator.h + webxmlgenerator.h \ + qdoccommandlineparser.h SOURCES += atom.cpp \ clangcodeparser.cpp \ @@ -88,7 +89,8 @@ SOURCES += atom.cpp \ tokenizer.cpp \ tree.cpp \ yyindent.cpp \ - webxmlgenerator.cpp + webxmlgenerator.cpp \ + qdoccommandlineparser.cpp ### QML/JS Parser ### diff --git a/src/qdoc/qdoccommandlineparser.cpp b/src/qdoc/qdoccommandlineparser.cpp new file mode 100644 index 000000000..4aa691fc9 --- /dev/null +++ b/src/qdoc/qdoccommandlineparser.cpp @@ -0,0 +1,219 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdoccommandlineparser.h" + +#include <QtCore/qdebug.h> +#include <QtCore/qfile.h> + +#include "config.h" +#include "generator.h" +#include "loggingcategory.h" + +QDocCommandLineParser::QDocCommandLineParser() + : QCommandLineParser(), + defineOption(QStringList() << QStringLiteral("D")), + dependsOption(QStringList() << QStringLiteral("depends")), + highlightingOption(QStringList() << QStringLiteral("highlighting")), + showInternalOption(QStringList() << QStringLiteral("showinternal")), + redirectDocumentationToDevNullOption(QStringList() << QStringLiteral("redirect-documentation-to-dev-null")), + noExamplesOption(QStringList() << QStringLiteral("no-examples")), + indexDirOption(QStringList() << QStringLiteral("indexdir")), + installDirOption(QStringList() << QStringLiteral("installdir")), + obsoleteLinksOption(QStringList() << QStringLiteral("obsoletelinks")), + outputDirOption(QStringList() << QStringLiteral("outputdir")), + outputFormatOption(QStringList() << QStringLiteral("outputformat")), + noLinkErrorsOption(QStringList() << QStringLiteral("no-link-errors")), + autoLinkErrorsOption(QStringList() << QStringLiteral("autolink-errors")), + debugOption(QStringList() << QStringLiteral("debug")), + prepareOption(QStringList() << QStringLiteral("prepare")), + generateOption(QStringList() << QStringLiteral("generate")), + logProgressOption(QStringList() << QStringLiteral("log-progress")), + singleExecOption(QStringList() << QStringLiteral("single-exec")), + writeQaPagesOption(QStringList() << QStringLiteral("write-qa-pages")), + includePathOption("I", "Add dir to the include path for header files.", "path"), + includePathSystemOption("isystem", "Add dir to the system include path for header files.", "path"), + frameworkOption("F", "Add macOS framework to the include path for header files.", "framework") +{ + setApplicationDescription(QCoreApplication::translate("qdoc", "Qt documentation generator")); + addHelpOption(); + addVersionOption(); + + setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); + + addPositionalArgument("file1.qdocconf ...", QCoreApplication::translate("qdoc", "Input files")); + + defineOption.setDescription(QCoreApplication::translate("qdoc", "Define the argument as a macro while parsing sources")); + defineOption.setValueName(QStringLiteral("macro[=def]")); + addOption(defineOption); + + dependsOption.setDescription(QCoreApplication::translate("qdoc", "Specify dependent modules")); + dependsOption.setValueName(QStringLiteral("module")); + addOption(dependsOption); + + highlightingOption.setDescription(QCoreApplication::translate("qdoc", "Turn on syntax highlighting (makes qdoc run slower)")); + addOption(highlightingOption); + + showInternalOption.setDescription(QCoreApplication::translate("qdoc", "Include content marked internal")); + addOption(showInternalOption); + + redirectDocumentationToDevNullOption.setDescription(QCoreApplication::translate("qdoc", "Save all documentation content to /dev/null. Useful if someone is interested in qdoc errors only.")); + addOption(redirectDocumentationToDevNullOption); + + noExamplesOption.setDescription(QCoreApplication::translate("qdoc", "Do not generate documentation for examples")); + addOption(noExamplesOption); + + indexDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify a directory where QDoc should search for index files to load")); + indexDirOption.setValueName(QStringLiteral("dir")); + addOption(indexDirOption); + + installDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify the directory where the output will be after running \"make install\"")); + installDirOption.setValueName(QStringLiteral("dir")); + addOption(installDirOption); + + obsoleteLinksOption.setDescription(QCoreApplication::translate("qdoc", "Report links from obsolete items to non-obsolete items")); + addOption(obsoleteLinksOption); + + outputDirOption.setDescription(QCoreApplication::translate("qdoc", "Specify output directory, overrides setting in qdocconf file")); + outputDirOption.setValueName(QStringLiteral("dir")); + addOption(outputDirOption); + + outputFormatOption.setDescription(QCoreApplication::translate("qdoc", "Specify output format, overrides setting in qdocconf file")); + outputFormatOption.setValueName(QStringLiteral("format")); + addOption(outputFormatOption); + + noLinkErrorsOption.setDescription(QCoreApplication::translate("qdoc", "Do not print link errors (i.e. missing targets)")); + addOption(noLinkErrorsOption); + + autoLinkErrorsOption.setDescription(QCoreApplication::translate("qdoc", "Show errors when automatic linking fails")); + addOption(autoLinkErrorsOption); + + debugOption.setDescription(QCoreApplication::translate("qdoc", "Enable debug output")); + addOption(debugOption); + + prepareOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc only to generate an index file, not the docs")); + addOption(prepareOption); + + generateOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc to read the index files and generate the docs")); + addOption(generateOption); + + logProgressOption.setDescription(QCoreApplication::translate("qdoc", "Log progress on stderr.")); + addOption(logProgressOption); + + singleExecOption.setDescription(QCoreApplication::translate("qdoc", "Run qdoc once over all the qdoc conf files.")); + addOption(singleExecOption); + + writeQaPagesOption.setDescription(QCoreApplication::translate("qdoc", "Write QA pages.")); + addOption(writeQaPagesOption); + + includePathOption.setFlags(QCommandLineOption::ShortOptionStyle); + addOption(includePathOption); + + addOption(includePathSystemOption); + + frameworkOption.setFlags(QCommandLineOption::ShortOptionStyle); + addOption(frameworkOption); +} + +void QDocCommandLineParser::process(const QCoreApplication &app, QDocGlobals &qdocGlobals) +{ + QCommandLineParser::process(app); + + qdocGlobals.addDefine(values(defineOption)); + qdocGlobals.dependModules() += values(dependsOption); + qdocGlobals.enableHighlighting(isSet(highlightingOption)); + qdocGlobals.setShowInternal(isSet(showInternalOption)); + qdocGlobals.setSingleExec(isSet(singleExecOption)); + qdocGlobals.setWriteQaPages(isSet(writeQaPagesOption)); + qdocGlobals.setRedirectDocumentationToDevNull(isSet(redirectDocumentationToDevNullOption)); + Config::generateExamples = !isSet(noExamplesOption); + foreach (const QString &indexDir, values(indexDirOption)) { + if (QFile::exists(indexDir)) + qdocGlobals.appendToIndexDirs(indexDir); + else + qDebug() << "Cannot find index directory" << indexDir; + } + if (isSet(installDirOption)) + Config::installDir = value(installDirOption); + qdocGlobals.setObsoleteLinks(isSet(obsoleteLinksOption)); + if (isSet(outputDirOption)) + Config::overrideOutputDir = value(outputDirOption); + foreach (const QString &format, values(outputFormatOption)) + Config::overrideOutputFormats.insert(format); + qdocGlobals.setNoLinkErrors(isSet(noLinkErrorsOption) || qEnvironmentVariableIsSet("QDOC_NOLINKERRORS")); + qdocGlobals.setAutolinkErrors(isSet(autoLinkErrorsOption)); + if (isSet(debugOption)) + Generator::startDebugging(QString("command line")); + qCDebug(lcQdoc).noquote() << "Arguments :" << QCoreApplication::arguments(); + + if (isSet(prepareOption)) + Generator::setQDocPass(Generator::Prepare); + if (isSet(generateOption)) + Generator::setQDocPass(Generator::Generate); + if (isSet(singleExecOption)) { + Generator::setSingleExec(); + if (isSet(indexDirOption)) + qDebug() << "WARNING: -indexdir option ignored: Index files are not used in -single-exec mode."; + } + if (isSet(writeQaPagesOption)) + Generator::setWriteQaPages(); + if (isSet(logProgressOption)) + Location::startLoggingProgress(); + + QDir currentDir = QDir::current(); + const auto paths = values(includePathOption); + for (const auto &i : paths) + qdocGlobals.addIncludePath("-I", currentDir.absoluteFilePath(i)); + +#ifdef QDOC_PASS_ISYSTEM + const auto paths2 = values(includePathSystemOption); + for (const auto &i : paths2) + qdocGlobals.addIncludePath("-isystem", currentDir.absoluteFilePath(i)); +#endif + const auto paths3 = values(frameworkOption); + for (const auto &i : paths3) + qdocGlobals.addIncludePath("-F", currentDir.absoluteFilePath(i)); + + /* + The default indent for code is 0. + The default value for false is 0. + The default supported file extensions are cpp, h, qdoc and qml. + The default language is c++. + The default output format is html. + The default tab size is 8. + And those are all the default values for configuration variables. + */ + if (qdocGlobals.defaults().isEmpty()) { + qdocGlobals.defaults().insert(CONFIG_CODEINDENT, QLatin1String("0")); + qdocGlobals.defaults().insert(CONFIG_FALSEHOODS, QLatin1String("0")); + qdocGlobals.defaults().insert(CONFIG_FILEEXTENSIONS, QLatin1String("*.cpp *.h *.qdoc *.qml")); + qdocGlobals.defaults().insert(CONFIG_LANGUAGE, QLatin1String("Cpp")); + qdocGlobals.defaults().insert(CONFIG_OUTPUTFORMATS, QLatin1String("HTML")); + qdocGlobals.defaults().insert(CONFIG_TABSIZE, QLatin1String("8")); + } +} diff --git a/src/qdoc/qdoccommandlineparser.h b/src/qdoc/qdoccommandlineparser.h new file mode 100644 index 000000000..cbaea5250 --- /dev/null +++ b/src/qdoc/qdoccommandlineparser.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDOCCOMMANDLINEPARSER_H +#define QDOCCOMMANDLINEPARSER_H +#include <QtCore/qcommandlineparser.h> +#include "qdocglobals.h" + +QT_BEGIN_NAMESPACE + +class QDocCommandLineParser : public QCommandLineParser +{ +public: + QDocCommandLineParser(); + void process(const QCoreApplication &app, QDocGlobals &qdocGlobals); + +private: + QCommandLineOption defineOption, dependsOption, highlightingOption; + QCommandLineOption showInternalOption, redirectDocumentationToDevNullOption; + QCommandLineOption noExamplesOption, indexDirOption, installDirOption; + QCommandLineOption obsoleteLinksOption, outputDirOption, outputFormatOption; + QCommandLineOption noLinkErrorsOption, autoLinkErrorsOption, debugOption; + QCommandLineOption prepareOption, generateOption, logProgressOption; + QCommandLineOption singleExecOption, writeQaPagesOption; + QCommandLineOption includePathOption, includePathSystemOption, frameworkOption; +}; + +QT_END_NAMESPACE + +#endif // QDOCCOMMANDLINEPARSER_H diff --git a/src/qdoc/qdocglobals.cpp b/src/qdoc/qdocglobals.cpp index 181b32b9d..2e1e084ed 100644 --- a/src/qdoc/qdocglobals.cpp +++ b/src/qdoc/qdocglobals.cpp @@ -127,7 +127,8 @@ QStringList QDocGlobals::includesPaths() void QDocGlobals::addIncludePath(const QString &flag, const QString &path) { - m_includesPaths << flag << path; + QString includePath = flag + path; + m_includesPaths << includePath; } QStringList &QDocGlobals::dependModules() |