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

12251{
12252 AUTO_TRACE();
12253 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12264
12265 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12266
12267 /* Set the global html file extension. */
12268 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12269
12270
12272 Config_getBool(CALLER_GRAPH) ||
12273 Config_getBool(REFERENCES_RELATION) ||
12274 Config_getBool(REFERENCED_BY_RELATION);
12275
12276 /**************************************************************************
12277 * Add custom extension mappings
12278 **************************************************************************/
12279
12280 StringVector extMaps = Config_getList(EXTENSION_MAPPING);
12281 for (const auto &mapping : extMaps)
12282 {
12283 DString mapStr = mapping;
12284 if (size_t i=mapStr.find('='); i==DString::npos)
12285 {
12286 continue;
12287 }
12288 else
12289 {
12290 DString ext = mapStr.left(i).stripWhiteSpace().lower();
12291 DString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12292 if (ext.empty() || language.empty())
12293 {
12294 continue;
12295 }
12296
12297 if (!updateLanguageMapping(ext,language))
12298 {
12299 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12300 "Check the EXTENSION_MAPPING setting in the config file.\n",
12301 ext,language);
12302 }
12303 else
12304 {
12305 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12306 ext,language);
12307 }
12308 }
12309 }
12310 // create input file exncodings
12311
12312 // check INPUT_ENCODING
12313 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12314 if (cd==reinterpret_cast<void *>(-1))
12315 {
12316 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12317 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12318 Config_getString(INPUT_ENCODING),strerror(errno));
12319 }
12320 else
12321 {
12323 }
12324
12325 // check and split INPUT_FILE_ENCODING
12326 StringVector fileEncod = Config_getList(INPUT_FILE_ENCODING);
12327 for (const auto &mapping : fileEncod)
12328 {
12329 DString mapStr = mapping;
12330 if (size_t i=mapStr.find('='); i==DString::npos)
12331 {
12332 continue;
12333 }
12334 else
12335 {
12336 DString pattern = mapStr.left(i).stripWhiteSpace().lower();
12337 DString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12338 if (pattern.empty() || encoding.empty())
12339 {
12340 continue;
12341 }
12342 cd = portable_iconv_open("UTF-8",encoding.data());
12343 if (cd==reinterpret_cast<void *>(-1))
12344 {
12345 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12346 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12347 encoding,strerror(errno));
12348 }
12349 else
12350 {
12352 }
12353
12354 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12355 }
12356 }
12357
12358 // add predefined macro name to a dictionary
12359 StringVector expandAsDefinedList = Config_getList(EXPAND_AS_DEFINED);
12360 for (const auto &s : expandAsDefinedList)
12361 {
12363 }
12364
12365 // read aliases and store them in a dictionary
12366 readAliases();
12367
12368 // store number of spaces in a tab into Doxygen::spaces
12369 int tabSize = Config_getInt(TAB_SIZE);
12370 Doxygen::spaces.resize(tabSize);
12371 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12372 Doxygen::spaces.at(tabSize)='\0';
12373}
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:4069

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

12240{
12241 AUTO_TRACE();
12242
12243 Config::postProcess(false);
12247}
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 11776 of file doxygen.cpp.

11777{
11781
11782 delete Doxygen::indexList;
11792 Doxygen::mainPage.reset();
11796 Doxygen::globalScope = nullptr;
11798 delete theTranslator;
11799 delete g_outputList;
11800
11805 delete Doxygen::dirLinkedMap;
11806 delete Doxygen::symbolMap;
11807}
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 13431 of file doxygen.cpp.

