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

12058{
12059 AUTO_TRACE();
12060 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12071
12072 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12073
12074 /* Set the global html file extension. */
12075 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12076
12077
12079 Config_getBool(CALLER_GRAPH) ||
12080 Config_getBool(REFERENCES_RELATION) ||
12081 Config_getBool(REFERENCED_BY_RELATION);
12082
12083 /**************************************************************************
12084 * Add custom extension mappings
12085 **************************************************************************/
12086
12087 StringVector extMaps = Config_getList(EXTENSION_MAPPING);
12088 for (const auto &mapping : extMaps)
12089 {
12090 DString mapStr = mapping;
12091 if (size_t i=mapStr.find('='); i==DString::npos)
12092 {
12093 continue;
12094 }
12095 else
12096 {
12097 DString ext = mapStr.left(i).stripWhiteSpace().lower();
12098 DString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12099 if (ext.empty() || language.empty())
12100 {
12101 continue;
12102 }
12103
12104 if (!updateLanguageMapping(ext,language))
12105 {
12106 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12107 "Check the EXTENSION_MAPPING setting in the config file.\n",
12108 ext,language);
12109 }
12110 else
12111 {
12112 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12113 ext,language);
12114 }
12115 }
12116 }
12117 // create input file exncodings
12118
12119 // check INPUT_ENCODING
12120 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12121 if (cd==reinterpret_cast<void *>(-1))
12122 {
12123 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12124 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12125 Config_getString(INPUT_ENCODING),strerror(errno));
12126 }
12127 else
12128 {
12130 }
12131
12132 // check and split INPUT_FILE_ENCODING
12133 StringVector fileEncod = Config_getList(INPUT_FILE_ENCODING);
12134 for (const auto &mapping : fileEncod)
12135 {
12136 DString mapStr = mapping;
12137 if (size_t i=mapStr.find('='); i==DString::npos)
12138 {
12139 continue;
12140 }
12141 else
12142 {
12143 DString pattern = mapStr.left(i).stripWhiteSpace().lower();
12144 DString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12145 if (pattern.empty() || encoding.empty())
12146 {
12147 continue;
12148 }
12149 cd = portable_iconv_open("UTF-8",encoding.data());
12150 if (cd==reinterpret_cast<void *>(-1))
12151 {
12152 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12153 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12154 encoding,strerror(errno));
12155 }
12156 else
12157 {
12159 }
12160
12161 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12162 }
12163 }
12164
12165 // add predefined macro name to a dictionary
12166 StringVector expandAsDefinedList = Config_getList(EXPAND_AS_DEFINED);
12167 for (const auto &s : expandAsDefinedList)
12168 {
12170 }
12171
12172 // read aliases and store them in a dictionary
12173 readAliases();
12174
12175 // store number of spaces in a tab into Doxygen::spaces
12176 int tabSize = Config_getInt(TAB_SIZE);
12177 Doxygen::spaces.resize(tabSize);
12178 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12179 Doxygen::spaces.at(tabSize)='\0';
12180}
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 12046 of file doxygen.cpp.

12047{
12048 AUTO_TRACE();
12049
12050 Config::postProcess(false);
12054}
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 11583 of file doxygen.cpp.

11584{
11588
11589 delete Doxygen::indexList;
11599 Doxygen::mainPage.reset();
11603 Doxygen::globalScope = nullptr;
11605 delete theTranslator;
11606 delete g_outputList;
11607
11612 delete Doxygen::dirLinkedMap;
11613 delete Doxygen::symbolMap;
11614}
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 13238 of file doxygen.cpp.

