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

12015{
12016 AUTO_TRACE();
12017 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12028
12029 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12030
12031 /* Set the global html file extension. */
12032 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12033
12034
12036 Config_getBool(CALLER_GRAPH) ||
12037 Config_getBool(REFERENCES_RELATION) ||
12038 Config_getBool(REFERENCED_BY_RELATION);
12039
12040 /**************************************************************************
12041 * Add custom extension mappings
12042 **************************************************************************/
12043
12044 StringVector extMaps = Config_getList(EXTENSION_MAPPING);
12045 for (const auto &mapping : extMaps)
12046 {
12047 DString mapStr = mapping;
12048 if (size_t i=mapStr.find('='); i==DString::npos)
12049 {
12050 continue;
12051 }
12052 else
12053 {
12054 DString ext = mapStr.left(i).stripWhiteSpace().lower();
12055 DString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12056 if (ext.empty() || language.empty())
12057 {
12058 continue;
12059 }
12060
12061 if (!updateLanguageMapping(ext,language))
12062 {
12063 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12064 "Check the EXTENSION_MAPPING setting in the config file.\n",
12065 ext,language);
12066 }
12067 else
12068 {
12069 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12070 ext,language);
12071 }
12072 }
12073 }
12074 // create input file exncodings
12075
12076 // check INPUT_ENCODING
12077 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12078 if (cd==reinterpret_cast<void *>(-1))
12079 {
12080 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12081 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12082 Config_getString(INPUT_ENCODING),strerror(errno));
12083 }
12084 else
12085 {
12087 }
12088
12089 // check and split INPUT_FILE_ENCODING
12090 StringVector fileEncod = Config_getList(INPUT_FILE_ENCODING);
12091 for (const auto &mapping : fileEncod)
12092 {
12093 DString mapStr = mapping;
12094 if (size_t i=mapStr.find('='); i==DString::npos)
12095 {
12096 continue;
12097 }
12098 else
12099 {
12100 DString pattern = mapStr.left(i).stripWhiteSpace().lower();
12101 DString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12102 if (pattern.empty() || encoding.empty())
12103 {
12104 continue;
12105 }
12106 cd = portable_iconv_open("UTF-8",encoding.data());
12107 if (cd==reinterpret_cast<void *>(-1))
12108 {
12109 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12110 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12111 encoding,strerror(errno));
12112 }
12113 else
12114 {
12116 }
12117
12118 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12119 }
12120 }
12121
12122 // add predefined macro name to a dictionary
12123 StringVector expandAsDefinedList = Config_getList(EXPAND_AS_DEFINED);
12124 for (const auto &s : expandAsDefinedList)
12125 {
12127 }
12128
12129 // read aliases and store them in a dictionary
12130 readAliases();
12131
12132 // store number of spaces in a tab into Doxygen::spaces
12133 int tabSize = Config_getInt(TAB_SIZE);
12134 Doxygen::spaces.resize(tabSize);
12135 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12136 Doxygen::spaces.at(tabSize)='\0';
12137}
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:4063

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

12004{
12005 AUTO_TRACE();
12006
12007 Config::postProcess(false);
12011}
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 11540 of file doxygen.cpp.

11541{
11545
11546 delete Doxygen::indexList;
11556 Doxygen::mainPage.reset();
11560 Doxygen::globalScope = nullptr;
11562 delete theTranslator;
11563 delete g_outputList;
11564
11569 delete Doxygen::dirLinkedMap;
11570 delete Doxygen::symbolMap;
11571}
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 13195 of file doxygen.cpp.

