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

12208{
12209 AUTO_TRACE();
12210 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12221
12222 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12223
12224 /* Set the global html file extension. */
12225 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12226
12227
12229 Config_getBool(CALLER_GRAPH) ||
12230 Config_getBool(REFERENCES_RELATION) ||
12231 Config_getBool(REFERENCED_BY_RELATION);
12232
12233 /**************************************************************************
12234 * Add custom extension mappings
12235 **************************************************************************/
12236
12237 StringVector extMaps = Config_getList(EXTENSION_MAPPING);
12238 for (const auto &mapping : extMaps)
12239 {
12240 DString mapStr = mapping;
12241 if (size_t i=mapStr.find('='); i==DString::npos)
12242 {
12243 continue;
12244 }
12245 else
12246 {
12247 DString ext = mapStr.left(i).stripWhiteSpace().lower();
12248 DString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12249 if (ext.empty() || language.empty())
12250 {
12251 continue;
12252 }
12253
12254 if (!updateLanguageMapping(ext,language))
12255 {
12256 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12257 "Check the EXTENSION_MAPPING setting in the config file.\n",
12258 ext,language);
12259 }
12260 else
12261 {
12262 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12263 ext,language);
12264 }
12265 }
12266 }
12267 // create input file exncodings
12268
12269 // check INPUT_ENCODING
12270 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12271 if (cd==reinterpret_cast<void *>(-1))
12272 {
12273 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12274 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12275 Config_getString(INPUT_ENCODING),strerror(errno));
12276 }
12277 else
12278 {
12280 }
12281
12282 // check and split INPUT_FILE_ENCODING
12283 StringVector fileEncod = Config_getList(INPUT_FILE_ENCODING);
12284 for (const auto &mapping : fileEncod)
12285 {
12286 DString mapStr = mapping;
12287 if (size_t i=mapStr.find('='); i==DString::npos)
12288 {
12289 continue;
12290 }
12291 else
12292 {
12293 DString pattern = mapStr.left(i).stripWhiteSpace().lower();
12294 DString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12295 if (pattern.empty() || encoding.empty())
12296 {
12297 continue;
12298 }
12299 cd = portable_iconv_open("UTF-8",encoding.data());
12300 if (cd==reinterpret_cast<void *>(-1))
12301 {
12302 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12303 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12304 encoding,strerror(errno));
12305 }
12306 else
12307 {
12309 }
12310
12311 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12312 }
12313 }
12314
12315 // add predefined macro name to a dictionary
12316 StringVector expandAsDefinedList = Config_getList(EXPAND_AS_DEFINED);
12317 for (const auto &s : expandAsDefinedList)
12318 {
12320 }
12321
12322 // read aliases and store them in a dictionary
12323 readAliases();
12324
12325 // store number of spaces in a tab into Doxygen::spaces
12326 int tabSize = Config_getInt(TAB_SIZE);
12327 Doxygen::spaces.resize(tabSize);
12328 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12329 Doxygen::spaces.at(tabSize)='\0';
12330}
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:4072

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

12197{
12198 AUTO_TRACE();
12199
12200 Config::postProcess(false);
12204}
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 11733 of file doxygen.cpp.

11734{
11738
11739 delete Doxygen::indexList;
11749 Doxygen::mainPage.reset();
11753 Doxygen::globalScope = nullptr;
11755 delete theTranslator;
11756 delete g_outputList;
11757
11762 delete Doxygen::dirLinkedMap;
11763 delete Doxygen::symbolMap;
11764}
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 13388 of file doxygen.cpp.