13239{
13240 AUTO_TRACE();
13241 /**************************************************************************
13242 * Initialize output generators *
13243 **************************************************************************/
13244
13245 /// add extra languages for which we can only produce syntax highlighted code
13247
13248 //// dump all symbols
13249 if (g_dumpSymbolMap)
13250 {
13251 dumpSymbolMap();
13252 exit(0);
13253 }
13254
13255 bool generateHtml = Config_getBool(GENERATE_HTML);
13256 bool generateLatex = Config_getBool(GENERATE_LATEX);
13257 bool generateMan = Config_getBool(GENERATE_MAN);
13258 bool generateRtf = Config_getBool(GENERATE_RTF);
13259 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13260
13261
13263 if (generateHtml)
13264 {
13268 }
13269 if (generateLatex)
13270 {
13273 }
13274 if (generateDocbook)
13275 {
13278 }
13279 if (generateMan)
13280 {
13283 }
13284 if (generateRtf)
13285 {
13288 }
13289 if (Config_getBool(USE_HTAGS))
13290 {
13291 Htags::useHtags = true;
13292 DString htmldir = Config_getString(HTML_OUTPUT);
13293 if (!Htags::execute(htmldir))
13294 err("USE_HTAGS is YES but htags(1) failed. \n");
13295 else if (!Htags::loadFilemap(htmldir))
13296 err("htags(1) ended normally but failed to load the filemap. \n");
13297 }
13298
13299 /**************************************************************************
13300 * Generate documentation *
13301 **************************************************************************/
13302
13303 g_s.begin("Generating style sheet...\n");
13304 //printf("writing style info\n");
13305 g_outputList->writeStyleInfo(0); // write first part
13306 g_s.end();
13307
13308 bool searchEngine = Config_getBool(SEARCHENGINE);
13309 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13310
13311 g_s.begin("Generating search indices...\n");
13312 if (searchEngine && !serverBasedSearch && generateHtml)
13313 {
13315 }
13316
13317 // generate search indices (need to do this before writing other HTML
13318 // pages as these contain a drop down menu with options depending on
13319 // what categories we find in this function.
13320 if (generateHtml && searchEngine)
13321 {
13322 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13323 Dir searchDir(searchDirName.str());
13324 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13325 {
13326 term("Could not create search results directory '{}' $PWD='{}'\n",
13327 searchDirName,Dir::currentDirPath());
13328 }
13329 HtmlGenerator::writeSearchData(searchDirName);
13330 if (!serverBasedSearch) // client side search index
13331 {
13333 }
13334 }
13335 g_s.end();
13336
13337 // copy static stuff
13338 if (generateHtml)
13339 {
13341 copyLogo(Config_getString(HTML_OUTPUT),true);
13342 copyIcon(Config_getString(HTML_OUTPUT),true);
13343 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13344 }
13345 if (generateLatex)
13346 {
13348 copyLogo(Config_getString(LATEX_OUTPUT),false);
13349 copyIcon(Config_getString(LATEX_OUTPUT),false);
13350 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13351 }
13352 if (generateDocbook)
13353 {
13354 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13355 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13356 }
13357 if (generateRtf)
13358 {
13359 copyLogo(Config_getString(RTF_OUTPUT),false);
13360 copyIcon(Config_getString(RTF_OUTPUT),false);
13361 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13362 }
13363
13365 if (fm.hasFormulas() && generateHtml
13366 && !Config_getBool(USE_MATHJAX))
13367 {
13368 g_s.begin("Generating images for formulas in HTML...\n");
13369 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13371 g_s.end();
13372 }
13373 if (fm.hasFormulas() && generateRtf)
13374 {
13375 g_s.begin("Generating images for formulas in RTF...\n");
13377 g_s.end();
13378 }
13379
13380 if (fm.hasFormulas() && generateDocbook)
13381 {
13382 g_s.begin("Generating images for formulas in Docbook...\n");
13384 g_s.end();
13385 }
13386
13387 g_s.begin("Generating example documentation...\n");
13389 g_s.end();
13390
13391 g_s.begin("Generating file sources...\n");
13393 g_s.end();
13394
13395 g_s.begin("Counting members...\n");
13396 // needs to be done after generating the sources
13397 // but before generating the compound documentation, see bug #12233
13398 countMembers();
13399 g_s.end();
13400
13401 g_s.begin("Generating file documentation...\n");
13403 g_s.end();
13404
13405 g_s.begin("Generating page documentation...\n");
13407 g_s.end();
13408
13409 g_s.begin("Generating group documentation...\n");
13411 g_s.end();
13412
13413 g_s.begin("Generating class documentation...\n");
13415 g_s.end();
13416
13417 g_s.begin("Generating concept documentation...\n");
13419 g_s.end();
13420
13421 g_s.begin("Generating module documentation...\n");
13423 g_s.end();
13424
13425 g_s.begin("Generating namespace documentation...\n");
13427 g_s.end();
13428
13429 if (Config_getBool(GENERATE_LEGEND))
13430 {
13431 g_s.begin("Generating graph info page...\n");
13433 g_s.end();
13434 }
13435
13436 g_s.begin("Generating directory documentation...\n");
13438 g_s.end();
13439
13440 if (g_outputList->size()>0)
13441 {
13443 }
13444
13445 g_s.begin("finalizing index lists...\n");
13447 g_s.end();
13448
13449 g_s.begin("writing tag file...\n");
13450 writeTagFile();
13451 g_s.end();
13452
13453 if (Config_getBool(GENERATE_XML))
13454 {
13455 g_s.begin("Generating XML output...\n");
13457 generateXML();
13459 g_s.end();
13460 }
13461 if (Config_getBool(GENERATE_SQLITE3))
13462 {
13463 g_s.begin("Generating SQLITE3 output...\n");
13465 g_s.end();
13466 }
13467
13468 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13469 {
13470 g_s.begin("Generating AutoGen DEF output...\n");
13471 generateDEF();
13472 g_s.end();
13473 }
13474 if (Config_getBool(GENERATE_PERLMOD))
13475 {
13476 g_s.begin("Generating Perl module output...\n");
13478 g_s.end();
13479 }
13480 if (generateHtml && searchEngine && serverBasedSearch)
13481 {
13482 g_s.begin("Generating search index\n");
13483 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13484 {
13486 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13487 }
13488 else // write data for external search index
13489 {
13491 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13492 if (searchDataFile.empty())
13493 {
13494 searchDataFile="searchdata.xml";
13495 }
13496 if (!Portable::isAbsolutePath(searchDataFile.data()))
13497 {
13498 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13499 }
13500 Doxygen::searchIndex.write(searchDataFile);
13501 }
13502 g_s.end();
13503 }
13504
13505 if (generateRtf)
13506 {
13507 g_s.begin("Combining RTF output...\n");
13508 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13509 {
13510 err("An error occurred during post-processing the RTF files!\n");
13511 }
13512 g_s.end();
13513 }
13514
13515 if (PlantumlManager::instance().needToRun())
13516 {
13517 g_s.begin("Running plantuml with JAVA...\n");
13519 g_s.end();
13520 }
13521
13522 if (MermaidManager::instance().needToRun())
13523 {
13524 g_s.begin("Running mermaid (mmdc)...\n");
13526 g_s.end();
13527 }
13528
13529 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13530 {
13531 g_s.begin("Running dot...\n");
13533 g_s.end();
13534 }
13535
13536 if (generateHtml &&
13537 Config_getBool(GENERATE_HTMLHELP) &&
13538 !Config_getString(HHC_LOCATION).empty())
13539 {
13540 g_s.begin("Running html help compiler...\n");
13542 g_s.end();
13543 }
13544
13545 if ( generateHtml &&
13546 Config_getBool(GENERATE_QHP) &&
13547 !Config_getString(QHG_LOCATION).empty())
13548 {
13549 g_s.begin("Running qhelpgenerator...\n");
13551 g_s.end();
13552 }
13553
13556
13558
13560 {
13561
13562 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13563 if (numThreads<1) numThreads=1;
13564 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13565 (static_cast<double>(Debug::elapsedTime())),
13566 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13567 );
13568 g_s.print();
13569
13571 msg("finished...\n");
13573 }
13574 else
13575 {
13576 msg("finished...\n");
13577 }
13578
13579
13580 /**************************************************************************
13581 * Start cleaning up *
13582 **************************************************************************/
13583
13585
13587 Dir thisDir;
13588 thisDir.remove(Doxygen::filterDBFileName.str());
13590 exitTracing();
13592 delete Doxygen::clangUsrMap;
13593 g_successfulRun=true;
13594
13595 //dumpDocNodeSizes();
13596}
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:8876
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8710
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9311
static void countMembers()
Definition doxygen.cpp:9172
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:9337
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:5399
void generateXML()
Definition xmlgen.cpp:2316

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