13196{
13197 AUTO_TRACE();
13198 /**************************************************************************
13199 * Initialize output generators *
13200 **************************************************************************/
13201
13202 /// add extra languages for which we can only produce syntax highlighted code
13204
13205 //// dump all symbols
13206 if (g_dumpSymbolMap)
13207 {
13208 dumpSymbolMap();
13209 exit(0);
13210 }
13211
13212 bool generateHtml = Config_getBool(GENERATE_HTML);
13213 bool generateLatex = Config_getBool(GENERATE_LATEX);
13214 bool generateMan = Config_getBool(GENERATE_MAN);
13215 bool generateRtf = Config_getBool(GENERATE_RTF);
13216 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13217
13218
13220 if (generateHtml)
13221 {
13225 }
13226 if (generateLatex)
13227 {
13230 }
13231 if (generateDocbook)
13232 {
13235 }
13236 if (generateMan)
13237 {
13240 }
13241 if (generateRtf)
13242 {
13245 }
13246 if (Config_getBool(USE_HTAGS))
13247 {
13248 Htags::useHtags = true;
13249 DString htmldir = Config_getString(HTML_OUTPUT);
13250 if (!Htags::execute(htmldir))
13251 err("USE_HTAGS is YES but htags(1) failed. \n");
13252 else if (!Htags::loadFilemap(htmldir))
13253 err("htags(1) ended normally but failed to load the filemap. \n");
13254 }
13255
13256 /**************************************************************************
13257 * Generate documentation *
13258 **************************************************************************/
13259
13260 g_s.begin("Generating style sheet...\n");
13261 //printf("writing style info\n");
13262 g_outputList->writeStyleInfo(0); // write first part
13263 g_s.end();
13264
13265 bool searchEngine = Config_getBool(SEARCHENGINE);
13266 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13267
13268 g_s.begin("Generating search indices...\n");
13269 if (searchEngine && !serverBasedSearch && generateHtml)
13270 {
13272 }
13273
13274 // generate search indices (need to do this before writing other HTML
13275 // pages as these contain a drop down menu with options depending on
13276 // what categories we find in this function.
13277 if (generateHtml && searchEngine)
13278 {
13279 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13280 Dir searchDir(searchDirName.str());
13281 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13282 {
13283 term("Could not create search results directory '{}' $PWD='{}'\n",
13284 searchDirName,Dir::currentDirPath());
13285 }
13286 HtmlGenerator::writeSearchData(searchDirName);
13287 if (!serverBasedSearch) // client side search index
13288 {
13290 }
13291 }
13292 g_s.end();
13293
13294 // copy static stuff
13295 if (generateHtml)
13296 {
13298 copyLogo(Config_getString(HTML_OUTPUT),true);
13299 copyIcon(Config_getString(HTML_OUTPUT),true);
13300 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13301 }
13302 if (generateLatex)
13303 {
13305 copyLogo(Config_getString(LATEX_OUTPUT),false);
13306 copyIcon(Config_getString(LATEX_OUTPUT),false);
13307 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13308 }
13309 if (generateDocbook)
13310 {
13311 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13312 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13313 }
13314 if (generateRtf)
13315 {
13316 copyLogo(Config_getString(RTF_OUTPUT),false);
13317 copyIcon(Config_getString(RTF_OUTPUT),false);
13318 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13319 }
13320
13322 if (fm.hasFormulas() && generateHtml
13323 && !Config_getBool(USE_MATHJAX))
13324 {
13325 g_s.begin("Generating images for formulas in HTML...\n");
13326 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13328 g_s.end();
13329 }
13330 if (fm.hasFormulas() && generateRtf)
13331 {
13332 g_s.begin("Generating images for formulas in RTF...\n");
13334 g_s.end();
13335 }
13336
13337 if (fm.hasFormulas() && generateDocbook)
13338 {
13339 g_s.begin("Generating images for formulas in Docbook...\n");
13341 g_s.end();
13342 }
13343
13344 g_s.begin("Generating example documentation...\n");
13346 g_s.end();
13347
13348 g_s.begin("Generating file sources...\n");
13350 g_s.end();
13351
13352 g_s.begin("Counting members...\n");
13353 // needs to be done after generating the sources
13354 // but before generating the compound documentation, see bug #12233
13355 countMembers();
13356 g_s.end();
13357
13358 g_s.begin("Generating file documentation...\n");
13360 g_s.end();
13361
13362 g_s.begin("Generating page documentation...\n");
13364 g_s.end();
13365
13366 g_s.begin("Generating group documentation...\n");
13368 g_s.end();
13369
13370 g_s.begin("Generating class documentation...\n");
13372 g_s.end();
13373
13374 g_s.begin("Generating concept documentation...\n");
13376 g_s.end();
13377
13378 g_s.begin("Generating module documentation...\n");
13380 g_s.end();
13381
13382 g_s.begin("Generating namespace documentation...\n");
13384 g_s.end();
13385
13386 if (Config_getBool(GENERATE_LEGEND))
13387 {
13388 g_s.begin("Generating graph info page...\n");
13390 g_s.end();
13391 }
13392
13393 g_s.begin("Generating directory documentation...\n");
13395 g_s.end();
13396
13397 if (g_outputList->size()>0)
13398 {
13400 }
13401
13402 g_s.begin("finalizing index lists...\n");
13404 g_s.end();
13405
13406 g_s.begin("writing tag file...\n");
13407 writeTagFile();
13408 g_s.end();
13409
13410 if (Config_getBool(GENERATE_XML))
13411 {
13412 g_s.begin("Generating XML output...\n");
13414 generateXML();
13416 g_s.end();
13417 }
13418 if (Config_getBool(GENERATE_SQLITE3))
13419 {
13420 g_s.begin("Generating SQLITE3 output...\n");
13422 g_s.end();
13423 }
13424
13425 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13426 {
13427 g_s.begin("Generating AutoGen DEF output...\n");
13428 generateDEF();
13429 g_s.end();
13430 }
13431 if (Config_getBool(GENERATE_PERLMOD))
13432 {
13433 g_s.begin("Generating Perl module output...\n");
13435 g_s.end();
13436 }
13437 if (generateHtml && searchEngine && serverBasedSearch)
13438 {
13439 g_s.begin("Generating search index\n");
13440 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13441 {
13443 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13444 }
13445 else // write data for external search index
13446 {
13448 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13449 if (searchDataFile.empty())
13450 {
13451 searchDataFile="searchdata.xml";
13452 }
13453 if (!Portable::isAbsolutePath(searchDataFile.data()))
13454 {
13455 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13456 }
13457 Doxygen::searchIndex.write(searchDataFile);
13458 }
13459 g_s.end();
13460 }
13461
13462 if (generateRtf)
13463 {
13464 g_s.begin("Combining RTF output...\n");
13465 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13466 {
13467 err("An error occurred during post-processing the RTF files!\n");
13468 }
13469 g_s.end();
13470 }
13471
13472 if (PlantumlManager::instance().needToRun())
13473 {
13474 g_s.begin("Running plantuml with JAVA...\n");
13476 g_s.end();
13477 }
13478
13479 if (MermaidManager::instance().needToRun())
13480 {
13481 g_s.begin("Running mermaid (mmdc)...\n");
13483 g_s.end();
13484 }
13485
13486 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13487 {
13488 g_s.begin("Running dot...\n");
13490 g_s.end();
13491 }
13492
13493 if (generateHtml &&
13494 Config_getBool(GENERATE_HTMLHELP) &&
13495 !Config_getString(HHC_LOCATION).empty())
13496 {
13497 g_s.begin("Running html help compiler...\n");
13499 g_s.end();
13500 }
13501
13502 if ( generateHtml &&
13503 Config_getBool(GENERATE_QHP) &&
13504 !Config_getString(QHG_LOCATION).empty())
13505 {
13506 g_s.begin("Running qhelpgenerator...\n");
13508 g_s.end();
13509 }
13510
13513
13515
13517 {
13518
13519 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13520 if (numThreads<1) numThreads=1;
13521 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13522 (static_cast<double>(Debug::elapsedTime())),
13523 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13524 );
13525 g_s.print();
13526
13528 msg("finished...\n");
13530 }
13531 else
13532 {
13533 msg("finished...\n");
13534 }
13535
13536
13537 /**************************************************************************
13538 * Start cleaning up *
13539 **************************************************************************/
13540
13542
13544 Dir thisDir;
13545 thisDir.remove(Doxygen::filterDBFileName.str());
13547 exitTracing();
13549 delete Doxygen::clangUsrMap;
13550 g_successfulRun=true;
13551
13552 //dumpDocNodeSizes();
13553}
DString & prepend(const char *s)
Definition dstring.h:515
const std::string & str() const
Definition dstring.h:645
@ Time
Definition debug.h:36
static void clearFlag(const DebugMask mask)
Definition debug.cpp:122
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
static double elapsedTime()
Definition debug.cpp:200
static void setFlag(const DebugMask mask)
Definition debug.cpp:117
Class representing a directory in the file system.
Definition dir.h:73
static std::string currentDirPath()
Definition dir.cpp:348
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:320
static void init()
bool run()
Definition dot.cpp:119
static DotManager * instance()
Definition dot.cpp:78
static DString filterDBFileName
Definition doxygen.h:124
static bool generatingXmlOutput
Definition doxygen.h:127
static SearchIndexIntf searchIndex
Definition doxygen.h:117
static ClangUsrMap * clangUsrMap
Definition doxygen.h:119
bool hasFormulas() const
Definition formula.cpp:720
void generateImages(const DString &outputDir, bool toIndex, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:635
Generator for HTML output.
Definition htmlgen.h:93
static void writeSearchData(const DString &dir)
Definition htmlgen.cpp:1455
static void init()
Definition htmlgen.cpp:1275
static void writeSearchPage()
Definition htmlgen.cpp:3272
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1439
static void writeExternalSearchPage()
Definition htmlgen.cpp:3371
void finalize()
Definition indexlist.h:104
Generator for LaTeX output.
Definition latexgen.h:93
static void init()
Definition latexgen.cpp:634
Generator for Man page output.
Definition mangen.h:69
static void init()
Definition mangen.cpp:275
void run()
Run mmdc tool for all collected diagrams.
Definition mermaid.cpp:255
static MermaidManager & instance()
Definition mermaid.cpp:38
void writeDocumentation(OutputList &ol)
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:311
void add()
Definition outputlist.h:348
size_t size() const
Definition outputlist.h:357
void writeStyleInfo(int part)
Definition outputlist.h:391
void cleanup()
Definition outputlist.h:748
static PlantumlManager & instance()
Definition plantuml.cpp:236
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:432
Generator for RTF output.
Definition rtfgen.h:80
static void init()
Definition rtfgen.cpp:464
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
Definition rtfgen.cpp:2468
void write(const DString &file)
void print()
Definition doxygen.cpp:250
void begin(const char *name)
Definition doxygen.cpp:237
void end()
Definition doxygen.cpp:243
static void showCacheUsage()
Show usage of the type lookup cache.
void generateDEF()
Definition defgen.cpp:463
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1189
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:8837
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8671
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9272
static void countMembers()
Definition doxygen.cpp:9133
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:9298
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4097
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5811
void finishWarnExit()
Definition message.cpp:291
void deinit()
double getSysElapsedTime()
Definition portable.cpp:113
bool isAbsolutePath(const DString &fileName)
Definition portable.cpp:513
void generatePerlMod()
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
void generateSqlite3()
static bool execute(const DString &htmldir)
Definition htags.cpp:41
static bool loadFilemap(const DString &htmldir)
Definition htags.cpp:110
static bool useHtags
Definition htags.h:23
void exitTracing()
Definition trace.cpp:55
void addCodeOnlyMappings()
Definition util.cpp:4162
void cleanupInlineGraphs()
Definition util.cpp:5398
void generateXML()
Definition xmlgen.cpp:2316

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

Referenced by main().

◆ initDoxygen()

void initDoxygen ( )

Definition at line 11470 of file doxygen.cpp.

11471{
11472 initResources();
11473 DString lang = Portable::getenv("LC_ALL");
11474 if (!lang.empty()) Portable::setenv("LANG",lang);
11475 std::setlocale(LC_ALL,"");
11476 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11477 std::setlocale(LC_NUMERIC,"C");
11478
11480
11504
11505 // register any additional parsers here...
11506
11508
11509#if USE_LIBCLANG
11511#endif
11520 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11521 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11522 //Doxygen::tagDestinationDict.setAutoDelete(true);
11524
11525 // initialization of these globals depends on
11526 // configuration switches so we need to postpone these
11527 Doxygen::globalScope = nullptr;
11537
11538}
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:4095

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

12527{
12528 AUTO_TRACE();
12529 std::atexit(exitDoxygen);
12530
12531 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12532
12533#if USE_LIBCLANG
12534 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12535#endif
12536
12537 // we would like to show the versionString earlier, but we first have to handle the configuration file
12538 // to know the value of the QUIET setting.
12539 DString versionString = getFullVersion();
12540 msg("Doxygen version used: {}\n",versionString);
12541
12543
12544 /**************************************************************************
12545 * Make sure the output directory exists
12546 **************************************************************************/
12547 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12548 if (!g_singleComment)
12549 {
12550 if (outputDirectory.empty())
12551 {
12552 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12553 }
12554 else
12555 {
12556 Dir dir(outputDirectory.str());
12557 if (!dir.exists())
12558 {
12559 dir.setPath(Dir::currentDirPath());
12560 if (!dir.mkdir(outputDirectory.str()))
12561 {
12562 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12563 "exist and cannot be created\n",outputDirectory);
12564 }
12565 else
12566 {
12567 msg("Notice: Output directory '{}' does not exist. "
12568 "I have created it for you.\n", outputDirectory);
12569 }
12570 dir.setPath(outputDirectory.str());
12571 }
12572 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12573 }
12574 }
12575 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12576
12577 /**************************************************************************
12578 * Initialize global lists and dictionaries
12579 **************************************************************************/
12580
12581#ifdef HAS_SIGNALS
12582 signal(SIGINT, stopDoxygen);
12583#endif
12584
12585 uint32_t pid = Portable::pid();
12586 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12587 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12588
12589 /**************************************************************************
12590 * Check/create output directories *
12591 **************************************************************************/
12592
12593 bool generateHtml = Config_getBool(GENERATE_HTML);
12594 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12595 bool generateXml = Config_getBool(GENERATE_XML);
12596 bool generateLatex = Config_getBool(GENERATE_LATEX);
12597 bool generateRtf = Config_getBool(GENERATE_RTF);
12598 bool generateMan = Config_getBool(GENERATE_MAN);
12599 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12600 DString htmlOutput;
12601 DString docbookOutput;
12602 DString xmlOutput;
12603 DString latexOutput;
12604 DString rtfOutput;
12605 DString manOutput;
12606 DString sqlOutput;
12607
12608 if (!g_singleComment)
12609 {
12610 if (generateHtml)
12611 {
12612 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12613 Config_updateString(HTML_OUTPUT,htmlOutput);
12614
12615 DString sitemapUrl = Config_getString(SITEMAP_URL);
12616 bool generateSitemap = !sitemapUrl.empty();
12617 if (generateSitemap && !sitemapUrl.endsWith("/"))
12618 {
12619 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12620 }
12621
12622 // add HTML indexers that are enabled
12623 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12624 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12625 bool generateQhp = Config_getBool(GENERATE_QHP);
12626 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12627 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12628 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12629 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12630 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12631 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12632 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12633 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12636 }
12637
12638 if (generateDocbook)
12639 {
12640 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12641 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12642 }
12643
12644 if (generateXml)
12645 {
12646 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12647 Config_updateString(XML_OUTPUT,xmlOutput);
12648 }
12649
12650 if (generateLatex)
12651 {
12652 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12653 Config_updateString(LATEX_OUTPUT,latexOutput);
12654 }
12655
12656 if (generateRtf)
12657 {
12658 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12659 Config_updateString(RTF_OUTPUT,rtfOutput);
12660 }
12661
12662 if (generateMan)
12663 {
12664 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12665 Config_updateString(MAN_OUTPUT,manOutput);
12666 }
12667
12668 if (generateSql)
12669 {
12670 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12671 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12672 }
12673 }
12674
12675 if (Config_getBool(HAVE_DOT))
12676 {
12677 DString curFontPath = Config_getString(DOT_FONTPATH);
12678 if (curFontPath.empty())
12679 {
12680 Portable::getenv("DOTFONTPATH");
12681 DString newFontPath = ".";
12682 if (!curFontPath.empty())
12683 {
12684 newFontPath+=Portable::pathListSeparator();
12685 newFontPath+=curFontPath;
12686 }
12687 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12688 }
12689 else
12690 {
12691 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12692 }
12693 }
12694
12695 /**************************************************************************
12696 * Handle layout file *
12697 **************************************************************************/
12698
12700 DString layoutFileName = Config_getString(LAYOUT_FILE);
12701 bool defaultLayoutUsed = false;
12702 if (layoutFileName.empty())
12703 {
12704 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12705 defaultLayoutUsed = true;
12706 }
12707 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12708
12709 FileInfo fi(layoutFileName.str());
12710 if (fi.exists())
12711 {
12712 msg("Parsing layout file {}...\n",layoutFileName);
12713 LayoutDocManager::instance().parse(layoutFileName);
12714 }
12715 else if (!defaultLayoutUsed)
12716 {
12717 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12718 }
12719 printLayout();
12720
12721 /**************************************************************************
12722 * Read and preprocess input *
12723 **************************************************************************/
12724
12725 // prevent search in the output directories
12726 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12727 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12728 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12729 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12730 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12731 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12732 if (generateMan) exclPatterns.push_back(manOutput.str());
12733 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12734
12735 if (!g_singleComment)
12736 {
12738
12740 }
12741
12742 // Notice: the order of the function calls below is very important!
12743
12744 if (generateHtml && !Config_getBool(USE_MATHJAX))
12745 {
12747 }
12748 if (generateRtf)
12749 {
12751 }
12752 if (generateDocbook)
12753 {
12755 }
12756
12758
12759 /**************************************************************************
12760 * Handle Tag Files *
12761 **************************************************************************/
12762
12763 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12764
12765 if (!g_singleComment)
12766 {
12767 msg("Reading and parsing tag files\n");
12768 StringVector tagFileList = Config_getList(TAGFILES);
12769 for (const auto &s : tagFileList)
12770 {
12771 readTagFile(root,s.c_str());
12772 }
12773 }
12774
12775 /**************************************************************************
12776 * Parse source files *
12777 **************************************************************************/
12778
12779 addSTLSupport(root);
12780
12781 g_s.begin("Parsing files\n");
12782 if (g_singleComment)
12783 {
12784 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12785 if (g_commentFileName=="-")
12786 {
12787 std::string text = fileToString(g_commentFileName).str();
12788 addTerminalCharIfMissing(text,'\n');
12789 generateHtmlForComment("stdin.md",text);
12790 }
12791 else if (FileInfo(g_commentFileName.str()).isFile())
12792 {
12793 std::string text;
12795 addTerminalCharIfMissing(text,'\n');
12797 }
12798 else
12799 {
12800 }
12802 exit(0);
12803 }
12804 else
12805 {
12806 if (Config_getInt(NUM_PROC_THREADS)==1)
12807 {
12809 }
12810 else
12811 {
12813 }
12814 }
12815 g_s.end();
12816
12817 /**************************************************************************
12818 * Gather information *
12819 **************************************************************************/
12820
12821 g_s.begin("Building macro definition list...\n");
12823 g_s.end();
12824
12825 g_s.begin("Building group list...\n");
12826 buildGroupList(root.get());
12827 organizeSubGroups(root.get());
12828 g_s.end();
12829
12830 g_s.begin("Building directory list...\n");
12832 findDirDocumentation(root.get());
12833 g_s.end();
12834
12835 g_s.begin("Building namespace list...\n");
12836 buildNamespaceList(root.get());
12837 findUsingDirectives(root.get());
12838 g_s.end();
12839
12840 g_s.begin("Building file list...\n");
12841 buildFileList(root.get());
12842 g_s.end();
12843
12844 g_s.begin("Building class list...\n");
12845 buildClassList(root.get());
12846 g_s.end();
12847
12848 g_s.begin("Building concept list...\n");
12849 buildConceptList(root.get());
12850 g_s.end();
12851
12852 // build list of using declarations here (global list)
12853 buildListOfUsingDecls(root.get());
12854 g_s.end();
12855
12856 g_s.begin("Computing nesting relations for classes...\n");
12858 g_s.end();
12859 // 1.8.2-20121111: no longer add nested classes to the group as well
12860 //distributeClassGroupRelations();
12861
12862 // calling buildClassList may result in cached relations that
12863 // become invalid after resolveClassNestingRelations(), that's why
12864 // we need to clear the cache here
12866 // we don't need the list of using declaration anymore
12867 g_usingDeclarations.clear();
12868
12869 g_s.begin("Associating documentation with classes...\n");
12870 buildClassDocList(root.get());
12871 g_s.end();
12872
12873 g_s.begin("Associating documentation with concepts...\n");
12874 buildConceptDocList(root.get());
12876 g_s.end();
12877
12878 g_s.begin("Associating documentation with modules...\n");
12879 findModuleDocumentation(root.get());
12880 g_s.end();
12881
12882 g_s.begin("Building example list...\n");
12883 buildExampleList(root.get());
12884 g_s.end();
12885
12886 g_s.begin("Searching for enumerations...\n");
12887 findEnums(root.get());
12888 g_s.end();
12889
12890 // Since buildVarList calls isVarWithConstructor
12891 // and this calls getResolvedClass we need to process
12892 // typedefs first so the relations between classes via typedefs
12893 // are properly resolved. See bug 536385 for an example.
12894 g_s.begin("Searching for documented typedefs...\n");
12895 buildTypedefList(root.get());
12896 g_s.end();
12897
12898 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12899 {
12900 g_s.begin("Searching for documented sequences...\n");
12901 buildSequenceList(root.get());
12902 g_s.end();
12903
12904 g_s.begin("Searching for documented dictionaries...\n");
12905 buildDictionaryList(root.get());
12906 g_s.end();
12907 }
12908
12909 g_s.begin("Searching for members imported via using declarations...\n");
12910 // this should be after buildTypedefList in order to properly import
12911 // used typedefs
12912 findUsingDeclarations(root.get(),true); // do for python packages first
12913 findUsingDeclarations(root.get(),false); // then the rest
12914 g_s.end();
12915
12916 g_s.begin("Searching for included using directives...\n");
12918 g_s.end();
12919
12920 g_s.begin("Searching for documented variables...\n");
12921 buildVarList(root.get());
12922 g_s.end();
12923
12924 g_s.begin("Building interface member list...\n");
12925 buildInterfaceAndServiceList(root.get()); // UNO IDL
12926
12927 g_s.begin("Building member list...\n"); // using class info only !
12928 buildFunctionList(root.get());
12929 g_s.end();
12930
12931 g_s.begin("Searching for friends...\n");
12932 findFriends();
12933 g_s.end();
12934
12935 g_s.begin("Searching for documented defines...\n");
12936 findDefineDocumentation(root.get());
12937 g_s.end();
12938
12939 g_s.begin("Computing class inheritance relations...\n");
12940 findClassEntries(root.get());
12942 g_s.end();
12943
12944 g_s.begin("Computing class usage relations...\n");
12946 g_s.end();
12947
12948 g_s.begin("Flushing cached template relations that have become invalid...\n");
12950 g_s.end();
12951
12952 g_s.begin("Warn for undocumented namespaces...\n");
12954 g_s.end();
12955
12956 g_s.begin("Computing class relations...\n");
12959 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12960 {
12962 }
12964 g_classEntries.clear();
12965 g_s.end();
12966
12967 g_s.begin("Add enum values to enums...\n");
12968 addEnumValuesToEnums(root.get());
12969 findEnumDocumentation(root.get());
12970 g_s.end();
12971
12972 g_s.begin("Searching for member function documentation...\n");
12973 findObjCMethodDefinitions(root.get());
12974 findMemberDocumentation(root.get()); // may introduce new members !
12975 findUsingDeclImports(root.get()); // may introduce new members !
12976 g_usingClassMap.clear();
12980 g_s.end();
12981
12982 // moved to after finding and copying documentation,
12983 // as this introduces new members see bug 722654
12984 g_s.begin("Creating members for template instances...\n");
12986 g_s.end();
12987
12988 g_s.begin("Searching for tag less structs...\n");
12990 g_s.end();
12991
12992 g_s.begin("Building page list...\n");
12993 buildPageList(root.get());
12994 g_s.end();
12995
12996 g_s.begin("Building requirements list...\n");
12997 buildRequirementsList(root.get());
12998 g_s.end();
12999
13000 g_s.begin("Search for main page...\n");
13001 findMainPage(root.get());
13002 findMainPageTagFiles(root.get());
13003 g_s.end();
13004
13005 g_s.begin("Computing page relations...\n");
13006 computePageRelations(root.get());
13008 g_s.end();
13009
13010 g_s.begin("Determining the scope of groups...\n");
13011 findGroupScope(root.get());
13012 g_s.end();
13013
13014 g_s.begin("Computing module relations...\n");
13015 auto &mm = ModuleManager::instance();
13016 mm.resolvePartitions();
13017 mm.resolveImports();
13018 mm.collectExportedSymbols();
13019 g_s.end();
13020
13021 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13022 {
13023 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13024 n2->memberName().data()+getPrefixIndex(n2->memberName())
13025 )<0;
13026 };
13027
13028 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13029 {
13030 if (Config_getBool(SORT_BY_SCOPE_NAME))
13031 {
13032 return dstricmp_sort(c1->name(), c2->name())<0;
13033 }
13034 else
13035 {
13036 int i = dstricmp_sort(c1->className(), c2->className());
13037 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13038 }
13039 };
13040
13041 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13042 {
13043 return dstricmp_sort(n1->name(),n2->name())<0;
13044 };
13045
13046 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13047 {
13048 return dstricmp_sort(c1->name(),c2->name())<0;
13049 };
13050
13051 g_s.begin("Sorting lists...\n");
13052 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13054 memberNameComp);
13055 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13057 memberNameComp);
13058 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13060 classComp);
13061 std::stable_sort(Doxygen::classLinkedMap->begin(),
13063 classComp);
13064 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13066 conceptComp);
13067 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13069 namespaceComp);
13070 g_s.end();
13071
13072 g_s.begin("Determining which enums are documented\n");
13074 g_s.end();
13075
13076 g_s.begin("Computing member relations...\n");
13079 g_s.end();
13080
13081 g_s.begin("Building full member lists recursively...\n");
13083 g_s.end();
13084
13085 g_s.begin("Adding members to member groups.\n");
13087 g_s.end();
13088
13089 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13090 {
13091 g_s.begin("Distributing member group documentation.\n");
13093 g_s.end();
13094 }
13095
13096 g_s.begin("Computing member references...\n");
13098 g_s.end();
13099
13100 if (Config_getBool(INHERIT_DOCS))
13101 {
13102 g_s.begin("Inheriting documentation...\n");
13104 g_s.end();
13105 }
13106
13107
13108 // compute the shortest possible names of all files
13109 // without losing the uniqueness of the file names.
13110 g_s.begin("Generating disk names...\n");
13112 g_s.end();
13113
13114 g_s.begin("Adding source references...\n");
13116 g_s.end();
13117
13118 g_s.begin("Adding xrefitems...\n");
13121 g_s.end();
13122
13123 g_s.begin("Adding requirements...\n");
13126 g_s.end();
13127
13128 g_s.begin("Sorting member lists...\n");
13130 g_s.end();
13131
13132 g_s.begin("Setting anonymous enum type...\n");
13134 g_s.end();
13135
13136 g_s.begin("Computing dependencies between directories...\n");
13138 g_s.end();
13139
13140 g_s.begin("Generating citations page...\n");
13142 g_s.end();
13143
13144 g_s.begin("Counting data structures...\n");
13146 g_s.end();
13147
13148 g_s.begin("Resolving user defined references...\n");
13150 g_s.end();
13151
13152 g_s.begin("Finding anchors and sections in the documentation...\n");
13154 g_s.end();
13155
13156 g_s.begin("Transferring function references...\n");
13158 g_s.end();
13159
13160 g_s.begin("Combining using relations...\n");
13162 g_s.end();
13163
13165 g_s.begin("Adding members to index pages...\n");
13167 addToIndices();
13168 g_s.end();
13169
13170 g_s.begin("Correcting members for VHDL...\n");
13172 g_s.end();
13173
13174 g_s.begin("Computing tooltip texts...\n");
13176 g_s.end();
13177
13178 if (Config_getBool(SORT_GROUP_NAMES))
13179 {
13180 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13182 [](const auto &g1,const auto &g2)
13183 { return g1->groupTitle() < g2->groupTitle(); });
13184
13185 for (const auto &gd : *Doxygen::groupLinkedMap)
13186 {
13187 gd->sortSubGroups();
13188 }
13189 }
13190
13191 printNavTree(root.get(),0);
13193}
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:1471
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1438
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:1098
void computeDirDependencies()
Definition dirdef.cpp:1172
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:54
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5386
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:435
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2179
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9514
static void computeTemplateClassRelations()
Definition doxygen.cpp:5480
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5659
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2332
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9714
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5435
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1331
static void resolveClassNestingRelations()
Definition doxygen.cpp:1386
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5351
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8473
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5549
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4510
static void addMembersToMemberGroup()
Definition doxygen.cpp:9379
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9883
static void distributeConceptGroups()
Definition doxygen.cpp:1353
static void transferFunctionDocumentation()
Definition doxygen.cpp:4429
static void setAnonymousEnumType()
Definition doxygen.cpp:9119
static void sortMemberLists()
Definition doxygen.cpp:9024
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8601
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4559
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7618
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3498
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:450
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9627
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7588
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9417
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7821
static void resolveUserReferences()
Definition doxygen.cpp:9945
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9774
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3635
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3598
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1838
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2582
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:494
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4332
static void findEnums(const Entry *root)
Definition doxygen.cpp:7646
static DString g_commentFileName
Definition doxygen.cpp:196
static void addListReferences()
Definition doxygen.cpp:5650
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8263
static void findMainPage(Entry *root)
Definition doxygen.cpp:9813
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2022
static void addSourceReferences()
Definition doxygen.cpp:8897
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9319
static void flushUnresolvedRelations()
Definition doxygen.cpp:9556
static void findDocumentedEnumValues()
Definition doxygen.cpp:8255
static void findTagLessClasses()
Definition doxygen.cpp:1786
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8305
static void computeClassRelations()
Definition doxygen.cpp:5455
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4027
static void checkPageRelations()
Definition doxygen.cpp:9925
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1321
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8144
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9895
static StringSet g_usingDeclarations
Definition doxygen.cpp:193
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3616
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1156
static void buildPageList(Entry *root)
Definition doxygen.cpp:9786
static void addRequirementReferences()
Definition doxygen.cpp:5642
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:197
static void findSectionsInDocumentation()
Definition doxygen.cpp:9455
static void mergeCategories()
Definition doxygen.cpp:8620
static void buildFileList(const Entry *root)
Definition doxygen.cpp:606
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1146
static void findUsedTemplateInstances()
Definition doxygen.cpp:5419
static void computeTooltipTexts()
Definition doxygen.cpp:9073
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8641
static void combineUsingRelations()
Definition doxygen.cpp:9354
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2330
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1341
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:4462
static void buildDefineList()
Definition doxygen.cpp:8976
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3730
static void computeMemberRelations()
Definition doxygen.cpp:8585
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2166
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:1823
#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:4374
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1053
int getPrefixIndex(const DString &name)
Definition util.cpp:2651

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

