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

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

12001{
12002 AUTO_TRACE();
12003
12004 Config::postProcess(false);
12008}
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 11537 of file doxygen.cpp.

11538{
11542
11543 delete Doxygen::indexList;
11553 Doxygen::mainPage.reset();
11557 Doxygen::globalScope = nullptr;
11559 delete theTranslator;
11560 delete g_outputList;
11561
11566 delete Doxygen::dirLinkedMap;
11567 delete Doxygen::symbolMap;
11568}
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 13192 of file doxygen.cpp.

13193{
13194 AUTO_TRACE();
13195 /**************************************************************************
13196 * Initialize output generators *
13197 **************************************************************************/
13198
13199 /// add extra languages for which we can only produce syntax highlighted code
13201
13202 //// dump all symbols
13203 if (g_dumpSymbolMap)
13204 {
13205 dumpSymbolMap();
13206 exit(0);
13207 }
13208
13209 bool generateHtml = Config_getBool(GENERATE_HTML);
13210 bool generateLatex = Config_getBool(GENERATE_LATEX);
13211 bool generateMan = Config_getBool(GENERATE_MAN);
13212 bool generateRtf = Config_getBool(GENERATE_RTF);
13213 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13214
13215
13217 if (generateHtml)
13218 {
13222 }
13223 if (generateLatex)
13224 {
13227 }
13228 if (generateDocbook)
13229 {
13232 }
13233 if (generateMan)
13234 {
13237 }
13238 if (generateRtf)
13239 {
13242 }
13243 if (Config_getBool(USE_HTAGS))
13244 {
13245 Htags::useHtags = true;
13246 DString htmldir = Config_getString(HTML_OUTPUT);
13247 if (!Htags::execute(htmldir))
13248 err("USE_HTAGS is YES but htags(1) failed. \n");
13249 else if (!Htags::loadFilemap(htmldir))
13250 err("htags(1) ended normally but failed to load the filemap. \n");
13251 }
13252
13253 /**************************************************************************
13254 * Generate documentation *
13255 **************************************************************************/
13256
13257 g_s.begin("Generating style sheet...\n");
13258 //printf("writing style info\n");
13259 g_outputList->writeStyleInfo(0); // write first part
13260 g_s.end();
13261
13262 bool searchEngine = Config_getBool(SEARCHENGINE);
13263 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13264
13265 g_s.begin("Generating search indices...\n");
13266 if (searchEngine && !serverBasedSearch && generateHtml)
13267 {
13269 }
13270
13271 // generate search indices (need to do this before writing other HTML
13272 // pages as these contain a drop down menu with options depending on
13273 // what categories we find in this function.
13274 if (generateHtml && searchEngine)
13275 {
13276 DString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13277 Dir searchDir(searchDirName.str());
13278 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13279 {
13280 term("Could not create search results directory '{}' $PWD='{}'\n",
13281 searchDirName,Dir::currentDirPath());
13282 }
13283 HtmlGenerator::writeSearchData(searchDirName);
13284 if (!serverBasedSearch) // client side search index
13285 {
13287 }
13288 }
13289 g_s.end();
13290
13291 // copy static stuff
13292 if (generateHtml)
13293 {
13295 copyLogo(Config_getString(HTML_OUTPUT),true);
13296 copyIcon(Config_getString(HTML_OUTPUT),true);
13297 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT),true);
13298 }
13299 if (generateLatex)
13300 {
13302 copyLogo(Config_getString(LATEX_OUTPUT),false);
13303 copyIcon(Config_getString(LATEX_OUTPUT),false);
13304 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT),false);
13305 }
13306 if (generateDocbook)
13307 {
13308 copyLogo(Config_getString(DOCBOOK_OUTPUT),false);
13309 copyIcon(Config_getString(DOCBOOK_OUTPUT),false);
13310 }
13311 if (generateRtf)
13312 {
13313 copyLogo(Config_getString(RTF_OUTPUT),false);
13314 copyIcon(Config_getString(RTF_OUTPUT),false);
13315 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT),false);
13316 }
13317
13319 if (fm.hasFormulas() && generateHtml
13320 && !Config_getBool(USE_MATHJAX))
13321 {
13322 g_s.begin("Generating images for formulas in HTML...\n");
13323 fm.generateImages(Config_getString(HTML_OUTPUT), true, Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13325 g_s.end();
13326 }
13327 if (fm.hasFormulas() && generateRtf)
13328 {
13329 g_s.begin("Generating images for formulas in RTF...\n");
13331 g_s.end();
13332 }
13333
13334 if (fm.hasFormulas() && generateDocbook)
13335 {
13336 g_s.begin("Generating images for formulas in Docbook...\n");
13338 g_s.end();
13339 }
13340
13341 g_s.begin("Generating example documentation...\n");
13343 g_s.end();
13344
13345 g_s.begin("Generating file sources...\n");
13347 g_s.end();
13348
13349 g_s.begin("Counting members...\n");
13350 // needs to be done after generating the sources
13351 // but before generating the compound documentation, see bug #12233
13352 countMembers();
13353 g_s.end();
13354
13355 g_s.begin("Generating file documentation...\n");
13357 g_s.end();
13358
13359 g_s.begin("Generating page documentation...\n");
13361 g_s.end();
13362
13363 g_s.begin("Generating group documentation...\n");
13365 g_s.end();
13366
13367 g_s.begin("Generating class documentation...\n");
13369 g_s.end();
13370
13371 g_s.begin("Generating concept documentation...\n");
13373 g_s.end();
13374
13375 g_s.begin("Generating module documentation...\n");
13377 g_s.end();
13378
13379 g_s.begin("Generating namespace documentation...\n");
13381 g_s.end();
13382
13383 if (Config_getBool(GENERATE_LEGEND))
13384 {
13385 g_s.begin("Generating graph info page...\n");
13387 g_s.end();
13388 }
13389
13390 g_s.begin("Generating directory documentation...\n");
13392 g_s.end();
13393
13394 if (g_outputList->size()>0)
13395 {
13397 }
13398
13399 g_s.begin("finalizing index lists...\n");
13401 g_s.end();
13402
13403 g_s.begin("writing tag file...\n");
13404 writeTagFile();
13405 g_s.end();
13406
13407 if (Config_getBool(GENERATE_XML))
13408 {
13409 g_s.begin("Generating XML output...\n");
13411 generateXML();
13413 g_s.end();
13414 }
13415 if (Config_getBool(GENERATE_SQLITE3))
13416 {
13417 g_s.begin("Generating SQLITE3 output...\n");
13419 g_s.end();
13420 }
13421
13422 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13423 {
13424 g_s.begin("Generating AutoGen DEF output...\n");
13425 generateDEF();
13426 g_s.end();
13427 }
13428 if (Config_getBool(GENERATE_PERLMOD))
13429 {
13430 g_s.begin("Generating Perl module output...\n");
13432 g_s.end();
13433 }
13434 if (generateHtml && searchEngine && serverBasedSearch)
13435 {
13436 g_s.begin("Generating search index\n");
13437 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13438 {
13440 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13441 }
13442 else // write data for external search index
13443 {
13445 DString searchDataFile = Config_getString(SEARCHDATA_FILE);
13446 if (searchDataFile.empty())
13447 {
13448 searchDataFile="searchdata.xml";
13449 }
13450 if (!Portable::isAbsolutePath(searchDataFile.data()))
13451 {
13452 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13453 }
13454 Doxygen::searchIndex.write(searchDataFile);
13455 }
13456 g_s.end();
13457 }
13458
13459 if (generateRtf)
13460 {
13461 g_s.begin("Combining RTF output...\n");
13462 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13463 {
13464 err("An error occurred during post-processing the RTF files!\n");
13465 }
13466 g_s.end();
13467 }
13468
13469 if (PlantumlManager::instance().needToRun())
13470 {
13471 g_s.begin("Running plantuml with JAVA...\n");
13473 g_s.end();
13474 }
13475
13476 if (MermaidManager::instance().needToRun())
13477 {
13478 g_s.begin("Running mermaid (mmdc)...\n");
13480 g_s.end();
13481 }
13482
13483 if (Config_getBool(HAVE_DOT) && DotManager::instance()->needToRun())
13484 {
13485 g_s.begin("Running dot...\n");
13487 g_s.end();
13488 }
13489
13490 if (generateHtml &&
13491 Config_getBool(GENERATE_HTMLHELP) &&
13492 !Config_getString(HHC_LOCATION).empty())
13493 {
13494 g_s.begin("Running html help compiler...\n");
13496 g_s.end();
13497 }
13498
13499 if ( generateHtml &&
13500 Config_getBool(GENERATE_QHP) &&
13501 !Config_getString(QHG_LOCATION).empty())
13502 {
13503 g_s.begin("Running qhelpgenerator...\n");
13505 g_s.end();
13506 }
13507
13510
13512
13514 {
13515
13516 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13517 if (numThreads<1) numThreads=1;
13518 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13519 (static_cast<double>(Debug::elapsedTime())),
13520 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13521 );
13522 g_s.print();
13523
13525 msg("finished...\n");
13527 }
13528 else
13529 {
13530 msg("finished...\n");
13531 }
13532
13533
13534 /**************************************************************************
13535 * Start cleaning up *
13536 **************************************************************************/
13537
13539
13541 Dir thisDir;
13542 thisDir.remove(Doxygen::filterDBFileName.str());
13544 exitTracing();
13546 delete Doxygen::clangUsrMap;
13547 g_successfulRun=true;
13548
13549 //dumpDocNodeSizes();
13550}
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:2467
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:8834
static void generatePageDocs()
static void copyIcon(const DString &outputOption, bool toIndex)
static void generateFileSources()
Definition doxygen.cpp:8668
static void copyExtraFiles(StringVector files, const DString &filesOption, const DString &outputOption, bool toIndex)
static void generateClassDocs()
Definition doxygen.cpp:9269
static void countMembers()
Definition doxygen.cpp:9130
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:9295
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4100
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5814
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:5383
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 11467 of file doxygen.cpp.