13432{
13433 AUTO_TRACE();
13434 /**************************************************************************
13435 * Initialize output generators *
13436 **************************************************************************/
13437
13438 /// add extra languages for which we can only produce syntax highlighted code
13440
13441 //// dump all symbols
13442 if (g_dumpSymbolMap)
13443 {
13444 dumpSymbolMap();
13445 exit(0);
13446 }
13447
13448 bool generateHtml = Config_getBool(GENERATE_HTML);
13449 bool generateLatex = Config_getBool(GENERATE_LATEX);
13450 bool generateMan = Config_getBool(GENERATE_MAN);
13451 bool generateRtf = Config_getBool(GENERATE_RTF);
13452 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13453
13454
13456 if (generateHtml)
13457 {
13461 }
13462 if (generateLatex)
13463 {
13466 }
13467 if (generateDocbook)
13468 {
13471 }
13472 if (generateMan)
13473 {
13476 }
13477 if (generateRtf)
13478 {
13481 }
13482 if (Config_getBool(USE_HTAGS))
13483 {
13484 Htags::useHtags = true;
13485 DString htmldir = Config_getString(HTML_OUTPUT);
13486 if (!Htags::execute(htmldir))
13487 err("USE_HTAGS is YES but htags(1) failed. \n");
13488 else if (!Htags::loadFilemap(htmldir))
13489 err("htags(1) ended normally but failed to load the filemap. \n");
13490 }
13491
13492 /**************************************************************************
13493 * Generate documentation *
13494 **************************************************************************/
13495
13496 g_s.begin("Generating style sheet...\n");
13497 //printf("writing style info\n");
13498 g_outputList->writeStyleInfo(0); // write first part
13499 g_s.end();
13500
13501 bool searchEngine = Config_getBool(SEARCHENGINE);
13502 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13503
13504 g_s.begin("Generating search indices...\n");
13505 if (searchEngine && !serverBasedSearch && generateHtml)
13506 {
13508 }
13509
13510 // generate search indices (need to do this before writing other HTML
13511 // pages as these contain a drop down menu with options depending on
13512 // what categories we find in this function.
13513 if (generateHtml && searchEngine)
13514 {
13515 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13516 Dir searchDir(searchDirName.str());
13517 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13518 {
13519 term("Could not create search results directory '{}' $PWD='{}'\n",
13520 searchDirName,Dir::currentDirPath());
13521 }
13522 HtmlGenerator::writeSearchData(searchDirName);
13523 if (!serverBasedSearch) // client side search index
13524 {
13526 }
13527 }
13528 g_s.end();
13529
13530 // copy static stuff
13531 if (generateHtml)
13532 {
13534 copyLogo(Config_getString(HTML_OUTPUT),true);
13535 copyIcon(Config_getString(HTML_OUTPUT),true);
13536 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13537 }
13538 if (generateLatex)
13539 {
13541 copyLogo(Config_getString(LATEX_OUTPUT),false);
13542 copyIcon(Config_getString(LATEX_OUTPUT),false);
13543 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13544 }
13545 if (generateDocbook)
13546 {
13547 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13548 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13549 }
13550 if (generateRtf)
13551 {
13552 copyLogo(Config_getString(RTF_OUTPUT),false);
13553 copyIcon(Config_getString(RTF_OUTPUT),false);
13554 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13555 }
13556
13558 if (fm.hasFormulas() && generateHtml
13559 && !Config_getBool(USE_MATHJAX))
13560 {
13561 g_s.begin("Generating images for formulas in HTML...\n");
13562 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13564 g_s.end();
13565 }
13566 if (fm.hasFormulas() && generateRtf)
13567 {
13568 g_s.begin("Generating images for formulas in RTF...\n");
13570 g_s.end();
13571 }
13572
13573 if (fm.hasFormulas() && generateDocbook)
13574 {
13575 g_s.begin("Generating images for formulas in Docbook...\n");
13577 g_s.end();
13578 }
13579
13580 g_s.begin("Generating example documentation...\n");
13582 g_s.end();
13583
13584 g_s.begin("Generating file sources...\n");
13586 g_s.end();
13587
13588 g_s.begin("Counting members...\n");
13589 // needs to be done after generating the sources
13590 // but before generating the compound documentation, see bug #12233
13591 countMembers();
13592 g_s.end();
13593
13594 g_s.begin("Generating file documentation...\n");
13596 g_s.end();
13597
13598 g_s.begin("Generating page documentation...\n");
13600 g_s.end();
13601
13602 g_s.begin("Generating group documentation...\n");
13604 g_s.end();
13605
13606 g_s.begin("Generating class documentation...\n");
13608 g_s.end();
13609
13610 g_s.begin("Generating concept documentation...\n");
13612 g_s.end();
13613
13614 g_s.begin("Generating module documentation...\n");
13616 g_s.end();
13617
13618 g_s.begin("Generating namespace documentation...\n");
13620 g_s.end();
13621
13622 if (Config_getBool(GENERATE_LEGEND))
13623 {
13624 g_s.begin("Generating graph info page...\n");
13626 g_s.end();
13627 }
13628
13629 g_s.begin("Generating directory documentation...\n");
13631 g_s.end();
13632
13633 if (g_outputList->size()>0)
13634 {
13636 }
13637
13638 g_s.begin("finalizing index lists...\n");
13640 g_s.end();
13641
13642 g_s.begin("writing tag file...\n");
13643 writeTagFile();
13644 g_s.end();
13645
13646 if (Config_getBool(GENERATE_XML))
13647 {
13648 g_s.begin("Generating XML output...\n");
13650 generateXML();
13652 g_s.end();
13653 }
13654 if (Config_getBool(GENERATE_SQLITE3))
13655 {
13656 g_s.begin("Generating SQLITE3 output...\n");
13658 g_s.end();
13659 }
13660
13661 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13662 {
13663 g_s.begin("Generating AutoGen DEF output...\n");
13664 generateDEF();
13665 g_s.end();
13666 }
13667 if (Config_getBool(GENERATE_PERLMOD))
13668 {
13669 g_s.begin("Generating Perl module output...\n");
13671 g_s.end();
13672 }
13673 if (generateHtml && searchEngine && serverBasedSearch)
13674 {
13675 g_s.begin("Generating search index\n");
13676 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13677 {
13679 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13680 }
13681 else // write data for external search index
13682 {
13684 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13685 if (searchDataFile.empty())
13686 {
13687 searchDataFile="searchdata.xml";
13688 }
13689 if (!Portable::isAbsolutePath(searchDataFile.data()))
13690 {
13691 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13692 }
13693 Doxygen::searchIndex.write(searchDataFile);
13694 }
13695 g_s.end();
13696 }
13697
13698 if (generateRtf)
13699 {
13700 g_s.begin("Combining RTF output...\n");
13701 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13702 {
13703 err("An error occurred during post-processing the RTF files!\n");
13704 }
13705 g_s.end();
13706 }
13707
13708 if (PlantumlManager::instance().needToRun())
13709 {
13710 g_s.begin("Running plantuml with JAVA...\n");
13712 g_s.end();
13713 }
13714
13715 if (MermaidManager::instance().needToRun())
13716 {
13717 g_s.begin("Running mermaid (mmdc)...\n");
13719 g_s.end();
13720 }
13721
13722 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13723 {
13724 g_s.begin("Running dot...\n");
13726 g_s.end();
13727 }
13728
13729 if (generateHtml &&
13730 Config_getBool(GENERATE_HTMLHELP) &&
13731 !Config_getString(HHC_LOCATION).empty())
13732 {
13733 g_s.begin("Running html help compiler...\n");
13735 g_s.end();
13736 }
13737
13738 if ( generateHtml &&
13739 Config_getBool(GENERATE_QHP) &&
13740 !Config_getString(QHG_LOCATION).empty())
13741 {
13742 g_s.begin("Running qhelpgenerator...\n");
13744 g_s.end();
13745 }
13746
13749
13751
13753 {
13754
13755 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13756 if (numThreads<1) numThreads=1;
13757 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13758 (static_cast<double>(Debug::elapsedTime())),
13759 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13760 );
13761 g_s.print();
13762
13764 msg("finished...\n");
13766 }
13767 else
13768 {
13769 msg("finished...\n");
13770 }
13771
13772
13773 /**************************************************************************
13774 * Start cleaning up *
13775 **************************************************************************/
13776
13778
13780 Dir thisDir;
13781 thisDir.remove(Doxygen::filterDBFileName.str());
13783 exitTracing();
13785 delete Doxygen::clangUsrMap;
13786 g_successfulRun=true;
13787
13788 //dumpDocNodeSizes();
13789}
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:1461
static void init()
Definition htmlgen.cpp:1281
static void writeSearchPage()
Definition htmlgen.cpp:3284
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1445
static void writeExternalSearchPage()
Definition htmlgen.cpp:3383
void finalize()
Definition indexlist.h:104
Generator for LaTeX output.
Definition latexgen.h:96
static void init()
Definition latexgen.cpp:632
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:9059
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8893
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9494
static void countMembers()
Definition doxygen.cpp:9355
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:9520
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:4168
void cleanupInlineGraphs()
Definition util.cpp:5432
void generateXML()
Definition xmlgen.cpp:2357

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