13389{
13390 AUTO_TRACE();
13391 /**************************************************************************
13392 * Initialize output generators *
13393 **************************************************************************/
13394
13395 /// add extra languages for which we can only produce syntax highlighted code
13397
13398 //// dump all symbols
13399 if (g_dumpSymbolMap)
13400 {
13401 dumpSymbolMap();
13402 exit(0);
13403 }
13404
13405 bool generateHtml = Config_getBool(GENERATE_HTML);
13406 bool generateLatex = Config_getBool(GENERATE_LATEX);
13407 bool generateMan = Config_getBool(GENERATE_MAN);
13408 bool generateRtf = Config_getBool(GENERATE_RTF);
13409 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13410
13411
13413 if (generateHtml)
13414 {
13418 }
13419 if (generateLatex)
13420 {
13423 }
13424 if (generateDocbook)
13425 {
13428 }
13429 if (generateMan)
13430 {
13433 }
13434 if (generateRtf)
13435 {
13438 }
13439 if (Config_getBool(USE_HTAGS))
13440 {
13441 Htags::useHtags = true;
13442 DString htmldir = Config_getString(HTML_OUTPUT);
13443 if (!Htags::execute(htmldir))
13444 err("USE_HTAGS is YES but htags(1) failed. \n");
13445 else if (!Htags::loadFilemap(htmldir))
13446 err("htags(1) ended normally but failed to load the filemap. \n");
13447 }
13448
13449 /**************************************************************************
13450 * Generate documentation *
13451 **************************************************************************/
13452
13453 g_s.begin("Generating style sheet...\n");
13454 //printf("writing style info\n");
13455 g_outputList->writeStyleInfo(0); // write first part
13456 g_s.end();
13457
13458 bool searchEngine = Config_getBool(SEARCHENGINE);
13459 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13460
13461 g_s.begin("Generating search indices...\n");
13462 if (searchEngine && !serverBasedSearch && generateHtml)
13463 {
13465 }
13466
13467 // generate search indices (need to do this before writing other HTML
13468 // pages as these contain a drop down menu with options depending on
13469 // what categories we find in this function.
13470 if (generateHtml && searchEngine)
13471 {
13472 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13473 Dir searchDir(searchDirName.str());
13474 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13475 {
13476 term("Could not create search results directory '{}' $PWD='{}'\n",
13477 searchDirName,Dir::currentDirPath());
13478 }
13479 HtmlGenerator::writeSearchData(searchDirName);
13480 if (!serverBasedSearch) // client side search index
13481 {
13483 }
13484 }
13485 g_s.end();
13486
13487 // copy static stuff
13488 if (generateHtml)
13489 {
13491 copyLogo(Config_getString(HTML_OUTPUT),true);
13492 copyIcon(Config_getString(HTML_OUTPUT),true);
13493 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13494 }
13495 if (generateLatex)
13496 {
13498 copyLogo(Config_getString(LATEX_OUTPUT),false);
13499 copyIcon(Config_getString(LATEX_OUTPUT),false);
13500 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13501 }
13502 if (generateDocbook)
13503 {
13504 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13505 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13506 }
13507 if (generateRtf)
13508 {
13509 copyLogo(Config_getString(RTF_OUTPUT),false);
13510 copyIcon(Config_getString(RTF_OUTPUT),false);
13511 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13512 }
13513
13515 if (fm.hasFormulas() && generateHtml
13516 && !Config_getBool(USE_MATHJAX))
13517 {
13518 g_s.begin("Generating images for formulas in HTML...\n");
13519 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13521 g_s.end();
13522 }
13523 if (fm.hasFormulas() && generateRtf)
13524 {
13525 g_s.begin("Generating images for formulas in RTF...\n");
13527 g_s.end();
13528 }
13529
13530 if (fm.hasFormulas() && generateDocbook)
13531 {
13532 g_s.begin("Generating images for formulas in Docbook...\n");
13534 g_s.end();
13535 }
13536
13537 g_s.begin("Generating example documentation...\n");
13539 g_s.end();
13540
13541 g_s.begin("Generating file sources...\n");
13543 g_s.end();
13544
13545 g_s.begin("Counting members...\n");
13546 // needs to be done after generating the sources
13547 // but before generating the compound documentation, see bug #12233
13548 countMembers();
13549 g_s.end();
13550
13551 g_s.begin("Generating file documentation...\n");
13553 g_s.end();
13554
13555 g_s.begin("Generating page documentation...\n");
13557 g_s.end();
13558
13559 g_s.begin("Generating group documentation...\n");
13561 g_s.end();
13562
13563 g_s.begin("Generating class documentation...\n");
13565 g_s.end();
13566
13567 g_s.begin("Generating concept documentation...\n");
13569 g_s.end();
13570
13571 g_s.begin("Generating module documentation...\n");
13573 g_s.end();
13574
13575 g_s.begin("Generating namespace documentation...\n");
13577 g_s.end();
13578
13579 if (Config_getBool(GENERATE_LEGEND))
13580 {
13581 g_s.begin("Generating graph info page...\n");
13583 g_s.end();
13584 }
13585
13586 g_s.begin("Generating directory documentation...\n");
13588 g_s.end();
13589
13590 if (g_outputList->size()>0)
13591 {
13593 }
13594
13595 g_s.begin("finalizing index lists...\n");
13597 g_s.end();
13598
13599 g_s.begin("writing tag file...\n");
13600 writeTagFile();
13601 g_s.end();
13602
13603 if (Config_getBool(GENERATE_XML))
13604 {
13605 g_s.begin("Generating XML output...\n");
13607 generateXML();
13609 g_s.end();
13610 }
13611 if (Config_getBool(GENERATE_SQLITE3))
13612 {
13613 g_s.begin("Generating SQLITE3 output...\n");
13615 g_s.end();
13616 }
13617
13618 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13619 {
13620 g_s.begin("Generating AutoGen DEF output...\n");
13621 generateDEF();
13622 g_s.end();
13623 }
13624 if (Config_getBool(GENERATE_PERLMOD))
13625 {
13626 g_s.begin("Generating Perl module output...\n");
13628 g_s.end();
13629 }
13630 if (generateHtml && searchEngine && serverBasedSearch)
13631 {
13632 g_s.begin("Generating search index\n");
13633 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13634 {
13636 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13637 }
13638 else // write data for external search index
13639 {
13641 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13642 if (searchDataFile.empty())
13643 {
13644 searchDataFile="searchdata.xml";
13645 }
13646 if (!Portable::isAbsolutePath(searchDataFile.data()))
13647 {
13648 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13649 }
13650 Doxygen::searchIndex.write(searchDataFile);
13651 }
13652 g_s.end();
13653 }
13654
13655 if (generateRtf)
13656 {
13657 g_s.begin("Combining RTF output...\n");
13658 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13659 {
13660 err("An error occurred during post-processing the RTF files!\n");
13661 }
13662 g_s.end();
13663 }
13664
13665 if (PlantumlManager::instance().needToRun())
13666 {
13667 g_s.begin("Running plantuml with JAVA...\n");
13669 g_s.end();
13670 }
13671
13672 if (MermaidManager::instance().needToRun())
13673 {
13674 g_s.begin("Running mermaid (mmdc)...\n");
13676 g_s.end();
13677 }
13678
13679 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13680 {
13681 g_s.begin("Running dot...\n");
13683 g_s.end();
13684 }
13685
13686 if (generateHtml &&
13687 Config_getBool(GENERATE_HTMLHELP) &&
13688 !Config_getString(HHC_LOCATION).empty())
13689 {
13690 g_s.begin("Running html help compiler...\n");
13692 g_s.end();
13693 }
13694
13695 if ( generateHtml &&
13696 Config_getBool(GENERATE_QHP) &&
13697 !Config_getString(QHG_LOCATION).empty())
13698 {
13699 g_s.begin("Running qhelpgenerator...\n");
13701 g_s.end();
13702 }
13703
13706
13708
13710 {
13711
13712 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13713 if (numThreads<1) numThreads=1;
13714 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13715 (static_cast<double>(Debug::elapsedTime())),
13716 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13717 );
13718 g_s.print();
13719
13721 msg("finished...\n");
13723 }
13724 else
13725 {
13726 msg("finished...\n");
13727 }
13728
13729
13730 /**************************************************************************
13731 * Start cleaning up *
13732 **************************************************************************/
13733
13735
13737 Dir thisDir;
13738 thisDir.remove(Doxygen::filterDBFileName.str());
13740 exitTracing();
13742 delete Doxygen::clangUsrMap;
13743 g_successfulRun=true;
13744
13745 //dumpDocNodeSizes();
13746}
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:3279
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1439
static void writeExternalSearchPage()
Definition htmlgen.cpp:3378
void finalize()
Definition indexlist.h:104
Generator for LaTeX output.
Definition latexgen.h:96
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:9016
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8850
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9451
static void countMembers()
Definition doxygen.cpp:9312
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:9477
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4097
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5812
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:4171
void cleanupInlineGraphs()
Definition util.cpp:5431
void generateXML()
Definition xmlgen.cpp:2349

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

