Doxygen
Loading...
Searching...
No Matches
doxygen.h File Reference
#include <mutex>
#include "containers.h"
#include "membergroup.h"
#include "dirdef.h"
#include "memberlist.h"
#include "define.h"
#include "cache.h"
#include "symbolmap.h"
#include "searchindex.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 31 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 82 of file doxygen.h.

◆ InputFileEncodingList

Definition at line 80 of file doxygen.h.

◆ NamespaceAliasInfoMap

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

Definition at line 86 of file doxygen.h.

◆ StaticInitMap

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

Definition at line 84 of file doxygen.h.

Function Documentation

◆ adjustConfiguration()

void adjustConfiguration ( )

adjust globals that depend on configuration settings.

Definition at line 12008 of file doxygen.cpp.

12009{
12010 AUTO_TRACE();
12011 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
12022
12023 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
12024
12025 /* Set the global html file extension. */
12026 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12027
12028
12030 Config_getBool(CALLER_GRAPH) ||
12031 Config_getBool(REFERENCES_RELATION) ||
12032 Config_getBool(REFERENCED_BY_RELATION);
12033
12034 /**************************************************************************
12035 * Add custom extension mappings
12036 **************************************************************************/
12037
12038 StringVector extMaps = Config_getList(EXTENSION_MAPPING);
12039 for (const auto &mapping : extMaps)
12040 {
12041 DString mapStr = mapping;
12042 if (size_t i=mapStr.find('='); i==DString::npos)
12043 {
12044 continue;
12045 }
12046 else
12047 {
12048 DString ext = mapStr.left(i).stripWhiteSpace().lower();
12049 DString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12050 if (ext.empty() || language.empty())
12051 {
12052 continue;
12053 }
12054
12055 if (!updateLanguageMapping(ext,language))
12056 {
12057 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12058 "Check the EXTENSION_MAPPING setting in the config file.\n",
12059 ext,language);
12060 }
12061 else
12062 {
12063 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12064 ext,language);
12065 }
12066 }
12067 }
12068 // create input file exncodings
12069
12070 // check INPUT_ENCODING
12071 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12072 if (cd==reinterpret_cast<void *>(-1))
12073 {
12074 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12075 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12076 Config_getString(INPUT_ENCODING),strerror(errno));
12077 }
12078 else
12079 {
12081 }
12082
12083 // check and split INPUT_FILE_ENCODING
12084 StringVector fileEncod = Config_getList(INPUT_FILE_ENCODING);
12085 for (const auto &mapping : fileEncod)
12086 {
12087 DString mapStr = mapping;
12088 if (size_t i=mapStr.find('='); i==DString::npos)
12089 {
12090 continue;
12091 }
12092 else
12093 {
12094 DString pattern = mapStr.left(i).stripWhiteSpace().lower();
12095 DString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12096 if (pattern.empty() || encoding.empty())
12097 {
12098 continue;
12099 }
12100 cd = portable_iconv_open("UTF-8",encoding.data());
12101 if (cd==reinterpret_cast<void *>(-1))
12102 {
12103 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12104 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12105 encoding,strerror(errno));
12106 }
12107 else
12108 {
12110 }
12111
12112 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12113 }
12114 }
12115
12116 // add predefined macro name to a dictionary
12117 StringVector expandAsDefinedList = Config_getList(EXPAND_AS_DEFINED);
12118 for (const auto &s : expandAsDefinedList)
12119 {
12121 }
12122
12123 // read aliases and store them in a dictionary
12124 readAliases();
12125
12126 // store number of spaces in a tab into Doxygen::spaces
12127 int tabSize = Config_getInt(TAB_SIZE);
12128 Doxygen::spaces.resize(tabSize);
12129 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12130 Doxygen::spaces.at(tabSize)='\0';
12131}
void readAliases()
Definition aliases.cpp:161
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:89
void resize(size_t newlen)
Definition dstring.h:214
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:323
DString lower() const
Definition dstring.h:331
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:153
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:183
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:691
size_t find(char c, size_t pos=0) const
Definition dstring.h:244
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:342
DString left(size_t len) const
Definition dstring.h:311
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:162
static FileNameLinkedMap * plantUmlFileNameLinkedMap
Definition doxygen.h:109
static bool parseSourcesNeeded
Definition doxygen.h:123
static StringUnorderedSet expandAsDefinedSet
Definition doxygen.h:119
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:104
static InputFileEncodingList inputFileEncodingList
Definition doxygen.h:138
static FileNameLinkedMap * dotFileNameLinkedMap
Definition doxygen.h:106
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static FileNameLinkedMap * imageNameLinkedMap
Definition doxygen.h:105
static FileNameLinkedMap * mscFileNameLinkedMap
Definition doxygen.h:107
static FileNameLinkedMap * mermaidFileNameLinkedMap
Definition doxygen.h:110
static FileNameLinkedMap * diaFileNameLinkedMap
Definition doxygen.h:108
static DString spaces
Definition doxygen.h:133
static std::unique_ptr< NamespaceDef > globalNamespaceDef
Definition doxygen.h:120
static DString htmlFileExtension
Definition doxygen.h:122
static FileNameLinkedMap * includeNameLinkedMap
Definition doxygen.h:101
static FileNameLinkedMap * exampleNameLinkedMap
Definition doxygen.h:102
Ordered dictionary of FileName objects.
Definition filename.h:69
#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:50
void setTranslator(OUTPUT_LANGUAGE_t langName)
Definition language.cpp:73
#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:4130

References adjustConfiguration(), 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 adjustConfiguration(), and main().

◆ checkConfiguration()

