Doxygen
Loading...
Searching...
No Matches
doxygen.h File Reference

#include <src/doxygen.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 DString &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 30 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 75 of file doxygen.h.

◆ InputFileEncodingList

Definition at line 73 of file doxygen.h.

◆ NamespaceAliasInfoMap

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

Definition at line 79 of file doxygen.h.

◆ StaticInitMap

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

Definition at line 77 of file doxygen.h.

Function Documentation

◆ adjustConfiguration()

void adjustConfiguration ( )

adjust globals that depend on configuration settings.

Definition at line 12143 of file doxygen.cpp.

12144{
12145 AUTO_TRACE();
12146 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12157
12158 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12159
12160 /* Set the global html file extension. */
12161 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12162
12163
12165 Config_getBool(CALLER_GRAPH) ||
12166 Config_getBool(REFERENCES_RELATION) ||
12167 Config_getBool(REFERENCED_BY_RELATION);
12168
12169 /**************************************************************************
12170 * Add custom extension mappings
12171 **************************************************************************/
12172
12173 StringVector extMaps = Config_getList(EXTENSION_MAPPING);
12174 for (const auto &mapping : extMaps)
12175 {
12176 DString mapStr = mapping;
12177 if (size_t i=mapStr.find('='); i==DString::npos)
12178 {
12179 continue;
12180 }
12181 else
12182 {
12183 DString ext = mapStr.left(i).stripWhiteSpace().lower();
12184 DString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12185 if (ext.empty() || language.empty())
12186 {
12187 continue;
12188 }
12189
12190 if (!updateLanguageMapping(ext,language))
12191 {
12192 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12193 "Check the EXTENSION_MAPPING setting in the config file.\n",
12194 ext,language);
12195 }
12196 else
12197 {
12198 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12199 ext,language);
12200 }
12201 }
12202 }
12203 // create input file exncodings
12204
12205 // check INPUT_ENCODING
12206 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12207 if (cd==reinterpret_cast<void *>(-1))
12208 {
12209 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12210 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12211 Config_getString(INPUT_ENCODING),strerror(errno));
12212 }
12213 else
12214 {
12216 }
12217
12218 // check and split INPUT_FILE_ENCODING
12219 StringVector fileEncod = Config_getList(INPUT_FILE_ENCODING);
12220 for (const auto &mapping : fileEncod)
12221 {
12222 DString mapStr = mapping;
12223 if (size_t i=mapStr.find('='); i==DString::npos)
12224 {
12225 continue;
12226 }
12227 else
12228 {
12229 DString pattern = mapStr.left(i).stripWhiteSpace().lower();
12230 DString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12231 if (pattern.empty() || encoding.empty())
12232 {
12233 continue;
12234 }
12235 cd = portable_iconv_open("UTF-8",encoding.data());
12236 if (cd==reinterpret_cast<void *>(-1))
12237 {
12238 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12239 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12240 encoding,strerror(errno));
12241 }
12242 else
12243 {
12245 }
12246
12247 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12248 }
12249 }
12250
12251 // add predefined macro name to a dictionary
12252 StringVector expandAsDefinedList = Config_getList(EXPAND_AS_DEFINED);
12253 for (const auto &s : expandAsDefinedList)
12254 {
12256 }
12257
12258 // read aliases and store them in a dictionary
12259 readAliases();
12260
12261 // store number of spaces in a tab into Doxygen::spaces
12262 int tabSize = Config_getInt(TAB_SIZE);
12263 Doxygen::spaces.resize(tabSize);
12264 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12265 Doxygen::spaces.at(tabSize)='\0';
12266}
void readAliases()
Definition aliases.cpp:162
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
void resize(size_t newlen)
Definition dstring.h:209
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
DString lower() const
Definition dstring.h:326
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:157
static FileNameLinkedMap * plantUmlFileNameLinkedMap
Definition doxygen.h:102
static bool parseSourcesNeeded
Definition doxygen.h:116
static StringUnorderedSet expandAsDefinedSet
Definition doxygen.h:112
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:97
static InputFileEncodingList inputFileEncodingList
Definition doxygen.h:131
static FileNameLinkedMap * dotFileNameLinkedMap
Definition doxygen.h:99
static NamespaceDefMutable * globalScope
Definition doxygen.h:114
static FileNameLinkedMap * imageNameLinkedMap
Definition doxygen.h:98
static FileNameLinkedMap * mscFileNameLinkedMap
Definition doxygen.h:100
static FileNameLinkedMap * mermaidFileNameLinkedMap
Definition doxygen.h:103
static FileNameLinkedMap * diaFileNameLinkedMap
Definition doxygen.h:101
static DString spaces
Definition doxygen.h:126
static std::unique_ptr< NamespaceDef > globalNamespaceDef
Definition doxygen.h:113
static DString htmlFileExtension
Definition doxygen.h:115
static FileNameLinkedMap * includeNameLinkedMap
Definition doxygen.h:94
static FileNameLinkedMap * exampleNameLinkedMap
Definition doxygen.h:95
Ordered dictionary of FileName objects.
Definition filename.h:70
#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:53
void setTranslator(OUTPUT_LANGUAGE_t langName)
Definition language.cpp:78
#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 DString &defFileName, int defLine, size_t defColumn, const DString &name, const DString &ref, const DString &refFile, const DString &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 DString &extension, const DString &language)
Definition util.cpp:4064

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

Referenced by main().

◆ checkConfiguration()

void checkConfiguration ( )

check and resolve config options

Definition at line 12132 of file doxygen.cpp.

12133{
12134 AUTO_TRACE();
12135
12136 Config::postProcess(false);
12140}
void initWarningFormat()
Definition message.cpp:233
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void updateObsolete()

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

Referenced by main().

◆ cleanUpDoxygen()

void cleanUpDoxygen ( )

Definition at line 11669 of file doxygen.cpp.

11670{
11674
11675 delete Doxygen::indexList;
11685 Doxygen::mainPage.reset();
11689 Doxygen::globalScope = nullptr;
11691 delete theTranslator;
11692 delete g_outputList;
11693
11698 delete Doxygen::dirLinkedMap;
11699 delete Doxygen::symbolMap;
11700}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:108
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:93
static ParserManager * parserManager
Definition doxygen.h:122
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:105
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:91
static IndexList * indexList
Definition doxygen.h:125
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:92
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:120
static MemberNameLinkedMap * memberNameLinkedMap
Definition doxygen.h:104
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:118
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:107
static FormulaManager & instance()
Definition formula.cpp:54
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:192
Translator * theTranslator
Definition language.cpp:76

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 13324 of file doxygen.cpp.

