Doxygen
Loading...
Searching...
No Matches
doxygen.h File Reference
#include <mutex>
#include "containers.h"
#include "membergroup.h"
#include "dirdef.h"
#include "memberlist.h"
#include "define.h"
#include "cache.h"
#include "symbolmap.h"
#include "searchindex.h"
Include dependency graph for doxygen.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  LookupInfo
struct  InputFileEncoding
struct  NamespaceAliasInfo
class  Doxygen
 This class serves as a namespace for global variables used by doxygen. More...

Macros

#define THREAD_LOCAL   thread_local
#define AtomicInt   std::atomic_int

Typedefs

using InputFileEncodingList = std::vector<InputFileEncoding>
using ClangUsrMap = std::unordered_map<std::string,const Definition *>
using StaticInitMap = std::unordered_map<std::string,BodyInfo>
using NamespaceAliasInfoMap = std::unordered_map<std::string,NamespaceAliasInfo>

Functions

void initDoxygen ()
void readConfiguration (int argc, char **argv)
void checkConfiguration ()
 check and resolve config options
void adjustConfiguration ()
 adjust globals that depend on configuration settings.
void parseInput ()
void generateOutput ()
void cleanUpDoxygen ()
void readFileOrDirectory (const QCString &s, FileNameLinkedMap *fnDict, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool recursive, bool errorIfNotExist=TRUE, StringUnorderedSet *killSet=nullptr, StringUnorderedSet *paths=nullptr)

Macro Definition Documentation

◆ AtomicInt

#define AtomicInt   std::atomic_int

Definition at line 31 of file doxygen.h.

◆ THREAD_LOCAL

#define THREAD_LOCAL   thread_local

Typedef Documentation

◆ ClangUsrMap

using ClangUsrMap = std::unordered_map<std::string,const Definition *>

Definition at line 82 of file doxygen.h.

◆ InputFileEncodingList

Definition at line 80 of file doxygen.h.

◆ NamespaceAliasInfoMap

using NamespaceAliasInfoMap = std::unordered_map<std::string,NamespaceAliasInfo>

Definition at line 86 of file doxygen.h.

◆ StaticInitMap

using StaticInitMap = std::unordered_map<std::string,BodyInfo>

Definition at line 84 of file doxygen.h.

Function Documentation

◆ adjustConfiguration()

void adjustConfiguration ( )

adjust globals that depend on configuration settings.

Definition at line 12048 of file doxygen.cpp.

12049{
12050 AUTO_TRACE();
12051 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12062
12063 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12064
12065 /* Set the global html file extension. */
12066 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12067
12068
12070 Config_getBool(CALLER_GRAPH) ||
12071 Config_getBool(REFERENCES_RELATION) ||
12072 Config_getBool(REFERENCED_BY_RELATION);
12073
12074 /**************************************************************************
12075 * Add custom extension mappings
12076 **************************************************************************/
12077
12078 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
12079 for (const auto &mapping : extMaps)
12080 {
12081 QCString mapStr = mapping;
12082 int i=mapStr.find('=');
12083 if (i==-1)
12084 {
12085 continue;
12086 }
12087 else
12088 {
12089 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
12090 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12091 if (ext.isEmpty() || language.isEmpty())
12092 {
12093 continue;
12094 }
12095
12096 if (!updateLanguageMapping(ext,language))
12097 {
12098 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12099 "Check the EXTENSION_MAPPING setting in the config file.\n",
12100 ext,language);
12101 }
12102 else
12103 {
12104 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12105 ext,language);
12106 }
12107 }
12108 }
12109 // create input file exncodings
12110
12111 // check INPUT_ENCODING
12112 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12113 if (cd==reinterpret_cast<void *>(-1))
12114 {
12115 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12116 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12117 Config_getString(INPUT_ENCODING),strerror(errno));
12118 }
12119 else
12120 {
12122 }
12123
12124 // check and split INPUT_FILE_ENCODING
12125 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
12126 for (const auto &mapping : fileEncod)
12127 {
12128 QCString mapStr = mapping;
12129 int i=mapStr.find('=');
12130 if (i==-1)
12131 {
12132 continue;
12133 }
12134 else
12135 {
12136 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
12137 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12138 if (pattern.isEmpty() || encoding.isEmpty())
12139 {
12140 continue;
12141 }
12142 cd = portable_iconv_open("UTF-8",encoding.data());
12143 if (cd==reinterpret_cast<void *>(-1))
12144 {
12145 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12146 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12147 encoding,strerror(errno));
12148 }
12149 else
12150 {
12152 }
12153
12154 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12155 }
12156 }
12157
12158 // add predefined macro name to a dictionary
12159 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
12160 for (const auto &s : expandAsDefinedList)
12161 {
12163 }
12164
12165 // read aliases and store them in a dictionary
12166 readAliases();
12167
12168 // store number of spaces in a tab into Doxygen::spaces
12169 int tabSize = Config_getInt(TAB_SIZE);
12170 Doxygen::spaces.resize(tabSize);
12171 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12172 Doxygen::spaces.at(tabSize)='\0';
12173}
void readAliases()
Definition aliases.cpp:161
static FileNameLinkedMap * plantUmlFileNameLinkedMap
Definition doxygen.h:109
static bool parseSourcesNeeded
Definition doxygen.h:123
static StringUnorderedSet expandAsDefinedSet
Definition doxygen.h:119
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:104
static InputFileEncodingList inputFileEncodingList
Definition doxygen.h:138
static FileNameLinkedMap * dotFileNameLinkedMap
Definition doxygen.h:106
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static FileNameLinkedMap * imageNameLinkedMap
Definition doxygen.h:105
static FileNameLinkedMap * mscFileNameLinkedMap
Definition doxygen.h:107
static FileNameLinkedMap * mermaidFileNameLinkedMap
Definition doxygen.h:110
static QCString spaces
Definition doxygen.h:133
static FileNameLinkedMap * diaFileNameLinkedMap
Definition doxygen.h:108
static QCString htmlFileExtension
Definition doxygen.h:122
static std::unique_ptr< NamespaceDef > globalNamespaceDef
Definition doxygen.h:120
static FileNameLinkedMap * includeNameLinkedMap
Definition doxygen.h:101
static FileNameLinkedMap * exampleNameLinkedMap
Definition doxygen.h:102
Ordered dictionary of FileName objects.
Definition filename.h:69
This is an alternative implementation of QCString.
Definition qcstring.h:103
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:245
QCString lower() const
Definition qcstring.h:253
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:167
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:264
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:176
QCString left(size_t len) const
Definition qcstring.h:233
#define Config_getInt(name)
Definition config.h:34
#define Config_getList(name)
Definition config.h:38
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
#define Config_getEnum(name)
Definition config.h:35
std::vector< std::string > StringVector
Definition containers.h:33
#define AUTO_TRACE(...)
Definition docnode.cpp:48
void setTranslator(OUTPUT_LANGUAGE_t langName)
Definition language.cpp:73
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
#define term(fmt,...)
Definition message.h:137
std::unique_ptr< NamespaceDef > createNamespaceDef(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &type, bool isPublished)
Factory method to create new NamespaceDef instance.
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
int portable_iconv_close(void *cd)
void * portable_iconv_open(const char *tocode, const char *fromcode)
bool updateLanguageMapping(const QCString &extension, const QCString &language)
Definition util.cpp:5148

References AUTO_TRACE, Config_getBool, Config_getEnum, Config_getInt, Config_getList, Config_getString, createNamespaceDef(), QCString::data(), Doxygen::diaFileNameLinkedMap, Doxygen::dotFileNameLinkedMap, err, Doxygen::exampleNameLinkedMap, Doxygen::expandAsDefinedSet, QCString::find(), Doxygen::globalNamespaceDef, Doxygen::globalScope, Doxygen::htmlFileExtension, Doxygen::imageNameLinkedMap, Doxygen::includeNameLinkedMap, Doxygen::inputFileEncodingList, Doxygen::inputNameLinkedMap, QCString::isEmpty(), QCString::left(), QCString::lower(), Doxygen::mermaidFileNameLinkedMap, QCString::mid(), Doxygen::mscFileNameLinkedMap, msg, Doxygen::parseSourcesNeeded, Doxygen::plantUmlFileNameLinkedMap, portable_iconv_close(), portable_iconv_open(), readAliases(), setTranslator(), Doxygen::spaces, QCString::stripWhiteSpace(), term, toNamespaceDefMutable(), and updateLanguageMapping().

Referenced by main().

◆ checkConfiguration()

void checkConfiguration ( )

check and resolve config options

Definition at line 12037 of file doxygen.cpp.

12038{
12039 AUTO_TRACE();
12040
12045}
void initWarningFormat()
Definition message.cpp:236
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void updateObsolete()
#define FALSE
Definition qcstring.h:34