11514{
11515 initResources();
11516 DString lang = Portable::getenv("LC_ALL");
11517 if (!lang.empty()) Portable::setenv("LANG",lang);
11518 std::setlocale(LC_ALL,"");
11519 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11520 std::setlocale(LC_NUMERIC,"C");
11521
11523
11547
11548 // register any additional parsers here...
11549
11551
11552#if USE_LIBCLANG
11554#endif
11563 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11564 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11565 //Doxygen::tagDestinationDict.setAutoDelete(true);
11567
11568 // initialization of these globals depends on
11569 // configuration switches so we need to postpone these
11570 Doxygen::globalScope = nullptr;
11580
11581}
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 12569 of file doxygen.cpp.

12570{
12571 AUTO_TRACE();
12572 std::atexit(exitDoxygen);
12573
12574 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12575
12576#if USE_LIBCLANG
12577 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12578#endif
12579
12580 // we would like to show the versionString earlier, but we first have to handle the configuration file
12581 // to know the value of the QUIET setting.
12582 DString versionString = getFullVersion();
12583 msg("Doxygen version used: {}\n",versionString);
12584
12586
12587 /**************************************************************************
12588 * Make sure the output directory exists
12589 **************************************************************************/
12590 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12591 if (!g_singleComment)
12592 {
12593 if (outputDirectory.empty())
12594 {
12595 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12596 }
12597 else
12598 {
12599 Dir dir(outputDirectory.str());
12600 if (!dir.exists())
12601 {
12602 dir.setPath(Dir::currentDirPath());
12603 if (!dir.mkdir(outputDirectory.str()))
12604 {
12605 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12606 "exist and cannot be created\n",outputDirectory);
12607 }
12608 else
12609 {
12610 msg("Notice: Output directory '{}' does not exist. "
12611 "I have created it for you.\n", outputDirectory);
12612 }
12613 dir.setPath(outputDirectory.str());
12614 }
12615 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12616 }
12617 }
12618 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12619
12620 /**************************************************************************
12621 * Initialize global lists and dictionaries
12622 **************************************************************************/
12623
12624#ifdef HAS_SIGNALS
12625 signal(SIGINT, stopDoxygen);
12626#endif
12627
12628 uint32_t pid = Portable::pid();
12629 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12630 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12631
12632 /**************************************************************************
12633 * Check/create output directories *
12634 **************************************************************************/
12635
12636 bool generateHtml = Config_getBool(GENERATE_HTML);
12637 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12638 bool generateXml = Config_getBool(GENERATE_XML);
12639 bool generateLatex = Config_getBool(GENERATE_LATEX);
12640 bool generateRtf = Config_getBool(GENERATE_RTF);
12641 bool generateMan = Config_getBool(GENERATE_MAN);
12642 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12643 DString htmlOutput;
12644 DString docbookOutput;
12645 DString xmlOutput;
12646 DString latexOutput;
12647 DString rtfOutput;
12648 DString manOutput;
12649 DString sqlOutput;
12650
12651 if (!g_singleComment)
12652 {
12653 if (generateHtml)
12654 {
12655 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12656 Config_updateString(HTML_OUTPUT,htmlOutput);
12657
12658 DString sitemapUrl = Config_getString(SITEMAP_URL);
12659 bool generateSitemap = !sitemapUrl.empty();
12660 if (generateSitemap && !sitemapUrl.endsWith("/"))
12661 {
12662 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12663 }
12664
12665 // add HTML indexers that are enabled
12666 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12667 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12668 bool generateQhp = Config_getBool(GENERATE_QHP);
12669 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12670 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12671 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12672 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12673 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12674 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12675 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12676 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12679 }
12680
12681 if (generateDocbook)
12682 {
12683 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12684 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12685 }
12686
12687 if (generateXml)
12688 {
12689 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12690 Config_updateString(XML_OUTPUT,xmlOutput);
12691 }
12692
12693 if (generateLatex)
12694 {
12695 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12696 Config_updateString(LATEX_OUTPUT,latexOutput);
12697 }
12698
12699 if (generateRtf)
12700 {
12701 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12702 Config_updateString(RTF_OUTPUT,rtfOutput);
12703 }
12704
12705 if (generateMan)
12706 {
12707 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12708 Config_updateString(MAN_OUTPUT,manOutput);
12709 }
12710
12711 if (generateSql)
12712 {
12713 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12714 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12715 }
12716 }
12717
12718 if (Config_getBool(HAVE_DOT))
12719 {
12720 DString curFontPath = Config_getString(DOT_FONTPATH);
12721 if (curFontPath.empty())
12722 {
12723 Portable::getenv("DOTFONTPATH");
12724 DString newFontPath = ".";
12725 if (!curFontPath.empty())
12726 {
12727 newFontPath+=Portable::pathListSeparator();
12728 newFontPath+=curFontPath;
12729 }
12730 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12731 }
12732 else
12733 {
12734 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12735 }
12736 }
12737
12738 /**************************************************************************
12739 * Handle layout file *
12740 **************************************************************************/
12741
12743 DString layoutFileName = Config_getString(LAYOUT_FILE);
12744 bool defaultLayoutUsed = false;
12745 if (layoutFileName.empty())
12746 {
12747 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12748 defaultLayoutUsed = true;
12749 }
12750 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12751
12752 FileInfo fi(layoutFileName.str());
12753 if (fi.exists())
12754 {
12755 msg("Parsing layout file {}...\n",layoutFileName);
12756 LayoutDocManager::instance().parse(layoutFileName);
12757 }
12758 else if (!defaultLayoutUsed)
12759 {
12760 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12761 }
12762 printLayout();
12763
12764 /**************************************************************************
12765 * Read and preprocess input *
12766 **************************************************************************/
12767
12768 // prevent search in the output directories
12769 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12770 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12771 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12772 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12773 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12774 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12775 if (generateMan) exclPatterns.push_back(manOutput.str());
12776 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12777
12778 if (!g_singleComment)
12779 {
12781
12783 }
12784
12785 // Notice: the order of the function calls below is very important!
12786
12787 if (generateHtml && !Config_getBool(USE_MATHJAX))
12788 {
12790 }
12791 if (generateRtf)
12792 {
12794 }
12795 if (generateDocbook)
12796 {
12798 }
12799
12801
12802 /**************************************************************************
12803 * Handle Tag Files *
12804 **************************************************************************/
12805
12806 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12807
12808 if (!g_singleComment)
12809 {
12810 msg("Reading and parsing tag files\n");
12811 StringVector tagFileList = Config_getList(TAGFILES);
12812 for (const auto &s : tagFileList)
12813 {
12814 readTagFile(root,s.c_str());
12815 }
12816 }
12817
12818 /**************************************************************************
12819 * Parse source files *
12820 **************************************************************************/
12821
12822 addSTLSupport(root);
12823
12824 g_s.begin("Parsing files\n");
12825 if (g_singleComment)
12826 {
12827 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12828 if (g_commentFileName=="-")
12829 {
12830 std::string text = fileToString(g_commentFileName).str();
12831 addTerminalCharIfMissing(text,'\n');
12832 generateHtmlForComment("stdin.md",text);
12833 }
12834 else if (FileInfo(g_commentFileName.str()).isFile())
12835 {
12836 std::string text;
12838 addTerminalCharIfMissing(text,'\n');
12840 }
12841 else
12842 {
12843 }
12845 exit(0);
12846 }
12847 else
12848 {
12849 if (Config_getInt(NUM_PROC_THREADS)==1)
12850 {
12852 }
12853 else
12854 {
12856 }
12857 }
12858 g_s.end();
12859
12860 /**************************************************************************
12861 * Gather information *
12862 **************************************************************************/
12863
12864 g_s.begin("Building macro definition list...\n");
12866 g_s.end();
12867
12868 g_s.begin("Building group list...\n");
12869 buildGroupList(root.get());
12870 organizeSubGroups(root.get());
12871 g_s.end();
12872
12873 g_s.begin("Building directory list...\n");
12875 findDirDocumentation(root.get());
12876 g_s.end();
12877
12878 g_s.begin("Building namespace list...\n");
12879 buildNamespaceList(root.get());
12880 findUsingDirectives(root.get());
12881 g_s.end();
12882
12883 g_s.begin("Building file list...\n");
12884 buildFileList(root.get());
12885 g_s.end();
12886
12887 g_s.begin("Building class list...\n");
12888 buildClassList(root.get());
12889 g_s.end();
12890
12891 g_s.begin("Building concept list...\n");
12892 buildConceptList(root.get());
12893 g_s.end();
12894
12895 // build list of using declarations here (global list)
12896 buildListOfUsingDecls(root.get());
12897 g_s.end();
12898
12899 g_s.begin("Computing nesting relations for classes...\n");
12901 g_s.end();
12902 // 1.8.2-20121111: no longer add nested classes to the group as well
12903 //distributeClassGroupRelations();
12904
12905 // calling buildClassList may result in cached relations that
12906 // become invalid after resolveClassNestingRelations(), that's why
12907 // we need to clear the cache here
12909 // we don't need the list of using declaration anymore
12910 g_usingDeclarations.clear();
12911
12912 g_s.begin("Associating documentation with classes...\n");
12913 buildClassDocList(root.get());
12914 g_s.end();
12915
12916 g_s.begin("Associating documentation with concepts...\n");
12917 buildConceptDocList(root.get());
12919 g_s.end();
12920
12921 g_s.begin("Associating documentation with modules...\n");
12922 findModuleDocumentation(root.get());
12923 g_s.end();
12924
12925 g_s.begin("Building example list...\n");
12926 buildExampleList(root.get());
12927 g_s.end();
12928
12929 g_s.begin("Searching for enumerations...\n");
12930 findEnums(root.get());
12931 g_s.end();
12932
12933 // Since buildVarList calls isVarWithConstructor
12934 // and this calls getResolvedClass we need to process
12935 // typedefs first so the relations between classes via typedefs
12936 // are properly resolved. See bug 536385 for an example.
12937 g_s.begin("Searching for documented typedefs...\n");
12938 buildTypedefList(root.get());
12939 g_s.end();
12940
12941 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12942 {
12943 g_s.begin("Searching for documented sequences...\n");
12944 buildSequenceList(root.get());
12945 g_s.end();
12946
12947 g_s.begin("Searching for documented dictionaries...\n");
12948 buildDictionaryList(root.get());
12949 g_s.end();
12950 }
12951
12952 g_s.begin("Searching for members imported via using declarations...\n");
12953 // this should be after buildTypedefList in order to properly import
12954 // used typedefs
12955 findUsingDeclarations(root.get(),true); // do for python packages first
12956 findUsingDeclarations(root.get(),false); // then the rest
12957 g_s.end();
12958
12959 g_s.begin("Searching for included using directives...\n");
12961 g_s.end();
12962
12963 g_s.begin("Searching for documented variables...\n");
12964 buildVarList(root.get());
12965 g_s.end();
12966
12967 g_s.begin("Building interface member list...\n");
12968 buildInterfaceAndServiceList(root.get()); // UNO IDL
12969
12970 g_s.begin("Building member list...\n"); // using class info only !
12971 buildFunctionList(root.get());
12972 g_s.end();
12973
12974 g_s.begin("Searching for friends...\n");
12975 findFriends();
12976 g_s.end();
12977
12978 g_s.begin("Searching for documented defines...\n");
12979 findDefineDocumentation(root.get());
12980 g_s.end();
12981
12982 g_s.begin("Computing class inheritance relations...\n");
12983 findClassEntries(root.get());
12985 g_s.end();
12986
12987 g_s.begin("Computing class usage relations...\n");
12989 g_s.end();
12990
12991 g_s.begin("Flushing cached template relations that have become invalid...\n");
12993 g_s.end();
12994
12995 g_s.begin("Warn for undocumented namespaces...\n");
12997 g_s.end();
12998
12999 g_s.begin("Computing class relations...\n");
13002 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
13003 {
13005 }
13007 g_classEntries.clear();
13008 g_s.end();
13009
13010 g_s.begin("Add enum values to enums...\n");
13011 addEnumValuesToEnums(root.get());
13012 findEnumDocumentation(root.get());
13013 g_s.end();
13014
13015 g_s.begin("Searching for member function documentation...\n");
13016 findObjCMethodDefinitions(root.get());
13017 findMemberDocumentation(root.get()); // may introduce new members !
13018 findUsingDeclImports(root.get()); // may introduce new members !
13019 g_usingClassMap.clear();
13023 g_s.end();
13024
13025 // moved to after finding and copying documentation,
13026 // as this introduces new members see bug 722654
13027 g_s.begin("Creating members for template instances...\n");
13029 g_s.end();
13030
13031 g_s.begin("Searching for tag less structs...\n");
13033 g_s.end();
13034
13035 g_s.begin("Building page list...\n");
13036 buildPageList(root.get());
13037 g_s.end();
13038
13039 g_s.begin("Building requirements list...\n");
13040 buildRequirementsList(root.get());
13041 g_s.end();
13042
13043 g_s.begin("Search for main page...\n");
13044 findMainPage(root.get());
13045 findMainPageTagFiles(root.get());
13046 g_s.end();
13047
13048 g_s.begin("Computing page relations...\n");
13049 computePageRelations(root.get());
13051 g_s.end();
13052
13053 g_s.begin("Determining the scope of groups...\n");
13054 findGroupScope(root.get());
13055 g_s.end();
13056
13057 g_s.begin("Computing module relations...\n");
13058 auto &mm = ModuleManager::instance();
13059 mm.resolvePartitions();
13060 mm.resolveImports();
13061 mm.collectExportedSymbols();
13062 g_s.end();
13063
13064 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13065 {
13066 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13067 n2->memberName().data()+getPrefixIndex(n2->memberName())
13068 )<0;
13069 };
13070
13071 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13072 {
13073 if (Config_getBool(SORT_BY_SCOPE_NAME))
13074 {
13075 return dstricmp_sort(c1->name(), c2->name())<0;
13076 }
13077 else
13078 {
13079 int i = dstricmp_sort(c1->className(), c2->className());
13080 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13081 }
13082 };
13083
13084 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13085 {
13086 return dstricmp_sort(n1->name(),n2->name())<0;
13087 };
13088
13089 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13090 {
13091 return dstricmp_sort(c1->name(),c2->name())<0;
13092 };
13093
13094 g_s.begin("Sorting lists...\n");
13095 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13097 memberNameComp);
13098 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13100 memberNameComp);
13101 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13103 classComp);
13104 std::stable_sort(Doxygen::classLinkedMap->begin(),
13106 classComp);
13107 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13109 conceptComp);
13110 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13112 namespaceComp);
13113 g_s.end();
13114
13115 g_s.begin("Determining which enums are documented\n");
13117 g_s.end();
13118
13119 g_s.begin("Computing member relations...\n");
13122 g_s.end();
13123
13124 g_s.begin("Building full member lists recursively...\n");
13126 g_s.end();
13127
13128 g_s.begin("Adding members to member groups.\n");
13130 g_s.end();
13131
13132 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13133 {
13134 g_s.begin("Distributing member group documentation.\n");
13136 g_s.end();
13137 }
13138
13139 g_s.begin("Computing member references...\n");
13141 g_s.end();
13142
13143 if (Config_getBool(INHERIT_DOCS))
13144 {
13145 g_s.begin("Inheriting documentation...\n");
13147 g_s.end();
13148 }
13149
13150
13151 // compute the shortest possible names of all files
13152 // without losing the uniqueness of the file names.
13153 g_s.begin("Generating disk names...\n");
13155 g_s.end();
13156
13157 g_s.begin("Adding source references...\n");
13159 g_s.end();
13160
13161 g_s.begin("Adding xrefitems...\n");
13164 g_s.end();
13165
13166 g_s.begin("Adding requirements...\n");
13169 g_s.end();
13170
13171 g_s.begin("Sorting member lists...\n");
13173 g_s.end();
13174
13175 g_s.begin("Setting anonymous enum type...\n");
13177 g_s.end();
13178
13179 g_s.begin("Computing dependencies between directories...\n");
13181 g_s.end();
13182
13183 g_s.begin("Generating citations page...\n");
13185 g_s.end();
13186
13187 g_s.begin("Counting data structures...\n");
13189 g_s.end();
13190
13191 g_s.begin("Resolving user defined references...\n");
13193 g_s.end();
13194
13195 g_s.begin("Finding anchors and sections in the documentation...\n");
13197 g_s.end();
13198
13199 g_s.begin("Transferring function references...\n");
13201 g_s.end();
13202
13203 g_s.begin("Combining using relations...\n");
13205 g_s.end();
13206
13208 g_s.begin("Adding members to index pages...\n");
13210 addToIndices();
13211 g_s.end();
13212
13213 g_s.begin("Correcting members for VHDL...\n");
13215 g_s.end();
13216
13217 g_s.begin("Computing tooltip texts...\n");
13219 g_s.end();
13220
13221 if (Config_getBool(SORT_GROUP_NAMES))
13222 {
13223 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13225 [](const auto &g1,const auto &g2)
13226 { return g1->groupTitle() < g2->groupTitle(); });
13227
13228 for (const auto &gd : *Doxygen::groupLinkedMap)
13229 {
13230 gd->sortSubGroups();
13231 }
13232 }
13233
13234 printNavTree(root.get(),0);
13236}
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:5419
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:2189
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9553
static void computeTemplateClassRelations()
Definition doxygen.cpp:5513
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5692
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2342
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9753
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5468
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:5384
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8512
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5582
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4543
static void addMembersToMemberGroup()
Definition doxygen.cpp:9418
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9922
static void distributeConceptGroups()
Definition doxygen.cpp:1358
static void transferFunctionDocumentation()
Definition doxygen.cpp:4462
static void setAnonymousEnumType()
Definition doxygen.cpp:9158
static void sortMemberLists()
Definition doxygen.cpp:9063
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8640
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4592
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7656
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3528
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:555
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9666
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7626
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9456
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7860
static void resolveUserReferences()
Definition doxygen.cpp:9984
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9813
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3665
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3628
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1848
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2592
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:599
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4365
static void findEnums(const Entry *root)
Definition doxygen.cpp:7684
static DString g_commentFileName
Definition doxygen.cpp:196
static void addListReferences()
Definition doxygen.cpp:5683
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8302
static void findMainPage(Entry *root)
Definition doxygen.cpp:9852
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2032
static void addSourceReferences()
Definition doxygen.cpp:8936
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9358
static void flushUnresolvedRelations()
Definition doxygen.cpp:9595
static void findDocumentedEnumValues()
Definition doxygen.cpp:8294
static void findTagLessClasses()
Definition doxygen.cpp:1796
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8344
static void computeClassRelations()
Definition doxygen.cpp:5488
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4060
static void checkPageRelations()
Definition doxygen.cpp:9964
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:8183
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9934
static StringSet g_usingDeclarations
Definition doxygen.cpp:193
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3646
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1161
static void buildPageList(Entry *root)
Definition doxygen.cpp:9825
static void addRequirementReferences()
Definition doxygen.cpp:5675
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:197
static void findSectionsInDocumentation()
Definition doxygen.cpp:9494
static void mergeCategories()
Definition doxygen.cpp:8659
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:5452
static void computeTooltipTexts()
Definition doxygen.cpp:9112
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8680
static void combineUsingRelations()
Definition doxygen.cpp:9393
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2340
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:4495
static void buildDefineList()
Definition doxygen.cpp:9015
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3761
static void computeMemberRelations()
Definition doxygen.cpp:8624
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2176
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 11616 of file doxygen.cpp.