11707{
11708 initResources();
11709 DString lang = Portable::getenv("LC_ALL");
11710 if (!lang.empty()) Portable::setenv("LANG",lang);
11711 std::setlocale(LC_ALL,"");
11712 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11713 std::setlocale(LC_NUMERIC,"C");
11714
11716
11740
11741 // register any additional parsers here...
11742
11744
11745#if USE_LIBCLANG
11747#endif
11756 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11757 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11758 //Doxygen::tagDestinationDict.setAutoDelete(true);
11760
11761 // initialization of these globals depends on
11762 // configuration switches so we need to postpone these
11763 Doxygen::globalScope = nullptr;
11773
11774}
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:4101

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

12763{
12764 AUTO_TRACE();
12765 std::atexit(exitDoxygen);
12766
12767 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12768
12769#if USE_LIBCLANG
12770 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12771#endif
12772
12773 // we would like to show the versionString earlier, but we first have to handle the configuration file
12774 // to know the value of the QUIET setting.
12775 DString versionString = getFullVersion();
12776 msg("Doxygen version used: {}\n",versionString);
12777
12779
12780 /**************************************************************************
12781 * Make sure the output directory exists
12782 **************************************************************************/
12783 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12784 if (!g_singleComment)
12785 {
12786 if (outputDirectory.empty())
12787 {
12788 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12789 }
12790 else
12791 {
12792 Dir dir(outputDirectory.str());
12793 if (!dir.exists())
12794 {
12795 dir.setPath(Dir::currentDirPath());
12796 if (!dir.mkdir(outputDirectory.str()))
12797 {
12798 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12799 "exist and cannot be created\n",outputDirectory);
12800 }
12801 else
12802 {
12803 msg("Notice: Output directory '{}' does not exist. "
12804 "I have created it for you.\n", outputDirectory);
12805 }
12806 dir.setPath(outputDirectory.str());
12807 }
12808 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12809 }
12810 }
12811 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12812
12813 /**************************************************************************
12814 * Initialize global lists and dictionaries
12815 **************************************************************************/
12816
12817#ifdef HAS_SIGNALS
12818 signal(SIGINT, stopDoxygen);
12819#endif
12820
12821 uint32_t pid = Portable::pid();
12822 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12823 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12824
12825 /**************************************************************************
12826 * Check/create output directories *
12827 **************************************************************************/
12828
12829 bool generateHtml = Config_getBool(GENERATE_HTML);
12830 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12831 bool generateXml = Config_getBool(GENERATE_XML);
12832 bool generateLatex = Config_getBool(GENERATE_LATEX);
12833 bool generateRtf = Config_getBool(GENERATE_RTF);
12834 bool generateMan = Config_getBool(GENERATE_MAN);
12835 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12836 DString htmlOutput;
12837 DString docbookOutput;
12838 DString xmlOutput;
12839 DString latexOutput;
12840 DString rtfOutput;
12841 DString manOutput;
12842 DString sqlOutput;
12843
12844 if (!g_singleComment)
12845 {
12846 if (generateHtml)
12847 {
12848 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12849 Config_updateString(HTML_OUTPUT,htmlOutput);
12850
12851 DString sitemapUrl = Config_getString(SITEMAP_URL);
12852 bool generateSitemap = !sitemapUrl.empty();
12853 if (generateSitemap && !sitemapUrl.endsWith("/"))
12854 {
12855 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12856 }
12857
12858 // add HTML indexers that are enabled
12859 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12860 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12861 bool generateQhp = Config_getBool(GENERATE_QHP);
12862 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12863 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12864 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12865 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12866 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12867 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12868 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12869 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12872 }
12873
12874 if (generateDocbook)
12875 {
12876 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12877 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12878 }
12879
12880 if (generateXml)
12881 {
12882 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12883 Config_updateString(XML_OUTPUT,xmlOutput);
12884 }
12885
12886 if (generateLatex)
12887 {
12888 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12889 Config_updateString(LATEX_OUTPUT,latexOutput);
12890 }
12891
12892 if (generateRtf)
12893 {
12894 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12895 Config_updateString(RTF_OUTPUT,rtfOutput);
12896 }
12897
12898 if (generateMan)
12899 {
12900 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12901 Config_updateString(MAN_OUTPUT,manOutput);
12902 }
12903
12904 if (generateSql)
12905 {
12906 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12907 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12908 }
12909 }
12910
12911 if (Config_getBool(HAVE_DOT))
12912 {
12913 DString curFontPath = Config_getString(DOT_FONTPATH);
12914 if (curFontPath.empty())
12915 {
12916 Portable::getenv("DOTFONTPATH");
12917 DString newFontPath = ".";
12918 if (!curFontPath.empty())
12919 {
12920 newFontPath+=Portable::pathListSeparator();
12921 newFontPath+=curFontPath;
12922 }
12923 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12924 }
12925 else
12926 {
12927 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12928 }
12929 }
12930
12931 /**************************************************************************
12932 * Handle layout file *
12933 **************************************************************************/
12934
12936 DString layoutFileName = Config_getString(LAYOUT_FILE);
12937 bool defaultLayoutUsed = false;
12938 if (layoutFileName.empty())
12939 {
12940 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12941 defaultLayoutUsed = true;
12942 }
12943 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12944
12945 FileInfo fi(layoutFileName.str());
12946 if (fi.exists())
12947 {
12948 msg("Parsing layout file {}...\n",layoutFileName);
12949 LayoutDocManager::instance().parse(layoutFileName);
12950 }
12951 else if (!defaultLayoutUsed)
12952 {
12953 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12954 }
12955 printLayout();
12956
12957 /**************************************************************************
12958 * Read and preprocess input *
12959 **************************************************************************/
12960
12961 // prevent search in the output directories
12962 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12963 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12964 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12965 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12966 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12967 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12968 if (generateMan) exclPatterns.push_back(manOutput.str());
12969 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12970
12971 if (!g_singleComment)
12972 {
12974
12976 }
12977
12978 // Notice: the order of the function calls below is very important!
12979
12980 if (generateHtml && !Config_getBool(USE_MATHJAX))
12981 {
12983 }
12984 if (generateRtf)
12985 {
12987 }
12988 if (generateDocbook)
12989 {
12991 }
12992
12994
12995 /**************************************************************************
12996 * Handle Tag Files *
12997 **************************************************************************/
12998
12999 std::shared_ptr<Entry> root = std::make_shared<Entry>();
13000
13001 if (!g_singleComment)
13002 {
13003 msg("Reading and parsing tag files\n");
13004 StringVector tagFileList = Config_getList(TAGFILES);
13005 for (const auto &s : tagFileList)
13006 {
13007 readTagFile(root,s.c_str());
13008 }
13009 }
13010
13011 /**************************************************************************
13012 * Parse source files *
13013 **************************************************************************/
13014
13015 addSTLSupport(root);
13016
13017 g_s.begin("Parsing files\n");
13018 if (g_singleComment)
13019 {
13020 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
13021 if (g_commentFileName=="-")
13022 {
13023 std::string text = fileToString(g_commentFileName).str();
13024 addTerminalCharIfMissing(text,'\n');
13025 generateHtmlForComment("stdin.md",text);
13026 }
13027 else if (FileInfo(g_commentFileName.str()).isFile())
13028 {
13029 std::string text;
13031 addTerminalCharIfMissing(text,'\n');
13033 }
13034 else
13035 {
13036 }
13038 exit(0);
13039 }
13040 else
13041 {
13042 if (Config_getInt(NUM_PROC_THREADS)==1)
13043 {
13045 }
13046 else
13047 {
13049 }
13050 }
13051 g_s.end();
13052
13053 /**************************************************************************
13054 * Gather information *
13055 **************************************************************************/
13056
13057 g_s.begin("Building macro definition list...\n");
13059 g_s.end();
13060
13061 g_s.begin("Building group list...\n");
13062 buildGroupList(root.get());
13063 organizeSubGroups(root.get());
13064 g_s.end();
13065
13066 g_s.begin("Building directory list...\n");
13068 findDirDocumentation(root.get());
13069 g_s.end();
13070
13071 g_s.begin("Building namespace list...\n");
13072 buildNamespaceList(root.get());
13073 findUsingDirectives(root.get());
13074 g_s.end();
13075
13076 g_s.begin("Building file list...\n");
13077 buildFileList(root.get());
13078 g_s.end();
13079
13080 g_s.begin("Building class list...\n");
13081 buildClassList(root.get());
13082 g_s.end();
13083
13084 g_s.begin("Building concept list...\n");
13085 buildConceptList(root.get());
13086 g_s.end();
13087
13088 // build list of using declarations here (global list)
13089 buildListOfUsingDecls(root.get());
13090 g_s.end();
13091
13092 g_s.begin("Computing nesting relations for classes...\n");
13094 g_s.end();
13095 // 1.8.2-20121111: no longer add nested classes to the group as well
13096 //distributeClassGroupRelations();
13097
13098 // calling buildClassList may result in cached relations that
13099 // become invalid after resolveClassNestingRelations(), that's why
13100 // we need to clear the cache here
13102 // we don't need the list of using declaration anymore
13103 g_usingDeclarations.clear();
13104
13105 g_s.begin("Associating documentation with classes...\n");
13106 buildClassDocList(root.get());
13107 g_s.end();
13108
13109 g_s.begin("Associating documentation with concepts...\n");
13110 buildConceptDocList(root.get());
13112 g_s.end();
13113
13114 g_s.begin("Associating documentation with modules...\n");
13115 findModuleDocumentation(root.get());
13116 g_s.end();
13117
13118 g_s.begin("Building example list...\n");
13119 buildExampleList(root.get());
13120 g_s.end();
13121
13122 g_s.begin("Searching for enumerations...\n");
13123 findEnums(root.get());
13124 g_s.end();
13125
13126 // Since buildVarList calls isVarWithConstructor
13127 // and this calls getResolvedClass we need to process
13128 // typedefs first so the relations between classes via typedefs
13129 // are properly resolved. See bug 536385 for an example.
13130 g_s.begin("Searching for documented typedefs...\n");
13131 buildTypedefList(root.get());
13132 g_s.end();
13133
13134 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
13135 {
13136 g_s.begin("Searching for documented sequences...\n");
13137 buildSequenceList(root.get());
13138 g_s.end();
13139
13140 g_s.begin("Searching for documented dictionaries...\n");
13141 buildDictionaryList(root.get());
13142 g_s.end();
13143 }
13144
13145 g_s.begin("Searching for members imported via using declarations...\n");
13146 // this should be after buildTypedefList in order to properly import
13147 // used typedefs
13148 findUsingDeclarations(root.get(),true); // do for python packages first
13149 findUsingDeclarations(root.get(),false); // then the rest
13150 g_s.end();
13151
13152 g_s.begin("Searching for included using directives...\n");
13154 g_s.end();
13155
13156 g_s.begin("Searching for documented variables...\n");
13157 buildVarList(root.get());
13158 g_s.end();
13159
13160 g_s.begin("Building interface member list...\n");
13161 buildInterfaceAndServiceList(root.get()); // UNO IDL
13162
13163 g_s.begin("Building member list...\n"); // using class info only !
13164 buildFunctionList(root.get());
13165 g_s.end();
13166
13167 g_s.begin("Searching for friends...\n");
13168 findFriends();
13169 g_s.end();
13170
13171 g_s.begin("Searching for documented defines...\n");
13172 findDefineDocumentation(root.get());
13173 g_s.end();
13174
13175 g_s.begin("Computing class inheritance relations...\n");
13176 findClassEntries(root.get());
13178 g_s.end();
13179
13180 g_s.begin("Computing class usage relations...\n");
13182 g_s.end();
13183
13184 g_s.begin("Flushing cached template relations that have become invalid...\n");
13186 g_s.end();
13187
13188 g_s.begin("Warn for undocumented namespaces...\n");
13190 g_s.end();
13191
13192 g_s.begin("Computing class relations...\n");
13195 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
13196 {
13198 }
13200 g_classEntries.clear();
13201 g_s.end();
13202
13203 g_s.begin("Add enum values to enums...\n");
13204 addEnumValuesToEnums(root.get());
13205 findEnumDocumentation(root.get());
13206 g_s.end();
13207
13208 g_s.begin("Searching for member function documentation...\n");
13209 findObjCMethodDefinitions(root.get());
13210 findMemberDocumentation(root.get()); // may introduce new members !
13211 findUsingDeclImports(root.get()); // may introduce new members !
13212 g_usingClassMap.clear();
13216 g_s.end();
13217
13218 // moved to after finding and copying documentation,
13219 // as this introduces new members see bug 722654
13220 g_s.begin("Creating members for template instances...\n");
13222 g_s.end();
13223
13224 g_s.begin("Searching for tag less structs...\n");
13226 g_s.end();
13227
13228 g_s.begin("Building page list...\n");
13229 buildPageList(root.get());
13230 g_s.end();
13231
13232 g_s.begin("Building requirements list...\n");
13233 buildRequirementsList(root.get());
13234 g_s.end();
13235
13236 g_s.begin("Search for main page...\n");
13237 findMainPage(root.get());
13238 findMainPageTagFiles(root.get());
13239 g_s.end();
13240
13241 g_s.begin("Computing page relations...\n");
13242 computePageRelations(root.get());
13244 g_s.end();
13245
13246 g_s.begin("Determining the scope of groups...\n");
13247 findGroupScope(root.get());
13248 g_s.end();
13249
13250 g_s.begin("Computing module relations...\n");
13251 auto &mm = ModuleManager::instance();
13252 mm.resolvePartitions();
13253 mm.resolveImports();
13254 mm.collectExportedSymbols();
13255 g_s.end();
13256
13257 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13258 {
13259 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13260 n2->memberName().data()+getPrefixIndex(n2->memberName())
13261 )<0;
13262 };
13263
13264 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13265 {
13266 if (Config_getBool(SORT_BY_SCOPE_NAME))
13267 {
13268 return dstricmp_sort(c1->name(), c2->name())<0;
13269 }
13270 else
13271 {
13272 int i = dstricmp_sort(c1->className(), c2->className());
13273 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13274 }
13275 };
13276
13277 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13278 {
13279 return dstricmp_sort(n1->name(),n2->name())<0;
13280 };
13281
13282 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13283 {
13284 return dstricmp_sort(c1->name(),c2->name())<0;
13285 };
13286
13287 g_s.begin("Sorting lists...\n");
13288 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13290 memberNameComp);
13291 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13293 memberNameComp);
13294 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13296 classComp);
13297 std::stable_sort(Doxygen::classLinkedMap->begin(),
13299 classComp);
13300 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13302 conceptComp);
13303 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13305 namespaceComp);
13306 g_s.end();
13307
13308 g_s.begin("Determining which enums are documented\n");
13310 g_s.end();
13311
13312 g_s.begin("Computing member relations...\n");
13315 g_s.end();
13316
13317 g_s.begin("Building full member lists recursively...\n");
13319 g_s.end();
13320
13321 g_s.begin("Adding members to member groups.\n");
13323 g_s.end();
13324
13325 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13326 {
13327 g_s.begin("Distributing member group documentation.\n");
13329 g_s.end();
13330 }
13331
13332 g_s.begin("Computing member references...\n");
13334 g_s.end();
13335
13336 if (Config_getBool(INHERIT_DOCS))
13337 {
13338 g_s.begin("Inheriting documentation...\n");
13340 g_s.end();
13341 }
13342
13343
13344 // compute the shortest possible names of all files
13345 // without losing the uniqueness of the file names.
13346 g_s.begin("Generating disk names...\n");
13348 g_s.end();
13349
13350 g_s.begin("Adding source references...\n");
13352 g_s.end();
13353
13354 g_s.begin("Adding xrefitems...\n");
13357 g_s.end();
13358
13359 g_s.begin("Adding requirements...\n");
13362 g_s.end();
13363
13364 g_s.begin("Sorting member lists...\n");
13366 g_s.end();
13367
13368 g_s.begin("Setting anonymous enum type...\n");
13370 g_s.end();
13371
13372 g_s.begin("Computing dependencies between directories...\n");
13374 g_s.end();
13375
13376 g_s.begin("Generating citations page...\n");
13378 g_s.end();
13379
13380 g_s.begin("Counting data structures...\n");
13382 g_s.end();
13383
13384 g_s.begin("Resolving user defined references...\n");
13386 g_s.end();
13387
13388 g_s.begin("Finding anchors and sections in the documentation...\n");
13390 g_s.end();
13391
13392 g_s.begin("Transferring function references...\n");
13394 g_s.end();
13395
13396 g_s.begin("Combining using relations...\n");
13398 g_s.end();
13399
13401 g_s.begin("Adding members to index pages...\n");
13403 addToIndices();
13404 g_s.end();
13405
13406 g_s.begin("Correcting members for VHDL...\n");
13408 g_s.end();
13409
13410 g_s.begin("Computing tooltip texts...\n");
13412 g_s.end();
13413
13414 if (Config_getBool(SORT_GROUP_NAMES))
13415 {
13416 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13418 [](const auto &g1,const auto &g2)
13419 { return g1->groupTitle() < g2->groupTitle(); });
13420
13421 for (const auto &gd : *Doxygen::groupLinkedMap)
13422 {
13423 gd->sortSubGroups();
13424 }
13425 }
13426
13427 printNavTree(root.get(),0);
13429}
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:5553
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:2326
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9736
static void computeTemplateClassRelations()
Definition doxygen.cpp:5647
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5826
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2479
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9936
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5602
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:5518
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8655
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5716
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4677
static void addMembersToMemberGroup()
Definition doxygen.cpp:9601
static void findMainPageTagFiles(Entry *root)
static void distributeConceptGroups()
Definition doxygen.cpp:1358
static void transferFunctionDocumentation()
Definition doxygen.cpp:4596
static void setAnonymousEnumType()
Definition doxygen.cpp:9341
static void sortMemberLists()
Definition doxygen.cpp:9246
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8823
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4726
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7799
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3662
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:555
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9849
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7769
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9639
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:8003
static void resolveUserReferences()
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9996
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3799
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3762
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1985
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2729
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:599
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4499
static void findEnums(const Entry *root)
Definition doxygen.cpp:7827
static DString g_commentFileName
Definition doxygen.cpp:196
static void addListReferences()
Definition doxygen.cpp:5817
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8445
static void findMainPage(Entry *root)
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2169
static void addSourceReferences()
Definition doxygen.cpp:9119
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9541
static void flushUnresolvedRelations()
Definition doxygen.cpp:9778
static void findDocumentedEnumValues()
Definition doxygen.cpp:8437
static void findTagLessClasses()
Definition doxygen.cpp:1932
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8487
static void computeClassRelations()
Definition doxygen.cpp:5622
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4194
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:8326
static void computePageRelations(Entry *root)
static StringSet g_usingDeclarations
Definition doxygen.cpp:193
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3780
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1161
static void buildPageList(Entry *root)
static void addRequirementReferences()
Definition doxygen.cpp:5809
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:197
static void findSectionsInDocumentation()
Definition doxygen.cpp:9677
static void mergeCategories()
Definition doxygen.cpp:8842
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:5586
static void computeTooltipTexts()
Definition doxygen.cpp:9295
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8863
static void combineUsingRelations()
Definition doxygen.cpp:9576
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2477
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:4629
static void buildDefineList()
Definition doxygen.cpp:9198
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3895
static void computeMemberRelations()
Definition doxygen.cpp:8806
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2313
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, const ReadInputFileOptions &options)
read a file name fileName and optionally filter and transcode it
Definition util.cpp:4380
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1058
int getPrefixIndex(const DString &name)
Definition util.cpp:2657

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