References AUTO_TRACE, Config::checkAndCorrect(), Config_getBool, FALSE, initWarningFormat(), Config::postProcess(), and Config::updateObsolete().

Referenced by main().

◆ cleanUpDoxygen()

void cleanUpDoxygen ( )

Definition at line 11574 of file doxygen.cpp.

11575{
11579
11580 delete Doxygen::indexList;
11590 Doxygen::mainPage.reset();
11594 Doxygen::globalScope = nullptr;
11596 delete theTranslator;
11597 delete g_outputList;
11598
11603 delete Doxygen::dirLinkedMap;
11604 delete Doxygen::symbolMap;
11605}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:115
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:100
static ParserManager * parserManager
Definition doxygen.h:129
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:112
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:98
static IndexList * indexList
Definition doxygen.h:132
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:127
static MemberNameLinkedMap * memberNameLinkedMap
Definition doxygen.h:111
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:125
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:114
static FormulaManager & instance()
Definition formula.cpp:53
void clear()
Definition linkedmap.h:212
static ModuleManager & instance()
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
static OutputList * g_outputList
Definition doxygen.cpp:189
Translator * theTranslator
Definition language.cpp:71

References FormulaManager::clear(), LinkedMap< T, Hash, KeyEqual, Map >::clear(), ModuleManager::clear(), Doxygen::diaFileNameLinkedMap, Doxygen::dirLinkedMap, Doxygen::dotFileNameLinkedMap, Doxygen::exampleLinkedMap, Doxygen::exampleNameLinkedMap, Doxygen::functionNameLinkedMap, g_outputList, Doxygen::globalNamespaceDef, Doxygen::globalScope, Doxygen::groupLinkedMap, Doxygen::imageNameLinkedMap, Doxygen::includeNameLinkedMap, Doxygen::indexList, Doxygen::inputNameLinkedMap, FormulaManager::instance(), ModuleManager::instance(), SectionManager::instance(), Doxygen::mainPage, Doxygen::memberNameLinkedMap, Doxygen::mermaidFileNameLinkedMap, Doxygen::mscFileNameLinkedMap, Doxygen::namespaceLinkedMap, Doxygen::pageLinkedMap, Doxygen::parserManager, Doxygen::plantUmlFileNameLinkedMap, Doxygen::symbolMap, and theTranslator.

Referenced by generateOutput(), parseInput(), readConfiguration(), and stopDoxygen().

◆ generateOutput()

void generateOutput ( )

add extra languages for which we can only produce syntax highlighted code

Definition at line 13228 of file doxygen.cpp.

13229{
13230 AUTO_TRACE();
13231 /**************************************************************************
13232 * Initialize output generators *
13233 **************************************************************************/
13234
13235 /// add extra languages for which we can only produce syntax highlighted code
13237
13238 //// dump all symbols
13239 if (g_dumpSymbolMap)
13240 {
13241 dumpSymbolMap();
13242 exit(0);
13243 }
13244
13245 bool generateHtml = Config_getBool(GENERATE_HTML);
13246 bool generateLatex = Config_getBool(GENERATE_LATEX);
13247 bool generateMan = Config_getBool(GENERATE_MAN);
13248 bool generateRtf = Config_getBool(GENERATE_RTF);
13249 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13250
13251
13253 if (generateHtml)
13254 {
13258 }
13259 if (generateLatex)
13260 {
13263 }
13264 if (generateDocbook)
13265 {
13268 }
13269 if (generateMan)
13270 {
13271 g_outputList->add<ManGenerator>();
13273 }
13274 if (generateRtf)
13275 {
13276 g_outputList->add<RTFGenerator>();
13278 }
13279 if (Config_getBool(USE_HTAGS))
13280 {
13282 QCString htmldir = Config_getString(HTML_OUTPUT);
13283 if (!Htags::execute(htmldir))
13284 err("USE_HTAGS is YES but htags(1) failed. \n");
13285 else if (!Htags::loadFilemap(htmldir))
13286 err("htags(1) ended normally but failed to load the filemap. \n");
13287 }
13288
13289 /**************************************************************************
13290 * Generate documentation *
13291 **************************************************************************/
13292
13293 g_s.begin("Generating style sheet...\n");
13294 //printf("writing style info\n");
13295 g_outputList->writeStyleInfo(0); // write first part
13296 g_s.end();
13297
13298 bool searchEngine = Config_getBool(SEARCHENGINE);
13299 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13300
13301 g_s.begin("Generating search indices...\n");
13302 if (searchEngine && !serverBasedSearch && generateHtml)
13303 {
13305 }
13306
13307 // generate search indices (need to do this before writing other HTML
13308 // pages as these contain a drop down menu with options depending on
13309 // what categories we find in this function.
13310 if (generateHtml && searchEngine)
13311 {
13312 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13313 Dir searchDir(searchDirName.str());
13314 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13315 {
13316 term("Could not create search results directory '{}' $PWD='{}'\n",
13317 searchDirName,Dir::currentDirPath());
13318 }
13319 HtmlGenerator::writeSearchData(searchDirName);
13320 if (!serverBasedSearch) // client side search index
13321 {
13323 }
13324 }
13325 g_s.end();
13326
13327 // copy static stuff
13328 if (generateHtml)
13329 {
13331 copyLogo(Config_getString(HTML_OUTPUT),true);
13332 copyIcon(Config_getString(HTML_OUTPUT),true);
13333 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13334 }
13335 if (generateLatex)
13336 {
13338 copyLogo(Config_getString(LATEX_OUTPUT),false);
13339 copyIcon(Config_getString(LATEX_OUTPUT),false);
13340 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13341 }
13342 if (generateDocbook)
13343 {
13344 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13345 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13346 }
13347 if (generateRtf)
13348 {
13349 copyLogo(Config_getString(RTF_OUTPUT),false);
13350 copyIcon(Config_getString(RTF_OUTPUT),false);
13351 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13352 }
13353
13355 if (fm.hasFormulas() && generateHtml
13356 && !Config_getBool(USE_MATHJAX))
13357 {
13358 g_s.begin("Generating images for formulas in HTML...\n");
13359 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13361 g_s.end();
13362 }
13363 if (fm.hasFormulas() && generateRtf)
13364 {
13365 g_s.begin("Generating images for formulas in RTF...\n");
13367 g_s.end();
13368 }
13369
13370 if (fm.hasFormulas() && generateDocbook)
13371 {
13372 g_s.begin("Generating images for formulas in Docbook...\n");
13374 g_s.end();
13375 }
13376
13377 g_s.begin("Generating example documentation...\n");
13379 g_s.end();
13380
13381 g_s.begin("Generating file sources...\n");
13383 g_s.end();
13384
13385 g_s.begin("Counting members...\n");
13386 // needs to be done after generating the sources
13387 // but before generating the compound documentation, see bug #12233
13388 countMembers();
13389 g_s.end();
13390
13391 g_s.begin("Generating file documentation...\n");
13393 g_s.end();
13394
13395 g_s.begin("Generating page documentation...\n");
13397 g_s.end();
13398
13399 g_s.begin("Generating group documentation...\n");
13401 g_s.end();
13402
13403 g_s.begin("Generating class documentation...\n");
13405 g_s.end();
13406
13407 g_s.begin("Generating concept documentation...\n");
13409 g_s.end();
13410
13411 g_s.begin("Generating module documentation...\n");
13413 g_s.end();
13414
13415 g_s.begin("Generating namespace documentation...\n");
13417 g_s.end();
13418
13419 if (Config_getBool(GENERATE_LEGEND))
13420 {
13421 g_s.begin("Generating graph info page...\n");
13423 g_s.end();
13424 }
13425
13426 g_s.begin("Generating directory documentation...\n");
13428 g_s.end();
13429
13430 if (g_outputList->size()>0)
13431 {
13433 }
13434
13435 g_s.begin("finalizing index lists...\n");
13436 Doxygen::indexList->finalize();
13437 g_s.end();
13438
13439 g_s.begin("writing tag file...\n");
13440 writeTagFile();
13441 g_s.end();
13442
13443 if (Config_getBool(GENERATE_XML))
13444 {
13445 g_s.begin("Generating XML output...\n");
13447 generateXML();
13449 g_s.end();
13450 }
13451 if (Config_getBool(GENERATE_SQLITE3))
13452 {
13453 g_s.begin("Generating SQLITE3 output...\n");
13455 g_s.end();
13456 }
13457
13458 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13459 {
13460 g_s.begin("Generating AutoGen DEF output...\n");
13461 generateDEF();
13462 g_s.end();
13463 }
13464 if (Config_getBool(GENERATE_PERLMOD))
13465 {
13466 g_s.begin("Generating Perl module output...\n");
13468 g_s.end();
13469 }
13470 if (generateHtml && searchEngine && serverBasedSearch)
13471 {
13472 g_s.begin("Generating search index\n");
13473 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13474 {
13476 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13477 }
13478 else // write data for external search index
13479 {
13481 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13482 if (searchDataFile.isEmpty())
13483 {
13484 searchDataFile="searchdata.xml";
13485 }
13486 if (!Portable::isAbsolutePath(searchDataFile.data()))
13487 {
13488 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13489 }
13490 Doxygen::searchIndex.write(searchDataFile);
13491 }
13492 g_s.end();
13493 }
13494
13495 if (generateRtf)
13496 {
13497 g_s.begin("Combining RTF output...\n");
13498 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13499 {
13500 err("An error occurred during post-processing the RTF files!\n");
13501 }
13502 g_s.end();
13503 }
13504
13505 if (PlantumlManager::instance().needToRun())
13506 {
13507 g_s.begin("Running plantuml with JAVA...\n");
13509 g_s.end();
13510 }
13511
13512 if (MermaidManager::instance().needToRun())
13513 {
13514 g_s.begin("Running mermaid (mmdc)...\n");
13516 g_s.end();
13517 }
13518
13519 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13520 {
13521 g_s.begin("Running dot...\n");
13523 g_s.end();
13524 }
13525
13526 if (generateHtml &&
13527 Config_getBool(GENERATE_HTMLHELP) &&
13528 !Config_getString(HHC_LOCATION).isEmpty())
13529 {
13530 g_s.begin("Running html help compiler...\n");
13532 g_s.end();
13533 }
13534
13535 if ( generateHtml &&
13536 Config_getBool(GENERATE_QHP) &&
13537 !Config_getString(QHG_LOCATION).isEmpty())
13538 {
13539 g_s.begin("Running qhelpgenerator...\n");
13541 g_s.end();
13542 }
13543
13544 g_outputList->cleanup();
13546
13548
13550 {
13551
13552 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13553 if (numThreads<1) numThreads=1;
13554 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13555 (static_cast<double>(Debug::elapsedTime())),
13556 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13557 );
13558 g_s.print();
13559
13561 msg("finished...\n");
13563 }
13564 else
13565 {
13566 msg("finished...\n");
13567 }
13568
13569
13570 /**************************************************************************
13571 * Start cleaning up *
13572 **************************************************************************/
13573
13575
13577 Dir thisDir;
13578 thisDir.remove(Doxygen::filterDBFileName.str());
13580 exitTracing();
13582 delete Doxygen::clangUsrMap;
13584
13585 //dumpDocNodeSizes();
13586}
@ Time
Definition debug.h:35
static void clearFlag(const DebugMask mask)
Definition debug.cpp:123
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133
static double elapsedTime()
Definition debug.cpp:201
static void setFlag(const DebugMask mask)
Definition debug.cpp:118
Class representing a directory in the file system.
Definition dir.h:75
static std::string currentDirPath()
Definition dir.cpp:342
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:314
static void init()
bool run()
Definition dot.cpp:119
static DotManager * instance()
Definition dot.cpp:78
static QCString filterDBFileName
Definition doxygen.h:131
static bool generatingXmlOutput
Definition doxygen.h:134
static SearchIndexIntf searchIndex
Definition doxygen.h:124
static ClangUsrMap * clangUsrMap
Definition doxygen.h:126
bool hasFormulas() const
Definition formula.cpp:720
void generateImages(const QCString &outputDir, bool toIndex, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:635
Generator for HTML output.
Definition htmlgen.h:96
static void init()
Definition htmlgen.cpp:1248
static void writeSearchPage()
Definition htmlgen.cpp:3238
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1412
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1421
static void writeExternalSearchPage()
Definition htmlgen.cpp:3337
Generator for LaTeX output.
Definition latexgen.h:94
static void init()
Definition latexgen.cpp:632
Generator for Man page output.
Definition mangen.h:69
static void init()
Definition mangen.cpp:272
void run()
Run mmdc tool for all collected diagrams.
Definition mermaid.cpp:252
static MermaidManager & instance()
Definition mermaid.cpp:33
void writeDocumentation(OutputList &ol)
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
static PlantumlManager & instance()
Definition plantuml.cpp:232
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:390
QCString & prepend(const char *s)
Definition qcstring.h:426
const std::string & str() const
Definition qcstring.h:556
Generator for RTF output.
Definition rtfgen.h:80
static void init()
Definition rtfgen.cpp:461
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
Definition rtfgen.cpp:2461
static void showCacheUsage()
Show usage of the type lookup cache.
void generateDEF()
Definition defgen.cpp:464
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1210
static void copyLatexStyleSheet()
static void runQHelpGenerator()
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption, bool toIndex)
class Statistics g_s
static void copyStyleSheet()
static void generateGroupDocs()
static void generateExampleDocs()
static void dumpSymbolMap()
static void generateFileDocs()
Definition doxygen.cpp:8872
static void generatePageDocs()
static void generateFileSources()
Definition doxygen.cpp:8706
static void generateClassDocs()
Definition doxygen.cpp:9307
static void countMembers()
Definition doxygen.cpp:9168
static void copyLogo(const QCString &outputOption, bool toIndex)
static void runHtmlHelpCompiler()
static bool g_dumpSymbolMap
Definition doxygen.cpp:192
static bool g_successfulRun
Definition doxygen.cpp:191
static void copyIcon(const QCString &outputOption, bool toIndex)
static void generateNamespaceDocs()
static void writeTagFile()
void cleanUpDoxygen()
static void generateConceptDocs()
Definition doxygen.cpp:9333
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4102
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5816
void finishWarnExit()
Definition message.cpp:294
void deinit()
bool isAbsolutePath(const QCString &fileName)
Definition portable.cpp:497
double getSysElapsedTime()
Definition portable.cpp:97
void generatePerlMod()
#define TRUE
Definition qcstring.h:37
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
void generateSqlite3()
static bool execute(const QCString &htmldir)
Definition htags.cpp:38
static bool loadFilemap(const QCString &htmldir)
Definition htags.cpp:107
static bool useHtags
Definition htags.h:23
void exitTracing()
Definition trace.cpp:52
void addCodeOnlyMappings()
Definition util.cpp:5247
void cleanupInlineGraph()
Definition util.cpp:7030
void generateXML()
Definition xmlgen.cpp:2317