11664{
11665 initResources();
11666 DString lang = Portable::getenv("LC_ALL");
11667 if (!lang.empty()) Portable::setenv("LANG",lang);
11668 std::setlocale(LC_ALL,"");
11669 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11670 std::setlocale(LC_NUMERIC,"C");
11671
11673
11697
11698 // register any additional parsers here...
11699
11701
11702#if USE_LIBCLANG
11704#endif
11713 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11714 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11715 //Doxygen::tagDestinationDict.setAutoDelete(true);
11717
11718 // initialization of these globals depends on
11719 // configuration switches so we need to postpone these
11720 Doxygen::globalScope = nullptr;
11730
11731}
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:4104

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

12720{
12721 AUTO_TRACE();
12722 std::atexit(exitDoxygen);
12723
12724 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12725
12726#if USE_LIBCLANG
12727 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12728#endif
12729
12730 // we would like to show the versionString earlier, but we first have to handle the configuration file
12731 // to know the value of the QUIET setting.
12732 DString versionString = getFullVersion();
12733 msg("Doxygen version used: {}\n",versionString);
12734
12736
12737 /**************************************************************************
12738 * Make sure the output directory exists
12739 **************************************************************************/
12740 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12741 if (!g_singleComment)
12742 {
12743 if (outputDirectory.empty())
12744 {
12745 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12746 }
12747 else
12748 {
12749 Dir dir(outputDirectory.str());
12750 if (!dir.exists())
12751 {
12752 dir.setPath(Dir::currentDirPath());
12753 if (!dir.mkdir(outputDirectory.str()))
12754 {
12755 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12756 "exist and cannot be created\n",outputDirectory);
12757 }
12758 else
12759 {
12760 msg("Notice: Output directory '{}' does not exist. "
12761 "I have created it for you.\n", outputDirectory);
12762 }
12763 dir.setPath(outputDirectory.str());
12764 }
12765 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12766 }
12767 }
12768 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12769
12770 /**************************************************************************
12771 * Initialize global lists and dictionaries
12772 **************************************************************************/
12773
12774#ifdef HAS_SIGNALS
12775 signal(SIGINT, stopDoxygen);
12776#endif
12777
12778 uint32_t pid = Portable::pid();
12779 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12780 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12781
12782 /**************************************************************************
12783 * Check/create output directories *
12784 **************************************************************************/
12785
12786 bool generateHtml = Config_getBool(GENERATE_HTML);
12787 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12788 bool generateXml = Config_getBool(GENERATE_XML);
12789 bool generateLatex = Config_getBool(GENERATE_LATEX);
12790 bool generateRtf = Config_getBool(GENERATE_RTF);
12791 bool generateMan = Config_getBool(GENERATE_MAN);
12792 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12793 DString htmlOutput;
12794 DString docbookOutput;
12795 DString xmlOutput;
12796 DString latexOutput;
12797 DString rtfOutput;
12798 DString manOutput;
12799 DString sqlOutput;
12800
12801 if (!g_singleComment)
12802 {
12803 if (generateHtml)
12804 {
12805 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12806 Config_updateString(HTML_OUTPUT,htmlOutput);
12807
12808 DString sitemapUrl = Config_getString(SITEMAP_URL);
12809 bool generateSitemap = !sitemapUrl.empty();
12810 if (generateSitemap && !sitemapUrl.endsWith("/"))
12811 {
12812 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12813 }
12814
12815 // add HTML indexers that are enabled
12816 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12817 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12818 bool generateQhp = Config_getBool(GENERATE_QHP);
12819 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12820 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12821 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12822 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12823 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12824 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12825 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12826 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12829 }
12830
12831 if (generateDocbook)
12832 {
12833 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12834 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12835 }
12836
12837 if (generateXml)
12838 {
12839 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12840 Config_updateString(XML_OUTPUT,xmlOutput);
12841 }
12842
12843 if (generateLatex)
12844 {
12845 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12846 Config_updateString(LATEX_OUTPUT,latexOutput);
12847 }
12848
12849 if (generateRtf)
12850 {
12851 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12852 Config_updateString(RTF_OUTPUT,rtfOutput);
12853 }
12854
12855 if (generateMan)
12856 {
12857 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12858 Config_updateString(MAN_OUTPUT,manOutput);
12859 }
12860
12861 if (generateSql)
12862 {
12863 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12864 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12865 }
12866 }
12867
12868 if (Config_getBool(HAVE_DOT))
12869 {
12870 DString curFontPath = Config_getString(DOT_FONTPATH);
12871 if (curFontPath.empty())
12872 {
12873 Portable::getenv("DOTFONTPATH");
12874 DString newFontPath = ".";
12875 if (!curFontPath.empty())
12876 {
12877 newFontPath+=Portable::pathListSeparator();
12878 newFontPath+=curFontPath;
12879 }
12880 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12881 }
12882 else
12883 {
12884 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12885 }
12886 }
12887
12888 /**************************************************************************
12889 * Handle layout file *
12890 **************************************************************************/
12891
12893 DString layoutFileName = Config_getString(LAYOUT_FILE);
12894 bool defaultLayoutUsed = false;
12895 if (layoutFileName.empty())
12896 {
12897 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12898 defaultLayoutUsed = true;
12899 }
12900 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12901
12902 FileInfo fi(layoutFileName.str());
12903 if (fi.exists())
12904 {
12905 msg("Parsing layout file {}...\n",layoutFileName);
12906 LayoutDocManager::instance().parse(layoutFileName);
12907 }
12908 else if (!defaultLayoutUsed)
12909 {
12910 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12911 }
12912 printLayout();
12913
12914 /**************************************************************************
12915 * Read and preprocess input *
12916 **************************************************************************/
12917
12918 // prevent search in the output directories
12919 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12920 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12921 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12922 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12923 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12924 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12925 if (generateMan) exclPatterns.push_back(manOutput.str());
12926 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12927
12928 if (!g_singleComment)
12929 {
12931
12933 }
12934
12935 // Notice: the order of the function calls below is very important!
12936
12937 if (generateHtml && !Config_getBool(USE_MATHJAX))
12938 {
12940 }
12941 if (generateRtf)
12942 {
12944 }
12945 if (generateDocbook)
12946 {
12948 }
12949
12951
12952 /**************************************************************************
12953 * Handle Tag Files *
12954 **************************************************************************/
12955
12956 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12957
12958 if (!g_singleComment)
12959 {
12960 msg("Reading and parsing tag files\n");
12961 StringVector tagFileList = Config_getList(TAGFILES);
12962 for (const auto &s : tagFileList)
12963 {
12964 readTagFile(root,s.c_str());
12965 }
12966 }
12967
12968 /**************************************************************************
12969 * Parse source files *
12970 **************************************************************************/
12971
12972 addSTLSupport(root);
12973
12974 g_s.begin("Parsing files\n");
12975 if (g_singleComment)
12976 {
12977 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12978 if (g_commentFileName=="-")
12979 {
12980 std::string text = fileToString(g_commentFileName).str();
12981 addTerminalCharIfMissing(text,'\n');
12982 generateHtmlForComment("stdin.md",text);
12983 }
12984 else if (FileInfo(g_commentFileName.str()).isFile())
12985 {
12986 std::string text;
12988 addTerminalCharIfMissing(text,'\n');
12990 }
12991 else
12992 {
12993 }
12995 exit(0);
12996 }
12997 else
12998 {
12999 if (Config_getInt(NUM_PROC_THREADS)==1)
13000 {
13002 }
13003 else
13004 {
13006 }
13007 }
13008 g_s.end();
13009
13010 /**************************************************************************
13011 * Gather information *
13012 **************************************************************************/
13013
13014 g_s.begin("Building macro definition list...\n");
13016 g_s.end();
13017
13018 g_s.begin("Building group list...\n");
13019 buildGroupList(root.get());
13020 organizeSubGroups(root.get());
13021 g_s.end();
13022
13023 g_s.begin("Building directory list...\n");
13025 findDirDocumentation(root.get());
13026 g_s.end();
13027
13028 g_s.begin("Building namespace list...\n");
13029 buildNamespaceList(root.get());
13030 findUsingDirectives(root.get());
13031 g_s.end();
13032
13033 g_s.begin("Building file list...\n");
13034 buildFileList(root.get());
13035 g_s.end();
13036
13037 g_s.begin("Building class list...\n");
13038 buildClassList(root.get());
13039 g_s.end();
13040
13041 g_s.begin("Building concept list...\n");
13042 buildConceptList(root.get());
13043 g_s.end();
13044
13045 // build list of using declarations here (global list)
13046 buildListOfUsingDecls(root.get());
13047 g_s.end();
13048
13049 g_s.begin("Computing nesting relations for classes...\n");
13051 g_s.end();
13052 // 1.8.2-20121111: no longer add nested classes to the group as well
13053 //distributeClassGroupRelations();
13054
13055 // calling buildClassList may result in cached relations that
13056 // become invalid after resolveClassNestingRelations(), that's why
13057 // we need to clear the cache here
13059 // we don't need the list of using declaration anymore
13060 g_usingDeclarations.clear();
13061
13062 g_s.begin("Associating documentation with classes...\n");
13063 buildClassDocList(root.get());
13064 g_s.end();
13065
13066 g_s.begin("Associating documentation with concepts...\n");
13067 buildConceptDocList(root.get());
13069 g_s.end();
13070
13071 g_s.begin("Associating documentation with modules...\n");
13072 findModuleDocumentation(root.get());
13073 g_s.end();
13074
13075 g_s.begin("Building example list...\n");
13076 buildExampleList(root.get());
13077 g_s.end();
13078
13079 g_s.begin("Searching for enumerations...\n");
13080 findEnums(root.get());
13081 g_s.end();
13082
13083 // Since buildVarList calls isVarWithConstructor
13084 // and this calls getResolvedClass we need to process
13085 // typedefs first so the relations between classes via typedefs
13086 // are properly resolved. See bug 536385 for an example.
13087 g_s.begin("Searching for documented typedefs...\n");
13088 buildTypedefList(root.get());
13089 g_s.end();
13090
13091 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
13092 {
13093 g_s.begin("Searching for documented sequences...\n");
13094 buildSequenceList(root.get());
13095 g_s.end();
13096
13097 g_s.begin("Searching for documented dictionaries...\n");
13098 buildDictionaryList(root.get());
13099 g_s.end();
13100 }
13101
13102 g_s.begin("Searching for members imported via using declarations...\n");
13103 // this should be after buildTypedefList in order to properly import
13104 // used typedefs
13105 findUsingDeclarations(root.get(),true); // do for python packages first
13106 findUsingDeclarations(root.get(),false); // then the rest
13107 g_s.end();
13108
13109 g_s.begin("Searching for included using directives...\n");
13111 g_s.end();
13112
13113 g_s.begin("Searching for documented variables...\n");
13114 buildVarList(root.get());
13115 g_s.end();
13116
13117 g_s.begin("Building interface member list...\n");
13118 buildInterfaceAndServiceList(root.get()); // UNO IDL
13119
13120 g_s.begin("Building member list...\n"); // using class info only !
13121 buildFunctionList(root.get());
13122 g_s.end();
13123
13124 g_s.begin("Searching for friends...\n");
13125 findFriends();
13126 g_s.end();
13127
13128 g_s.begin("Searching for documented defines...\n");
13129 findDefineDocumentation(root.get());
13130 g_s.end();
13131
13132 g_s.begin("Computing class inheritance relations...\n");
13133 findClassEntries(root.get());
13135 g_s.end();
13136
13137 g_s.begin("Computing class usage relations...\n");
13139 g_s.end();
13140
13141 g_s.begin("Flushing cached template relations that have become invalid...\n");
13143 g_s.end();
13144
13145 g_s.begin("Warn for undocumented namespaces...\n");
13147 g_s.end();
13148
13149 g_s.begin("Computing class relations...\n");
13152 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
13153 {
13155 }
13157 g_classEntries.clear();
13158 g_s.end();
13159
13160 g_s.begin("Add enum values to enums...\n");
13161 addEnumValuesToEnums(root.get());
13162 findEnumDocumentation(root.get());
13163 g_s.end();
13164
13165 g_s.begin("Searching for member function documentation...\n");
13166 findObjCMethodDefinitions(root.get());
13167 findMemberDocumentation(root.get()); // may introduce new members !
13168 findUsingDeclImports(root.get()); // may introduce new members !
13169 g_usingClassMap.clear();
13173 g_s.end();
13174
13175 // moved to after finding and copying documentation,
13176 // as this introduces new members see bug 722654
13177 g_s.begin("Creating members for template instances...\n");
13179 g_s.end();
13180
13181 g_s.begin("Searching for tag less structs...\n");
13183 g_s.end();
13184
13185 g_s.begin("Building page list...\n");
13186 buildPageList(root.get());
13187 g_s.end();
13188
13189 g_s.begin("Building requirements list...\n");
13190 buildRequirementsList(root.get());
13191 g_s.end();
13192
13193 g_s.begin("Search for main page...\n");
13194 findMainPage(root.get());
13195 findMainPageTagFiles(root.get());
13196 g_s.end();
13197
13198 g_s.begin("Computing page relations...\n");
13199 computePageRelations(root.get());
13201 g_s.end();
13202
13203 g_s.begin("Determining the scope of groups...\n");
13204 findGroupScope(root.get());
13205 g_s.end();
13206
13207 g_s.begin("Computing module relations...\n");
13208 auto &mm = ModuleManager::instance();
13209 mm.resolvePartitions();
13210 mm.resolveImports();
13211 mm.collectExportedSymbols();
13212 g_s.end();
13213
13214 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13215 {
13216 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13217 n2->memberName().data()+getPrefixIndex(n2->memberName())
13218 )<0;
13219 };
13220
13221 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13222 {
13223 if (Config_getBool(SORT_BY_SCOPE_NAME))
13224 {
13225 return dstricmp_sort(c1->name(), c2->name())<0;
13226 }
13227 else
13228 {
13229 int i = dstricmp_sort(c1->className(), c2->className());
13230 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13231 }
13232 };
13233
13234 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13235 {
13236 return dstricmp_sort(n1->name(),n2->name())<0;
13237 };
13238
13239 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13240 {
13241 return dstricmp_sort(c1->name(),c2->name())<0;
13242 };
13243
13244 g_s.begin("Sorting lists...\n");
13245 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13247 memberNameComp);
13248 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13250 memberNameComp);
13251 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13253 classComp);
13254 std::stable_sort(Doxygen::classLinkedMap->begin(),
13256 classComp);
13257 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13259 conceptComp);
13260 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13262 namespaceComp);
13263 g_s.end();
13264
13265 g_s.begin("Determining which enums are documented\n");
13267 g_s.end();
13268
13269 g_s.begin("Computing member relations...\n");
13272 g_s.end();
13273
13274 g_s.begin("Building full member lists recursively...\n");
13276 g_s.end();
13277
13278 g_s.begin("Adding members to member groups.\n");
13280 g_s.end();
13281
13282 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13283 {
13284 g_s.begin("Distributing member group documentation.\n");
13286 g_s.end();
13287 }
13288
13289 g_s.begin("Computing member references...\n");
13291 g_s.end();
13292
13293 if (Config_getBool(INHERIT_DOCS))
13294 {
13295 g_s.begin("Inheriting documentation...\n");
13297 g_s.end();
13298 }
13299
13300
13301 // compute the shortest possible names of all files
13302 // without losing the uniqueness of the file names.
13303 g_s.begin("Generating disk names...\n");
13305 g_s.end();
13306
13307 g_s.begin("Adding source references...\n");
13309 g_s.end();
13310
13311 g_s.begin("Adding xrefitems...\n");
13314 g_s.end();
13315
13316 g_s.begin("Adding requirements...\n");
13319 g_s.end();
13320
13321 g_s.begin("Sorting member lists...\n");
13323 g_s.end();
13324
13325 g_s.begin("Setting anonymous enum type...\n");
13327 g_s.end();
13328
13329 g_s.begin("Computing dependencies between directories...\n");
13331 g_s.end();
13332
13333 g_s.begin("Generating citations page...\n");
13335 g_s.end();
13336
13337 g_s.begin("Counting data structures...\n");
13339 g_s.end();
13340
13341 g_s.begin("Resolving user defined references...\n");
13343 g_s.end();
13344
13345 g_s.begin("Finding anchors and sections in the documentation...\n");
13347 g_s.end();
13348
13349 g_s.begin("Transferring function references...\n");
13351 g_s.end();
13352
13353 g_s.begin("Combining using relations...\n");
13355 g_s.end();
13356
13358 g_s.begin("Adding members to index pages...\n");
13360 addToIndices();
13361 g_s.end();
13362
13363 g_s.begin("Correcting members for VHDL...\n");
13365 g_s.end();
13366
13367 g_s.begin("Computing tooltip texts...\n");
13369 g_s.end();
13370
13371 if (Config_getBool(SORT_GROUP_NAMES))
13372 {
13373 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13375 [](const auto &g1,const auto &g2)
13376 { return g1->groupTitle() < g2->groupTitle(); });
13377
13378 for (const auto &gd : *Doxygen::groupLinkedMap)
13379 {
13380 gd->sortSubGroups();
13381 }
13382 }
13383
13384 printNavTree(root.get(),0);
13386}
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:1482
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1449
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:5550
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:2323
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9693
static void computeTemplateClassRelations()
Definition doxygen.cpp:5644
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5823
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2476
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9893
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5599
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:5515
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8652
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5713
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4674
static void addMembersToMemberGroup()
Definition doxygen.cpp:9558
static void findMainPageTagFiles(Entry *root)
static void distributeConceptGroups()
Definition doxygen.cpp:1358
static void transferFunctionDocumentation()
Definition doxygen.cpp:4593
static void setAnonymousEnumType()
Definition doxygen.cpp:9298
static void sortMemberLists()
Definition doxygen.cpp:9203
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8780
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4723
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7796
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3659
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:555
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9806
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7766
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9596
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:8000
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9953
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3796
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3759
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1982
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2726
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:599
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4496
static void findEnums(const Entry *root)
Definition doxygen.cpp:7824
static DString g_commentFileName
Definition doxygen.cpp:196
static void addListReferences()
Definition doxygen.cpp:5814
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8442
static void findMainPage(Entry *root)
Definition doxygen.cpp:9992
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2166
static void addSourceReferences()
Definition doxygen.cpp:9076
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9498
static void flushUnresolvedRelations()
Definition doxygen.cpp:9735
static void findDocumentedEnumValues()
Definition doxygen.cpp:8434
static void findTagLessClasses()
Definition doxygen.cpp:1930
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8484
static void computeClassRelations()
Definition doxygen.cpp:5619
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4191
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:8323
static void computePageRelations(Entry *root)
static StringSet g_usingDeclarations
Definition doxygen.cpp:193
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3777
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1161
static void buildPageList(Entry *root)
Definition doxygen.cpp:9965
static void addRequirementReferences()
Definition doxygen.cpp:5806
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:197
static void findSectionsInDocumentation()
Definition doxygen.cpp:9634
static void mergeCategories()
Definition doxygen.cpp:8799
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:5583
static void computeTooltipTexts()
Definition doxygen.cpp:9252
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8820
static void combineUsingRelations()
Definition doxygen.cpp:9533
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2474
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:4626
static void buildDefineList()
Definition doxygen.cpp:9155
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3892
static void computeMemberRelations()
Definition doxygen.cpp:8764
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2310
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:1834
#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:4383
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1061
int getPrefixIndex(const DString &name)
Definition util.cpp:2660

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