11617{
11618 DString versionString = getFullVersion();
11619
11620 // helper that calls \a func to write to file \a fileName via a TextStream
11621 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11622 {
11623 std::ofstream f;
11624 if (openOutputFile(fileName,f))
11625 {
11626 TextStream t(&f);
11627 func(t);
11628 return true;
11629 }
11630 return false;
11631 };
11632
11633
11634 /**************************************************************************
11635 * Handle arguments *
11636 **************************************************************************/
11637
11638 int optInd=1;
11639 DString configName;
11640 DString traceName;
11641 bool genConfig=false;
11642 bool shortList=false;
11643 bool traceTiming=false;
11645 bool updateConfig=false;
11646 bool quiet = false;
11647 while (optInd<argc && argv[optInd][0]=='-' &&
11648 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11649 argv[optInd][1]=='-')
11650 )
11651 {
11652 switch(argv[optInd][1])
11653 {
11654 case 'g':
11655 {
11656 genConfig=true;
11657 }
11658 break;
11659 case 'l':
11660 {
11661 DString layoutName;
11662 if (optInd+1>=argc)
11663 {
11664 layoutName="DoxygenLayout.xml";
11665 }
11666 else
11667 {
11668 layoutName=argv[optInd+1];
11669 }
11670 writeDefaultLayoutFile(layoutName);
11672 exit(0);
11673 }
11674 break;
11675 case 'c':
11676 if (optInd+1>=argc) // no file name given
11677 {
11678 msg("option \"-c\" is missing the file name to read\n");
11679 devUsage();
11681 exit(1);
11682 }
11683 else
11684 {
11685 g_commentFileName=argv[optInd+1];
11686 optInd++;
11687 }
11688 g_singleComment=true;
11689 quiet=true;
11690 break;
11691 case 'd':
11692 {
11693 DString debugLabel=getArg(argc,argv,optInd);
11694 if (debugLabel.empty())
11695 {
11696 devUsage();
11698 exit(0);
11699 }
11700 int retVal = Debug::setFlagStr(debugLabel);
11701 if (!retVal)
11702 {
11703 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11704 devUsage();
11706 exit(1);
11707 }
11708 }
11709 break;
11710 case 't':
11711 {
11712#if ENABLE_TRACING
11713 if (!strcmp(argv[optInd]+1,"t_time"))
11714 {
11715 traceTiming = true;
11716 }
11717 else if (!strcmp(argv[optInd]+1,"t"))
11718 {
11719 traceTiming = false;
11720 }
11721 else
11722 {
11723 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11725 exit(1);
11726 }
11727 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11728 {
11729 traceName="stdout";
11730 }
11731 else
11732 {
11733 traceName=argv[optInd+1];
11734 optInd++;
11735 }
11736#else
11737 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11739 exit(1);
11740#endif
11741 }
11742 break;
11743 case 'x':
11744 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11745 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11746 else
11747 {
11748 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11750 exit(1);
11751 }
11752 break;
11753 case 's':
11754 shortList=true;
11755 break;
11756 case 'u':
11757 updateConfig=true;
11758 break;
11759 case 'e':
11760 {
11761 DString formatName=getArg(argc,argv,optInd);
11762 if (formatName.empty())
11763 {
11764 err("option \"-e\" is missing format specifier rtf.\n");
11766 exit(1);
11767 }
11768 if (dstricmp(formatName.data(),"rtf")==0)
11769 {
11770 if (optInd+1>=argc)
11771 {
11772 err("option \"-e rtf\" is missing an extensions file name\n");
11774 exit(1);
11775 }
11776 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11778 exit(0);
11779 }
11780 err("option \"-e\" has invalid format specifier.\n");
11782 exit(1);
11783 }
11784 break;
11785 case 'f':
11786 {
11787 DString listName=getArg(argc,argv,optInd);
11788 if (listName.empty())
11789 {
11790 err("option \"-f\" is missing list specifier.\n");
11792 exit(1);
11793 }
11794 if (dstricmp(listName.data(),"emoji")==0)
11795 {
11796 if (optInd+1>=argc)
11797 {
11798 err("option \"-f emoji\" is missing an output file name\n");
11800 exit(1);
11801 }
11802 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11804 exit(0);
11805 }
11806 err("option \"-f\" has invalid list specifier.\n");
11808 exit(1);
11809 }
11810 break;
11811 case 'w':
11812 {
11813 DString formatName=getArg(argc,argv,optInd);
11814 if (formatName.empty())
11815 {
11816 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11818 exit(1);
11819 }
11820 if (dstricmp(formatName.data(),"rtf")==0)
11821 {
11822 if (optInd+1>=argc)
11823 {
11824 err("option \"-w rtf\" is missing a style sheet file name\n");
11826 exit(1);
11827 }
11828 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11829 {
11830 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11832 exit(1);
11833 }
11835 exit(0);
11836 }
11837 else if (dstricmp(formatName.data(),"html")==0)
11838 {
11839 Config::init();
11840 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11841 // explicit config file mentioned or default found on disk
11842 {
11843 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11844 if (!Config::parse(df)) // parse the config file
11845 {
11846 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11848 exit(1);
11849 }
11850 }
11851 if (optInd+3>=argc)
11852 {
11853 err("option \"-w html\" does not have enough arguments\n");
11855 exit(1);
11856 }
11857 Config::postProcess(true);
11860 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11861 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11862 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11863 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11865 exit(0);
11866 }
11867 else if (dstricmp(formatName.data(),"latex")==0)
11868 {
11869 Config::init();
11870 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11871 {
11872 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11873 if (!Config::parse(df))
11874 {
11875 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11877 exit(1);
11878 }
11879 }
11880 if (optInd+3>=argc)
11881 {
11882 err("option \"-w latex\" does not have enough arguments\n");
11884 exit(1);
11885 }
11886 Config::postProcess(true);
11889 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11890 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11891 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11892 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11894 exit(0);
11895 }
11896 else
11897 {
11898 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11900 exit(1);
11901 }
11902 }
11903 break;
11904 case 'm':
11905 g_dumpSymbolMap = true;
11906 break;
11907 case 'v':
11908 version(false);
11910 exit(0);
11911 break;
11912 case 'V':
11913 version(true);
11915 exit(0);
11916 break;
11917 case '-':
11918 if (dstrcmp(&argv[optInd][2],"help")==0)
11919 {
11920 usage(argv[0],versionString);
11921 exit(0);
11922 }
11923 else if (dstrcmp(&argv[optInd][2],"version")==0)
11924 {
11925 version(false);
11927 exit(0);
11928 }
11929 else if ((dstrcmp(&argv[optInd][2],"Version")==0) ||
11930 (dstrcmp(&argv[optInd][2],"VERSION")==0))
11931 {
11932 version(true);
11934 exit(0);
11935 }
11936 else
11937 {
11938 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11939 usage(argv[0],versionString);
11940 exit(1);
11941 }
11942 break;
11943 case 'b':
11944 setvbuf(stdout,nullptr,_IONBF,0);
11945 break;
11946 case 'q':
11947 quiet = true;
11948 break;
11949 case 'h':
11950 case '?':
11951 usage(argv[0],versionString);
11952 exit(0);
11953 break;
11954 default:
11955 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11956 usage(argv[0],versionString);
11957 exit(1);
11958 }
11959 optInd++;
11960 }
11961
11962 /**************************************************************************
11963 * Parse or generate the config file *
11964 **************************************************************************/
11965
11966 initTracing(traceName.data(),traceTiming);
11967 TRACE("Doxygen version used: {}",getFullVersion());
11968 Config::init();
11969
11970 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11971 if (optInd>=argc)
11972 {
11973 if (configFileInfo1.exists())
11974 {
11975 configName="Doxyfile";
11976 }
11977 else if (configFileInfo2.exists())
11978 {
11979 configName="doxyfile";
11980 }
11981 else if (genConfig)
11982 {
11983 configName="Doxyfile";
11984 }
11985 else
11986 {
11987 err("Doxyfile not found and no input file specified!\n");
11988 usage(argv[0],versionString);
11989 exit(1);
11990 }
11991 }
11992 else
11993 {
11994 FileInfo fi(argv[optInd]);
11995 if (fi.exists() || dstrcmp(argv[optInd],"-")==0 || genConfig)
11996 {
11997 configName=argv[optInd];
11998 }
11999 else
12000 {
12001 err("configuration file {} not found!\n",argv[optInd]);
12002 usage(argv[0],versionString);
12003 exit(1);
12004 }
12005 }
12006
12007 if (genConfig)
12008 {
12009 generateConfigFile(configName,shortList);
12011 exit(0);
12012 }
12013
12014 if (!Config::parse(configName,updateConfig,diffList))
12015 {
12016 err("could not open or read configuration file {}!\n",configName);
12018 exit(1);
12019 }
12020
12021 if (diffList!=Config::CompareMode::Full)
12022 {
12024 compareDoxyfile(diffList);
12026 exit(0);
12027 }
12028
12029 if (updateConfig)
12030 {
12032 generateConfigFile(configName,shortList,true);
12034 exit(0);
12035 }
12036
12037 /* Perlmod wants to know the path to the config file.*/
12038 FileInfo configFileInfo(configName.str());
12039 setPerlModDoxyfile(configFileInfo.absFilePath());
12040
12041 /* handle -q option */
12042 if (quiet) Config_updateBool(QUIET,true);
12043}
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 11274 of file doxygen.cpp.