References addCodeOnlyMappings(), AUTO_TRACE, FormulaManager::Bitmap, Doxygen::clangUsrMap, cleanUpDoxygen(), cleanupInlineGraph(), Debug::clearFlag(), Config_getBool, Config_getEnum, Config_getInt, Config_getList, Config_getString, copyExtraFiles(), copyIcon(), copyLatexStyleSheet(), copyLogo(), copyStyleSheet(), countMembers(), createJavaScriptSearchIndex(), Dir::currentDirPath(), QCString::data(), Config::deinit(), dumpSymbolMap(), Debug::elapsedTime(), err, Htags::execute(), Dir::exists(), exitTracing(), FALSE, Doxygen::filterDBFileName, finalizeSearchIndexer(), finishWarnExit(), g_dumpSymbolMap, g_outputList, g_s, g_successfulRun, generateClassDocs(), generateConceptDocs(), generateDEF(), generateDirDocs(), generateExampleDocs(), generateFileDocs(), generateFileSources(), generateGroupDocs(), FormulaManager::generateImages(), generateNamespaceDocs(), generatePageDocs(), generatePerlMod(), generateSqlite3(), generateXML(), Doxygen::generatingXmlOutput, Portable::getSysElapsedTime(), FormulaManager::hasFormulas(), Doxygen::indexList, DocbookGenerator::init(), HtmlGenerator::init(), LatexGenerator::init(), ManGenerator::init(), RTFGenerator::init(), DotManager::instance(), FormulaManager::instance(), MermaidManager::instance(), ModuleManager::instance(), PlantumlManager::instance(), SearchIndexIntf::Internal, Portable::isAbsolutePath(), QCString::isEmpty(), Debug::isFlagSet(), Htags::loadFilemap(), Dir::mkdir(), msg, FormulaManager::On, QCString::prepend(), RTFGenerator::preProcessFileInplace(), Dir::remove(), DotManager::run(), MermaidManager::run(), PlantumlManager::run(), runHtmlHelpCompiler(), runQHelpGenerator(), Doxygen::searchIndex, Debug::setFlag(), SymbolResolver::showCacheUsage(), QCString::str(), term, Debug::Time, TRUE, Htags::useHtags, FormulaManager::Vector, ModuleManager::writeDocumentation(), HtmlGenerator::writeExternalSearchPage(), writeGraphInfo(), writeIndexHierarchy(), writeJavaScriptSearchIndex(), HtmlGenerator::writeSearchData(), HtmlGenerator::writeSearchPage(), HtmlGenerator::writeTabData(), and writeTagFile().