13325{
13326 AUTO_TRACE();
13327 /**************************************************************************
13328 * Initialize output generators *
13329 **************************************************************************/
13330
13331 /// add extra languages for which we can only produce syntax highlighted code
13333
13334 //// dump all symbols
13335 if (g_dumpSymbolMap)
13336 {
13337 dumpSymbolMap();
13338 exit(0);
13339 }
13340
13341 bool generateHtml = Config_getBool(GENERATE_HTML);
13342 bool generateLatex = Config_getBool(GENERATE_LATEX);
13343 bool generateMan = Config_getBool(GENERATE_MAN);
13344 bool generateRtf = Config_getBool(GENERATE_RTF);
13345 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13346
13347
13349 if (generateHtml)
13350 {
13354 }
13355 if (generateLatex)
13356 {
13359 }
13360 if (generateDocbook)
13361 {
13364 }
13365 if (generateMan)
13366 {
13369 }
13370 if (generateRtf)
13371 {
13374 }
13375 if (Config_getBool(USE_HTAGS))
13376 {
13377 Htags::useHtags = true;
13378 DString htmldir = Config_getString(HTML_OUTPUT);
13379 if (!Htags::execute(htmldir))
13380 err("USE_HTAGS is YES but htags(1) failed. \n");
13381 else if (!Htags::loadFilemap(htmldir))
13382 err("htags(1) ended normally but failed to load the filemap. \n");
13383 }
13384
13385 /**************************************************************************
13386 * Generate documentation *
13387 **************************************************************************/
13388
13389 g_s.begin("Generating style sheet...\n");
13390 //printf("writing style info\n");
13391 g_outputList->writeStyleInfo(0); // write first part
13392 g_s.end();
13393
13394 bool searchEngine = Config_getBool(SEARCHENGINE);
13395 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13396
13397 g_s.begin("Generating search indices...\n");
13398 if (searchEngine && !serverBasedSearch && generateHtml)
13399 {
13401 }
13402
13403 // generate search indices (need to do this before writing other HTML
13404 // pages as these contain a drop down menu with options depending on
13405 // what categories we find in this function.
13406 if (generateHtml && searchEngine)
13407 {
13408 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13409 Dir searchDir(searchDirName.str());
13410 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13411 {
13412 term("Could not create search results directory '{}' $PWD='{}'\n",
13413 searchDirName,Dir::currentDirPath());
13414 }
13415 HtmlGenerator::writeSearchData(searchDirName);
13416 if (!serverBasedSearch) // client side search index
13417 {
13419 }
13420 }
13421 g_s.end();
13422
13423 // copy static stuff
13424 if (generateHtml)
13425 {
13427 copyLogo(Config_getString(HTML_OUTPUT),true);
13428 copyIcon(Config_getString(HTML_OUTPUT),true);
13429 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13430 }
13431 if (generateLatex)
13432 {
13434 copyLogo(Config_getString(LATEX_OUTPUT),false);
13435 copyIcon(Config_getString(LATEX_OUTPUT),false);
13436 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13437 }
13438 if (generateDocbook)
13439 {
13440 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13441 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13442 }
13443 if (generateRtf)
13444 {
13445 copyLogo(Config_getString(RTF_OUTPUT),false);
13446 copyIcon(Config_getString(RTF_OUTPUT),false);
13447 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13448 }
13449
13451 if (fm.hasFormulas() && generateHtml
13452 && !Config_getBool(USE_MATHJAX))
13453 {
13454 g_s.begin("Generating images for formulas in HTML...\n");
13455 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13457 g_s.end();
13458 }
13459 if (fm.hasFormulas() && generateRtf)
13460 {
13461 g_s.begin("Generating images for formulas in RTF...\n");
13463 g_s.end();
13464 }
13465
13466 if (fm.hasFormulas() && generateDocbook)
13467 {
13468 g_s.begin("Generating images for formulas in Docbook...\n");
13470 g_s.end();
13471 }
13472
13473 g_s.begin("Generating example documentation...\n");
13475 g_s.end();
13476
13477 g_s.begin("Generating file sources...\n");
13479 g_s.end();
13480
13481 g_s.begin("Counting members...\n");
13482 // needs to be done after generating the sources
13483 // but before generating the compound documentation, see bug #12233
13484 countMembers();
13485 g_s.end();
13486
13487 g_s.begin("Generating file documentation...\n");
13489 g_s.end();
13490
13491 g_s.begin("Generating page documentation...\n");
13493 g_s.end();
13494
13495 g_s.begin("Generating group documentation...\n");
13497 g_s.end();
13498
13499 g_s.begin("Generating class documentation...\n");
13501 g_s.end();
13502
13503 g_s.begin("Generating concept documentation...\n");
13505 g_s.end();
13506
13507 g_s.begin("Generating module documentation...\n");
13509 g_s.end();
13510
13511 g_s.begin("Generating namespace documentation...\n");
13513 g_s.end();
13514
13515 if (Config_getBool(GENERATE_LEGEND))
13516 {
13517 g_s.begin("Generating graph info page...\n");
13519 g_s.end();
13520 }
13521
13522 g_s.begin("Generating directory documentation...\n");
13524 g_s.end();
13525
13526 if (g_outputList->size()>0)
13527 {
13529 }
13530
13531 g_s.begin("finalizing index lists...\n");
13533 g_s.end();
13534
13535 g_s.begin("writing tag file...\n");
13536 writeTagFile();
13537 g_s.end();
13538
13539 if (Config_getBool(GENERATE_XML))
13540 {
13541 g_s.begin("Generating XML output...\n");
13543 generateXML();
13545 g_s.end();
13546 }
13547 if (Config_getBool(GENERATE_SQLITE3))
13548 {
13549 g_s.begin("Generating SQLITE3 output...\n");
13551 g_s.end();
13552 }
13553
13554 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13555 {
13556 g_s.begin("Generating AutoGen DEF output...\n");
13557 generateDEF();
13558 g_s.end();
13559 }
13560 if (Config_getBool(GENERATE_PERLMOD))
13561 {
13562 g_s.begin("Generating Perl module output...\n");
13564 g_s.end();
13565 }
13566 if (generateHtml && searchEngine && serverBasedSearch)
13567 {
13568 g_s.begin("Generating search index\n");
13569 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13570 {
13572 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13573 }
13574 else // write data for external search index
13575 {
13577 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13578 if (searchDataFile.empty())
13579 {
13580 searchDataFile="searchdata.xml";
13581 }
13582 if (!Portable::isAbsolutePath(searchDataFile.data()))
13583 {
13584 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13585 }
13586 Doxygen::searchIndex.write(searchDataFile);
13587 }
13588 g_s.end();
13589 }
13590
13591 if (generateRtf)
13592 {
13593 g_s.begin("Combining RTF output...\n");
13594 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13595 {
13596 err("An error occurred during post-processing the RTF files!\n");
13597 }
13598 g_s.end();
13599 }
13600
13601 if (PlantumlManager::instance().needToRun())
13602 {
13603 g_s.begin("Running plantuml with JAVA...\n");
13605 g_s.end();
13606 }
13607
13608 if (MermaidManager::instance().needToRun())
13609 {
13610 g_s.begin("Running mermaid (mmdc)...\n");
13612 g_s.end();
13613 }
13614
13615 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13616 {
13617 g_s.begin("Running dot...\n");
13619 g_s.end();
13620 }
13621
13622 if (generateHtml &&
13623 Config_getBool(GENERATE_HTMLHELP) &&
13624 !Config_getString(HHC_LOCATION).empty())
13625 {
13626 g_s.begin("Running html help compiler...\n");
13628 g_s.end();
13629 }
13630
13631 if ( generateHtml &&
13632 Config_getBool(GENERATE_QHP) &&
13633 !Config_getString(QHG_LOCATION).empty())
13634 {
13635 g_s.begin("Running qhelpgenerator...\n");
13637 g_s.end();
13638 }
13639
13642
13644
13646 {
13647
13648 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13649 if (numThreads<1) numThreads=1;
13650 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13651 (static_cast<double>(Debug::elapsedTime())),
13652 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13653 );
13654 g_s.print();
13655
13657 msg("finished...\n");
13659 }
13660 else
13661 {
13662 msg("finished...\n");
13663 }
13664
13665
13666 /**************************************************************************
13667 * Start cleaning up *
13668 **************************************************************************/
13669
13671
13673 Dir thisDir;
13674 thisDir.remove(Doxygen::filterDBFileName.str());
13676 exitTracing();
13678 delete Doxygen::clangUsrMap;
13679 g_successfulRun=true;
13680
13681 //dumpDocNodeSizes();
13682}
DString & prepend(const char *s)
Definition dstring.h:515
const std::string & str() const
Definition dstring.h:645
@ Time
Definition debug.h:36
static void clearFlag(const DebugMask mask)
Definition debug.cpp:122
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
static double elapsedTime()
Definition debug.cpp:200
static void setFlag(const DebugMask mask)
Definition debug.cpp:117
Class representing a directory in the file system.
Definition dir.h:73
static std::string currentDirPath()
Definition dir.cpp:348
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:320
static void init()
bool run()
Definition dot.cpp:119
static DotManager * instance()
Definition dot.cpp:78
static DString filterDBFileName
Definition doxygen.h:124
static bool generatingXmlOutput
Definition doxygen.h:127
static SearchIndexIntf searchIndex
Definition doxygen.h:117
static ClangUsrMap * clangUsrMap
Definition doxygen.h:119
bool hasFormulas() const
Definition formula.cpp:720
void generateImages(const DString &outputDir, bool toIndex, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:635
Generator for HTML output.
Definition htmlgen.h:93
static void writeSearchData(const DString &dir)
Definition htmlgen.cpp:1455
static void init()
Definition htmlgen.cpp:1275
static void writeSearchPage()
Definition htmlgen.cpp:3272
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1439
static void writeExternalSearchPage()
Definition htmlgen.cpp:3371
void finalize()
Definition indexlist.h:104
Generator for LaTeX output.
Definition latexgen.h:93
static void init()
Definition latexgen.cpp:634
Generator for Man page output.
Definition mangen.h:69
static void init()
Definition mangen.cpp:275
void run()
Run mmdc tool for all collected diagrams.
Definition mermaid.cpp:255
static MermaidManager & instance()
Definition mermaid.cpp:38
void writeDocumentation(OutputList &ol)
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:311
void add()
Definition outputlist.h:348
size_t size() const
Definition outputlist.h:357
void writeStyleInfo(int part)
Definition outputlist.h:391
void cleanup()
Definition outputlist.h:748
static PlantumlManager & instance()
Definition plantuml.cpp:236
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:432
Generator for RTF output.
Definition rtfgen.h:80
static void init()
Definition rtfgen.cpp:464
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
Definition rtfgen.cpp:2468
void write(const DString &file)
void print()
Definition doxygen.cpp:250
void begin(const char *name)
Definition doxygen.cpp:237
void end()
Definition doxygen.cpp:243
static void showCacheUsage()
Show usage of the type lookup cache.
void generateDEF()
Definition defgen.cpp:463
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1188
static void copyLatexStyleSheet()
static void runQHelpGenerator()
class Statistics g_s
static void copyStyleSheet()
static void generateGroupDocs()
static void generateExampleDocs()
static void copyLogo(const DString &outputOption, bool toIndex)
static void dumpSymbolMap()
static void generateFileDocs()
Definition doxygen.cpp:8952
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8786
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9387
static void countMembers()
Definition doxygen.cpp:9248
static void runHtmlHelpCompiler()
static bool g_dumpSymbolMap
Definition doxygen.cpp:195
static bool g_successfulRun
Definition doxygen.cpp:194
static void generateNamespaceDocs()
static void writeTagFile()
void cleanUpDoxygen()
static void generateConceptDocs()
Definition doxygen.cpp:9413
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4097
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5811
void finishWarnExit()
Definition message.cpp:291
void deinit()
double getSysElapsedTime()
Definition portable.cpp:113
bool isAbsolutePath(const DString &fileName)
Definition portable.cpp:513
void generatePerlMod()
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
void generateSqlite3()
static bool execute(const DString &htmldir)
Definition htags.cpp:41
static bool loadFilemap(const DString &htmldir)
Definition htags.cpp:110
static bool useHtags
Definition htags.h:23
void exitTracing()
Definition trace.cpp:55
void addCodeOnlyMappings()
Definition util.cpp:4163
void cleanupInlineGraphs()
Definition util.cpp:5405
void generateXML()
Definition xmlgen.cpp:2331

References OutputList::add(), addCodeOnlyMappings(), AUTO_TRACE, Statistics::begin(), FormulaManager::Bitmap, Doxygen::clangUsrMap, OutputList::cleanup(), cleanUpDoxygen(), cleanupInlineGraphs(), Debug::clearFlag(), Config_getBool, Config_getEnum, Config_getInt, Config_getList, Config_getString, copyExtraFiles(), copyIcon(), copyLatexStyleSheet(), copyLogo(), copyStyleSheet(), countMembers(), createJavaScriptSearchIndex(), Dir::currentDirPath(), DString::data(), Config::deinit(), dumpSymbolMap(), Debug::elapsedTime(), DString::empty(), Statistics::end(), err, Htags::execute(), Dir::exists(), exitTracing(), Doxygen::filterDBFileName, IndexList::finalize(), 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(), Debug::isFlagSet(), Htags::loadFilemap(), Dir::mkdir(), msg, FormulaManager::On, DString::prepend(), RTFGenerator::preProcessFileInplace(), Statistics::print(), Dir::remove(), DotManager::run(), MermaidManager::run(), PlantumlManager::run(), runHtmlHelpCompiler(), runQHelpGenerator(), Doxygen::searchIndex, Debug::setFlag(), SymbolResolver::showCacheUsage(), OutputList::size(), DString::str(), term, Debug::Time, Htags::useHtags, FormulaManager::Vector, SearchIndexIntf::write(), ModuleManager::writeDocumentation(), HtmlGenerator::writeExternalSearchPage(), writeGraphInfo(), writeIndexHierarchy(), writeJavaScriptSearchIndex(), HtmlGenerator::writeSearchData(), HtmlGenerator::writeSearchPage(), OutputList::writeStyleInfo(), HtmlGenerator::writeTabData(), and writeTagFile().

Referenced by main().

◆ initDoxygen()

void initDoxygen ( )

Definition at line 11599 of file doxygen.cpp.

11600{
11601 initResources();
11602 DString lang = Portable::getenv("LC_ALL");
11603 if (!lang.empty()) Portable::setenv("LANG",lang);
11604 std::setlocale(LC_ALL,"");
11605 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11606 std::setlocale(LC_NUMERIC,"C");
11607
11609
11633
11634 // register any additional parsers here...
11635
11637
11638#if USE_LIBCLANG
11640#endif
11649 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11650 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11651 //Doxygen::tagDestinationDict.setAutoDelete(true);
11653
11654 // initialization of these globals depends on
11655 // configuration switches so we need to postpone these
11656 Doxygen::globalScope = nullptr;
11666
11667}
static void startTimer()
Definition debug.cpp:195
A linked map of directories.
Definition dirdef.h:173
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:90
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:88
static ClassLinkedMap * hiddenClassLinkedMap
Definition doxygen.h:89
A list of index interfaces.
Definition indexlist.h:65
Ordered dictionary of MemberName objects.
Definition membername.h:61
Manages programming language parsers.
Definition parserintf.h:182
void registerParser(const DString &name, const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Registers an additional parser.
Definition parserintf.h:215
std::function< std::unique_ptr< T >() > make_parser_factory()
void initResources()
std::unordered_map< std::string, const Definition * > ClangUsrMap
Definition doxygen.h:75
void setenv(const DString &variable, const DString &value)
Definition portable.cpp:302
DString getenv(const DString &variable)
Definition portable.cpp:337
void initDefaultExtensionMapping()
Definition util.cpp:4096

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

Referenced by main().

◆ parseInput()

void parseInput ( )

Definition at line 12655 of file doxygen.cpp.

12656{
12657 AUTO_TRACE();
12658 std::atexit(exitDoxygen);
12659
12660 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12661
12662#if USE_LIBCLANG
12663 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12664#endif
12665
12666 // we would like to show the versionString earlier, but we first have to handle the configuration file
12667 // to know the value of the QUIET setting.
12668 DString versionString = getFullVersion();
12669 msg("Doxygen version used: {}\n",versionString);
12670
12672
12673 /**************************************************************************
12674 * Make sure the output directory exists
12675 **************************************************************************/
12676 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12677 if (!g_singleComment)
12678 {
12679 if (outputDirectory.empty())
12680 {
12681 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12682 }
12683 else
12684 {
12685 Dir dir(outputDirectory.str());
12686 if (!dir.exists())
12687 {
12688 dir.setPath(Dir::currentDirPath());
12689 if (!dir.mkdir(outputDirectory.str()))
12690 {
12691 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12692 "exist and cannot be created\n",outputDirectory);
12693 }
12694 else
12695 {
12696 msg("Notice: Output directory '{}' does not exist. "
12697 "I have created it for you.\n", outputDirectory);
12698 }
12699 dir.setPath(outputDirectory.str());
12700 }
12701 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12702 }
12703 }
12704 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12705
12706 /**************************************************************************
12707 * Initialize global lists and dictionaries
12708 **************************************************************************/
12709
12710#ifdef HAS_SIGNALS
12711 signal(SIGINT, stopDoxygen);
12712#endif
12713
12714 uint32_t pid = Portable::pid();
12715 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12716 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12717
12718 /**************************************************************************
12719 * Check/create output directories *
12720 **************************************************************************/
12721
12722 bool generateHtml = Config_getBool(GENERATE_HTML);
12723 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12724 bool generateXml = Config_getBool(GENERATE_XML);
12725 bool generateLatex = Config_getBool(GENERATE_LATEX);
12726 bool generateRtf = Config_getBool(GENERATE_RTF);
12727 bool generateMan = Config_getBool(GENERATE_MAN);
12728 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12729 DString htmlOutput;
12730 DString docbookOutput;
12731 DString xmlOutput;
12732 DString latexOutput;
12733 DString rtfOutput;
12734 DString manOutput;
12735 DString sqlOutput;
12736
12737 if (!g_singleComment)
12738 {
12739 if (generateHtml)
12740 {
12741 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12742 Config_updateString(HTML_OUTPUT,htmlOutput);
12743
12744 DString sitemapUrl = Config_getString(SITEMAP_URL);
12745 bool generateSitemap = !sitemapUrl.empty();
12746 if (generateSitemap && !sitemapUrl.endsWith("/"))
12747 {
12748 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12749 }
12750
12751 // add HTML indexers that are enabled
12752 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12753 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12754 bool generateQhp = Config_getBool(GENERATE_QHP);
12755 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12756 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12757 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12758 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12759 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12760 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12761 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12762 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12765 }
12766
12767 if (generateDocbook)
12768 {
12769 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12770 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12771 }
12772
12773 if (generateXml)
12774 {
12775 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12776 Config_updateString(XML_OUTPUT,xmlOutput);
12777 }
12778
12779 if (generateLatex)
12780 {
12781 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12782 Config_updateString(LATEX_OUTPUT,latexOutput);
12783 }
12784
12785 if (generateRtf)
12786 {
12787 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12788 Config_updateString(RTF_OUTPUT,rtfOutput);
12789 }
12790
12791 if (generateMan)
12792 {
12793 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12794 Config_updateString(MAN_OUTPUT,manOutput);
12795 }
12796
12797 if (generateSql)
12798 {
12799 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12800 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12801 }
12802 }
12803
12804 if (Config_getBool(HAVE_DOT))
12805 {
12806 DString curFontPath = Config_getString(DOT_FONTPATH);
12807 if (curFontPath.empty())
12808 {
12809 Portable::getenv("DOTFONTPATH");
12810 DString newFontPath = ".";
12811 if (!curFontPath.empty())
12812 {
12813 newFontPath+=Portable::pathListSeparator();
12814 newFontPath+=curFontPath;
12815 }
12816 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12817 }
12818 else
12819 {
12820 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12821 }
12822 }
12823
12824 /**************************************************************************
12825 * Handle layout file *
12826 **************************************************************************/
12827
12829 DString layoutFileName = Config_getString(LAYOUT_FILE);
12830 bool defaultLayoutUsed = false;
12831 if (layoutFileName.empty())
12832 {
12833 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12834 defaultLayoutUsed = true;
12835 }
12836 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12837
12838 FileInfo fi(layoutFileName.str());
12839 if (fi.exists())
12840 {
12841 msg("Parsing layout file {}...\n",layoutFileName);
12842 LayoutDocManager::instance().parse(layoutFileName);
12843 }
12844 else if (!defaultLayoutUsed)
12845 {
12846 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12847 }
12848 printLayout();
12849
12850 /**************************************************************************
12851 * Read and preprocess input *
12852 **************************************************************************/
12853
12854 // prevent search in the output directories
12855 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12856 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12857 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12858 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12859 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12860 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12861 if (generateMan) exclPatterns.push_back(manOutput.str());
12862 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12863
12864 if (!g_singleComment)
12865 {
12867
12869 }
12870
12871 // Notice: the order of the function calls below is very important!
12872
12873 if (generateHtml && !Config_getBool(USE_MATHJAX))
12874 {
12876 }
12877 if (generateRtf)
12878 {
12880 }
12881 if (generateDocbook)
12882 {
12884 }
12885
12887
12888 /**************************************************************************
12889 * Handle Tag Files *
12890 **************************************************************************/
12891
12892 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12893
12894 if (!g_singleComment)
12895 {
12896 msg("Reading and parsing tag files\n");
12897 StringVector tagFileList = Config_getList(TAGFILES);
12898 for (const auto &s : tagFileList)
12899 {
12900 readTagFile(root,s.c_str());
12901 }
12902 }
12903
12904 /**************************************************************************
12905 * Parse source files *
12906 **************************************************************************/
12907
12908 addSTLSupport(root);
12909
12910 g_s.begin("Parsing files\n");
12911 if (g_singleComment)
12912 {
12913 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12914 if (g_commentFileName=="-")
12915 {
12916 std::string text = fileToString(g_commentFileName).str();
12917 addTerminalCharIfMissing(text,'\n');
12918 generateHtmlForComment("stdin.md",text);
12919 }
12920 else if (FileInfo(g_commentFileName.str()).isFile())
12921 {
12922 std::string text;
12924 addTerminalCharIfMissing(text,'\n');
12926 }
12927 else
12928 {
12929 }
12931 exit(0);
12932 }
12933 else
12934 {
12935 if (Config_getInt(NUM_PROC_THREADS)==1)
12936 {
12938 }
12939 else
12940 {
12942 }
12943 }
12944 g_s.end();
12945
12946 /**************************************************************************
12947 * Gather information *
12948 **************************************************************************/
12949
12950 g_s.begin("Building macro definition list...\n");
12952 g_s.end();
12953
12954 g_s.begin("Building group list...\n");
12955 buildGroupList(root.get());
12956 organizeSubGroups(root.get());
12957 g_s.end();
12958
12959 g_s.begin("Building directory list...\n");
12961 findDirDocumentation(root.get());
12962 g_s.end();
12963
12964 g_s.begin("Building namespace list...\n");
12965 buildNamespaceList(root.get());
12966 findUsingDirectives(root.get());
12967 g_s.end();
12968
12969 g_s.begin("Building file list...\n");
12970 buildFileList(root.get());
12971 g_s.end();
12972
12973 g_s.begin("Building class list...\n");
12974 buildClassList(root.get());
12975 g_s.end();
12976
12977 g_s.begin("Building concept list...\n");
12978 buildConceptList(root.get());
12979 g_s.end();
12980
12981 // build list of using declarations here (global list)
12982 buildListOfUsingDecls(root.get());
12983 g_s.end();
12984
12985 g_s.begin("Computing nesting relations for classes...\n");
12987 g_s.end();
12988 // 1.8.2-20121111: no longer add nested classes to the group as well
12989 //distributeClassGroupRelations();
12990
12991 // calling buildClassList may result in cached relations that
12992 // become invalid after resolveClassNestingRelations(), that's why
12993 // we need to clear the cache here
12995 // we don't need the list of using declaration anymore
12996 g_usingDeclarations.clear();
12997
12998 g_s.begin("Associating documentation with classes...\n");
12999 buildClassDocList(root.get());
13000 g_s.end();
13001
13002 g_s.begin("Associating documentation with concepts...\n");
13003 buildConceptDocList(root.get());
13005 g_s.end();
13006
13007 g_s.begin("Associating documentation with modules...\n");
13008 findModuleDocumentation(root.get());
13009 g_s.end();
13010
13011 g_s.begin("Building example list...\n");
13012 buildExampleList(root.get());
13013 g_s.end();
13014
13015 g_s.begin("Searching for enumerations...\n");
13016 findEnums(root.get());
13017 g_s.end();
13018
13019 // Since buildVarList calls isVarWithConstructor
13020 // and this calls getResolvedClass we need to process
13021 // typedefs first so the relations between classes via typedefs
13022 // are properly resolved. See bug 536385 for an example.
13023 g_s.begin("Searching for documented typedefs...\n");
13024 buildTypedefList(root.get());
13025 g_s.end();
13026
13027 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
13028 {
13029 g_s.begin("Searching for documented sequences...\n");
13030 buildSequenceList(root.get());
13031 g_s.end();
13032
13033 g_s.begin("Searching for documented dictionaries...\n");
13034 buildDictionaryList(root.get());
13035 g_s.end();
13036 }
13037
13038 g_s.begin("Searching for members imported via using declarations...\n");
13039 // this should be after buildTypedefList in order to properly import
13040 // used typedefs
13041 findUsingDeclarations(root.get(),true); // do for python packages first
13042 findUsingDeclarations(root.get(),false); // then the rest
13043 g_s.end();
13044
13045 g_s.begin("Searching for included using directives...\n");
13047 g_s.end();
13048
13049 g_s.begin("Searching for documented variables...\n");
13050 buildVarList(root.get());
13051 g_s.end();
13052
13053 g_s.begin("Building interface member list...\n");
13054 buildInterfaceAndServiceList(root.get()); // UNO IDL
13055
13056 g_s.begin("Building member list...\n"); // using class info only !
13057 buildFunctionList(root.get());
13058 g_s.end();
13059
13060 g_s.begin("Searching for friends...\n");
13061 findFriends();
13062 g_s.end();
13063
13064 g_s.begin("Searching for documented defines...\n");
13065 findDefineDocumentation(root.get());
13066 g_s.end();
13067
13068 g_s.begin("Computing class inheritance relations...\n");
13069 findClassEntries(root.get());
13071 g_s.end();
13072
13073 g_s.begin("Computing class usage relations...\n");
13075 g_s.end();
13076
13077 g_s.begin("Flushing cached template relations that have become invalid...\n");
13079 g_s.end();
13080
13081 g_s.begin("Warn for undocumented namespaces...\n");
13083 g_s.end();
13084
13085 g_s.begin("Computing class relations...\n");
13088 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
13089 {
13091 }
13093 g_classEntries.clear();
13094 g_s.end();
13095
13096 g_s.begin("Add enum values to enums...\n");
13097 addEnumValuesToEnums(root.get());
13098 findEnumDocumentation(root.get());
13099 g_s.end();
13100
13101 g_s.begin("Searching for member function documentation...\n");
13102 findObjCMethodDefinitions(root.get());
13103 findMemberDocumentation(root.get()); // may introduce new members !
13104 findUsingDeclImports(root.get()); // may introduce new members !
13105 g_usingClassMap.clear();
13109 g_s.end();
13110
13111 // moved to after finding and copying documentation,
13112 // as this introduces new members see bug 722654
13113 g_s.begin("Creating members for template instances...\n");
13115 g_s.end();
13116
13117 g_s.begin("Searching for tag less structs...\n");
13119 g_s.end();
13120
13121 g_s.begin("Building page list...\n");
13122 buildPageList(root.get());
13123 g_s.end();
13124
13125 g_s.begin("Building requirements list...\n");
13126 buildRequirementsList(root.get());
13127 g_s.end();
13128
13129 g_s.begin("Search for main page...\n");
13130 findMainPage(root.get());
13131 findMainPageTagFiles(root.get());
13132 g_s.end();
13133
13134 g_s.begin("Computing page relations...\n");
13135 computePageRelations(root.get());
13137 g_s.end();
13138
13139 g_s.begin("Determining the scope of groups...\n");
13140 findGroupScope(root.get());
13141 g_s.end();
13142
13143 g_s.begin("Computing module relations...\n");
13144 auto &mm = ModuleManager::instance();
13145 mm.resolvePartitions();
13146 mm.resolveImports();
13147 mm.collectExportedSymbols();
13148 g_s.end();
13149
13150 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13151 {
13152 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13153 n2->memberName().data()+getPrefixIndex(n2->memberName())
13154 )<0;
13155 };
13156
13157 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13158 {
13159 if (Config_getBool(SORT_BY_SCOPE_NAME))
13160 {
13161 return dstricmp_sort(c1->name(), c2->name())<0;
13162 }
13163 else
13164 {
13165 int i = dstricmp_sort(c1->className(), c2->className());
13166 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13167 }
13168 };
13169
13170 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13171 {
13172 return dstricmp_sort(n1->name(),n2->name())<0;
13173 };
13174
13175 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13176 {
13177 return dstricmp_sort(c1->name(),c2->name())<0;
13178 };
13179
13180 g_s.begin("Sorting lists...\n");
13181 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13183 memberNameComp);
13184 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13186 memberNameComp);
13187 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13189 classComp);
13190 std::stable_sort(Doxygen::classLinkedMap->begin(),
13192 classComp);
13193 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13195 conceptComp);
13196 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13198 namespaceComp);
13199 g_s.end();
13200
13201 g_s.begin("Determining which enums are documented\n");
13203 g_s.end();
13204
13205 g_s.begin("Computing member relations...\n");
13208 g_s.end();
13209
13210 g_s.begin("Building full member lists recursively...\n");
13212 g_s.end();
13213
13214 g_s.begin("Adding members to member groups.\n");
13216 g_s.end();
13217
13218 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13219 {
13220 g_s.begin("Distributing member group documentation.\n");
13222 g_s.end();
13223 }
13224
13225 g_s.begin("Computing member references...\n");
13227 g_s.end();
13228
13229 if (Config_getBool(INHERIT_DOCS))
13230 {
13231 g_s.begin("Inheriting documentation...\n");
13233 g_s.end();
13234 }
13235
13236
13237 // compute the shortest possible names of all files
13238 // without losing the uniqueness of the file names.
13239 g_s.begin("Generating disk names...\n");
13241 g_s.end();
13242
13243 g_s.begin("Adding source references...\n");
13245 g_s.end();
13246
13247 g_s.begin("Adding xrefitems...\n");
13250 g_s.end();
13251
13252 g_s.begin("Adding requirements...\n");
13255 g_s.end();
13256
13257 g_s.begin("Sorting member lists...\n");
13259 g_s.end();
13260
13261 g_s.begin("Setting anonymous enum type...\n");
13263 g_s.end();
13264
13265 g_s.begin("Computing dependencies between directories...\n");
13267 g_s.end();
13268
13269 g_s.begin("Generating citations page...\n");
13271 g_s.end();
13272
13273 g_s.begin("Counting data structures...\n");
13275 g_s.end();
13276
13277 g_s.begin("Resolving user defined references...\n");
13279 g_s.end();
13280
13281 g_s.begin("Finding anchors and sections in the documentation...\n");
13283 g_s.end();
13284
13285 g_s.begin("Transferring function references...\n");
13287 g_s.end();
13288
13289 g_s.begin("Combining using relations...\n");
13291 g_s.end();
13292
13294 g_s.begin("Adding members to index pages...\n");
13296 addToIndices();
13297 g_s.end();
13298
13299 g_s.begin("Correcting members for VHDL...\n");
13301 g_s.end();
13302
13303 g_s.begin("Computing tooltip texts...\n");
13305 g_s.end();
13306
13307 if (Config_getBool(SORT_GROUP_NAMES))
13308 {
13309 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13311 [](const auto &g1,const auto &g2)
13312 { return g1->groupTitle() < g2->groupTitle(); });
13313
13314 for (const auto &gd : *Doxygen::groupLinkedMap)
13315 {
13316 gd->sortSubGroups();
13317 }
13318 }
13319
13320 printNavTree(root.get(),0);
13322}
static CitationManager & instance()
Definition cite.cpp:90
void generatePage()
Generate the citations page.
Definition cite.cpp:336
DString & sprintf(const char *format,...)
Definition dstring.cpp:34
bool endsWith(const char *s) const
Definition dstring.h:617
A class that generates docset files.
Definition docsets.h:35
static bool clangAssistedParsing
Definition doxygen.h:129
Generator for Eclipse help files.
Definition eclipsehelp.h:42
A class that generates a dynamic tree view side panel.
Definition ftvhelp.h:41
Minimal replacement for QFileInfo.
Definition fileinfo.h:26
bool isFile() const
Definition fileinfo.cpp:67
void initFromRepository(const DString &dir)
Definition formula.cpp:60
void checkRepositories()
Definition formula.cpp:173
A class that generated the HTML Help specific files.
Definition htmlhelp.h:37
static Index & instance()
Definition index.cpp:110
void countDataStructures()
Definition index.cpp:266
void initialize()
Definition indexlist.h:101
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>().
Definition indexlist.h:98
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1472
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1439
std::unique_ptr< MemberName > Ptr
Definition linkedmap.h:38
Definition qhp.h:29
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:176
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:181
void buildDirectories()
Definition dirdef.cpp:1097
void computeDirDependencies()
Definition dirdef.cpp:1171
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:54
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5495
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:540
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2268
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9629
static void computeTemplateClassRelations()
Definition doxygen.cpp:5589
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5768
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2421
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9829
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5544
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1336
static void resolveClassNestingRelations()
Definition doxygen.cpp:1391
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5460
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8588
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5658
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4619
static void addMembersToMemberGroup()
Definition doxygen.cpp:9494
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9998
static void distributeConceptGroups()
Definition doxygen.cpp:1358
static void transferFunctionDocumentation()
Definition doxygen.cpp:4538
static void setAnonymousEnumType()
Definition doxygen.cpp:9234
static void sortMemberLists()
Definition doxygen.cpp:9139
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8716
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4668
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7732
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3604
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:555
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9742
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7702
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9532
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7936
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9889
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3741
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3704
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1927
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2671
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:599
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4441
static void findEnums(const Entry *root)
Definition doxygen.cpp:7760
static DString g_commentFileName
Definition doxygen.cpp:196
static void addListReferences()
Definition doxygen.cpp:5759
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8378
static void findMainPage(Entry *root)
Definition doxygen.cpp:9928
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2111
static void addSourceReferences()
Definition doxygen.cpp:9012
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9434
static void flushUnresolvedRelations()
Definition doxygen.cpp:9671
static void findDocumentedEnumValues()
Definition doxygen.cpp:8370
static void findTagLessClasses()
Definition doxygen.cpp:1875
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8420
static void computeClassRelations()
Definition doxygen.cpp:5564
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4136
static void checkPageRelations()
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1326
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8259
static void computePageRelations(Entry *root)
static StringSet g_usingDeclarations
Definition doxygen.cpp:193
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3722
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1161
static void buildPageList(Entry *root)
Definition doxygen.cpp:9901
static void addRequirementReferences()
Definition doxygen.cpp:5751
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:197
static void findSectionsInDocumentation()
Definition doxygen.cpp:9570
static void mergeCategories()
Definition doxygen.cpp:8735
static void buildFileList(const Entry *root)
Definition doxygen.cpp:611
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1151
static void findUsedTemplateInstances()
Definition doxygen.cpp:5528
static void computeTooltipTexts()
Definition doxygen.cpp:9188
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8756
static void combineUsingRelations()
Definition doxygen.cpp:9469
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2419
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1346
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static DString createOutputDirectory(const DString &baseDirName, const DString &formatDirName, const char *defaultDirName)
static void transferFunctionReferences()
Definition doxygen.cpp:4571
static void buildDefineList()
Definition doxygen.cpp:9091
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3837
static void computeMemberRelations()
Definition doxygen.cpp:8700
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2255
static std::multimap< std::string, const Entry * > g_classEntries
Definition doxygen.cpp:190
int dstricmp_sort(const char *str1, const char *str2)
Definition dstring.h:67
const char * qPrint(const char *s)
Definition dstring.h:783
void printLayout()
Definition layout.cpp:1824
#define warn_uncond(fmt,...)
Definition message.h:122
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
Definition portable.cpp:532
uint32_t pid()
Definition portable.cpp:264
DString pathListSeparator()
Definition portable.cpp:399
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:87
bool readInputFile(const DString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
Definition util.cpp:4375
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1053
int getPrefixIndex(const DString &name)
Definition util.cpp:2652

References Dir::absPath(), addEnumValuesToEnums(), IndexList::addIndex(), addListReferences(), addMembersToIndex(), addMembersToMemberGroup(), addRequirementReferences(), addSourceReferences(), addSTLSupport(), addTerminalCharIfMissing(), addToIndices(), SymbolResolver::All, AUTO_TRACE, AUTO_TRACE_ADD, begin(), Statistics::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(), dstricmp_sort(), DString::empty(), end(), Statistics::end(), DString::endsWith(), Dir::exists(), FileInfo::exists(), exitDoxygen(), 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(), IndexList::initialize(), initSearchIndexer(), CitationManager::instance(), FormulaManager::instance(), Index::instance(), LayoutDocManager::instance(), ModuleManager::instance(), RequirementManager::instance(), FileInfo::isFile(), Doxygen::memberNameLinkedMap, mergeCategories(), Dir::mkdir(), msg, Doxygen::namespaceLinkedMap, organizeSubGroups(), LayoutDocManager::parse(), parseFilesMultiThreading(), parseFilesSingleThreading(), Portable::pathListSeparator(), Portable::pid(), DString::prepend(), printLayout(), printNavTree(), printSectionsTree(), qPrint(), readInputFile(), readTagFile(), resolveClassNestingRelations(), resolveUserReferences(), searchInputFiles(), setAnonymousEnumType(), Portable::setenv(), Dir::setPath(), sortMemberLists(), DString::sprintf(), stopDoxygen(), DString::str(), term, transferFunctionDocumentation(), transferFunctionReferences(), transferRelatedFunctionDocumentation(), transferStaticInstanceInitializers(), vhdlCorrectMemberProperties(), warn_uncond, and warnUndocumentedNamespaces().

Referenced by main().

◆ readConfiguration()

void readConfiguration ( int argc,
char ** argv )

Definition at line 11702 of file doxygen.cpp.

11703{
11704 DString versionString = getFullVersion();
11705
11706 // helper that calls \a func to write to file \a fileName via a TextStream
11707 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11708 {
11709 std::ofstream f;
11710 if (openOutputFile(fileName,f))
11711 {
11712 TextStream t(&f);
11713 func(t);
11714 return true;
11715 }
11716 return false;
11717 };
11718
11719
11720 /**************************************************************************
11721 * Handle arguments *
11722 **************************************************************************/
11723
11724 int optInd=1;
11725 DString configName;
11726 DString traceName;
11727 bool genConfig=false;
11728 bool shortList=false;
11729 bool traceTiming=false;
11731 bool updateConfig=false;
11732 bool quiet = false;
11733 while (optInd<argc && argv[optInd][0]=='-' &&
11734 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11735 argv[optInd][1]=='-')
11736 )
11737 {
11738 switch(argv[optInd][1])
11739 {
11740 case 'g':
11741 {
11742 genConfig=true;
11743 }
11744 break;
11745 case 'l':
11746 {
11747 DString layoutName;
11748 if (optInd+1>=argc)
11749 {
11750 layoutName="DoxygenLayout.xml";
11751 }
11752 else
11753 {
11754 layoutName=argv[optInd+1];
11755 }
11756 writeDefaultLayoutFile(layoutName);
11758 exit(0);
11759 }
11760 break;
11761 case 'c':
11762 if (optInd+1>=argc) // no file name given
11763 {
11764 msg("option \"-c\" is missing the file name to read\n");
11765 devUsage();
11767 exit(1);
11768 }
11769 else
11770 {
11771 g_commentFileName=argv[optInd+1];
11772 optInd++;
11773 }
11774 g_singleComment=true;
11775 quiet=true;
11776 break;
11777 case 'd':
11778 {
11779 DString debugLabel=getArg(argc,argv,optInd);
11780 if (debugLabel.empty())
11781 {
11782 devUsage();
11784 exit(0);
11785 }
11786 int retVal = Debug::setFlagStr(debugLabel);
11787 if (!retVal)
11788 {
11789 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11790 devUsage();
11792 exit(1);
11793 }
11794 }
11795 break;
11796 case 't':
11797 {
11798#if ENABLE_TRACING
11799 if (!strcmp(argv[optInd]+1,"t_time"))
11800 {
11801 traceTiming = true;
11802 }
11803 else if (!strcmp(argv[optInd]+1,"t"))
11804 {
11805 traceTiming = false;
11806 }
11807 else
11808 {
11809 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11811 exit(1);
11812 }
11813 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11814 {
11815 traceName="stdout";
11816 }
11817 else
11818 {
11819 traceName=argv[optInd+1];
11820 optInd++;
11821 }
11822#else
11823 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11825 exit(1);
11826#endif
11827 }
11828 break;
11829 case 'x':
11830 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11831 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11832 else
11833 {
11834 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11836 exit(1);
11837 }
11838 break;
11839 case 's':
11840 shortList=true;
11841 break;
11842 case 'u':
11843 updateConfig=true;
11844 break;
11845 case 'e':
11846 {
11847 DString formatName=getArg(argc,argv,optInd);
11848 if (formatName.empty())
11849 {
11850 err("option \"-e\" is missing format specifier rtf.\n");
11852 exit(1);
11853 }
11854 if (dstricmp(formatName.data(),"rtf")==0)
11855 {
11856 if (optInd+1>=argc)
11857 {
11858 err("option \"-e rtf\" is missing an extensions file name\n");
11860 exit(1);
11861 }
11862 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11864 exit(0);
11865 }
11866 err("option \"-e\" has invalid format specifier.\n");
11868 exit(1);
11869 }
11870 break;
11871 case 'f':
11872 {
11873 DString listName=getArg(argc,argv,optInd);
11874 if (listName.empty())
11875 {
11876 err("option \"-f\" is missing list specifier.\n");
11878 exit(1);
11879 }
11880 if (dstricmp(listName.data(),"emoji")==0)
11881 {
11882 if (optInd+1>=argc)
11883 {
11884 err("option \"-f emoji\" is missing an output file name\n");
11886 exit(1);
11887 }
11888 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11890 exit(0);
11891 }
11892 err("option \"-f\" has invalid list specifier.\n");
11894 exit(1);
11895 }
11896 break;
11897 case 'w':
11898 {
11899 DString formatName=getArg(argc,argv,optInd);
11900 if (formatName.empty())
11901 {
11902 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11904 exit(1);
11905 }
11906 if (dstricmp(formatName.data(),"rtf")==0)
11907 {
11908 if (optInd+1>=argc)
11909 {
11910 err("option \"-w rtf\" is missing a style sheet file name\n");
11912 exit(1);
11913 }
11914 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11915 {
11916 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11918 exit(1);
11919 }
11921 exit(0);
11922 }
11923 else if (dstricmp(formatName.data(),"html")==0)
11924 {
11925 Config::init();
11926 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11927 // explicit config file mentioned or default found on disk
11928 {
11929 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11930 if (!Config::parse(df)) // parse the config file
11931 {
11932 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11934 exit(1);
11935 }
11936 }
11937 if (optInd+3>=argc)
11938 {
11939 err("option \"-w html\" does not have enough arguments\n");
11941 exit(1);
11942 }
11943 Config::postProcess(true);
11946 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11947 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11948 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11949 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11951 exit(0);
11952 }
11953 else if (dstricmp(formatName.data(),"latex")==0)
11954 {
11955 Config::init();
11956 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11957 {
11958 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11959 if (!Config::parse(df))
11960 {
11961 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11963 exit(1);
11964 }
11965 }
11966 if (optInd+3>=argc)
11967 {
11968 err("option \"-w latex\" does not have enough arguments\n");
11970 exit(1);
11971 }
11972 Config::postProcess(true);
11975 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11976 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11977 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11978 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11980 exit(0);
11981 }
11982 else
11983 {
11984 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11986 exit(1);
11987 }
11988 }
11989 break;
11990 case 'm':
11991 g_dumpSymbolMap = true;
11992 break;
11993 case 'v':
11994 version(false);
11996 exit(0);
11997 break;
11998 case 'V':
11999 version(true);
12001 exit(0);
12002 break;
12003 case '-':
12004 if (dstrcmp(&argv[optInd][2],"help")==0)
12005 {
12006 usage(argv[0],versionString);
12007 exit(0);
12008 }
12009 else if (dstrcmp(&argv[optInd][2],"version")==0)
12010 {
12011 version(false);
12013 exit(0);
12014 }
12015 else if ((dstrcmp(&argv[optInd][2],"Version")==0) ||
12016 (dstrcmp(&argv[optInd][2],"VERSION")==0))
12017 {
12018 version(true);
12020 exit(0);
12021 }
12022 else
12023 {
12024 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
12025 usage(argv[0],versionString);
12026 exit(1);
12027 }
12028 break;
12029 case 'b':
12030 setvbuf(stdout,nullptr,_IONBF,0);
12031 break;
12032 case 'q':
12033 quiet = true;
12034 break;
12035 case 'h':
12036 case '?':
12037 usage(argv[0],versionString);
12038 exit(0);
12039 break;
12040 default:
12041 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
12042 usage(argv[0],versionString);
12043 exit(1);
12044 }
12045 optInd++;
12046 }
12047
12048 /**************************************************************************
12049 * Parse or generate the config file *
12050 **************************************************************************/
12051
12052 initTracing(traceName.data(),traceTiming);
12053 TRACE("Doxygen version used: {}",getFullVersion());
12054 Config::init();
12055
12056 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
12057 if (optInd>=argc)
12058 {
12059 if (configFileInfo1.exists())
12060 {
12061 configName="Doxyfile";
12062 }
12063 else if (configFileInfo2.exists())
12064 {
12065 configName="doxyfile";
12066 }
12067 else if (genConfig)
12068 {
12069 configName="Doxyfile";
12070 }
12071 else
12072 {
12073 err("Doxyfile not found and no input file specified!\n");
12074 usage(argv[0],versionString);
12075 exit(1);
12076 }
12077 }
12078 else
12079 {
12080 FileInfo fi(argv[optInd]);
12081 if (fi.exists() || dstrcmp(argv[optInd],"-")==0 || genConfig)
12082 {
12083 configName=argv[optInd];
12084 }
12085 else
12086 {
12087 err("configuration file {} not found!\n",argv[optInd]);
12088 usage(argv[0],versionString);
12089 exit(1);
12090 }
12091 }
12092
12093 if (genConfig)
12094 {
12095 generateConfigFile(configName,shortList);
12097 exit(0);
12098 }
12099
12100 if (!Config::parse(configName,updateConfig,diffList))
12101 {
12102 err("could not open or read configuration file {}!\n",configName);
12104 exit(1);
12105 }
12106
12107 if (diffList!=Config::CompareMode::Full)
12108 {
12110 compareDoxyfile(diffList);
12112 exit(0);
12113 }
12114
12115 if (updateConfig)
12116 {
12118 generateConfigFile(configName,shortList,true);
12120 exit(0);
12121 }
12122
12123 /* Perlmod wants to know the path to the config file.*/
12124 FileInfo configFileInfo(configName.str());
12125 setPerlModDoxyfile(configFileInfo.absFilePath());
12126
12127 /* handle -q option */
12128 if (quiet) Config_updateBool(QUIET,true);
12129}
static bool setFlagStr(const DString &label)
Definition debug.cpp:103
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
Definition emoji.cpp:1981
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Definition emoji.cpp:2002
bool exists() const
Definition fileinfo.cpp:34
static void writeHeaderFile(TextStream &t, const DString &cssname)
Definition htmlgen.cpp:1623
static void writeFooterFile(TextStream &t)
Definition htmlgen.cpp:1629
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1617
static void writeFooterFile(TextStream &t)
Definition latexgen.cpp:698
static void writeStyleSheetFile(TextStream &t)
Definition latexgen.cpp:704
static void writeHeaderFile(TextStream &t)
Definition latexgen.cpp:692
static void writeStyleSheetFile(TextStream &t)
Definition rtfgen.cpp:397
static void writeExtensionsFile(TextStream &t)
Definition rtfgen.cpp:412
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_updateBool(name, value)
Definition config.h:40
static void compareDoxyfile(Config::CompareMode diffList)
static void devUsage()
static void generateConfigFile(const DString &configFile, bool shortList, bool updateOnly=false)
static void version(const bool extended)
static void usage(const DString &name, const DString &versionString)
static const char * getArg(int argc, char **argv, int &optInd)
int dstricmp(const char *s1, const char *s2)
Definition dstring.cpp:444
int dstrcmp(const char *str1, const char *str2)
Definition dstring.h:50
void writeDefaultLayoutFile(const DString &fileName)
Definition layout.cpp:1736
CompareMode
Definition config.h:54
void init()
bool parse(const DString &fileName, bool update=false, CompareMode compareMode=CompareMode::Full)
void setPerlModDoxyfile(const DString &qs)
void initTracing(const DString &logFile, bool timing)
Definition trace.cpp:25
#define TRACE(...)
Definition trace.h:77
bool openOutputFile(const DString &outFile, std::ofstream &f)
Definition util.cpp:4987