void checkConfiguration ( )

check and resolve config options

Definition at line 11997 of file doxygen.cpp.

11998{
11999 AUTO_TRACE();
12000
12001 Config::postProcess(false);
12005}
void initWarningFormat()
Definition message.cpp:231
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void updateObsolete()

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

Referenced by checkConfiguration(), and main().

◆ cleanUpDoxygen()

void cleanUpDoxygen ( )

Definition at line 11534 of file doxygen.cpp.

11535{
11539
11540 delete Doxygen::indexList;
11550 Doxygen::mainPage.reset();
11554 Doxygen::globalScope = nullptr;
11556 delete theTranslator;
11557 delete g_outputList;
11558
11563 delete Doxygen::dirLinkedMap;
11564 delete Doxygen::symbolMap;
11565}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:115
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:100
static ParserManager * parserManager
Definition doxygen.h:129
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:112
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:98
static IndexList * indexList
Definition doxygen.h:132
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:127
static MemberNameLinkedMap * memberNameLinkedMap
Definition doxygen.h:111
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:125
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:114
static FormulaManager & instance()
Definition formula.cpp:53
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:189
Translator * theTranslator
Definition language.cpp:71

References cleanUpDoxygen(), 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 cleanUpDoxygen(), generateOutput(), parseInput(), readConfiguration(), and stopDoxygen().

◆ generateOutput()

void generateOutput ( )

add extra languages for which we can only produce syntax highlighted code

Definition at line 13189 of file doxygen.cpp.