Referenced by main().

◆ initDoxygen()

void initDoxygen ( )

Definition at line 11504 of file doxygen.cpp.

11505{
11506 initResources();
11507 QCString lang = Portable::getenv("LC_ALL");
11508 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11509 std::setlocale(LC_ALL,"");
11510 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11511 std::setlocale(LC_NUMERIC,"C");
11512
11514
11538
11539 // register any additional parsers here...
11540
11542
11543#if USE_LIBCLANG
11545#endif
11554 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11555 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11556 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11558
11559 // initialization of these globals depends on
11560 // configuration switches so we need to postpone these
11561 Doxygen::globalScope = nullptr;
11571
11572}
static void startTimer()
Definition debug.cpp:196
A linked map of directories.
Definition dirdef.h:175
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:97
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:95
static ClassLinkedMap * hiddenClassLinkedMap
Definition doxygen.h:96
A list of index interfaces.
Definition indexlist.h:64
Ordered dictionary of MemberName objects.
Definition membername.h:63
Manages programming language parsers.
Definition parserintf.h:183
std::function< std::unique_ptr< T >() > make_parser_factory()
void initResources()
std::unordered_map< std::string, const Definition * > ClangUsrMap
Definition doxygen.h:82
void setenv(const QCString &variable, const QCString &value)
Definition portable.cpp:286
QCString getenv(const QCString &variable)
Definition portable.cpp:321
void initDefaultExtensionMapping()
Definition util.cpp:5180

References Doxygen::clangUsrMap, Doxygen::classLinkedMap, Doxygen::conceptLinkedMap, Doxygen::diaFileNameLinkedMap, Doxygen::dirLinkedMap, Doxygen::dotFileNameLinkedMap, Doxygen::exampleLinkedMap, Doxygen::exampleNameLinkedMap, Doxygen::functionNameLinkedMap, Portable::getenv(), Doxygen::globalScope, Doxygen::groupLinkedMap, Doxygen::hiddenClassLinkedMap, Doxygen::imageNameLinkedMap, Doxygen::includeNameLinkedMap, Doxygen::indexList, initDefaultExtensionMapping(), initResources(), Doxygen::inputNameLinkedMap, QCString::isEmpty(), make_parser_factory(), Doxygen::memberNameLinkedMap, Doxygen::mermaidFileNameLinkedMap, Doxygen::mscFileNameLinkedMap, Doxygen::namespaceLinkedMap, Doxygen::pageLinkedMap, Doxygen::parserManager, Doxygen::plantUmlFileNameLinkedMap, Portable::setenv(), Debug::startTimer(), and Doxygen::symbolMap.

Referenced by main().

◆ parseInput()

void parseInput ( )

Definition at line 12559 of file doxygen.cpp.