11574{
11575 DString versionString = getFullVersion();
11576
11577 // helper that calls \a func to write to file \a fileName via a TextStream
11578 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11579 {
11580 std::ofstream f;
11581 if (openOutputFile(fileName,f))
11582 {
11583 TextStream t(&f);
11584 func(t);
11585 return true;
11586 }
11587 return false;
11588 };
11589
11590
11591 /**************************************************************************
11592 * Handle arguments *
11593 **************************************************************************/
11594
11595 int optInd=1;
11596 DString configName;
11597 DString traceName;
11598 bool genConfig=false;
11599 bool shortList=false;
11600 bool traceTiming=false;
11602 bool updateConfig=false;
11603 bool quiet = false;
11604 while (optInd<argc && argv[optInd][0]=='-' &&
11605 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11606 argv[optInd][1]=='-')
11607 )
11608 {
11609 switch(argv[optInd][1])
11610 {
11611 case 'g':
11612 {
11613 genConfig=true;
11614 }
11615 break;
11616 case 'l':
11617 {
11618 DString layoutName;
11619 if (optInd+1>=argc)
11620 {
11621 layoutName="DoxygenLayout.xml";
11622 }
11623 else
11624 {
11625 layoutName=argv[optInd+1];
11626 }
11627 writeDefaultLayoutFile(layoutName);
11629 exit(0);
11630 }
11631 break;
11632 case 'c':
11633 if (optInd+1>=argc) // no file name given
11634 {
11635 msg("option \"-c\" is missing the file name to read\n");
11636 devUsage();
11638 exit(1);
11639 }
11640 else
11641 {
11642 g_commentFileName=argv[optInd+1];
11643 optInd++;
11644 }
11645 g_singleComment=true;
11646 quiet=true;
11647 break;
11648 case 'd':
11649 {
11650 DString debugLabel=getArg(argc,argv,optInd);
11651 if (debugLabel.empty())
11652 {
11653 devUsage();
11655 exit(0);
11656 }
11657 int retVal = Debug::setFlagStr(debugLabel);
11658 if (!retVal)
11659 {
11660 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11661 devUsage();
11663 exit(1);
11664 }
11665 }
11666 break;
11667 case 't':
11668 {
11669#if ENABLE_TRACING
11670 if (!strcmp(argv[optInd]+1,"t_time"))
11671 {
11672 traceTiming = true;
11673 }
11674 else if (!strcmp(argv[optInd]+1,"t"))
11675 {
11676 traceTiming = false;
11677 }
11678 else
11679 {
11680 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11682 exit(1);
11683 }
11684 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11685 {
11686 traceName="stdout";
11687 }
11688 else
11689 {
11690 traceName=argv[optInd+1];
11691 optInd++;
11692 }
11693#else
11694 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11696 exit(1);
11697#endif
11698 }
11699 break;
11700 case 'x':
11701 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11702 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11703 else
11704 {
11705 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11707 exit(1);
11708 }
11709 break;
11710 case 's':
11711 shortList=true;
11712 break;
11713 case 'u':
11714 updateConfig=true;
11715 break;
11716 case 'e':
11717 {
11718 DString formatName=getArg(argc,argv,optInd);
11719 if (formatName.empty())
11720 {
11721 err("option \"-e\" is missing format specifier rtf.\n");
11723 exit(1);
11724 }
11725 if (dstricmp(formatName.data(),"rtf")==0)
11726 {
11727 if (optInd+1>=argc)
11728 {
11729 err("option \"-e rtf\" is missing an extensions file name\n");
11731 exit(1);
11732 }
11733 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11735 exit(0);
11736 }
11737 err("option \"-e\" has invalid format specifier.\n");
11739 exit(1);
11740 }
11741 break;
11742 case 'f':
11743 {
11744 DString listName=getArg(argc,argv,optInd);
11745 if (listName.empty())
11746 {
11747 err("option \"-f\" is missing list specifier.\n");
11749 exit(1);
11750 }
11751 if (dstricmp(listName.data(),"emoji")==0)
11752 {
11753 if (optInd+1>=argc)
11754 {
11755 err("option \"-f emoji\" is missing an output file name\n");
11757 exit(1);
11758 }
11759 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11761 exit(0);
11762 }
11763 err("option \"-f\" has invalid list specifier.\n");
11765 exit(1);
11766 }
11767 break;
11768 case 'w':
11769 {
11770 DString formatName=getArg(argc,argv,optInd);
11771 if (formatName.empty())
11772 {
11773 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11775 exit(1);
11776 }
11777 if (dstricmp(formatName.data(),"rtf")==0)
11778 {
11779 if (optInd+1>=argc)
11780 {
11781 err("option \"-w rtf\" is missing a style sheet file name\n");
11783 exit(1);
11784 }
11785 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11786 {
11787 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11789 exit(1);
11790 }
11792 exit(0);
11793 }
11794 else if (dstricmp(formatName.data(),"html")==0)
11795 {
11796 Config::init();
11797 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11798 // explicit config file mentioned or default found on disk
11799 {
11800 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11801 if (!Config::parse(df)) // parse the config file
11802 {
11803 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11805 exit(1);
11806 }
11807 }
11808 if (optInd+3>=argc)
11809 {
11810 err("option \"-w html\" does not have enough arguments\n");
11812 exit(1);
11813 }
11814 Config::postProcess(true);
11817 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11818 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11819 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11820 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11822 exit(0);
11823 }
11824 else if (dstricmp(formatName.data(),"latex")==0)
11825 {
11826 Config::init();
11827 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11828 {
11829 DString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? DString("Doxyfile") : DString("doxyfile"));
11830 if (!Config::parse(df))
11831 {
11832 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11834 exit(1);
11835 }
11836 }
11837 if (optInd+3>=argc)
11838 {
11839 err("option \"-w latex\" does not have enough arguments\n");
11841 exit(1);
11842 }
11843 Config::postProcess(true);
11846 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11847 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11848 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11849 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11851 exit(0);
11852 }
11853 else
11854 {
11855 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11857 exit(1);
11858 }
11859 }
11860 break;
11861 case 'm':
11862 g_dumpSymbolMap = true;
11863 break;
11864 case 'v':
11865 version(false);
11867 exit(0);
11868 break;
11869 case 'V':
11870 version(true);
11872 exit(0);
11873 break;
11874 case '-':
11875 if (dstrcmp(&argv[optInd][2],"help")==0)
11876 {
11877 usage(argv[0],versionString);
11878 exit(0);
11879 }
11880 else if (dstrcmp(&argv[optInd][2],"version")==0)
11881 {
11882 version(false);
11884 exit(0);
11885 }
11886 else if ((dstrcmp(&argv[optInd][2],"Version")==0) ||
11887 (dstrcmp(&argv[optInd][2],"VERSION")==0))
11888 {
11889 version(true);
11891 exit(0);
11892 }
11893 else
11894 {
11895 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11896 usage(argv[0],versionString);
11897 exit(1);
11898 }
11899 break;
11900 case 'b':
11901 setvbuf(stdout,nullptr,_IONBF,0);
11902 break;
11903 case 'q':
11904 quiet = true;
11905 break;
11906 case 'h':
11907 case '?':
11908 usage(argv[0],versionString);
11909 exit(0);
11910 break;
11911 default:
11912 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11913 usage(argv[0],versionString);
11914 exit(1);
11915 }
11916 optInd++;
11917 }
11918
11919 /**************************************************************************
11920 * Parse or generate the config file *
11921 **************************************************************************/
11922
11923 initTracing(traceName.data(),traceTiming);
11924 TRACE("Doxygen version used: {}",getFullVersion());
11925 Config::init();
11926
11927 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11928 if (optInd>=argc)
11929 {
11930 if (configFileInfo1.exists())
11931 {
11932 configName="Doxyfile";
11933 }
11934 else if (configFileInfo2.exists())
11935 {
11936 configName="doxyfile";
11937 }
11938 else if (genConfig)
11939 {
11940 configName="Doxyfile";
11941 }
11942 else
11943 {
11944 err("Doxyfile not found and no input file specified!\n");
11945 usage(argv[0],versionString);
11946 exit(1);
11947 }
11948 }
11949 else
11950 {
11951 FileInfo fi(argv[optInd]);
11952 if (fi.exists() || dstrcmp(argv[optInd],"-")==0 || genConfig)
11953 {
11954 configName=argv[optInd];
11955 }
11956 else
11957 {
11958 err("configuration file {} not found!\n",argv[optInd]);
11959 usage(argv[0],versionString);
11960 exit(1);
11961 }
11962 }
11963
11964 if (genConfig)
11965 {
11966 generateConfigFile(configName,shortList);
11968 exit(0);
11969 }
11970
11971 if (!Config::parse(configName,updateConfig,diffList))
11972 {
11973 err("could not open or read configuration file {}!\n",configName);
11975 exit(1);
11976 }
11977
11978 if (diffList!=Config::CompareMode::Full)
11979 {
11981 compareDoxyfile(diffList);
11983 exit(0);
11984 }
11985
11986 if (updateConfig)
11987 {
11989 generateConfigFile(configName,shortList,true);
11991 exit(0);
11992 }
11993
11994 /* Perlmod wants to know the path to the config file.*/
11995 FileInfo configFileInfo(configName.str());
11996 setPerlModDoxyfile(configFileInfo.absFilePath());
11997
11998 /* handle -q option */
11999 if (quiet) Config_updateBool(QUIET,true);
12000}
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:1735
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:4986

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