References FileInfo::absFilePath(), Config::checkAndCorrect(), cleanUpDoxygen(), compareDoxyfile(), Config::Compressed, Config::CompressedNoEnv, Config_getBool, Config_getEnum, Config_updateBool, DString::data(), devUsage(), dstrcmp(), dstricmp(), DString::empty(), err, FileInfo::exists(), Config::Full, g_commentFileName, g_dumpSymbolMap, g_singleComment, generateConfigFile(), getArg(), Config::init(), initTracing(), EmojiEntityMapper::instance(), msg, openOutputFile(), Config::parse(), Config::postProcess(), Debug::setFlagStr(), setPerlModDoxyfile(), setTranslator(), DString::str(), TRACE, 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 DString & 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 11360 of file doxygen.cpp.

11372{
11373 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11374 // strip trailing slashes
11375 if (s.empty()) return;
11376
11377 g_pathsVisited.clear();
11378
11379 FileInfo fi(s.str());
11380 //printf("readFileOrDirectory(%s)\n",s);
11381 {
11382 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11383 {
11384 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11385 {
11386 }
11387 else if (!fi.exists() || !fi.isReadable())
11388 {
11389 if (errorIfNotExist)
11390 {
11391 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11392 }
11393 }
11394 else if (fi.isFile())
11395 {
11396 std::string dirPath = fi.dirPath(true);
11397 std::string filePath = fi.absFilePath();
11398 if (paths && !dirPath.empty())
11399 {
11400 paths->insert(dirPath);
11401 }
11402 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11403 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11404 {
11405 std::string name=fi.fileName();
11406 if (fnMap)
11407 {
11408 auto fd = createFileDef(dirPath+"/",name);
11409 if (!name.empty())
11410 {
11411 FileName *fn = fnMap->add(name);
11412 fn->push_back(std::move(fd));
11413 }
11414 }
11415 if (resultList || resultSet)
11416 {
11417 if (resultList) resultList->push_back(filePath);
11418 if (resultSet) resultSet->insert(filePath);
11419 }
11420
11421 if (killSet) killSet->insert(fi.absFilePath());
11422 }
11423 }
11424 else if (fi.isDir()) // readable dir
11425 {
11426 readDir(&fi,fnMap,exclSet,patList,
11427 exclPatList,resultList,resultSet,errorIfNotExist,
11428 recursive,killSet,paths);
11429 }
11430 }
11431 }
11432}
Class representing all files with a certain base name.
Definition filename.h:31
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 DString &p, const DString &n, const DString &ref, const DString &dn)
Definition filedef.cpp:269

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

Referenced by searchInputFiles().