11767{
11768 DString versionString = getFullVersion();
11769
11770 // helper that calls \a func to write to file \a fileName via a TextStream
11771 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11772 {
11773 std::ofstream f;
11774 if (openOutputFile(fileName,f))
11775 {
11776 TextStream t(&f);
11777 func(t);
11778 return true;
11779 }
11780 return false;
11781 };
11782
11783
11784 /**************************************************************************
11785 * Handle arguments *
11786 **************************************************************************/
11787
11788 int optInd=1;
11789 DString configName;
11790 DString traceName;
11791 bool genConfig=false;
11792 bool shortList=false;
11793 bool traceTiming=false;
11795 bool updateConfig=false;
11796 bool quiet = false;
11797 while (optInd<argc && argv[optInd][0]=='-' &&
11798 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11799 argv[optInd][1]=='-')
11800 )
11801 {
11802 switch(argv[optInd][1])
11803 {
11804 case 'g':
11805 {
11806 genConfig=true;
11807 }
11808 break;
11809 case 'l':
11810 {
11811 DString layoutName;
11812 if (optInd+1>=argc)
11813 {
11814 layoutName="DoxygenLayout.xml";
11815 }
11816 else
11817 {
11818 layoutName=argv[optInd+1];
11819 }
11820 writeDefaultLayoutFile(layoutName);
11822 exit(0);
11823 }
11824 break;
11825 case 'c':
11826 if (optInd+1>=argc) // no file name given
11827 {
11828 msg("option \"-c\" is missing the file name to read\n");
11829 devUsage();
11831 exit(1);
11832 }
11833 else
11834 {
11835 g_commentFileName=argv[optInd+1];
11836 optInd++;
11837 }
11838 g_singleComment=true;
11839 quiet=true;
11840 break;
11841 case 'd':
11842 {
11843 DString debugLabel=getArg(argc,argv,optInd);
11844 if (debugLabel.empty())
11845 {
11846 devUsage();
11848 exit(0);
11849 }
11850 int retVal = Debug::setFlagStr(debugLabel);
11851 if (!retVal)
11852 {
11853 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11854 devUsage();
11856 exit(1);
11857 }
11858 }
11859 break;
11860 case 't':
11861 {
11862#if ENABLE_TRACING
11863 if (!strcmp(argv[optInd]+1,"t_time"))
11864 {
11865 traceTiming = true;
11866 }
11867 else if (!strcmp(argv[optInd]+1,"t"))
11868 {
11869 traceTiming = false;
11870 }
11871 else
11872 {
11873 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11875 exit(1);
11876 }
11877 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11878 {
11879 traceName="stdout";
11880 }
11881 else
11882 {
11883 traceName=argv[optInd+1];
11884 optInd++;
11885 }
11886#else
11887 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11889 exit(1);
11890#endif
11891 }
11892 break;
11893 case 'x':
11894 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11895 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11896 else
11897 {
11898 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11900 exit(1);
11901 }
11902 break;
11903 case 's':
11904 shortList=true;
11905 break;
11906 case 'u':
11907 updateConfig=true;
11908 break;
11909 case 'e':
11910 {
11911 DString formatName=getArg(argc,argv,optInd);
11912 if (formatName.empty())
11913 {
11914 err("option \"-e\" is missing format specifier rtf.\n");
11916 exit(1);
11917 }
11918 if (dstricmp(formatName.data(),"rtf")==0)
11919 {
11920 if (optInd+1>=argc)
11921 {
11922 err("option \"-e rtf\" is missing an extensions file name\n");
11924 exit(1);
11925 }
11926 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11928 exit(0);
11929 }
11930 err("option \"-e\" has invalid format specifier.\n");
11932 exit(1);
11933 }
11934 break;
11935 case 'f':
11936 {
11937 DString listName=getArg(argc,argv,optInd);
11938 if (listName.empty())
11939 {
11940 err("option \"-f\" is missing list specifier.\n");
11942 exit(1);
11943 }
11944 if (dstricmp(listName.data(),"emoji")==0)
11945 {
11946 if (optInd+1>=argc)
11947 {
11948 err("option \"-f emoji\" is missing an output file name\n");
11950 exit(1);
11951 }
11952 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11954 exit(0);
11955 }
11956 err("option \"-f\" has invalid list specifier.\n");
11958 exit(1);
11959 }
11960 break;
11961 case 'w':
11962 {
11963 DString formatName=getArg(argc,argv,optInd);
11964 if (formatName.empty())
11965 {
11966 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11968 exit(1);
11969 }
11970 if (dstricmp(formatName.data(),"rtf")==0)
11971 {
11972 if (optInd+1>=argc)
11973 {
11974 err("option \"-w rtf\" is missing a style sheet file name\n");
11976 exit(1);
11977 }
11978 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11979 {
11980 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11982 exit(1);
11983 }
11985 exit(0);
11986 }
11987 else if (dstricmp(formatName.data(),"html")==0)
11988 {
11989 Config::init();
11990 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11991 // explicit config file mentioned or default found on disk
11992 {
11993 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11994 if (!Config::parse(df)) // parse the config file
11995 {
11996 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11998 exit(1);
11999 }
12000 }
12001 if (optInd+3>=argc)
12002 {
12003 err("option \"-w html\" does not have enough arguments\n");
12005 exit(1);
12006 }
12007 Config::postProcess(true);
12010 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12011 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
12012 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
12013 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
12015 exit(0);
12016 }
12017 else if (dstricmp(formatName.data(),"latex")==0)
12018 {
12019 Config::init();
12020 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
12021 {
12022 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
12023 if (!Config::parse(df))
12024 {
12025 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
12027 exit(1);
12028 }
12029 }
12030 if (optInd+3>=argc)
12031 {
12032 err("option \"-w latex\" does not have enough arguments\n");
12034 exit(1);
12035 }
12036 Config::postProcess(true);
12039 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12040 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
12041 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
12042 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
12044 exit(0);
12045 }
12046 else
12047 {
12048 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
12050 exit(1);
12051 }
12052 }
12053 break;
12054 case 'm':
12055 g_dumpSymbolMap = true;
12056 break;
12057 case 'v':
12058 version(false);
12060 exit(0);
12061 break;
12062 case 'V':
12063 version(true);
12065 exit(0);
12066 break;
12067 case '-':
12068 if (dstrcmp(&argv[optInd][2],"help")==0)
12069 {
12070 usage(argv[0],versionString);
12071 exit(0);
12072 }
12073 else if (dstrcmp(&argv[optInd][2],"version")==0)
12074 {
12075 version(false);
12077 exit(0);
12078 }
12079 else if ((dstrcmp(&argv[optInd][2],"Version")==0) ||
12080 (dstrcmp(&argv[optInd][2],"VERSION")==0))
12081 {
12082 version(true);
12084 exit(0);
12085 }
12086 else
12087 {
12088 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
12089 usage(argv[0],versionString);
12090 exit(1);
12091 }
12092 break;
12093 case 'b':
12094 setvbuf(stdout,nullptr,_IONBF,0);
12095 break;
12096 case 'q':
12097 quiet = true;
12098 break;
12099 case 'h':
12100 case '?':
12101 usage(argv[0],versionString);
12102 exit(0);
12103 break;
12104 default:
12105 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
12106 usage(argv[0],versionString);
12107 exit(1);
12108 }
12109 optInd++;
12110 }
12111
12112 /**************************************************************************
12113 * Parse or generate the config file *
12114 **************************************************************************/
12115
12116 initTracing(traceName.data(),traceTiming);
12117 TRACE("Doxygen version used: {}",getFullVersion());
12118 Config::init();
12119
12120 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
12121 if (optInd>=argc)
12122 {
12123 if (configFileInfo1.exists())
12124 {
12125 configName="Doxyfile";
12126 }
12127 else if (configFileInfo2.exists())
12128 {
12129 configName="doxyfile";
12130 }
12131 else if (genConfig)
12132 {
12133 configName="Doxyfile";
12134 }
12135 else
12136 {
12137 err("Doxyfile not found and no input file specified!\n");
12138 usage(argv[0],versionString);
12139 exit(1);
12140 }
12141 }
12142 else
12143 {
12144 FileInfo fi(argv[optInd]);
12145 if (fi.exists() || dstrcmp(argv[optInd],"-")==0 || genConfig)
12146 {
12147 configName=argv[optInd];
12148 }
12149 else
12150 {
12151 err("configuration file {} not found!\n",argv[optInd]);
12152 usage(argv[0],versionString);
12153 exit(1);
12154 }
12155 }
12156
12157 if (genConfig)
12158 {
12159 generateConfigFile(configName,shortList);
12161 exit(0);
12162 }
12163
12164 if (!Config::parse(configName,updateConfig,diffList))
12165 {
12166 err("could not open or read configuration file {}!\n",configName);
12168 exit(1);
12169 }
12170
12171 if (diffList!=Config::CompareMode::Full)
12172 {
12174 compareDoxyfile(diffList);
12176 exit(0);
12177 }
12178
12179 if (updateConfig)
12180 {
12182 generateConfigFile(configName,shortList,true);
12184 exit(0);
12185 }
12186
12187 /* Perlmod wants to know the path to the config file.*/
12188 FileInfo configFileInfo(configName.str());
12189 setPerlModDoxyfile(configFileInfo.absFilePath());
12190
12191 /* handle -q option */
12192 if (quiet) Config_updateBool(QUIET,true);
12193}
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:1746
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:4995

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