11468{
11469 initResources();
11470 DString lang = Portable::getenv("LC_ALL");
11471 if (!lang.empty()) Portable::setenv("LANG",lang);
11472 std::setlocale(LC_ALL,"");
11473 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11474 std::setlocale(LC_NUMERIC,"C");
11475
11477
11501
11502 // register any additional parsers here...
11503
11505
11506#if USE_LIBCLANG
11508#endif
11517 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11518 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11519 //Doxygen::tagDestinationDict.setAutoDelete(true);
11521
11522 // initialization of these globals depends on
11523 // configuration switches so we need to postpone these
11524 Doxygen::globalScope = nullptr;
11534
11535}
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 12523 of file doxygen.cpp.

12524{
12525 AUTO_TRACE();
12526 std::atexit(exitDoxygen);
12527
12528 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12529
12530#if USE_LIBCLANG
12531 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12532#endif
12533
12534 // we would like to show the versionString earlier, but we first have to handle the configuration file
12535 // to know the value of the QUIET setting.
12536 DString versionString = getFullVersion();
12537 msg("Doxygen version used: {}\n",versionString);
12538
12540
12541 /**************************************************************************
12542 * Make sure the output directory exists
12543 **************************************************************************/
12544 DString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12545 if (!g_singleComment)
12546 {
12547 if (outputDirectory.empty())
12548 {
12549 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12550 }
12551 else
12552 {
12553 Dir dir(outputDirectory.str());
12554 if (!dir.exists())
12555 {
12556 dir.setPath(Dir::currentDirPath());
12557 if (!dir.mkdir(outputDirectory.str()))
12558 {
12559 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12560 "exist and cannot be created\n",outputDirectory);
12561 }
12562 else
12563 {
12564 msg("Notice: Output directory '{}' does not exist. "
12565 "I have created it for you.\n", outputDirectory);
12566 }
12567 dir.setPath(outputDirectory.str());
12568 }
12569 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12570 }
12571 }
12572 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12573
12574 /**************************************************************************
12575 * Initialize global lists and dictionaries
12576 **************************************************************************/
12577
12578#ifdef HAS_SIGNALS
12579 signal(SIGINT, stopDoxygen);
12580#endif
12581
12582 uint32_t pid = Portable::pid();
12583 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12584 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12585
12586 /**************************************************************************
12587 * Check/create output directories *
12588 **************************************************************************/
12589
12590 bool generateHtml = Config_getBool(GENERATE_HTML);
12591 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12592 bool generateXml = Config_getBool(GENERATE_XML);
12593 bool generateLatex = Config_getBool(GENERATE_LATEX);
12594 bool generateRtf = Config_getBool(GENERATE_RTF);
12595 bool generateMan = Config_getBool(GENERATE_MAN);
12596 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12597 DString htmlOutput;
12598 DString docbookOutput;
12599 DString xmlOutput;
12600 DString latexOutput;
12601 DString rtfOutput;
12602 DString manOutput;
12603 DString sqlOutput;
12604
12605 if (!g_singleComment)
12606 {
12607 if (generateHtml)
12608 {
12609 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12610 Config_updateString(HTML_OUTPUT,htmlOutput);
12611
12612 DString sitemapUrl = Config_getString(SITEMAP_URL);
12613 bool generateSitemap = !sitemapUrl.empty();
12614 if (generateSitemap && !sitemapUrl.endsWith("/"))
12615 {
12616 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12617 }
12618
12619 // add HTML indexers that are enabled
12620 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12621 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12622 bool generateQhp = Config_getBool(GENERATE_QHP);
12623 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12624 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12625 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12626 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12627 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12628 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12629 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(true);
12630 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12633 }
12634
12635 if (generateDocbook)
12636 {
12637 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12638 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12639 }
12640
12641 if (generateXml)
12642 {
12643 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12644 Config_updateString(XML_OUTPUT,xmlOutput);
12645 }
12646
12647 if (generateLatex)
12648 {
12649 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12650 Config_updateString(LATEX_OUTPUT,latexOutput);
12651 }
12652
12653 if (generateRtf)
12654 {
12655 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12656 Config_updateString(RTF_OUTPUT,rtfOutput);
12657 }
12658
12659 if (generateMan)
12660 {
12661 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12662 Config_updateString(MAN_OUTPUT,manOutput);
12663 }
12664
12665 if (generateSql)
12666 {
12667 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12668 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12669 }
12670 }
12671
12672 if (Config_getBool(HAVE_DOT))
12673 {
12674 DString curFontPath = Config_getString(DOT_FONTPATH);
12675 if (curFontPath.empty())
12676 {
12677 Portable::getenv("DOTFONTPATH");
12678 DString newFontPath = ".";
12679 if (!curFontPath.empty())
12680 {
12681 newFontPath+=Portable::pathListSeparator();
12682 newFontPath+=curFontPath;
12683 }
12684 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12685 }
12686 else
12687 {
12688 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12689 }
12690 }
12691
12692 /**************************************************************************
12693 * Handle layout file *
12694 **************************************************************************/
12695
12697 DString layoutFileName = Config_getString(LAYOUT_FILE);
12698 bool defaultLayoutUsed = false;
12699 if (layoutFileName.empty())
12700 {
12701 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12702 defaultLayoutUsed = true;
12703 }
12704 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12705
12706 FileInfo fi(layoutFileName.str());
12707 if (fi.exists())
12708 {
12709 msg("Parsing layout file {}...\n",layoutFileName);
12710 LayoutDocManager::instance().parse(layoutFileName);
12711 }
12712 else if (!defaultLayoutUsed)
12713 {
12714 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12715 }
12716 printLayout();
12717
12718 /**************************************************************************
12719 * Read and preprocess input *
12720 **************************************************************************/
12721
12722 // prevent search in the output directories
12723 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12724 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12725 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12726 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12727 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12728 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12729 if (generateMan) exclPatterns.push_back(manOutput.str());
12730 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12731
12732 if (!g_singleComment)
12733 {
12735
12737 }
12738
12739 // Notice: the order of the function calls below is very important!
12740
12741 if (generateHtml && !Config_getBool(USE_MATHJAX))
12742 {
12744 }
12745 if (generateRtf)
12746 {
12748 }
12749 if (generateDocbook)
12750 {
12752 }
12753
12755
12756 /**************************************************************************
12757 * Handle Tag Files *
12758 **************************************************************************/
12759
12760 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12761
12762 if (!g_singleComment)
12763 {
12764 msg("Reading and parsing tag files\n");
12765 StringVector tagFileList = Config_getList(TAGFILES);
12766 for (const auto &s : tagFileList)
12767 {
12768 readTagFile(root,s.c_str());
12769 }
12770 }
12771
12772 /**************************************************************************
12773 * Parse source files *
12774 **************************************************************************/
12775
12776 addSTLSupport(root);
12777
12778 g_s.begin("Parsing files\n");
12779 if (g_singleComment)
12780 {
12781 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12782 if (g_commentFileName=="-")
12783 {
12784 std::string text = fileToString(g_commentFileName).str();
12785 addTerminalCharIfMissing(text,'\n');
12786 generateHtmlForComment("stdin.md",text);
12787 }
12788 else if (FileInfo(g_commentFileName.str()).isFile())
12789 {
12790 std::string text;
12792 addTerminalCharIfMissing(text,'\n');
12794 }
12795 else
12796 {
12797 }
12799 exit(0);
12800 }
12801 else
12802 {
12803 if (Config_getInt(NUM_PROC_THREADS)==1)
12804 {
12806 }
12807 else
12808 {
12810 }
12811 }
12812 g_s.end();
12813
12814 /**************************************************************************
12815 * Gather information *
12816 **************************************************************************/
12817
12818 g_s.begin("Building macro definition list...\n");
12820 g_s.end();
12821
12822 g_s.begin("Building group list...\n");
12823 buildGroupList(root.get());
12824 organizeSubGroups(root.get());
12825 g_s.end();
12826
12827 g_s.begin("Building directory list...\n");
12829 findDirDocumentation(root.get());
12830 g_s.end();
12831
12832 g_s.begin("Building namespace list...\n");
12833 buildNamespaceList(root.get());
12834 findUsingDirectives(root.get());
12835 g_s.end();
12836
12837 g_s.begin("Building file list...\n");
12838 buildFileList(root.get());
12839 g_s.end();
12840
12841 g_s.begin("Building class list...\n");
12842 buildClassList(root.get());
12843 g_s.end();
12844
12845 g_s.begin("Building concept list...\n");
12846 buildConceptList(root.get());
12847 g_s.end();
12848
12849 // build list of using declarations here (global list)
12850 buildListOfUsingDecls(root.get());
12851 g_s.end();
12852
12853 g_s.begin("Computing nesting relations for classes...\n");
12855 g_s.end();
12856 // 1.8.2-20121111: no longer add nested classes to the group as well
12857 //distributeClassGroupRelations();
12858
12859 // calling buildClassList may result in cached relations that
12860 // become invalid after resolveClassNestingRelations(), that's why
12861 // we need to clear the cache here
12863 // we don't need the list of using declaration anymore
12864 g_usingDeclarations.clear();
12865
12866 g_s.begin("Associating documentation with classes...\n");
12867 buildClassDocList(root.get());
12868 g_s.end();
12869
12870 g_s.begin("Associating documentation with concepts...\n");
12871 buildConceptDocList(root.get());
12873 g_s.end();
12874
12875 g_s.begin("Associating documentation with modules...\n");
12876 findModuleDocumentation(root.get());
12877 g_s.end();
12878
12879 g_s.begin("Building example list...\n");
12880 buildExampleList(root.get());
12881 g_s.end();
12882
12883 g_s.begin("Searching for enumerations...\n");
12884 findEnums(root.get());
12885 g_s.end();
12886
12887 // Since buildVarList calls isVarWithConstructor
12888 // and this calls getResolvedClass we need to process
12889 // typedefs first so the relations between classes via typedefs
12890 // are properly resolved. See bug 536385 for an example.
12891 g_s.begin("Searching for documented typedefs...\n");
12892 buildTypedefList(root.get());
12893 g_s.end();
12894
12895 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12896 {
12897 g_s.begin("Searching for documented sequences...\n");
12898 buildSequenceList(root.get());
12899 g_s.end();
12900
12901 g_s.begin("Searching for documented dictionaries...\n");
12902 buildDictionaryList(root.get());
12903 g_s.end();
12904 }
12905
12906 g_s.begin("Searching for members imported via using declarations...\n");
12907 // this should be after buildTypedefList in order to properly import
12908 // used typedefs
12909 findUsingDeclarations(root.get(),true); // do for python packages first
12910 findUsingDeclarations(root.get(),false); // then the rest
12911 g_s.end();
12912
12913 g_s.begin("Searching for included using directives...\n");
12915 g_s.end();
12916
12917 g_s.begin("Searching for documented variables...\n");
12918 buildVarList(root.get());
12919 g_s.end();
12920
12921 g_s.begin("Building interface member list...\n");
12922 buildInterfaceAndServiceList(root.get()); // UNO IDL
12923
12924 g_s.begin("Building member list...\n"); // using class info only !
12925 buildFunctionList(root.get());
12926 g_s.end();
12927
12928 g_s.begin("Searching for friends...\n");
12929 findFriends();
12930 g_s.end();
12931
12932 g_s.begin("Searching for documented defines...\n");
12933 findDefineDocumentation(root.get());
12934 g_s.end();
12935
12936 g_s.begin("Computing class inheritance relations...\n");
12937 findClassEntries(root.get());
12939 g_s.end();
12940
12941 g_s.begin("Computing class usage relations...\n");
12943 g_s.end();
12944
12945 g_s.begin("Flushing cached template relations that have become invalid...\n");
12947 g_s.end();
12948
12949 g_s.begin("Warn for undocumented namespaces...\n");
12951 g_s.end();
12952
12953 g_s.begin("Computing class relations...\n");
12956 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12957 {
12959 }
12961 g_classEntries.clear();
12962 g_s.end();
12963
12964 g_s.begin("Add enum values to enums...\n");
12965 addEnumValuesToEnums(root.get());
12966 findEnumDocumentation(root.get());
12967 g_s.end();
12968
12969 g_s.begin("Searching for member function documentation...\n");
12970 findObjCMethodDefinitions(root.get());
12971 findMemberDocumentation(root.get()); // may introduce new members !
12972 findUsingDeclImports(root.get()); // may introduce new members !
12973 g_usingClassMap.clear();
12977 g_s.end();
12978
12979 // moved to after finding and copying documentation,
12980 // as this introduces new members see bug 722654
12981 g_s.begin("Creating members for template instances...\n");
12983 g_s.end();
12984
12985 g_s.begin("Searching for tag less structs...\n");
12987 g_s.end();
12988
12989 g_s.begin("Building page list...\n");
12990 buildPageList(root.get());
12991 g_s.end();
12992
12993 g_s.begin("Building requirements list...\n");
12994 buildRequirementsList(root.get());
12995 g_s.end();
12996
12997 g_s.begin("Search for main page...\n");
12998 findMainPage(root.get());
12999 findMainPageTagFiles(root.get());
13000 g_s.end();
13001
13002 g_s.begin("Computing page relations...\n");
13003 computePageRelations(root.get());
13005 g_s.end();
13006
13007 g_s.begin("Determining the scope of groups...\n");
13008 findGroupScope(root.get());
13009 g_s.end();
13010
13011 g_s.begin("Computing module relations...\n");
13012 auto &mm = ModuleManager::instance();
13013 mm.resolvePartitions();
13014 mm.resolveImports();
13015 mm.collectExportedSymbols();
13016 g_s.end();
13017
13018 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13019 {
13020 return dstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13021 n2->memberName().data()+getPrefixIndex(n2->memberName())
13022 )<0;
13023 };
13024
13025 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13026 {
13027 if (Config_getBool(SORT_BY_SCOPE_NAME))
13028 {
13029 return dstricmp_sort(c1->name(), c2->name())<0;
13030 }
13031 else
13032 {
13033 int i = dstricmp_sort(c1->className(), c2->className());
13034 return i==0 ? dstricmp_sort(c1->name(), c2->name())<0 : i<0;
13035 }
13036 };
13037
13038 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13039 {
13040 return dstricmp_sort(n1->name(),n2->name())<0;
13041 };
13042
13043 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13044 {
13045 return dstricmp_sort(c1->name(),c2->name())<0;
13046 };
13047
13048 g_s.begin("Sorting lists...\n");
13049 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13051 memberNameComp);
13052 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13054 memberNameComp);
13055 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13057 classComp);
13058 std::stable_sort(Doxygen::classLinkedMap->begin(),
13060 classComp);
13061 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13063 conceptComp);
13064 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13066 namespaceComp);
13067 g_s.end();
13068
13069 g_s.begin("Determining which enums are documented\n");
13071 g_s.end();
13072
13073 g_s.begin("Computing member relations...\n");
13076 g_s.end();
13077
13078 g_s.begin("Building full member lists recursively...\n");
13080 g_s.end();
13081
13082 g_s.begin("Adding members to member groups.\n");
13084 g_s.end();
13085
13086 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13087 {
13088 g_s.begin("Distributing member group documentation.\n");
13090 g_s.end();
13091 }
13092
13093 g_s.begin("Computing member references...\n");
13095 g_s.end();
13096
13097 if (Config_getBool(INHERIT_DOCS))
13098 {
13099 g_s.begin("Inheriting documentation...\n");
13101 g_s.end();
13102 }
13103
13104
13105 // compute the shortest possible names of all files
13106 // without losing the uniqueness of the file names.
13107 g_s.begin("Generating disk names...\n");
13109 g_s.end();
13110
13111 g_s.begin("Adding source references...\n");
13113 g_s.end();
13114
13115 g_s.begin("Adding xrefitems...\n");
13118 g_s.end();
13119
13120 g_s.begin("Adding requirements...\n");
13123 g_s.end();
13124
13125 g_s.begin("Sorting member lists...\n");
13127 g_s.end();
13128
13129 g_s.begin("Setting anonymous enum type...\n");
13131 g_s.end();
13132
13133 g_s.begin("Computing dependencies between directories...\n");
13135 g_s.end();
13136
13137 g_s.begin("Generating citations page...\n");
13139 g_s.end();
13140
13141 g_s.begin("Counting data structures...\n");
13143 g_s.end();
13144
13145 g_s.begin("Resolving user defined references...\n");
13147 g_s.end();
13148
13149 g_s.begin("Finding anchors and sections in the documentation...\n");
13151 g_s.end();
13152
13153 g_s.begin("Transferring function references...\n");
13155 g_s.end();
13156
13157 g_s.begin("Combining using relations...\n");
13159 g_s.end();
13160
13162 g_s.begin("Adding members to index pages...\n");
13164 addToIndices();
13165 g_s.end();
13166
13167 g_s.begin("Correcting members for VHDL...\n");
13169 g_s.end();
13170
13171 g_s.begin("Computing tooltip texts...\n");
13173 g_s.end();
13174
13175 if (Config_getBool(SORT_GROUP_NAMES))
13176 {
13177 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13179 [](const auto &g1,const auto &g2)
13180 { return g1->groupTitle() < g2->groupTitle(); });
13181
13182 for (const auto &gd : *Doxygen::groupLinkedMap)
13183 {
13184 gd->sortSubGroups();
13185 }
13186 }
13187
13188 printNavTree(root.get(),0);
13190}
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:1470
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
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:5382
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:2174
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9511
static void computeTemplateClassRelations()
Definition doxygen.cpp:5476
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5655
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2327
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9711
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5431
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1328
static void resolveClassNestingRelations()
Definition doxygen.cpp:1383
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5347
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8470
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5545
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4506
static void addMembersToMemberGroup()
Definition doxygen.cpp:9376
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9880
static void distributeConceptGroups()
Definition doxygen.cpp:1350
static void transferFunctionDocumentation()
Definition doxygen.cpp:4425
static void setAnonymousEnumType()
Definition doxygen.cpp:9116
static void sortMemberLists()
Definition doxygen.cpp:9021
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8598
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4555
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7615
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3494
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:450
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9624
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7585
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9414
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7818
static void resolveUserReferences()
Definition doxygen.cpp:9942
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9771
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3631
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3594
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1835
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2577
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:494
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4328
static void findEnums(const Entry *root)
Definition doxygen.cpp:7643
static DString g_commentFileName
Definition doxygen.cpp:196
static void addListReferences()
Definition doxygen.cpp:5646
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8260
static void findMainPage(Entry *root)
Definition doxygen.cpp:9810
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:2017
static void addSourceReferences()
Definition doxygen.cpp:8894
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9316
static void flushUnresolvedRelations()
Definition doxygen.cpp:9553
static void findDocumentedEnumValues()
Definition doxygen.cpp:8252
static void findTagLessClasses()
Definition doxygen.cpp:1783
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8302
static void computeClassRelations()
Definition doxygen.cpp:5451
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:4023
static void checkPageRelations()
Definition doxygen.cpp:9922
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1318
static void readTagFile(const std::shared_ptr< Entry > &root, const DString &tagLine)
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8141
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9892
static StringSet g_usingDeclarations
Definition doxygen.cpp:193
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3612
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1153
static void buildPageList(Entry *root)
Definition doxygen.cpp:9783
static void addRequirementReferences()
Definition doxygen.cpp:5638
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:197
static void findSectionsInDocumentation()
Definition doxygen.cpp:9452
static void mergeCategories()
Definition doxygen.cpp:8617
static void buildFileList(const Entry *root)
Definition doxygen.cpp:506
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1143
static void findUsedTemplateInstances()
Definition doxygen.cpp:5415
static void computeTooltipTexts()
Definition doxygen.cpp:9070
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8638
static void combineUsingRelations()
Definition doxygen.cpp:9351
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2325
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1338
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:4458
static void buildDefineList()
Definition doxygen.cpp:8973
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3726
static void computeMemberRelations()
Definition doxygen.cpp:8582
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2161
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:1822
#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 11570 of file doxygen.cpp.

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

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

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

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