11286{
11287 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11288 // strip trailing slashes
11289 if (s.empty()) return;
11290
11291 g_pathsVisited.clear();
11292
11293 FileInfo fi(s.str());
11294 //printf("readFileOrDirectory(%s)\n",s);
11295 {
11296 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11297 {
11298 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11299 {
11300 }
11301 else if (!fi.exists() || !fi.isReadable())
11302 {
11303 if (errorIfNotExist)
11304 {
11305 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11306 }
11307 }
11308 else if (fi.isFile())
11309 {
11310 std::string dirPath = fi.dirPath(true);
11311 std::string filePath = fi.absFilePath();
11312 if (paths && !dirPath.empty())
11313 {
11314 paths->insert(dirPath);
11315 }
11316 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11317 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11318 {
11319 std::string name=fi.fileName();
11320 if (fnMap)
11321 {
11322 auto fd = createFileDef(dirPath+"/",name);
11323 if (!name.empty())
11324 {
11325 FileName *fn = fnMap->add(name);
11326 fn->push_back(std::move(fd));
11327 }
11328 }
11329 if (resultList || resultSet)
11330 {
11331 if (resultList) resultList->push_back(filePath);
11332 if (resultSet) resultSet->insert(filePath);
11333 }
11334
11335 if (killSet) killSet->insert(fi.absFilePath());
11336 }
11337 }
11338 else if (fi.isDir()) // readable dir
11339 {
11340 readDir(&fi,fnMap,exclSet,patList,
11341 exclPatList,resultList,resultSet,errorIfNotExist,
11342 recursive,killSet,paths);
11343 }
11344 }
11345 }
11346}
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().