11436{
11437 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11438 // strip trailing slashes
11439 if (s.empty()) return;
11440
11441 g_pathsVisited.clear();
11442
11443 FileInfo fi(s.str());
11444 //printf("readFileOrDirectory(%s)\n",s);
11445 {
11446 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11447 {
11448 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11449 {
11450 }
11451 else if (!fi.exists() || !fi.isReadable())
11452 {
11453 if (errorIfNotExist)
11454 {
11455 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11456 }
11457 }
11458 else if (fi.isFile())
11459 {
11460 std::string dirPath = fi.dirPath(true);
11461 std::string filePath = fi.absFilePath();
11462 if (paths && !dirPath.empty())
11463 {
11464 paths->insert(dirPath);
11465 }
11466 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11467 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11468 {
11469 std::string name=fi.fileName();
11470 if (fnMap)
11471 {
11472 auto fd = createFileDef(dirPath+"/",name);
11473 if (!name.empty())
11474 {
11475 FileName *fn = fnMap->add(name);
11476 fn->push_back(std::move(fd));
11477 }
11478 }
11479 if (resultList || resultSet)
11480 {
11481 if (resultList) resultList->push_back(filePath);
11482 if (resultSet) resultSet->insert(filePath);
11483 }
11484
11485 if (killSet) killSet->insert(fi.absFilePath());
11486 }
11487 }
11488 else if (fi.isDir()) // readable dir
11489 {
11490 readDir(&fi,fnMap,exclSet,patList,
11491 exclPatList,resultList,resultSet,errorIfNotExist,
11492 recursive,killSet,paths);
11493 }
11494 }
11495 }
11496}
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
const char * name(int level)
Definition latexgen.h:368

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().