11810{
11811 DString versionString = getFullVersion();
11812
11813 // helper that calls \a func to write to file \a fileName via a TextStream
11814 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11815 {
11816 std::ofstream f;
11817 if (openOutputFile(fileName,f))
11818 {
11819 TextStream t(&f);
11820 func(t);
11821 return true;
11822 }
11823 return false;
11824 };
11825
11826
11827 /**************************************************************************
11828 * Handle arguments *
11829 **************************************************************************/
11830
11831 int optInd=1;
11832 DString configName;
11833 DString traceName;
11834 bool genConfig=false;
11835 bool shortList=false;
11836 bool traceTiming=false;
11838 bool updateConfig=false;
11839 bool quiet = false;
11840 while (optInd<argc && argv[optInd][0]=='-' &&
11841 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11842 argv[optInd][1]=='-')
11843 )
11844 {
11845 switch(argv[optInd][1])
11846 {
11847 case 'g':
11848 {
11849 genConfig=true;
11850 }
11851 break;
11852 case 'l':
11853 {
11854 DString layoutName;
11855 if (optInd+1>=argc)
11856 {
11857 layoutName="DoxygenLayout.xml";
11858 }
11859 else
11860 {
11861 layoutName=argv[optInd+1];
11862 }
11863 writeDefaultLayoutFile(layoutName);
11865 exit(0);
11866 }
11867 break;
11868 case 'c':
11869 if (optInd+1>=argc) // no file name given
11870 {
11871 msg("option \"-c\" is missing the file name to read\n");
11872 devUsage();
11874 exit(1);
11875 }
11876 else
11877 {
11878 g_commentFileName=argv[optInd+1];
11879 optInd++;
11880 }
11881 g_singleComment=true;
11882 quiet=true;
11883 break;
11884 case 'd':
11885 {
11886 DString debugLabel=getArg(argc,argv,optInd);
11887 if (debugLabel.empty())
11888 {
11889 devUsage();
11891 exit(0);
11892 }
11893 int retVal = Debug::setFlagStr(debugLabel);
11894 if (!retVal)
11895 {
11896 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11897 devUsage();
11899 exit(1);
11900 }
11901 }
11902 break;
11903 case 't':
11904 {
11905#if ENABLE_TRACING
11906 if (!strcmp(argv[optInd]+1,"t_time"))
11907 {
11908 traceTiming = true;
11909 }
11910 else if (!strcmp(argv[optInd]+1,"t"))
11911 {
11912 traceTiming = false;
11913 }
11914 else
11915 {
11916 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11918 exit(1);
11919 }
11920 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11921 {
11922 traceName="stdout";
11923 }
11924 else
11925 {
11926 traceName=argv[optInd+1];
11927 optInd++;
11928 }
11929#else
11930 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11932 exit(1);
11933#endif
11934 }
11935 break;
11936 case 'x':
11937 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11938 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11939 else
11940 {
11941 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11943 exit(1);
11944 }
11945 break;
11946 case 's':
11947 shortList=true;
11948 break;
11949 case 'u':
11950 updateConfig=true;
11951 break;
11952 case 'e':
11953 {
11954 DString formatName=getArg(argc,argv,optInd);
11955 if (formatName.empty())
11956 {
11957 err("option \"-e\" is missing format specifier rtf.\n");
11959 exit(1);
11960 }
11961 if (dstricmp(formatName.data(),"rtf")==0)
11962 {
11963 if (optInd+1>=argc)
11964 {
11965 err("option \"-e rtf\" is missing an extensions file name\n");
11967 exit(1);
11968 }
11969 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11971 exit(0);
11972 }
11973 err("option \"-e\" has invalid format specifier.\n");
11975 exit(1);
11976 }
11977 break;
11978 case 'f':
11979 {
11980 DString listName=getArg(argc,argv,optInd);
11981 if (listName.empty())
11982 {
11983 err("option \"-f\" is missing list specifier.\n");
11985 exit(1);
11986 }
11987 if (dstricmp(listName.data(),"emoji")==0)
11988 {
11989 if (optInd+1>=argc)
11990 {
11991 err("option \"-f emoji\" is missing an output file name\n");
11993 exit(1);
11994 }
11995 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11997 exit(0);
11998 }
11999 err("option \"-f\" has invalid list specifier.\n");
12001 exit(1);
12002 }
12003 break;
12004 case 'w':
12005 {
12006 DString formatName=getArg(argc,argv,optInd);
12007 if (formatName.empty())
12008 {
12009 err("option \"-w\" is missing format specifier rtf, html or latex\n");
12011 exit(1);
12012 }
12013 if (dstricmp(formatName.data(),"rtf")==0)
12014 {
12015 if (optInd+1>=argc)
12016 {
12017 err("option \"-w rtf\" is missing a style sheet file name\n");
12019 exit(1);
12020 }
12021 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
12022 {
12023 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
12025 exit(1);
12026 }
12028 exit(0);
12029 }
12030 else if (dstricmp(formatName.data(),"html")==0)
12031 {
12032 Config::init();
12033 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
12034 // explicit config file mentioned or default found on disk
12035 {
12036 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
12037 if (!Config::parse(df)) // parse the config file
12038 {
12039 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
12041 exit(1);
12042 }
12043 }
12044 if (optInd+3>=argc)
12045 {
12046 err("option \"-w html\" does not have enough arguments\n");
12048 exit(1);
12049 }
12050 Config::postProcess(true);
12053 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12054 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
12055 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
12056 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
12058 exit(0);
12059 }
12060 else if (dstricmp(formatName.data(),"latex")==0)
12061 {
12062 Config::init();
12063 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
12064 {
12065 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
12066 if (!Config::parse(df))
12067 {
12068 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
12070 exit(1);
12071 }
12072 }
12073 if (optInd+3>=argc)
12074 {
12075 err("option \"-w latex\" does not have enough arguments\n");
12077 exit(1);
12078 }
12079 Config::postProcess(true);
12082 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12083 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
12084 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
12085 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
12087 exit(0);
12088 }
12089 else
12090 {
12091 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
12093 exit(1);
12094 }
12095 }
12096 break;
12097 case 'm':
12098 g_dumpSymbolMap = true;
12099 break;
12100 case 'v':
12101 version(false);
12103 exit(0);
12104 break;
12105 case 'V':
12106 version(true);
12108 exit(0);
12109 break;
12110 case '-':
12111 if (dstrcmp(&argv[optInd][2],"help")==0)
12112 {
12113 usage(argv[0],versionString);
12114 exit(0);
12115 }
12116 else if (dstrcmp(&argv[optInd][2],"version")==0)
12117 {
12118 version(false);
12120 exit(0);
12121 }
12122 else if ((dstrcmp(&argv[optInd][2],"Version")==0) ||
12123 (dstrcmp(&argv[optInd][2],"VERSION")==0))
12124 {
12125 version(true);
12127 exit(0);
12128 }
12129 else
12130 {
12131 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
12132 usage(argv[0],versionString);
12133 exit(1);
12134 }
12135 break;
12136 case 'b':
12137 setvbuf(stdout,nullptr,_IONBF,0);
12138 break;
12139 case 'q':
12140 quiet = true;
12141 break;
12142 case 'h':
12143 case '?':
12144 usage(argv[0],versionString);
12145 exit(0);
12146 break;
12147 default:
12148 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
12149 usage(argv[0],versionString);
12150 exit(1);
12151 }
12152 optInd++;
12153 }
12154
12155 /**************************************************************************
12156 * Parse or generate the config file *
12157 **************************************************************************/
12158
12159 initTracing(traceName.data(),traceTiming);
12160 TRACE("Doxygen version used: {}",getFullVersion());
12161 Config::init();
12162
12163 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
12164 if (optInd>=argc)
12165 {
12166 if (configFileInfo1.exists())
12167 {
12168 configName="Doxyfile";
12169 }
12170 else if (configFileInfo2.exists())
12171 {
12172 configName="doxyfile";
12173 }
12174 else if (genConfig)
12175 {
12176 configName="Doxyfile";
12177 }
12178 else
12179 {
12180 err("Doxyfile not found and no input file specified!\n");
12181 usage(argv[0],versionString);
12182 exit(1);
12183 }
12184 }
12185 else
12186 {
12187 FileInfo fi(argv[optInd]);
12188 if (fi.exists() || dstrcmp(argv[optInd],"-")==0 || genConfig)
12189 {
12190 configName=argv[optInd];
12191 }
12192 else
12193 {
12194 err("configuration file {} not found!\n",argv[optInd]);
12195 usage(argv[0],versionString);
12196 exit(1);
12197 }
12198 }
12199
12200 if (genConfig)
12201 {
12202 generateConfigFile(configName,shortList);
12204 exit(0);
12205 }
12206
12207 if (!Config::parse(configName,updateConfig,diffList))
12208 {
12209 err("could not open or read configuration file {}!\n",configName);
12211 exit(1);
12212 }
12213
12214 if (diffList!=Config::CompareMode::Full)
12215 {
12217 compareDoxyfile(diffList);
12219 exit(0);
12220 }
12221
12222 if (updateConfig)
12223 {
12225 generateConfigFile(configName,shortList,true);
12227 exit(0);
12228 }
12229
12230 /* Perlmod wants to know the path to the config file.*/
12231 FileInfo configFileInfo(configName.str());
12232 setPerlModDoxyfile(configFileInfo.absFilePath());
12233
12234 /* handle -q option */
12235 if (quiet) Config_updateBool(QUIET,true);
12236}
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:1629
static void writeFooterFile(TextStream &t)
Definition htmlgen.cpp:1635
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1623
static void writeFooterFile(TextStream &t)
Definition latexgen.cpp:696
static void writeStyleSheetFile(TextStream &t)
Definition latexgen.cpp:702
static void writeHeaderFile(TextStream &t)
Definition latexgen.cpp:690
static void writeStyleSheetFile(TextStream &t)
Definition rtfgen.cpp: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:4996

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