12560{
12561 AUTO_TRACE();
12562 std::atexit(exitDoxygen);
12563
12564 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12565
12566#if USE_LIBCLANG
12567 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12568#endif
12569
12570 // we would like to show the versionString earlier, but we first have to handle the configuration file
12571 // to know the value of the QUIET setting.
12572 QCString versionString = getFullVersion();
12573 msg("Doxygen version used: {}\n",versionString);
12574
12576
12577 /**************************************************************************
12578 * Make sure the output directory exists
12579 **************************************************************************/
12580 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12581 if (!g_singleComment)
12582 {
12583 if (outputDirectory.isEmpty())
12584 {
12585 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12586 }
12587 else
12588 {
12589 Dir dir(outputDirectory.str());
12590 if (!dir.exists())
12591 {
12592 dir.setPath(Dir::currentDirPath());
12593 if (!dir.mkdir(outputDirectory.str()))
12594 {
12595 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12596 "exist and cannot be created\n",outputDirectory);
12597 }
12598 else
12599 {
12600 msg("Notice: Output directory '{}' does not exist. "
12601 "I have created it for you.\n", outputDirectory);
12602 }
12603 dir.setPath(outputDirectory.str());
12604 }
12605 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12606 }
12607 }
12608 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12609
12610 /**************************************************************************
12611 * Initialize global lists and dictionaries
12612 **************************************************************************/
12613
12614#ifdef HAS_SIGNALS
12615 signal(SIGINT, stopDoxygen);
12616#endif
12617
12618 uint32_t pid = Portable::pid();
12619 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12620 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12621
12622 /**************************************************************************
12623 * Check/create output directories *
12624 **************************************************************************/
12625
12626 bool generateHtml = Config_getBool(GENERATE_HTML);
12627 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12628 bool generateXml = Config_getBool(GENERATE_XML);
12629 bool generateLatex = Config_getBool(GENERATE_LATEX);
12630 bool generateRtf = Config_getBool(GENERATE_RTF);
12631 bool generateMan = Config_getBool(GENERATE_MAN);
12632 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12633 QCString htmlOutput;
12634 QCString docbookOutput;
12635 QCString xmlOutput;
12636 QCString latexOutput;
12637 QCString rtfOutput;
12638 QCString manOutput;
12639 QCString sqlOutput;
12640
12641 if (!g_singleComment)
12642 {
12643 if (generateHtml)
12644 {
12645 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12646 Config_updateString(HTML_OUTPUT,htmlOutput);
12647
12648 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12649 bool generateSitemap = !sitemapUrl.isEmpty();
12650 if (generateSitemap && !sitemapUrl.endsWith("/"))
12651 {
12652 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12653 }
12654
12655 // add HTML indexers that are enabled
12656 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12657 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12658 bool generateQhp = Config_getBool(GENERATE_QHP);
12659 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12660 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12661 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12662 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12663 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12664 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12665 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12666 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12667 Doxygen::indexList->addIndex<Crawlmap>();
12668 Doxygen::indexList->initialize();
12669 }
12670
12671 if (generateDocbook)
12672 {
12673 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12674 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12675 }
12676
12677 if (generateXml)
12678 {
12679 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12680 Config_updateString(XML_OUTPUT,xmlOutput);
12681 }
12682
12683 if (generateLatex)
12684 {
12685 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12686 Config_updateString(LATEX_OUTPUT,latexOutput);
12687 }
12688
12689 if (generateRtf)
12690 {
12691 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12692 Config_updateString(RTF_OUTPUT,rtfOutput);
12693 }
12694
12695 if (generateMan)
12696 {
12697 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12698 Config_updateString(MAN_OUTPUT,manOutput);
12699 }
12700
12701 if (generateSql)
12702 {
12703 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12704 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12705 }
12706 }
12707
12708 if (Config_getBool(HAVE_DOT))
12709 {
12710 QCString curFontPath = Config_getString(DOT_FONTPATH);
12711 if (curFontPath.isEmpty())
12712 {
12713 Portable::getenv("DOTFONTPATH");
12714 QCString newFontPath = ".";
12715 if (!curFontPath.isEmpty())
12716 {
12717 newFontPath+=Portable::pathListSeparator();
12718 newFontPath+=curFontPath;
12719 }
12720 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12721 }
12722 else
12723 {
12724 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12725 }
12726 }
12727
12728 /**************************************************************************
12729 * Handle layout file *
12730 **************************************************************************/
12731
12733 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12734 bool defaultLayoutUsed = FALSE;
12735 if (layoutFileName.isEmpty())
12736 {
12737 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12738 defaultLayoutUsed = TRUE;
12739 }
12740 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12741
12742 FileInfo fi(layoutFileName.str());
12743 if (fi.exists())
12744 {
12745 msg("Parsing layout file {}...\n",layoutFileName);
12746 LayoutDocManager::instance().parse(layoutFileName);
12747 }
12748 else if (!defaultLayoutUsed)
12749 {
12750 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12751 }
12752 printLayout();
12753
12754 /**************************************************************************
12755 * Read and preprocess input *
12756 **************************************************************************/
12757
12758 // prevent search in the output directories
12759 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12760 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12761 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12762 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12763 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12764 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12765 if (generateMan) exclPatterns.push_back(manOutput.str());
12766 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12767
12768 if (!g_singleComment)
12769 {
12771
12773 }
12774
12775 // Notice: the order of the function calls below is very important!
12776
12777 if (generateHtml && !Config_getBool(USE_MATHJAX))
12778 {
12780 }
12781 if (generateRtf)
12782 {
12784 }
12785 if (generateDocbook)
12786 {
12788 }
12789
12791
12792 /**************************************************************************
12793 * Handle Tag Files *
12794 **************************************************************************/
12795
12796 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12797
12798 if (!g_singleComment)
12799 {
12800 msg("Reading and parsing tag files\n");
12801 const StringVector &tagFileList = Config_getList(TAGFILES);
12802 for (const auto &s : tagFileList)
12803 {
12804 readTagFile(root,s.c_str());
12805 }
12806 }
12807
12808 /**************************************************************************
12809 * Parse source files *
12810 **************************************************************************/
12811
12812 addSTLSupport(root);
12813
12814 g_s.begin("Parsing files\n");
12815 if (g_singleComment)
12816 {
12817 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12818 if (g_commentFileName=="-")
12819 {
12820 std::string text = fileToString(g_commentFileName).str();
12821 addTerminalCharIfMissing(text,'\n');
12822 generateHtmlForComment("stdin.md",text);
12823 }
12824 else if (FileInfo(g_commentFileName.str()).isFile())
12825 {
12826 std::string text;
12828 addTerminalCharIfMissing(text,'\n');
12830 }
12831 else
12832 {
12833 }
12835 exit(0);
12836 }
12837 else
12838 {
12839 if (Config_getInt(NUM_PROC_THREADS)==1)
12840 {
12842 }
12843 else
12844 {
12846 }
12847 }
12848 g_s.end();
12849
12850 /**************************************************************************
12851 * Gather information *
12852 **************************************************************************/
12853
12854 g_s.begin("Building macro definition list...\n");
12856 g_s.end();
12857
12858 g_s.begin("Building group list...\n");
12859 buildGroupList(root.get());
12860 organizeSubGroups(root.get());
12861 g_s.end();
12862
12863 g_s.begin("Building directory list...\n");
12865 findDirDocumentation(root.get());
12866 g_s.end();
12867
12868 g_s.begin("Building namespace list...\n");
12869 buildNamespaceList(root.get());
12870 findUsingDirectives(root.get());
12871 g_s.end();
12872
12873 g_s.begin("Building file list...\n");
12874 buildFileList(root.get());
12875 g_s.end();
12876
12877 g_s.begin("Building class list...\n");
12878 buildClassList(root.get());
12879 g_s.end();
12880
12881 g_s.begin("Building concept list...\n");
12882 buildConceptList(root.get());
12883 g_s.end();
12884
12885 // build list of using declarations here (global list)
12886 buildListOfUsingDecls(root.get());
12887 g_s.end();
12888
12889 g_s.begin("Computing nesting relations for classes...\n");
12891 g_s.end();
12892 // 1.8.2-20121111: no longer add nested classes to the group as well
12893 //distributeClassGroupRelations();
12894
12895 // calling buildClassList may result in cached relations that
12896 // become invalid after resolveClassNestingRelations(), that's why
12897 // we need to clear the cache here
12899 // we don't need the list of using declaration anymore
12900 g_usingDeclarations.clear();
12901
12902 g_s.begin("Associating documentation with classes...\n");
12903 buildClassDocList(root.get());
12904 g_s.end();
12905
12906 g_s.begin("Associating documentation with concepts...\n");
12907 buildConceptDocList(root.get());
12909 g_s.end();
12910
12911 g_s.begin("Associating documentation with modules...\n");
12912 findModuleDocumentation(root.get());
12913 g_s.end();
12914
12915 g_s.begin("Building example list...\n");
12916 buildExampleList(root.get());
12917 g_s.end();
12918
12919 g_s.begin("Searching for enumerations...\n");
12920 findEnums(root.get());
12921 g_s.end();
12922
12923 // Since buildVarList calls isVarWithConstructor
12924 // and this calls getResolvedClass we need to process
12925 // typedefs first so the relations between classes via typedefs
12926 // are properly resolved. See bug 536385 for an example.
12927 g_s.begin("Searching for documented typedefs...\n");
12928 buildTypedefList(root.get());
12929 g_s.end();
12930
12931 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12932 {
12933 g_s.begin("Searching for documented sequences...\n");
12934 buildSequenceList(root.get());
12935 g_s.end();
12936
12937 g_s.begin("Searching for documented dictionaries...\n");
12938 buildDictionaryList(root.get());
12939 g_s.end();
12940 }
12941
12942 g_s.begin("Searching for members imported via using declarations...\n");
12943 // this should be after buildTypedefList in order to properly import
12944 // used typedefs
12945 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12946 findUsingDeclarations(root.get(),FALSE); // then the rest
12947 g_s.end();
12948
12949 g_s.begin("Searching for included using directives...\n");
12951 g_s.end();
12952
12953 g_s.begin("Searching for documented variables...\n");
12954 buildVarList(root.get());
12955 g_s.end();
12956
12957 g_s.begin("Building interface member list...\n");
12958 buildInterfaceAndServiceList(root.get()); // UNO IDL
12959
12960 g_s.begin("Building member list...\n"); // using class info only !
12961 buildFunctionList(root.get());
12962 g_s.end();
12963
12964 g_s.begin("Searching for friends...\n");
12965 findFriends();
12966 g_s.end();
12967
12968 g_s.begin("Searching for documented defines...\n");
12969 findDefineDocumentation(root.get());
12970 g_s.end();
12971
12972 g_s.begin("Computing class inheritance relations...\n");
12973 findClassEntries(root.get());
12975 g_s.end();
12976
12977 g_s.begin("Computing class usage relations...\n");
12979 g_s.end();
12980
12981 g_s.begin("Flushing cached template relations that have become invalid...\n");
12983 g_s.end();
12984
12985 g_s.begin("Warn for undocumented namespaces...\n");
12987 g_s.end();
12988
12989 g_s.begin("Computing class relations...\n");
12992 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12993 {
12995 }
12997 g_classEntries.clear();
12998 g_s.end();
12999
13000 g_s.begin("Add enum values to enums...\n");
13001 addEnumValuesToEnums(root.get());
13002 findEnumDocumentation(root.get());
13003 g_s.end();
13004
13005 g_s.begin("Searching for member function documentation...\n");
13006 findObjCMethodDefinitions(root.get());
13007 findMemberDocumentation(root.get()); // may introduce new members !
13008 findUsingDeclImports(root.get()); // may introduce new members !
13009 g_usingClassMap.clear();
13013 g_s.end();
13014
13015 // moved to after finding and copying documentation,
13016 // as this introduces new members see bug 722654
13017 g_s.begin("Creating members for template instances...\n");
13019 g_s.end();
13020
13021 g_s.begin("Searching for tag less structs...\n");
13023 g_s.end();
13024
13025 g_s.begin("Building page list...\n");
13026 buildPageList(root.get());
13027 g_s.end();
13028
13029 g_s.begin("Building requirements list...\n");
13030 buildRequirementsList(root.get());
13031 g_s.end();
13032
13033 g_s.begin("Search for main page...\n");
13034 findMainPage(root.get());
13035 findMainPageTagFiles(root.get());
13036 g_s.end();
13037
13038 g_s.begin("Computing page relations...\n");
13039 computePageRelations(root.get());
13041 g_s.end();
13042
13043 g_s.begin("Determining the scope of groups...\n");
13044 findGroupScope(root.get());
13045 g_s.end();
13046
13047 g_s.begin("Computing module relations...\n");
13048 auto &mm = ModuleManager::instance();
13049 mm.resolvePartitions();
13050 mm.resolveImports();
13051 mm.collectExportedSymbols();
13052 g_s.end();
13053
13054 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13055 {
13056 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13057 n2->memberName().data()+getPrefixIndex(n2->memberName())
13058 )<0;
13059 };
13060
13061 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13062 {
13063 if (Config_getBool(SORT_BY_SCOPE_NAME))
13064 {
13065 return qstricmp_sort(c1->name(), c2->name())<0;
13066 }
13067 else
13068 {
13069 int i = qstricmp_sort(c1->className(), c2->className());
13070 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
13071 }
13072 };
13073
13074 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13075 {
13076 return qstricmp_sort(n1->name(),n2->name())<0;
13077 };
13078
13079 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13080 {
13081 return qstricmp_sort(c1->name(),c2->name())<0;
13082 };
13083
13084 g_s.begin("Sorting lists...\n");
13085 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13087 memberNameComp);
13088 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13090 memberNameComp);
13091 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13093 classComp);
13094 std::stable_sort(Doxygen::classLinkedMap->begin(),
13096 classComp);
13097 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13099 conceptComp);
13100 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13102 namespaceComp);
13103 g_s.end();
13104
13105 g_s.begin("Determining which enums are documented\n");
13107 g_s.end();
13108
13109 g_s.begin("Computing member relations...\n");
13112 g_s.end();
13113
13114 g_s.begin("Building full member lists recursively...\n");
13116 g_s.end();
13117
13118 g_s.begin("Adding members to member groups.\n");
13120 g_s.end();
13121
13122 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13123 {
13124 g_s.begin("Distributing member group documentation.\n");
13126 g_s.end();
13127 }
13128
13129 g_s.begin("Computing member references...\n");
13131 g_s.end();
13132
13133 if (Config_getBool(INHERIT_DOCS))
13134 {
13135 g_s.begin("Inheriting documentation...\n");
13137 g_s.end();
13138 }
13139
13140
13141 // compute the shortest possible names of all files
13142 // without losing the uniqueness of the file names.
13143 g_s.begin("Generating disk names...\n");
13145 g_s.end();
13146
13147 g_s.begin("Adding source references...\n");
13149 g_s.end();
13150
13151 g_s.begin("Adding xrefitems...\n");
13154 g_s.end();
13155
13156 g_s.begin("Adding requirements...\n");
13159 g_s.end();
13160
13161 g_s.begin("Sorting member lists...\n");
13163 g_s.end();
13164
13165 g_s.begin("Setting anonymous enum type...\n");
13167 g_s.end();
13168
13169 g_s.begin("Computing dependencies between directories...\n");
13171 g_s.end();
13172
13173 g_s.begin("Generating citations page...\n");
13175 g_s.end();
13176
13177 g_s.begin("Counting data structures...\n");
13179 g_s.end();
13180
13181 g_s.begin("Resolving user defined references...\n");
13183 g_s.end();
13184
13185 g_s.begin("Finding anchors and sections in the documentation...\n");
13187 g_s.end();
13188
13189 g_s.begin("Transferring function references...\n");
13191 g_s.end();
13192
13193 g_s.begin("Combining using relations...\n");
13195 g_s.end();
13196
13198 g_s.begin("Adding members to index pages...\n");
13200 addToIndices();
13201 g_s.end();
13202
13203 g_s.begin("Correcting members for VHDL...\n");
13205 g_s.end();
13206
13207 g_s.begin("Computing tooltip texts...\n");
13209 g_s.end();
13210
13211 if (Config_getBool(SORT_GROUP_NAMES))
13212 {
13213 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13215 [](const auto &g1,const auto &g2)
13216 { return g1->groupTitle() < g2->groupTitle(); });
13217
13218 for (const auto &gd : *Doxygen::groupLinkedMap)
13219 {
13220 gd->sortSubGroups();
13221 }
13222 }
13223
13224 printNavTree(root.get(),0);
13226}
static CitationManager & instance()
Definition cite.cpp:85
void generatePage()
Generate the citations page.
Definition cite.cpp:331
A class that generates docset files.
Definition docsets.h:36
static bool clangAssistedParsing
Definition doxygen.h:136
Generator for Eclipse help files.
Definition eclipsehelp.h:44
A class that generates a dynamic tree view side panel.
Definition ftvhelp.h:41
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
bool isFile() const
Definition fileinfo.cpp:63
void initFromRepository(const QCString &dir)
Definition formula.cpp:59
void checkRepositories()
Definition formula.cpp:172
A class that generated the HTML Help specific files.
Definition htmlhelp.h:36
static Index & instance()
Definition index.cpp:108
void countDataStructures()
Definition index.cpp:264
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1470
std::unique_ptr< MemberName > Ptr
Definition linkedmap.h:38
bool endsWith(const char *s) const
Definition qcstring.h:528
Definition qhp.h:27
static RequirementManager & instance()
static void clearTypeLookupCache(ClearScope scope)
static void computeVhdlComponentRelations()
#define Config_updateString(name, value)
Definition config.h:39
#define Config_updateList(name,...)
Definition config.h:43
DirIterator begin(DirIterator it) noexcept
Definition dir.cpp:170
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
void buildDirectories()
Definition dirdef.cpp:1119
void computeDirDependencies()
Definition dirdef.cpp:1193
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:49
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5415
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:432
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2172
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9549
static void computeTemplateClassRelations()
Definition doxygen.cpp:5509
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5688
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2325
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9749
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5464
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1326
static void resolveClassNestingRelations()
Definition doxygen.cpp:1381
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5378
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8507
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5578
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4536
static void addMembersToMemberGroup()
Definition doxygen.cpp:9414
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9919
static void distributeConceptGroups()
Definition doxygen.cpp:1348
static void transferFunctionDocumentation()
Definition doxygen.cpp:4455
static void setAnonymousEnumType()
Definition doxygen.cpp:9154
static void sortMemberLists()
Definition doxygen.cpp:9059
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8635
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4585
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7648
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3524
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:447
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9662
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7618
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9452
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7852
static void resolveUserReferences()
Definition doxygen.cpp:9981
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9810
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3661
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3624
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1834
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2575
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:491
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4358
static void findEnums(const Entry *root)
Definition doxygen.cpp:7676
static void addListReferences()
Definition doxygen.cpp:5679
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8297
static void findMainPage(Entry *root)
Definition doxygen.cpp:9849
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2016
static void addSourceReferences()
Definition doxygen.cpp:8932
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9354
static void flushUnresolvedRelations()
Definition doxygen.cpp:9591
static QCString g_commentFileName
Definition doxygen.cpp:193
static void findDocumentedEnumValues()
Definition doxygen.cpp:8289
static void findTagLessClasses()
Definition doxygen.cpp:1782
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8339
static void computeClassRelations()
Definition doxygen.cpp:5484
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4053
static void checkPageRelations()
Definition doxygen.cpp:9961
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1316
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8177
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9931
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static StringSet g_usingDeclarations
Definition doxygen.cpp:190
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3642
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1151
static void buildPageList(Entry *root)
Definition doxygen.cpp:9822
static void addRequirementReferences()
Definition doxygen.cpp:5671
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:194
static void findSectionsInDocumentation()
Definition doxygen.cpp:9490
static void mergeCategories()
Definition doxygen.cpp:8654
static void buildFileList(const Entry *root)
Definition doxygen.cpp:503
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1141
static void findUsedTemplateInstances()
Definition doxygen.cpp:5448
static void computeTooltipTexts()
Definition doxygen.cpp:9108
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8676
static void combineUsingRelations()
Definition doxygen.cpp:9389
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2323
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1336
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void transferFunctionReferences()
Definition doxygen.cpp:4488
static void buildDefineList()
Definition doxygen.cpp:9011
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3756
static void computeMemberRelations()
Definition doxygen.cpp:8619
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2159
static std::multimap< std::string, const Entry * > g_classEntries
Definition doxygen.cpp:187
void printLayout()
Definition layout.cpp:1822
#define warn_uncond(fmt,...)
Definition message.h:122
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
Definition portable.cpp:516
QCString pathListSeparator()
Definition portable.cpp:383
uint32_t pid()
Definition portable.cpp:248
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:691
void initSearchIndexer()
void generateHtmlForComment(const std::string &fn, const std::string &text)
Helper for implemented the -c option of doxygen, which produces HTML output for a given doxygen forma...
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library.
void addTerminalCharIfMissing(std::string &s, char c)
Definition stringutil.h:84
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
Definition util.cpp:5592
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1494
int getPrefixIndex(const QCString &name)
Definition util.cpp:3267