13190{
13191 AUTO_TRACE();
13192 /**************************************************************************
13193 * Initialize output generators *
13194 **************************************************************************/
13195
13196 /// add extra languages for which we can only produce syntax highlighted code
13198
13199 //// dump all symbols
13200 if (g_dumpSymbolMap)
13201 {
13202 dumpSymbolMap();
13203 exit(0);
13204 }
13205
13206 bool generateHtml = Config_getBool(GENERATE_HTML);
13207 bool generateLatex = Config_getBool(GENERATE_LATEX);
13208 bool generateMan = Config_getBool(GENERATE_MAN);
13209 bool generateRtf = Config_getBool(GENERATE_RTF);
13210 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13211
13212
13214 if (generateHtml)
13215 {
13219 }
13220 if (generateLatex)
13221 {
13224 }
13225 if (generateDocbook)
13226 {
13229 }
13230 if (generateMan)
13231 {
13234 }
13235 if (generateRtf)
13236 {
13239 }
13240 if (Config_getBool(USE_HTAGS))
13241 {
13242 Htags::useHtags = true;
13243 DString htmldir = Config_getString(HTML_OUTPUT);
13244 if (!Htags::execute(htmldir))
13245 err("USE_HTAGS is YES but htags(1) failed. \n");
13246 else if (!Htags::loadFilemap(htmldir))
13247 err("htags(1) ended normally but failed to load the filemap. \n");
13248 }
13249
13250 /**************************************************************************
13251 * Generate documentation *
13252 **************************************************************************/
13253
13254 g_s.begin("Generating style sheet...\n");
13255 //printf("writing style info\n");
13256 g_outputList->writeStyleInfo(0); // write first part
13257 g_s.end();
13258
13259 bool searchEngine = Config_getBool(SEARCHENGINE);
13260 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13261
13262 g_s.begin("Generating search indices...\n");
13263 if (searchEngine && !serverBasedSearch && generateHtml)
13264 {
13266 }
13267
13268 // generate search indices (need to do this before writing other HTML
13269 // pages as these contain a drop down menu with options depending on
13270 // what categories we find in this function.
13271 if (generateHtml && searchEngine)
13272 {
13273 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13274 Dir searchDir(searchDirName.str());
13275 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13276 {
13277 term("Could not create search results directory '{}' $PWD='{}'\n",
13278 searchDirName,Dir::currentDirPath());
13279 }
13280 HtmlGenerator::writeSearchData(searchDirName);
13281 if (!serverBasedSearch) // client side search index
13282 {
13284 }
13285 }
13286 g_s.end();
13287
13288 // copy static stuff
13289 if (generateHtml)
13290 {
13292 copyLogo(Config_getString(HTML_OUTPUT),true);
13293 copyIcon(Config_getString(HTML_OUTPUT),true);
13294 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13295 }
13296 if (generateLatex)
13297 {
13299 copyLogo(Config_getString(LATEX_OUTPUT),false);
13300 copyIcon(Config_getString(LATEX_OUTPUT),false);
13301 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13302 }
13303 if (generateDocbook)
13304 {
13305 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13306 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13307 }
13308 if (generateRtf)
13309 {
13310 copyLogo(Config_getString(RTF_OUTPUT),false);
13311 copyIcon(Config_getString(RTF_OUTPUT),false);
13312 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13313 }
13314
13316 if (fm.hasFormulas() && generateHtml
13317 && !Config_getBool(USE_MATHJAX))
13318 {
13319 g_s.begin("Generating images for formulas in HTML...\n");
13320 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13322 g_s.end();
13323 }
13324 if (fm.hasFormulas() && generateRtf)
13325 {
13326 g_s.begin("Generating images for formulas in RTF...\n");
13328 g_s.end();
13329 }
13330
13331 if (fm.hasFormulas() && generateDocbook)
13332 {
13333 g_s.begin("Generating images for formulas in Docbook...\n");
13335 g_s.end();
13336 }
13337
13338 g_s.begin("Generating example documentation...\n");
13340 g_s.end();
13341
13342 g_s.begin("Generating file sources...\n");
13344 g_s.end();
13345
13346 g_s.begin("Counting members...\n");
13347 // needs to be done after generating the sources
13348 // but before generating the compound documentation, see bug #12233
13349 countMembers();
13350 g_s.end();
13351
13352 g_s.begin("Generating file documentation...\n");
13354 g_s.end();
13355
13356 g_s.begin("Generating page documentation...\n");
13358 g_s.end();
13359
13360 g_s.begin("Generating group documentation...\n");
13362 g_s.end();
13363
13364 g_s.begin("Generating class documentation...\n");
13366 g_s.end();
13367
13368 g_s.begin("Generating concept documentation...\n");
13370 g_s.end();
13371
13372 g_s.begin("Generating module documentation...\n");
13374 g_s.end();
13375
13376 g_s.begin("Generating namespace documentation...\n");
13378 g_s.end();
13379
13380 if (Config_getBool(GENERATE_LEGEND))
13381 {
13382 g_s.begin("Generating graph info page...\n");
13384 g_s.end();
13385 }
13386
13387 g_s.begin("Generating directory documentation...\n");
13389 g_s.end();
13390
13391 if (g_outputList->size()>0)
13392 {
13394 }
13395
13396 g_s.begin("finalizing index lists...\n");
13398 g_s.end();
13399
13400 g_s.begin("writing tag file...\n");
13401 writeTagFile();
13402 g_s.end();
13403
13404 if (Config_getBool(GENERATE_XML))
13405 {
13406 g_s.begin("Generating XML output...\n");
13408 generateXML();
13410 g_s.end();
13411 }
13412 if (Config_getBool(GENERATE_SQLITE3))
13413 {
13414 g_s.begin("Generating SQLITE3 output...\n");
13416 g_s.end();
13417 }
13418
13419 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13420 {
13421 g_s.begin("Generating AutoGen DEF output...\n");
13422 generateDEF();
13423 g_s.end();
13424 }
13425 if (Config_getBool(GENERATE_PERLMOD))
13426 {
13427 g_s.begin("Generating Perl module output...\n");
13429 g_s.end();
13430 }
13431 if (generateHtml && searchEngine && serverBasedSearch)
13432 {
13433 g_s.begin("Generating search index\n");
13434 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13435 {
13437 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13438 }
13439 else // write data for external search index
13440 {
13442 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13443 if (searchDataFile.empty())
13444 {
13445 searchDataFile="searchdata.xml";
13446 }
13447 if (!Portable::isAbsolutePath(searchDataFile.data()))
13448 {
13449 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13450 }
13451 Doxygen::searchIndex.write(searchDataFile);
13452 }
13453 g_s.end();
13454 }
13455
13456 if (generateRtf)
13457 {
13458 g_s.begin("Combining RTF output...\n");
13459 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13460 {
13461 err("An error occurred during post-processing the RTF files!\n");
13462 }
13463 g_s.end();
13464 }
13465
13466 if (PlantumlManager::instance().needToRun())
13467 {
13468 g_s.begin("Running plantuml with JAVA...\n");
13470 g_s.end();
13471 }
13472
13473 if (MermaidManager::instance().needToRun())
13474 {
13475 g_s.begin("Running mermaid (mmdc)...\n");
13477 g_s.end();
13478 }
13479
13480 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13481 {
13482 g_s.begin("Running dot...\n");
13484 g_s.end();
13485 }
13486
13487 if (generateHtml &&
13488 Config_getBool(GENERATE_HTMLHELP) &&
13489 !Config_getString(HHC_LOCATION).empty())
13490 {
13491 g_s.begin("Running html help compiler...\n");
13493 g_s.end();
13494 }
13495
13496 if ( generateHtml &&
13497 Config_getBool(GENERATE_QHP) &&
13498 !Config_getString(QHG_LOCATION).empty())
13499 {
13500 g_s.begin("Running qhelpgenerator...\n");
13502 g_s.end();
13503 }
13504
13507
13509
13511 {
13512
13513 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13514 if (numThreads<1) numThreads=1;
13515 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13516 (static_cast<double>(Debug::elapsedTime())),
13517 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13518 );
13519 g_s.print();
13520
13522 msg("finished...\n");
13524 }
13525 else
13526 {
13527 msg("finished...\n");
13528 }
13529
13530
13531 /**************************************************************************
13532 * Start cleaning up *
13533 **************************************************************************/
13534
13536
13538 Dir thisDir;
13539 thisDir.remove(Doxygen::filterDBFileName.str());
13541 exitTracing();
13543 delete Doxygen::clangUsrMap;
13544 g_successfulRun=true;
13545
13546 //dumpDocNodeSizes();
13547}
DString & prepend(const char *s)
Definition dstring.h:520
const std::string & str() const
Definition dstring.h:650
@ Time
Definition debug.h:35
static void clearFlag(const DebugMask mask)
Definition debug.cpp:123
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133
static double elapsedTime()
Definition debug.cpp:201
static void setFlag(const DebugMask mask)
Definition debug.cpp:118
Class representing a directory in the file system.
Definition dir.h:75
static std::string currentDirPath()
Definition dir.cpp:342
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:314
static void init()
bool run()
Definition dot.cpp:119
static DotManager * instance()
Definition dot.cpp:78
static DString filterDBFileName
Definition doxygen.h:131
static bool generatingXmlOutput
Definition doxygen.h:134
static SearchIndexIntf searchIndex
Definition doxygen.h:124
static ClangUsrMap * clangUsrMap
Definition doxygen.h:126
bool hasFormulas() const
Definition formula.cpp:719
void generateImages(const DString &outputDir, bool toIndex, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:634
Generator for HTML output.
Definition htmlgen.h:96
static void writeSearchData(const DString &dir)
Definition htmlgen.cpp:1462
static void init()
Definition htmlgen.cpp:1282
static void writeSearchPage()
Definition htmlgen.cpp:3279
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1446
static void writeExternalSearchPage()
Definition htmlgen.cpp:3378
void finalize()
Definition indexlist.h:103
Generator for LaTeX output.
Definition latexgen.h:94
static void init()
Definition latexgen.cpp:633
Generator for Man page output.
Definition mangen.h:69
static void init()
Definition mangen.cpp:272
void run()
Run mmdc tool for all collected diagrams.
Definition mermaid.cpp:250
static MermaidManager & instance()
Definition mermaid.cpp:33
void writeDocumentation(OutputList &ol)
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
void add()
Definition outputlist.h:352
size_t size() const
Definition outputlist.h:361
void writeStyleInfo(int part)
Definition outputlist.h:395
void cleanup()
Definition outputlist.h:752
static PlantumlManager & instance()
Definition plantuml.cpp:230
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:388
Generator for RTF output.
Definition rtfgen.h:80
static void init()
Definition rtfgen.cpp:461
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:2461
void write(const DString &file)
void print()
Definition doxygen.cpp:247
void begin(const char *name)
Definition doxygen.cpp:234
void end()
Definition doxygen.cpp:240
static void showCacheUsage()
Show usage of the type lookup cache.
void generateDEF()
Definition defgen.cpp:464
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1185
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:8831
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8665
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9266
static void countMembers()
Definition doxygen.cpp:9127
static void runHtmlHelpCompiler()
static bool g_dumpSymbolMap
Definition doxygen.cpp:192
static bool g_successfulRun
Definition doxygen.cpp:191
static void generateNamespaceDocs()
static void writeTagFile()
void cleanUpDoxygen()
static void generateConceptDocs()
Definition doxygen.cpp:9292
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4098
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5812
void finishWarnExit()
Definition message.cpp:289
void deinit()
double getSysElapsedTime()
Definition portable.cpp:97
bool isAbsolutePath(const DString &fileName)
Definition portable.cpp:497
void generatePerlMod()
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
void generateSqlite3()
static bool execute(const DString &htmldir)
Definition htags.cpp:38
static bool loadFilemap(const DString &htmldir)
Definition htags.cpp:107
static bool useHtags
Definition htags.h:23
void exitTracing()
Definition trace.cpp:52
void addCodeOnlyMappings()
Definition util.cpp:4229
void cleanupInlineGraphs()
Definition util.cpp:5630
void generateXML()
Definition xmlgen.cpp:2315

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(), generateOutput(), 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 generateOutput(), and main().

◆ initDoxygen()

void initDoxygen ( )

Definition at line 11464 of file doxygen.cpp.

11465{
11466 initResources();
11467 DString lang = Portable::getenv("LC_ALL");
11468 if (!lang.empty()) Portable::setenv("LANG",lang);
11469 std::setlocale(LC_ALL,"");
11470 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11471 std::setlocale(LC_NUMERIC,"C");
11472
11474
11498
11499 // register any additional parsers here...
11500
11502
11503#if USE_LIBCLANG
11505#endif
11514 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11515 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11516 //Doxygen::tagDestinationDict.setAutoDelete(true);
11518
11519 // initialization of these globals depends on
11520 // configuration switches so we need to postpone these
11521 Doxygen::globalScope = nullptr;
11531
11532}
static void startTimer()
Definition debug.cpp:196
A linked map of directories.
Definition dirdef.h:175
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:97
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:95
static ClassLinkedMap * hiddenClassLinkedMap
Definition doxygen.h:96
A list of index interfaces.
Definition indexlist.h:64
Ordered dictionary of MemberName objects.
Definition membername.h:63
void registerParser(const DString &name, const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Registers an additional parser.
Definition parserintf.h:216
ParserManager(const OutlineParserFactory &outlineParserFactory, const CodeParserFactory &codeParserFactory)
Create the parser manager.
Definition parserintf.h:202
std::function< std::unique_ptr< T >() > make_parser_factory()
void initResources()
std::unordered_map< std::string, const Definition * > ClangUsrMap
Definition doxygen.h:82
void setenv(const DString &variable, const DString &value)
Definition portable.cpp:286
DString getenv(const DString &variable)
Definition portable.cpp:321
void initDefaultExtensionMapping()
Definition util.cpp:4162

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(), initDoxygen(), initResources(), Doxygen::inputNameLinkedMap, make_parser_factory(), Doxygen::memberNameLinkedMap, Doxygen::mermaidFileNameLinkedMap, Doxygen::mscFileNameLinkedMap, Doxygen::namespaceLinkedMap, Doxygen::pageLinkedMap, ParserManager::ParserManager(), Doxygen::parserManager, Doxygen::plantUmlFileNameLinkedMap, ParserManager::registerParser(), Portable::setenv(), Debug::startTimer(), and Doxygen::symbolMap.

Referenced by initDoxygen(), and main().

◆ parseInput()

void parseInput ( )

Definition at line 12520 of file doxygen.cpp.

12521{
12522 AUTO_TRACE();
12523 std::atexit(exitDoxygen);
12524
12525 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12526
12527#if USE_LIBCLANG
12528 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12529#endif
12530
12531 // we would like to show the versionString earlier, but we first have to handle the configuration file
12532 // to know the value of the QUIET setting.
12533 DString versionString = getFullVersion();
12534 msg("Doxygen version used: {}\n",versionString);
12535
12537
12538 /**************************************************************************
12539 * Make sure the output directory exists
12540 **************************************************************************/
12541 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12542 if (!g_singleComment)
12543 {
12544 if (outputDirectory.empty())
12545 {
12546 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12547 }
12548 else
12549 {
12550 Dir dir(outputDirectory.str());
12551 if (!dir.exists())
12552 {
12553 dir.setPath(Dir::currentDirPath());
12554 if (!dir.mkdir(outputDirectory.str()))
12555 {
12556 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12557 "exist and cannot be created\n",outputDirectory);
12558 }
12559 else
12560 {
12561 msg("Notice: Output directory '{}' does not exist. "
12562 "I have created it for you.\n", outputDirectory);
12563 }
12564 dir.setPath(outputDirectory.str());
12565 }
12566 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12567 }
12568 }
12569 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12570
12571 /**************************************************************************
12572 * Initialize global lists and dictionaries
12573 **************************************************************************/
12574
12575#ifdef HAS_SIGNALS
12576 signal(SIGINT, stopDoxygen);
12577#endif
12578
12579 uint32_t pid = Portable::pid();
12580 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12581 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12582
12583 /**************************************************************************
12584 * Check/create output directories *
12585 **************************************************************************/
12586
12587 bool generateHtml = Config_getBool(GENERATE_HTML);
12588 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12589 bool generateXml = Config_getBool(GENERATE_XML);
12590 bool generateLatex = Config_getBool(GENERATE_LATEX);
12591 bool generateRtf = Config_getBool(GENERATE_RTF);
12592 bool generateMan = Config_getBool(GENERATE_MAN);
12593 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12594 DString htmlOutput;
12595 DString docbookOutput;
12596 DString xmlOutput;
12597 DString latexOutput;
12598 DString rtfOutput;
12599 DString manOutput;
12600 DString sqlOutput;
12601
12602 if (!g_singleComment)
12603 {
12604 if (generateHtml)
12605 {
12606 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12607 Config_updateString(HTML_OUTPUT,htmlOutput);
12608
12609 DString sitemapUrl = Config_getString(SITEMAP_URL);
12610 bool generateSitemap = !sitemapUrl.empty();
12611 if (generateSitemap && !sitemapUrl.endsWith("/"))
12612 {
12613 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12614 }
12615
12616 // add HTML indexers that are enabled
12617 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12618 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12619 bool generateQhp = Config_getBool(GENERATE_QHP);
12620 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12621 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12622 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12623 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12624 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12625 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12626 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12627 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12630 }
12631
12632 if (generateDocbook)
12633 {
12634 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12635 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12636 }
12637
12638 if (generateXml)
12639 {
12640 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12641 Config_updateString(XML_OUTPUT,xmlOutput);
12642 }
12643
12644 if (generateLatex)
12645 {
12646 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12647 Config_updateString(LATEX_OUTPUT,latexOutput);
12648 }
12649
12650 if (generateRtf)
12651 {
12652 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12653 Config_updateString(RTF_OUTPUT,rtfOutput);
12654 }
12655
12656 if (generateMan)
12657 {
12658 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12659 Config_updateString(MAN_OUTPUT,manOutput);
12660 }
12661
12662 if (generateSql)
12663 {
12664 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12665 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12666 }
12667 }
12668
12669 if (Config_getBool(HAVE_DOT))
12670 {
12671 DString curFontPath = Config_getString(DOT_FONTPATH);
12672 if (curFontPath.empty())
12673 {
12674 Portable::getenv("DOTFONTPATH");
12675 DString newFontPath = ".";
12676 if (!curFontPath.empty())
12677 {
12678 newFontPath+=Portable::pathListSeparator();
12679 newFontPath+=curFontPath;
12680 }
12681 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12682 }
12683 else
12684 {
12685 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12686 }
12687 }
12688
12689 /**************************************************************************
12690 * Handle layout file *
12691 **************************************************************************/
12692
12694 DString layoutFileName = Config_getString(LAYOUT_FILE);
12695 bool defaultLayoutUsed = false;
12696 if (layoutFileName.empty())
12697 {
12698 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12699 defaultLayoutUsed = true;
12700 }
12701 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12702
12703 FileInfo fi(layoutFileName.str());
12704 if (fi.exists())
12705 {
12706 msg("Parsing layout file {}...\n",layoutFileName);
12707 LayoutDocManager::instance().parse(layoutFileName);
12708 }
12709 else if (!defaultLayoutUsed)
12710 {
12711 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12712 }
12713 printLayout();
12714
12715 /**************************************************************************
12716 * Read and preprocess input *
12717 **************************************************************************/
12718
12719 // prevent search in the output directories
12720 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12721 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12722 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12723 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12724 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12725 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12726 if (generateMan) exclPatterns.push_back(manOutput.str());
12727 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12728
12729 if (!g_singleComment)
12730 {
12732
12734 }
12735
12736 // Notice: the order of the function calls below is very important!
12737
12738 if (generateHtml && !Config_getBool(USE_MATHJAX))
12739 {
12741 }
12742 if (generateRtf)
12743 {
12745 }
12746 if (generateDocbook)
12747 {
12749 }
12750
12752
12753 /**************************************************************************
12754 * Handle Tag Files *
12755 **************************************************************************/
12756
12757 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12758
12759 if (!g_singleComment)
12760 {
12761 msg("Reading and parsing tag files\n");
12762 StringVector tagFileList = Config_getList(TAGFILES);
12763 for (const auto &s : tagFileList)
12764 {
12765 readTagFile(root,s.c_str());
12766 }
12767 }
12768
12769 /**************************************************************************
12770 * Parse source files *
12771 **************************************************************************/
12772
12773 addSTLSupport(root);
12774
12775 g_s.begin("Parsing files\n");
12776 if (g_singleComment)
12777 {
12778 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12779 if (g_commentFileName=="-")
12780 {
12781 std::string text = fileToString(g_commentFileName).str();
12782 addTerminalCharIfMissing(text,'\n');
12783 generateHtmlForComment("stdin.md",text);
12784 }
12785 else if (FileInfo(g_commentFileName.str()).isFile())
12786 {
12787 std::string text;
12789 addTerminalCharIfMissing(text,'\n');
12791 }
12792 else
12793 {
12794 }
12796 exit(0);
12797 }
12798 else
12799 {
12800 if (Config_getInt(NUM_PROC_THREADS)==1)
12801 {
12803 }
12804 else
12805 {
12807 }
12808 }
12809 g_s.end();
12810
12811 /**************************************************************************
12812 * Gather information *
12813 **************************************************************************/
12814
12815 g_s.begin("Building macro definition list...\n");
12817 g_s.end();
12818
12819 g_s.begin("Building group list...\n");
12820 buildGroupList(root.get());
12821 organizeSubGroups(root.get());
12822 g_s.end();
12823
12824 g_s.begin("Building directory list...\n");
12826 findDirDocumentation(root.get());
12827 g_s.end();
12828
12829 g_s.begin("Building namespace list...\n");
12830 buildNamespaceList(root.get());
12831 findUsingDirectives(root.get());
12832 g_s.end();
12833
12834 g_s.begin("Building file list...\n");
12835 buildFileList(root.get());
12836 g_s.end();
12837
12838 g_s.begin("Building class list...\n");
12839 buildClassList(root.get());
12840 g_s.end();
12841
12842 g_s.begin("Building concept list...\n");
12843 buildConceptList(root.get());
12844 g_s.end();
12845
12846 // build list of using declarations here (global list)
12847 buildListOfUsingDecls(root.get());
12848 g_s.end();
12849
12850 g_s.begin("Computing nesting relations for classes...\n");
12852 g_s.end();
12853 // 1.8.2-20121111: no longer add nested classes to the group as well
12854 //distributeClassGroupRelations();
12855
12856 // calling buildClassList may result in cached relations that
12857 // become invalid after resolveClassNestingRelations(), that's why
12858 // we need to clear the cache here
12860 // we don't need the list of using declaration anymore
12861 g_usingDeclarations.clear();
12862
12863 g_s.begin("Associating documentation with classes...\n");
12864 buildClassDocList(root.get());
12865 g_s.end();
12866
12867 g_s.begin("Associating documentation with concepts...\n");
12868 buildConceptDocList(root.get());
12870 g_s.end();
12871
12872 g_s.begin("Associating documentation with modules...\n");
12873 findModuleDocumentation(root.get());
12874 g_s.end();
12875
12876 g_s.begin("Building example list...\n");
12877 buildExampleList(root.get());
12878 g_s.end();
12879
12880 g_s.begin("Searching for enumerations...\n");
12881 findEnums(root.get());
12882 g_s.end();
12883
12884 // Since buildVarList calls isVarWithConstructor
12885 // and this calls getResolvedClass we need to process
12886 // typedefs first so the relations between classes via typedefs
12887 // are properly resolved. See bug 536385 for an example.
12888 g_s.begin("Searching for documented typedefs...\n");
12889 buildTypedefList(root.get());
12890 g_s.end();
12891
12892 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12893 {
12894 g_s.begin("Searching for documented sequences...\n");
12895 buildSequenceList(root.get());
12896 g_s.end();
12897
12898 g_s.begin("Searching for documented dictionaries...\n");
12899 buildDictionaryList(root.get());
12900 g_s.end();
12901 }
12902
12903 g_s.begin("Searching for members imported via using declarations...\n");
12904 // this should be after buildTypedefList in order to properly import
12905 // used typedefs
12906 findUsingDeclarations(root.get(),true); // do for python packages first
12907 findUsingDeclarations(root.get(),false); // then the rest
12908 g_s.end();
12909
12910 g_s.begin("Searching for included using directives...\n");
12912 g_s.end();
12913
12914 g_s.begin("Searching for documented variables...\n");
12915 buildVarList(root.get());
12916 g_s.end();
12917
12918 g_s.begin("Building interface member list...\n");
12919 buildInterfaceAndServiceList(root.get()); // UNO IDL
12920
12921 g_s.begin("Building member list...\n"); // using class info only !
12922 buildFunctionList(root.get());
12923 g_s.end();
12924
12925 g_s.begin("Searching for friends...\n");
12926 findFriends();
12927 g_s.end();
12928
12929 g_s.begin("Searching for documented defines...\n");
12930 findDefineDocumentation(root.get());
12931 g_s.end();
12932
12933 g_s.begin("Computing class inheritance relations...\n");
12934 findClassEntries(root.get());
12936 g_s.end();
12937
12938 g_s.begin("Computing class usage relations...\n");
12940 g_s.end();
12941
12942 g_s.begin("Flushing cached template relations that have become invalid...\n");
12944 g_s.end();
12945
12946 g_s.begin("Warn for undocumented namespaces...\n");
12948 g_s.end();
12949
12950 g_s.begin("Computing class relations...\n");
12953 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12954 {
12956 }
12958 g_classEntries.clear();
12959 g_s.end();
12960
12961 g_s.begin("Add enum values to enums...\n");
12962 addEnumValuesToEnums(root.get());
12963 findEnumDocumentation(root.get());
12964 g_s.end();
12965
12966 g_s.begin("Searching for member function documentation...\n");
12967 findObjCMethodDefinitions(root.get());
12968 findMemberDocumentation(root.get()); // may introduce new members !
12969 findUsingDeclImports(root.get()); // may introduce new members !
12970 g_usingClassMap.clear();
12974 g_s.end();
12975
12976 // moved to after finding and copying documentation,
12977 // as this introduces new members see bug 722654
12978 g_s.begin("Creating members for template instances...\n");
12980 g_s.end();
12981
12982 g_s.begin("Searching for tag less structs...\n");
12984 g_s.end();
12985
12986 g_s.begin("Building page list...\n");
12987 buildPageList(root.get());
12988 g_s.end();
12989
12990 g_s.begin("Building requirements list...\n");
12991 buildRequirementsList(root.get());
12992 g_s.end();
12993
12994 g_s.begin("Search for main page...\n");
12995 findMainPage(root.get());
12996 findMainPageTagFiles(root.get());
12997 g_s.end();
12998
12999 g_s.begin("Computing page relations...\n");
13000 computePageRelations(root.get());
13002 g_s.end();
13003
13004 g_s.begin("Determining the scope of groups...\n");
13005 findGroupScope(root.get());
13006 g_s.end();
13007
13008 g_s.begin("Computing module relations...\n");
13009 auto &mm = ModuleManager::instance();
13010 mm.resolvePartitions();
13011 mm.resolveImports();
13012 mm.collectExportedSymbols();
13013 g_s.end();
13014
13015 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13016 {
13017 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13018 n2->memberName().data()+getPrefixIndex(n2->memberName())
13019 )<0;
13020 };
13021
13022 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13023 {
13024 if (Config_getBool(SORT_BY_SCOPE_NAME))
13025 {
13026 return dstricmp_sort(c1->name(), c2->name())<0;
13027 }
13028 else
13029 {
13030 int i = dstricmp_sort(c1->className(), c2->className());
13031 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13032 }
13033 };
13034
13035 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13036 {
13037 return dstricmp_sort(n1->name(),n2->name())<0;
13038 };
13039
13040 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13041 {
13042 return dstricmp_sort(c1->name(),c2->name())<0;
13043 };
13044
13045 g_s.begin("Sorting lists...\n");
13046 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13048 memberNameComp);
13049 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13051 memberNameComp);
13052 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13054 classComp);
13055 std::stable_sort(Doxygen::classLinkedMap->begin(),
13057 classComp);
13058 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13060 conceptComp);
13061 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13063 namespaceComp);
13064 g_s.end();
13065
13066 g_s.begin("Determining which enums are documented\n");
13068 g_s.end();
13069
13070 g_s.begin("Computing member relations...\n");
13073 g_s.end();
13074
13075 g_s.begin("Building full member lists recursively...\n");
13077 g_s.end();
13078
13079 g_s.begin("Adding members to member groups.\n");
13081 g_s.end();
13082
13083 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13084 {
13085 g_s.begin("Distributing member group documentation.\n");
13087 g_s.end();
13088 }
13089
13090 g_s.begin("Computing member references...\n");
13092 g_s.end();
13093
13094 if (Config_getBool(INHERIT_DOCS))
13095 {
13096 g_s.begin("Inheriting documentation...\n");
13098 g_s.end();
13099 }
13100
13101
13102 // compute the shortest possible names of all files
13103 // without losing the uniqueness of the file names.
13104 g_s.begin("Generating disk names...\n");
13106 g_s.end();
13107
13108 g_s.begin("Adding source references...\n");
13110 g_s.end();
13111
13112 g_s.begin("Adding xrefitems...\n");
13115 g_s.end();
13116
13117 g_s.begin("Adding requirements...\n");
13120 g_s.end();
13121
13122 g_s.begin("Sorting member lists...\n");
13124 g_s.end();
13125
13126 g_s.begin("Setting anonymous enum type...\n");
13128 g_s.end();
13129
13130 g_s.begin("Computing dependencies between directories...\n");
13132 g_s.end();
13133
13134 g_s.begin("Generating citations page...\n");
13136 g_s.end();
13137
13138 g_s.begin("Counting data structures...\n");
13140 g_s.end();
13141
13142 g_s.begin("Resolving user defined references...\n");
13144 g_s.end();
13145
13146 g_s.begin("Finding anchors and sections in the documentation...\n");
13148 g_s.end();
13149
13150 g_s.begin("Transferring function references...\n");
13152 g_s.end();
13153
13154 g_s.begin("Combining using relations...\n");
13156 g_s.end();
13157
13159 g_s.begin("Adding members to index pages...\n");
13161 addToIndices();
13162 g_s.end();
13163
13164 g_s.begin("Correcting members for VHDL...\n");
13166 g_s.end();
13167
13168 g_s.begin("Computing tooltip texts...\n");
13170 g_s.end();
13171
13172 if (Config_getBool(SORT_GROUP_NAMES))
13173 {
13174 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13176 [](const auto &g1,const auto &g2)
13177 { return g1->groupTitle() < g2->groupTitle(); });
13178
13179 for (const auto &gd : *Doxygen::groupLinkedMap)
13180 {
13181 gd->sortSubGroups();
13182 }
13183 }
13184
13185 printNavTree(root.get(),0);
13187}
static CitationManager & instance()
Definition cite.cpp:87
void generatePage()
Generate the citations page.
Definition cite.cpp:333
DString & sprintf(const char *format,...)
Definition dstring.cpp:30
bool endsWith(const char *s) const
Definition dstring.h:622
A class that generates docset files.
Definition docsets.h:36
static bool clangAssistedParsing
Definition doxygen.h:136
Generator for Eclipse help files.
Definition eclipsehelp.h:44
A class that generates a dynamic tree view side panel.
Definition ftvhelp.h:41
Minimal replacement for QFileInfo.
Definition fileinfo.h:26
FileInfo(const std::string &name)
Definition fileinfo.h:28
void initFromRepository(const DString &dir)
Definition formula.cpp:59
void checkRepositories()
Definition formula.cpp:172
A class that generated the HTML Help specific files.
Definition htmlhelp.h:36
static Index & instance()
Definition index.cpp:108
void countDataStructures()
Definition index.cpp:264
void initialize()
Definition indexlist.h:100
void addIndex(As &&... args)
Add an index generator to the list, using a syntax similar to std::make_unique<T>().
Definition indexlist.h:97
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1468
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1435
std::unique_ptr< MemberName > Ptr
Definition linkedmap.h:38
Definition qhp.h:27
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:170
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
void buildDirectories()
Definition dirdef.cpp:1094
void computeDirDependencies()
Definition dirdef.cpp:1168
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:51
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5379
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:432
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2171
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9508
static void computeTemplateClassRelations()
Definition doxygen.cpp:5473
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5652
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2324
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9708
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5428
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1325
static void resolveClassNestingRelations()
Definition doxygen.cpp:1380
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5344
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8467
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5542
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4503
static void addMembersToMemberGroup()
Definition doxygen.cpp:9373
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9877
static void distributeConceptGroups()
Definition doxygen.cpp:1347
static void transferFunctionDocumentation()
Definition doxygen.cpp:4422
static void setAnonymousEnumType()
Definition doxygen.cpp:9113
static void sortMemberLists()
Definition doxygen.cpp:9018
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8595
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4552
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7612
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3491
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:447
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9621
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7582
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9411
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7815
static void resolveUserReferences()
Definition doxygen.cpp:9939
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9768
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3628
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3591
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1832
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2574
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:491
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4325
static void findEnums(const Entry *root)
Definition doxygen.cpp:7640
static DString g_commentFileName
Definition doxygen.cpp:193
static void addListReferences()
Definition doxygen.cpp:5643
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8257
static void findMainPage(Entry *root)
Definition doxygen.cpp:9807
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2014
static void addSourceReferences()
Definition doxygen.cpp:8891
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9313
static void flushUnresolvedRelations()
Definition doxygen.cpp:9550
static void findDocumentedEnumValues()
Definition doxygen.cpp:8249
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8299
static void computeClassRelations()
Definition doxygen.cpp:5448
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4020
static void checkPageRelations()
Definition doxygen.cpp:9919
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1315
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8138
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9889
static StringSet g_usingDeclarations
Definition doxygen.cpp:190
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3609
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1150
static void buildPageList(Entry *root)
Definition doxygen.cpp:9780
static void addRequirementReferences()
Definition doxygen.cpp:5635
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:194
static void findSectionsInDocumentation()
Definition doxygen.cpp:9449
static void mergeCategories()
Definition doxygen.cpp:8614
static void buildFileList(const Entry *root)
Definition doxygen.cpp:503
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1140
static void findUsedTemplateInstances()
Definition doxygen.cpp:5412
static void computeTooltipTexts()
Definition doxygen.cpp:9067
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8635
static void combineUsingRelations()
Definition doxygen.cpp:9348
static void findTagLessClasses(std::set< const Definition * > &candidates, const Container *cd)
Definition doxygen.cpp:1767
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2322
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1335
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:4455
static void buildDefineList()
Definition doxygen.cpp:8970
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3723
static void computeMemberRelations()
Definition doxygen.cpp:8579
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2158
static std::multimap< std::string, const Entry * > g_classEntries
Definition doxygen.cpp:187
int dstricmp_sort(const char *str1, const char *str2)
Definition dstring.h:72
const char * qPrint(const char *s)
Definition dstring.h:788
void printLayout()
Definition layout.cpp:1820
#define warn_uncond(fmt,...)
Definition message.h:122
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
Definition portable.cpp:516
uint32_t pid()
Definition portable.cpp:248
DString pathListSeparator()
Definition portable.cpp:383
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:4573
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1120
int getPrefixIndex(const DString &name)
Definition util.cpp:2718

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(), FileInfo::FileInfo(), 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(), Doxygen::memberNameLinkedMap, mergeCategories(), Dir::mkdir(), msg, Doxygen::namespaceLinkedMap, organizeSubGroups(), LayoutDocManager::parse(), parseFilesMultiThreading(), parseFilesSingleThreading(), parseInput(), 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(), and parseInput().

◆ readConfiguration()

void readConfiguration ( int argc,
char ** argv )

Definition at line 11567 of file doxygen.cpp.

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

References FileInfo::absFilePath(), Config::checkAndCorrect(), cleanUpDoxygen(), compareDoxyfile(), Config::Compressed, Config::CompressedNoEnv, Config_getBool, Config_getEnum, Config_updateBool, DString::data(), devUsage(), dstrcmp(), dstricmp(), DString::DString(), DString::empty(), err, FileInfo::exists(), FileInfo::FileInfo(), Config::Full, g_commentFileName, g_dumpSymbolMap, g_singleComment, generateConfigFile(), getArg(), Config::init(), initTracing(), EmojiEntityMapper::instance(), msg, openOutputFile(), Config::parse(), Config::postProcess(), readConfiguration(), 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(), and readConfiguration().

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

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

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(), readFileOrDirectory(), DString::str(), and warn_uncond.

Referenced by readFileOrDirectory(), and searchInputFiles().