11243{
11244 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11245 // strip trailing slashes
11246 if (s.empty()) return;
11247
11248 g_pathsVisited.clear();
11249
11250 FileInfo fi(s.str());
11251 //printf("readFileOrDirectory(%s)\n",s);
11252 {
11253 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11254 {
11255 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11256 {
11257 }
11258 else if (!fi.exists() || !fi.isReadable())
11259 {
11260 if (errorIfNotExist)
11261 {
11262 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11263 }
11264 }
11265 else if (fi.isFile())
11266 {
11267 std::string dirPath = fi.dirPath(true);
11268 std::string filePath = fi.absFilePath();
11269 if (paths && !dirPath.empty())
11270 {
11271 paths->insert(dirPath);
11272 }
11273 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11274 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11275 {
11276 std::string name=fi.fileName();
11277 if (fnMap)
11278 {
11279 auto fd = createFileDef(dirPath+"/",name);
11280 if (!name.empty())
11281 {
11282 FileName *fn = fnMap->add(name);
11283 fn->push_back(std::move(fd));
11284 }
11285 }
11286 if (resultList || resultSet)
11287 {
11288 if (resultList) resultList->push_back(filePath);
11289 if (resultSet) resultSet->insert(filePath);
11290 }
11291
11292 if (killSet) killSet->insert(fi.absFilePath());
11293 }
11294 }
11295 else if (fi.isDir()) // readable dir
11296 {
11297 readDir(&fi,fnMap,exclSet,patList,
11298 exclPatList,resultList,resultSet,errorIfNotExist,
11299 recursive,killSet,paths);
11300 }
11301 }
11302 }
11303}
Class representing all files with a certain base name.
Definition filename.h:31
static StringUnorderedSet g_pathsVisited(1009)
static void readDir(FileInfo *fi, FileNameLinkedMap *fnMap, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool errorIfNotExist, bool recursive, StringUnorderedSet *killSet, StringUnorderedSet *paths)
std::unique_ptr< FileDef > createFileDef(const DString &p, const DString &n, const DString &ref, const DString &dn)
Definition filedef.cpp:269

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

Referenced by searchInputFiles().