References Dir::absPath(), addEnumValuesToEnums(), addListReferences(), addMembersToIndex(), addMembersToMemberGroup(), addRequirementReferences(), addSourceReferences(), addSTLSupport(), addTerminalCharIfMissing(), addToIndices(), SymbolResolver::All, AUTO_TRACE, AUTO_TRACE_ADD, begin(), buildClassDocList(), buildClassList(), buildCompleteMemberLists(), buildConceptDocList(), buildConceptList(), buildDefineList(), buildDictionaryList(), buildDirectories(), buildExampleList(), buildFileList(), buildFunctionList(), buildGroupList(), buildInterfaceAndServiceList(), buildListOfUsingDecls(), buildNamespaceList(), buildPageList(), buildRequirementsList(), buildSequenceList(), buildTypedefList(), buildVarList(), checkMarkdownMainfile(), checkPageRelations(), FormulaManager::checkRepositories(), Doxygen::clangAssistedParsing, Doxygen::classLinkedMap, cleanUpDoxygen(), SymbolResolver::clearTypeLookupCache(), combineUsingRelations(), computeClassRelations(), computeDirDependencies(), computeMemberReferences(), computeMemberRelations(), computePageRelations(), computeTemplateClassRelations(), computeTooltipTexts(), computeVerifiedDotPath(), VhdlDocGen::computeVhdlComponentRelations(), Doxygen::conceptLinkedMap, Config_getBool, Config_getInt, Config_getList, Config_getString, Config_updateList, Config_updateString, Portable::correctPath(), Index::countDataStructures(), createOutputDirectory(), createTemplateInstanceMembers(), Dir::currentDirPath(), distributeConceptGroups(), distributeMemberGroupDocumentation(), end(), QCString::endsWith(), Dir::exists(), FileInfo::exists(), exitDoxygen(), FALSE, fileToString(), Doxygen::filterDBFileName, findClassEntries(), findDefineDocumentation(), findDirDocumentation(), findDocumentedEnumValues(), findEnumDocumentation(), findEnums(), findFriends(), findGroupScope(), findIncludedUsingDirectives(), findInheritedTemplateInstances(), findMainPage(), findMainPageTagFiles(), findMemberDocumentation(), findModuleDocumentation(), findObjCMethodDefinitions(), findSectionsInDocumentation(), findTagLessClasses(), findUsedTemplateInstances(), findUsingDeclarations(), findUsingDeclImports(), findUsingDirectives(), flushCachedTemplateRelations(), flushUnresolvedRelations(), Doxygen::functionNameLinkedMap, g_classEntries, g_commentFileName, g_s, g_singleComment, g_usingClassMap, g_usingDeclarations, generateDiskNames(), generateHtmlForComment(), CitationManager::generatePage(), RequirementManager::generatePage(), generateXRefPages(), Portable::getenv(), getPrefixIndex(), Doxygen::groupLinkedMap, Doxygen::hiddenClassLinkedMap, Doxygen::indexList, inheritDocumentation(), LayoutDocManager::init(), FormulaManager::initFromRepository(), initSearchIndexer(), CitationManager::instance(), FormulaManager::instance(), Index::instance(), LayoutDocManager::instance(), ModuleManager::instance(), RequirementManager::instance(), QCString::isEmpty(), FileInfo::isFile(), Doxygen::memberNameLinkedMap, mergeCategories(), Dir::mkdir(), msg, Doxygen::namespaceLinkedMap, organizeSubGroups(), LayoutDocManager::parse(), parseFilesMultiThreading(), parseFilesSingleThreading(), Portable::pathListSeparator(), Portable::pid(), printLayout(), printNavTree(), printSectionsTree(), qPrint(), qstricmp_sort(), readInputFile(), readTagFile(), resolveClassNestingRelations(), resolveUserReferences(), searchInputFiles(), setAnonymousEnumType(), Portable::setenv(), Dir::setPath(), sortMemberLists(), stopDoxygen(), QCString::str(), term, transferFunctionDocumentation(), transferFunctionReferences(), transferRelatedFunctionDocumentation(), transferStaticInstanceInitializers(), TRUE, vhdlCorrectMemberProperties(), warn_uncond, and warnUndocumentedNamespaces().