11479{
11480 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11481 // strip trailing slashes
11482 if (s.empty()) return;
11483
11484 g_pathsVisited.clear();
11485
11486 FileInfo fi(s.str());
11487 //printf("readFileOrDirectory(%s)\n",s);
11488 {
11489 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11490 {
11491 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11492 {
11493 }
11494 else if (!fi.exists() || !fi.isReadable())
11495 {
11496 if (errorIfNotExist)
11497 {
11498 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11499 }
11500 }
11501 else if (fi.isFile())
11502 {
11503 std::string dirPath = fi.dirPath(true);
11504 std::string filePath = fi.absFilePath();
11505 if (paths && !dirPath.empty())
11506 {
11507 paths->insert(dirPath);
11508 }
11509 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11510 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11511 {
11512 std::string name=fi.fileName();
11513 if (fnMap)
11514 {
11515 auto fd = createFileDef(dirPath+"/",name);
11516 if (!name.empty())
11517 {
11518 FileName *fn = fnMap->add(name);
11519 fn->push_back(std::move(fd));
11520 }
11521 }
11522 if (resultList || resultSet)
11523 {
11524 if (resultList) resultList->push_back(filePath);
11525 if (resultSet) resultSet->insert(filePath);
11526 }
11527
11528 if (killSet) killSet->insert(fi.absFilePath());
11529 }
11530 }
11531 else if (fi.isDir()) // readable dir
11532 {
11533 readDir(&fi,fnMap,exclSet,patList,
11534 exclPatList,resultList,resultSet,errorIfNotExist,
11535 recursive,killSet,paths);
11536 }
11537 }
11538 }
11539}
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().