Referenced by main().

◆ readConfiguration()

void readConfiguration ( int argc,
char ** argv )

Definition at line 11607 of file doxygen.cpp.

11608{
11609 QCString versionString = getFullVersion();
11610
11611 // helper that calls \a func to write to file \a fileName via a TextStream
11612 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11613 {
11614 std::ofstream f;
11615 if (openOutputFile(fileName,f))
11616 {
11617 TextStream t(&f);
11618 func(t);
11619 return true;
11620 }
11621 return false;
11622 };
11623
11624
11625 /**************************************************************************
11626 * Handle arguments *
11627 **************************************************************************/
11628
11629 int optInd=1;
11630 QCString configName;
11631 QCString traceName;
11632 bool genConfig=false;
11633 bool shortList=false;
11634 bool traceTiming=false;
11636 bool updateConfig=false;
11637 bool quiet = false;
11638 while (optInd<argc && argv[optInd][0]=='-' &&
11639 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11640 argv[optInd][1]=='-')
11641 )
11642 {
11643 switch(argv[optInd][1])
11644 {
11645 case 'g':
11646 {
11647 genConfig=TRUE;
11648 }
11649 break;
11650 case 'l':
11651 {
11652 QCString layoutName;
11653 if (optInd+1>=argc)
11654 {
11655 layoutName="DoxygenLayout.xml";
11656 }
11657 else
11658 {
11659 layoutName=argv[optInd+1];
11660 }
11661 writeDefaultLayoutFile(layoutName);
11663 exit(0);
11664 }
11665 break;
11666 case 'c':
11667 if (optInd+1>=argc) // no file name given
11668 {
11669 msg("option \"-c\" is missing the file name to read\n");
11670 devUsage();
11672 exit(1);
11673 }
11674 else
11675 {
11676 g_commentFileName=argv[optInd+1];
11677 optInd++;
11678 }
11679 g_singleComment=true;
11680 quiet=true;
11681 break;
11682 case 'd':
11683 {
11684 QCString debugLabel=getArg(argc,argv,optInd);
11685 if (debugLabel.isEmpty())
11686 {
11687 devUsage();
11689 exit(0);
11690 }
11691 int retVal = Debug::setFlagStr(debugLabel);
11692 if (!retVal)
11693 {
11694 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11695 devUsage();
11697 exit(1);
11698 }
11699 }
11700 break;
11701 case 't':
11702 {
11703#if ENABLE_TRACING
11704 if (!strcmp(argv[optInd]+1,"t_time"))
11705 {
11706 traceTiming = true;
11707 }
11708 else if (!strcmp(argv[optInd]+1,"t"))
11709 {
11710 traceTiming = false;
11711 }
11712 else
11713 {
11714 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11716 exit(1);
11717 }
11718 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11719 {
11720 traceName="stdout";
11721 }
11722 else
11723 {
11724 traceName=argv[optInd+1];
11725 optInd++;
11726 }
11727#else
11728 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11730 exit(1);
11731#endif
11732 }
11733 break;
11734 case 'x':
11735 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11736 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11737 else
11738 {
11739 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11741 exit(1);
11742 }
11743 break;
11744 case 's':
11745 shortList=TRUE;
11746 break;
11747 case 'u':
11748 updateConfig=TRUE;
11749 break;
11750 case 'e':
11751 {
11752 QCString formatName=getArg(argc,argv,optInd);
11753 if (formatName.isEmpty())
11754 {
11755 err("option \"-e\" is missing format specifier rtf.\n");
11757 exit(1);
11758 }
11759 if (qstricmp(formatName.data(),"rtf")==0)
11760 {
11761 if (optInd+1>=argc)
11762 {
11763 err("option \"-e rtf\" is missing an extensions file name\n");
11765 exit(1);
11766 }
11767 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11769 exit(0);
11770 }
11771 err("option \"-e\" has invalid format specifier.\n");
11773 exit(1);
11774 }
11775 break;
11776 case 'f':
11777 {
11778 QCString listName=getArg(argc,argv,optInd);
11779 if (listName.isEmpty())
11780 {
11781 err("option \"-f\" is missing list specifier.\n");
11783 exit(1);
11784 }
11785 if (qstricmp(listName.data(),"emoji")==0)
11786 {
11787 if (optInd+1>=argc)
11788 {
11789 err("option \"-f emoji\" is missing an output file name\n");
11791 exit(1);
11792 }
11793 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11795 exit(0);
11796 }
11797 err("option \"-f\" has invalid list specifier.\n");
11799 exit(1);
11800 }
11801 break;
11802 case 'w':
11803 {
11804 QCString formatName=getArg(argc,argv,optInd);
11805 if (formatName.isEmpty())
11806 {
11807 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11809 exit(1);
11810 }
11811 if (qstricmp(formatName.data(),"rtf")==0)
11812 {
11813 if (optInd+1>=argc)
11814 {
11815 err("option \"-w rtf\" is missing a style sheet file name\n");
11817 exit(1);
11818 }
11819 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11820 {
11821 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11823 exit(1);
11824 }
11826 exit(0);
11827 }
11828 else if (qstricmp(formatName.data(),"html")==0)
11829 {
11830 Config::init();
11831 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11832 // explicit config file mentioned or default found on disk
11833 {
11834 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11835 if (!Config::parse(df)) // parse the config file
11836 {
11837 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11839 exit(1);
11840 }
11841 }
11842 if (optInd+3>=argc)
11843 {
11844 err("option \"-w html\" does not have enough arguments\n");
11846 exit(1);
11847 }
11851 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11852 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11853 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11854 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11856 exit(0);
11857 }
11858 else if (qstricmp(formatName.data(),"latex")==0)
11859 {
11860 Config::init();
11861 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11862 {
11863 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11864 if (!Config::parse(df))
11865 {
11866 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11868 exit(1);
11869 }
11870 }
11871 if (optInd+3>=argc)
11872 {
11873 err("option \"-w latex\" does not have enough arguments\n");
11875 exit(1);
11876 }
11880 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11881 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11882 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11883 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11885 exit(0);
11886 }
11887 else
11888 {
11889 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11891 exit(1);
11892 }
11893 }
11894 break;
11895 case 'm':
11897 break;
11898 case 'v':
11899 version(false);
11901 exit(0);
11902 break;
11903 case 'V':
11904 version(true);
11906 exit(0);
11907 break;
11908 case '-':
11909 if (qstrcmp(&argv[optInd][2],"help")==0)
11910 {
11911 usage(argv[0],versionString);
11912 exit(0);
11913 }
11914 else if (qstrcmp(&argv[optInd][2],"version")==0)
11915 {
11916 version(false);
11918 exit(0);
11919 }
11920 else if ((qstrcmp(&argv[optInd][2],"Version")==0) ||
11921 (qstrcmp(&argv[optInd][2],"VERSION")==0))
11922 {
11923 version(true);
11925 exit(0);
11926 }
11927 else
11928 {
11929 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11930 usage(argv[0],versionString);
11931 exit(1);
11932 }
11933 break;
11934 case 'b':
11935 setvbuf(stdout,nullptr,_IONBF,0);
11936 break;
11937 case 'q':
11938 quiet = true;
11939 break;
11940 case 'h':
11941 case '?':
11942 usage(argv[0],versionString);
11943 exit(0);
11944 break;
11945 default:
11946 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11947 usage(argv[0],versionString);
11948 exit(1);
11949 }
11950 optInd++;
11951 }
11952
11953 /**************************************************************************
11954 * Parse or generate the config file *
11955 **************************************************************************/
11956
11957 initTracing(traceName.data(),traceTiming);
11958 TRACE("Doxygen version used: {}",getFullVersion());
11959 Config::init();
11960
11961 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11962 if (optInd>=argc)
11963 {
11964 if (configFileInfo1.exists())
11965 {
11966 configName="Doxyfile";
11967 }
11968 else if (configFileInfo2.exists())
11969 {
11970 configName="doxyfile";
11971 }
11972 else if (genConfig)
11973 {
11974 configName="Doxyfile";
11975 }
11976 else
11977 {
11978 err("Doxyfile not found and no input file specified!\n");
11979 usage(argv[0],versionString);
11980 exit(1);
11981 }
11982 }
11983 else
11984 {
11985 FileInfo fi(argv[optInd]);
11986 if (fi.exists() || qstrcmp(argv[optInd],"-")==0 || genConfig)
11987 {
11988 configName=argv[optInd];
11989 }
11990 else
11991 {
11992 err("configuration file {} not found!\n",argv[optInd]);
11993 usage(argv[0],versionString);
11994 exit(1);
11995 }
11996 }
11997
11998 if (genConfig)
11999 {
12000 generateConfigFile(configName,shortList);
12002 exit(0);
12003 }
12004
12005 if (!Config::parse(configName,updateConfig,diffList))
12006 {
12007 err("could not open or read configuration file {}!\n",configName);
12009 exit(1);
12010 }
12011
12012 if (diffList!=Config::CompareMode::Full)
12013 {
12015 compareDoxyfile(diffList);
12017 exit(0);
12018 }
12019
12020 if (updateConfig)
12021 {
12023 generateConfigFile(configName,shortList,TRUE);
12025 exit(0);
12026 }
12027
12028 /* Perlmod wants to know the path to the config file.*/
12029 FileInfo configFileInfo(configName.str());
12030 setPerlModDoxyfile(configFileInfo.absFilePath());
12031
12032 /* handle -q option */
12033 if (quiet) Config_updateBool(QUIET,TRUE);
12034}
static bool setFlagStr(const QCString &label)
Definition debug.cpp:104
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
Definition emoji.cpp:1978
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Definition emoji.cpp:1999
bool exists() const
Definition fileinfo.cpp:30
static void writeFooterFile(TextStream &t)
Definition htmlgen.cpp:1595
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1583
static void writeHeaderFile(TextStream &t, const QCString &cssname)
Definition htmlgen.cpp:1589
static void writeFooterFile(TextStream &t)
Definition latexgen.cpp:696
static void writeStyleSheetFile(TextStream &t)
Definition latexgen.cpp:702
static void writeHeaderFile(TextStream &t)
Definition latexgen.cpp:690
static void writeStyleSheetFile(TextStream &t)
Definition rtfgen.cpp:394
static void writeExtensionsFile(TextStream &t)
Definition rtfgen.cpp:409
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_updateBool(name, value)
Definition config.h:40
static void generateConfigFile(const QCString &configFile, bool shortList, bool updateOnly=FALSE)
static void compareDoxyfile(Config::CompareMode diffList)
static void usage(const QCString &name, const QCString &versionString)
static void devUsage()
static void version(const bool extended)
static const char * getArg(int argc, char **argv, int &optInd)
void writeDefaultLayoutFile(const QCString &fileName)
Definition layout.cpp:1734
CompareMode
Definition config.h:54
bool parse(const QCString &fileName, bool update=FALSE, CompareMode compareMode=CompareMode::Full)
void init()
void setPerlModDoxyfile(const QCString &qs)
int qstricmp(const char *s1, const char *s2)
Definition qcstring.cpp:530
int qstrcmp(const char *str1, const char *str2)
Definition qcstring.h:69
void initTracing(const QCString &logFile, bool timing)
Definition trace.cpp:22
#define TRACE(...)
Definition trace.h:77
bool openOutputFile(const QCString &outFile, std::ofstream &f)
Definition util.cpp:6336

References FileInfo::absFilePath(), Config::checkAndCorrect(), cleanUpDoxygen(), compareDoxyfile(), Config::Compressed, Config::CompressedNoEnv, Config_getBool, Config_getEnum, Config_updateBool, QCString::data(), devUsage(), err, FileInfo::exists(), Config::Full, g_commentFileName, g_dumpSymbolMap, g_singleComment, generateConfigFile(), getArg(), Config::init(), initTracing(), EmojiEntityMapper::instance(), QCString::isEmpty(), msg, openOutputFile(), Config::parse(), Config::postProcess(), qstrcmp(), qstricmp(), Debug::setFlagStr(), setPerlModDoxyfile(), setTranslator(), QCString::str(), TRACE, TRUE, Config::updateObsolete(), usage(), version(), writeDefaultLayoutFile(), EmojiEntityMapper::writeEmojiFile(), RTFGenerator::writeExtensionsFile(), HtmlGenerator::writeFooterFile(), LatexGenerator::writeFooterFile(), HtmlGenerator::writeHeaderFile(), LatexGenerator::writeHeaderFile(), HtmlGenerator::writeStyleSheetFile(), LatexGenerator::writeStyleSheetFile(), and RTFGenerator::writeStyleSheetFile().

Referenced by main().

◆ readFileOrDirectory()

void readFileOrDirectory ( const QCString & s,
FileNameLinkedMap * fnDict,
StringUnorderedSet * exclSet,
const StringVector * patList,
const StringVector * exclPatList,
StringVector * resultList,
StringUnorderedSet * resultSet,
bool recursive,
bool errorIfNotExist = TRUE,
StringUnorderedSet * killSet = nullptr,
StringUnorderedSet * paths = nullptr )

Definition at line 11267 of file doxygen.cpp.

11279{
11280 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11281 // strip trailing slashes
11282 if (s.isEmpty()) return;
11283
11284 g_pathsVisited.clear();
11285
11286 FileInfo fi(s.str());
11287 //printf("readFileOrDirectory(%s)\n",s);
11288 {
11289 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11290 {
11291 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11292 {
11293 }
11294 else if (!fi.exists() || !fi.isReadable())
11295 {
11296 if (errorIfNotExist)
11297 {
11298 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11299 }
11300 }
11301 else if (fi.isFile())
11302 {
11303 std::string dirPath = fi.dirPath(true);
11304 std::string filePath = fi.absFilePath();
11305 if (paths && !dirPath.empty())
11306 {
11307 paths->insert(dirPath);
11308 }
11309 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11310 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11311 {
11312 std::string name=fi.fileName();
11313 if (fnMap)
11314 {
11315 auto fd = createFileDef(dirPath+"/",name);
11316 if (!name.empty())
11317 {
11318 FileName *fn = fnMap->add(name);
11319 fn->push_back(std::move(fd));
11320 }
11321 }
11322 if (resultList || resultSet)
11323 {
11324 if (resultList) resultList->push_back(filePath);
11325 if (resultSet) resultSet->insert(filePath);
11326 }
11327
11328 if (killSet) killSet->insert(fi.absFilePath());
11329 }
11330 }
11331 else if (fi.isDir()) // readable dir
11332 {
11333 readDir(&fi,fnMap,exclSet,patList,
11334 exclPatList,resultList,resultSet,errorIfNotExist,
11335 recursive,killSet,paths);
11336 }
11337 }
11338 }
11339}
Class representing all files with a certain base name.
Definition filename.h:30
static StringUnorderedSet g_pathsVisited(1009)
static void readDir(FileInfo *fi, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool errorIfNotExist, bool recursive, StringUnorderedSet *killSet, StringUnorderedSet *paths)
std::unique_ptr< FileDef > createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
Definition filedef.cpp:268

References FileInfo::absFilePath(), LinkedMap< T, Hash, KeyEqual, Map >::add(), Config_getBool, createFileDef(), FileInfo::dirPath(), FileInfo::exists(), FileInfo::fileName(), g_pathsVisited(), FileInfo::isDir(), QCString::isEmpty(), FileInfo::isFile(), FileInfo::isReadable(), FileInfo::isSymLink(), readDir(), QCString::str(), and warn_uncond.

Referenced by searchInputFiles().