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 QCString &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

Definition at line 30 of file doxygen.h.

Referenced by LatexCodeGenerator::codify(), and removeRedundantWhiteSpace().

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

12013{
12014 AUTO_TRACE();
12015 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 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
12042 for (const auto &mapping : extMaps)
12043 {
12044 QCString mapStr = mapping;
12045 int i=mapStr.find('=');
12046 if (i==-1)
12047 {
12048 continue;
12049 }
12050 else
12051 {
12052 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
12053 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12054 if (ext.isEmpty() || language.isEmpty())
12055 {
12056 continue;
12057 }
12058
12059 if (!updateLanguageMapping(ext,language))
12060 {
12061 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12062 "Check the EXTENSION_MAPPING setting in the config file.\n",
12063 ext,language);
12064 }
12065 else
12066 {
12067 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12068 ext,language);
12069 }
12070 }
12071 }
12072 // create input file exncodings
12073
12074 // check INPUT_ENCODING
12075 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12076 if (cd==reinterpret_cast<void *>(-1))
12077 {
12078 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12079 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12080 Config_getString(INPUT_ENCODING),strerror(errno));
12081 }
12082 else
12083 {
12085 }
12086
12087 // check and split INPUT_FILE_ENCODING
12088 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
12089 for (const auto &mapping : fileEncod)
12090 {
12091 QCString mapStr = mapping;
12092 int i=mapStr.find('=');
12093 if (i==-1)
12094 {
12095 continue;
12096 }
12097 else
12098 {
12099 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
12100 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12101 if (pattern.isEmpty() || encoding.isEmpty())
12102 {
12103 continue;
12104 }
12105 cd = portable_iconv_open("UTF-8",encoding.data());
12106 if (cd==reinterpret_cast<void *>(-1))
12107 {
12108 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12109 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12110 encoding,strerror(errno));
12111 }
12112 else
12113 {
12115 }
12116
12117 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12118 }
12119 }
12120
12121 // add predefined macro name to a dictionary
12122 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
12123 for (const auto &s : expandAsDefinedList)
12124 {
12126 }
12127
12128 // read aliases and store them in a dictionary
12129 readAliases();
12130
12131 // store number of spaces in a tab into Doxygen::spaces
12132 int tabSize = Config_getInt(TAB_SIZE);
12133 Doxygen::spaces.resize(tabSize);
12134 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12135 Doxygen::spaces.at(tabSize)='\0';
12136}
void readAliases()
Definition aliases.cpp:161
static FileNameLinkedMap * plantUmlFileNameLinkedMap
Definition doxygen.h:109
static bool parseSourcesNeeded
Definition doxygen.h:122
static StringUnorderedSet expandAsDefinedSet
Definition doxygen.h:118
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:104
static InputFileEncodingList inputFileEncodingList
Definition doxygen.h:139
static FileNameLinkedMap * dotFileNameLinkedMap
Definition doxygen.h:106
static NamespaceDefMutable * globalScope
Definition doxygen.h:120
static FileNameLinkedMap * imageNameLinkedMap
Definition doxygen.h:105
static FileNameLinkedMap * mscFileNameLinkedMap
Definition doxygen.h:107
static QCString spaces
Definition doxygen.h:134
static FileNameLinkedMap * diaFileNameLinkedMap
Definition doxygen.h:108
static QCString htmlFileExtension
Definition doxygen.h:121
static std::unique_ptr< NamespaceDef > globalNamespaceDef
Definition doxygen.h:119
static FileNameLinkedMap * includeNameLinkedMap
Definition doxygen.h:101
static FileNameLinkedMap * exampleNameLinkedMap
Definition doxygen.h:102
Ordered dictionary of FileName objects.
Definition filename.h:73
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:241
QCString lower() const
Definition qcstring.h:249
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
QCString left(size_t len) const
Definition qcstring.h:229
#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:47
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 QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &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 QCString &extension, const QCString &language)
Definition util.cpp:5089

References AUTO_TRACE, Config_getBool, Config_getEnum, Config_getInt, Config_getList, Config_getString, createNamespaceDef(), QCString::data(), Doxygen::diaFileNameLinkedMap, Doxygen::dotFileNameLinkedMap, err, Doxygen::exampleNameLinkedMap, Doxygen::expandAsDefinedSet, QCString::find(), Doxygen::globalNamespaceDef, Doxygen::globalScope, Doxygen::htmlFileExtension, Doxygen::imageNameLinkedMap, Doxygen::includeNameLinkedMap, Doxygen::inputFileEncodingList, Doxygen::inputNameLinkedMap, QCString::isEmpty(), QCString::left(), QCString::lower(), QCString::mid(), Doxygen::mscFileNameLinkedMap, msg, Doxygen::parseSourcesNeeded, Doxygen::plantUmlFileNameLinkedMap, portable_iconv_close(), portable_iconv_open(), readAliases(), setTranslator(), Doxygen::spaces, QCString::stripWhiteSpace(), term, toNamespaceDefMutable(), and updateLanguageMapping().

Referenced by main().

◆ checkConfiguration()

void checkConfiguration ( )

check and resolve config options

Definition at line 12001 of file doxygen.cpp.

12002{
12003 AUTO_TRACE();
12004
12009}
void initWarningFormat()
Definition message.cpp:236
void postProcess(bool clearHeaderAndFooter, CompareMode compareMode=CompareMode::Full)
void checkAndCorrect(bool quiet, const bool check)
void updateObsolete()
#define FALSE
Definition qcstring.h:34

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

Referenced by main().

◆ cleanUpDoxygen()

void cleanUpDoxygen ( )

Definition at line 11523 of file doxygen.cpp.

11524{
11528
11529 delete Doxygen::indexList;
11538 Doxygen::mainPage.reset();
11542 Doxygen::globalScope = nullptr;
11544 delete theTranslator;
11545 delete g_outputList;
11546
11551 delete Doxygen::dirLinkedMap;
11552 delete Doxygen::symbolMap;
11553}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:114
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:100
static ParserManager * parserManager
Definition doxygen.h:130
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:111
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:98
static IndexList * indexList
Definition doxygen.h:133
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:128
static MemberNameLinkedMap * memberNameLinkedMap
Definition doxygen.h:110
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:124
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:113
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:189
Translator * theTranslator
Definition language.cpp:71

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

13189{
13190 AUTO_TRACE();
13191 /**************************************************************************
13192 * Initialize output generators *
13193 **************************************************************************/
13194
13195 /// add extra languages for which we can only produce syntax highlighted code
13197
13198 //// dump all symbols
13199 if (g_dumpSymbolMap)
13200 {
13201 dumpSymbolMap();
13202 exit(0);
13203 }
13204
13205 bool generateHtml = Config_getBool(GENERATE_HTML);
13206 bool generateLatex = Config_getBool(GENERATE_LATEX);
13207 bool generateMan = Config_getBool(GENERATE_MAN);
13208 bool generateRtf = Config_getBool(GENERATE_RTF);
13209 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13210
13211
13213 if (generateHtml)
13214 {
13218 }
13219 if (generateLatex)
13220 {
13223 }
13224 if (generateDocbook)
13225 {
13228 }
13229 if (generateMan)
13230 {
13231 g_outputList->add<ManGenerator>();
13233 }
13234 if (generateRtf)
13235 {
13236 g_outputList->add<RTFGenerator>();
13238 }
13239 if (Config_getBool(USE_HTAGS))
13240 {
13242 QCString htmldir = Config_getString(HTML_OUTPUT);
13243 if (!Htags::execute(htmldir))
13244 err("USE_HTAGS is YES but htags(1) failed. \n");
13245 else if (!Htags::loadFilemap(htmldir))
13246 err("htags(1) ended normally but failed to load the filemap. \n");
13247 }
13248
13249 /**************************************************************************
13250 * Generate documentation *
13251 **************************************************************************/
13252
13253 g_s.begin("Generating style sheet...\n");
13254 //printf("writing style info\n");
13255 g_outputList->writeStyleInfo(0); // write first part
13256 g_s.end();
13257
13258 bool searchEngine = Config_getBool(SEARCHENGINE);
13259 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13260
13261 g_s.begin("Generating search indices...\n");
13262 if (searchEngine && !serverBasedSearch && generateHtml)
13263 {
13265 }
13266
13267 // generate search indices (need to do this before writing other HTML
13268 // pages as these contain a drop down menu with options depending on
13269 // what categories we find in this function.
13270 if (generateHtml && searchEngine)
13271 {
13272 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13273 Dir searchDir(searchDirName.str());
13274 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13275 {
13276 term("Could not create search results directory '{}' $PWD='{}'\n",
13277 searchDirName,Dir::currentDirPath());
13278 }
13279 HtmlGenerator::writeSearchData(searchDirName);
13280 if (!serverBasedSearch) // client side search index
13281 {
13283 }
13284 }
13285 g_s.end();
13286
13287 // copy static stuff
13288 if (generateHtml)
13289 {
13291 copyLogo(Config_getString(HTML_OUTPUT));
13292 copyIcon(Config_getString(HTML_OUTPUT));
13293 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13294 }
13295 if (generateLatex)
13296 {
13298 copyLogo(Config_getString(LATEX_OUTPUT));
13299 copyIcon(Config_getString(LATEX_OUTPUT));
13300 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13301 }
13302 if (generateDocbook)
13303 {
13304 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13305 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13306 }
13307 if (generateRtf)
13308 {
13309 copyLogo(Config_getString(RTF_OUTPUT));
13310 copyIcon(Config_getString(RTF_OUTPUT));
13311 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13312 }
13313
13315 if (fm.hasFormulas() && generateHtml
13316 && !Config_getBool(USE_MATHJAX))
13317 {
13318 g_s.begin("Generating images for formulas in HTML...\n");
13319 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13321 g_s.end();
13322 }
13323 if (fm.hasFormulas() && generateRtf)
13324 {
13325 g_s.begin("Generating images for formulas in RTF...\n");
13327 g_s.end();
13328 }
13329
13330 if (fm.hasFormulas() && generateDocbook)
13331 {
13332 g_s.begin("Generating images for formulas in Docbook...\n");
13334 g_s.end();
13335 }
13336
13337 g_s.begin("Generating example documentation...\n");
13339 g_s.end();
13340
13341 g_s.begin("Generating file sources...\n");
13343 g_s.end();
13344
13345 g_s.begin("Generating file documentation...\n");
13347 g_s.end();
13348
13349 g_s.begin("Generating page documentation...\n");
13351 g_s.end();
13352
13353 g_s.begin("Generating group documentation...\n");
13355 g_s.end();
13356
13357 g_s.begin("Generating class documentation...\n");
13359 g_s.end();
13360
13361 g_s.begin("Generating concept documentation...\n");
13363 g_s.end();
13364
13365 g_s.begin("Generating module documentation...\n");
13367 g_s.end();
13368
13369 g_s.begin("Generating namespace documentation...\n");
13371 g_s.end();
13372
13373 if (Config_getBool(GENERATE_LEGEND))
13374 {
13375 g_s.begin("Generating graph info page...\n");
13377 g_s.end();
13378 }
13379
13380 g_s.begin("Generating directory documentation...\n");
13382 g_s.end();
13383
13384 if (g_outputList->size()>0)
13385 {
13387 }
13388
13389 g_s.begin("finalizing index lists...\n");
13390 Doxygen::indexList->finalize();
13391 g_s.end();
13392
13393 g_s.begin("writing tag file...\n");
13394 writeTagFile();
13395 g_s.end();
13396
13397 if (Config_getBool(GENERATE_XML))
13398 {
13399 g_s.begin("Generating XML output...\n");
13401 generateXML();
13403 g_s.end();
13404 }
13405 if (Config_getBool(GENERATE_SQLITE3))
13406 {
13407 g_s.begin("Generating SQLITE3 output...\n");
13409 g_s.end();
13410 }
13411
13412 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13413 {
13414 g_s.begin("Generating AutoGen DEF output...\n");
13415 generateDEF();
13416 g_s.end();
13417 }
13418 if (Config_getBool(GENERATE_PERLMOD))
13419 {
13420 g_s.begin("Generating Perl module output...\n");
13422 g_s.end();
13423 }
13424 if (generateHtml && searchEngine && serverBasedSearch)
13425 {
13426 g_s.begin("Generating search index\n");
13427 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13428 {
13430 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13431 }
13432 else // write data for external search index
13433 {
13435 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13436 if (searchDataFile.isEmpty())
13437 {
13438 searchDataFile="searchdata.xml";
13439 }
13440 if (!Portable::isAbsolutePath(searchDataFile.data()))
13441 {
13442 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13443 }
13444 Doxygen::searchIndex.write(searchDataFile);
13445 }
13446 g_s.end();
13447 }
13448
13449 if (generateRtf)
13450 {
13451 g_s.begin("Combining RTF output...\n");
13452 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13453 {
13454 err("An error occurred during post-processing the RTF files!\n");
13455 }
13456 g_s.end();
13457 }
13458
13459 g_s.begin("Running plantuml with JAVA...\n");
13461 g_s.end();
13462
13463 if (Config_getBool(HAVE_DOT))
13464 {
13465 g_s.begin("Running dot...\n");
13467 g_s.end();
13468 }
13469
13470 if (generateHtml &&
13471 Config_getBool(GENERATE_HTMLHELP) &&
13472 !Config_getString(HHC_LOCATION).isEmpty())
13473 {
13474 g_s.begin("Running html help compiler...\n");
13476 g_s.end();
13477 }
13478
13479 if ( generateHtml &&
13480 Config_getBool(GENERATE_QHP) &&
13481 !Config_getString(QHG_LOCATION).isEmpty())
13482 {
13483 g_s.begin("Running qhelpgenerator...\n");
13485 g_s.end();
13486 }
13487
13488 g_outputList->cleanup();
13490
13491 msg("type lookup cache used {}/{} hits={} misses={}\n",
13493 Doxygen::typeLookupCache->capacity(),
13495 Doxygen::typeLookupCache->misses());
13496 msg("symbol lookup cache used {}/{} hits={} misses={}\n",
13498 Doxygen::symbolLookupCache->capacity(),
13500 Doxygen::symbolLookupCache->misses());
13501 int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
13502 int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
13503 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13504 if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
13505 {
13506 msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13507 }
13508
13510 {
13511
13512 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13513 if (numThreads<1) numThreads=1;
13514 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13515 (static_cast<double>(Debug::elapsedTime())),
13516 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13517 );
13518 g_s.print();
13519
13521 msg("finished...\n");
13523 }
13524 else
13525 {
13526 msg("finished...\n");
13527 }
13528
13529
13530 /**************************************************************************
13531 * Start cleaning up *
13532 **************************************************************************/
13533
13535
13537 Dir thisDir;
13538 thisDir.remove(Doxygen::filterDBFileName.str());
13540 exitTracing();
13542 delete Doxygen::clangUsrMap;
13544
13545 //dumpDocNodeSizes();
13546}
@ Time
Definition debug.h:35
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: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:128
static DotManager * instance()
Definition dot.cpp:78
static Cache< std::string, LookupInfo > * typeLookupCache
Definition doxygen.h:126
static Cache< std::string, LookupInfo > * symbolLookupCache
Definition doxygen.h:127
static QCString filterDBFileName
Definition doxygen.h:132
static bool generatingXmlOutput
Definition doxygen.h:135
static SearchIndexIntf searchIndex
Definition doxygen.h:123
static ClangUsrMap * clangUsrMap
Definition doxygen.h:125
bool hasFormulas() const
Definition formula.cpp:720
void generateImages(const QCString &outputDir, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:636
Generator for HTML output.
Definition htmlgen.h:96
static void init()
Definition htmlgen.cpp:1197
static void writeSearchPage()
Definition htmlgen.cpp:3197
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1357
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1366
static void writeExternalSearchPage()
Definition htmlgen.cpp:3296
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 writeDocumentation(OutputList &ol)
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
static PlantumlManager & instance()
Definition plantuml.cpp:231
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:389
QCString & prepend(const char *s)
Definition qcstring.h:422
const std::string & str() const
Definition qcstring.h:552
Generator for RTF output.
Definition rtfgen.h:80
static void init()
Definition rtfgen.cpp:461
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
Definition rtfgen.cpp:2461
void generateDEF()
Definition defgen.cpp:482
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1210
static void copyLatexStyleSheet()
static void runQHelpGenerator()
class Statistics g_s
static void copyStyleSheet()
static void generateGroupDocs()
static void generateExampleDocs()
static void dumpSymbolMap()
static void generateFileDocs()
Definition doxygen.cpp:8784
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9999
static void generateFileSources()
Definition doxygen.cpp:8618
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9219
static int computeIdealCacheParam(size_t v)
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
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:9245
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4066
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5780
void finishWarnExit()
Definition message.cpp:294
void deinit()
bool isAbsolutePath(const QCString &fileName)
Definition portable.cpp:498
double getSysElapsedTime()
Definition portable.cpp:98
void generatePerlMod()
#define TRUE
Definition qcstring.h:37
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
void generateSqlite3()
static bool execute(const QCString &htmldir)
Definition htags.cpp:38
static bool loadFilemap(const QCString &htmldir)
Definition htags.cpp:107
static bool useHtags
Definition htags.h:23
void exitTracing()
Definition trace.cpp:52
void addCodeOnlyMappings()
Definition util.cpp:5188
void cleanupInlineGraph()
Definition util.cpp:6993
void generateXML()
Definition xmlgen.cpp:2326

References addCodeOnlyMappings(), AUTO_TRACE, FormulaManager::Bitmap, Doxygen::clangUsrMap, cleanUpDoxygen(), cleanupInlineGraph(), Debug::clearFlag(), computeIdealCacheParam(), Config_getBool, Config_getEnum, Config_getInt, Config_getList, Config_getString, copyExtraFiles(), copyIcon(), copyLatexStyleSheet(), copyLogo(), copyStyleSheet(), createJavaScriptSearchIndex(), Dir::currentDirPath(), QCString::data(), Config::deinit(), dumpSymbolMap(), Debug::elapsedTime(), err, Htags::execute(), Dir::exists(), exitTracing(), FALSE, Doxygen::filterDBFileName, 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(), ModuleManager::instance(), PlantumlManager::instance(), SearchIndexIntf::Internal, Portable::isAbsolutePath(), QCString::isEmpty(), Debug::isFlagSet(), Htags::loadFilemap(), Dir::mkdir(), msg, FormulaManager::On, QCString::prepend(), RTFGenerator::preProcessFileInplace(), Dir::remove(), DotManager::run(), PlantumlManager::run(), runHtmlHelpCompiler(), runQHelpGenerator(), Doxygen::searchIndex, Debug::setFlag(), QCString::str(), Doxygen::symbolLookupCache, term, Debug::Time, TRUE, Doxygen::typeLookupCache, Htags::useHtags, FormulaManager::Vector, ModuleManager::writeDocumentation(), HtmlGenerator::writeExternalSearchPage(), writeGraphInfo(), writeIndexHierarchy(), writeJavaScriptSearchIndex(), HtmlGenerator::writeSearchData(), HtmlGenerator::writeSearchPage(), HtmlGenerator::writeTabData(), and writeTagFile().

Referenced by main().

◆ initDoxygen()

void initDoxygen ( )

Definition at line 11454 of file doxygen.cpp.

11455{
11456 initResources();
11457 QCString lang = Portable::getenv("LC_ALL");
11458 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11459 std::setlocale(LC_ALL,"");
11460 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11461 std::setlocale(LC_NUMERIC,"C");
11462
11464
11488
11489 // register any additional parsers here...
11490
11492
11493#if USE_LIBCLANG
11495#endif
11504 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11505 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11506 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11508
11509 // initialization of these globals depends on
11510 // configuration switches so we need to postpone these
11511 Doxygen::globalScope = nullptr;
11520
11521}
static void startTimer()
Definition debug.cpp:195
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
Manages programming language parsers.
Definition parserintf.h:183
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 QCString &variable, const QCString &value)
Definition portable.cpp:287
QCString getenv(const QCString &variable)
Definition portable.cpp:322
void initDefaultExtensionMapping()
Definition util.cpp:5121

References Doxygen::clangUsrMap, Doxygen::classLinkedMap, Doxygen::conceptLinkedMap, Doxygen::diaFileNameLinkedMap, Doxygen::dirLinkedMap, Doxygen::dotFileNameLinkedMap, Doxygen::exampleLinkedMap, Doxygen::exampleNameLinkedMap, Doxygen::functionNameLinkedMap, Portable::getenv(), Doxygen::globalScope, Doxygen::groupLinkedMap, Doxygen::hiddenClassLinkedMap, Doxygen::imageNameLinkedMap, Doxygen::includeNameLinkedMap, Doxygen::indexList, initDefaultExtensionMapping(), initResources(), Doxygen::inputNameLinkedMap, QCString::isEmpty(), make_parser_factory(), Doxygen::memberNameLinkedMap, Doxygen::mscFileNameLinkedMap, Doxygen::namespaceLinkedMap, Doxygen::pageLinkedMap, Doxygen::parserManager, Doxygen::plantUmlFileNameLinkedMap, Portable::setenv(), Debug::startTimer(), and Doxygen::symbolMap.

Referenced by main().

◆ parseInput()

void parseInput ( )

Definition at line 12504 of file doxygen.cpp.

12505{
12506 AUTO_TRACE();
12507 std::atexit(exitDoxygen);
12508
12509 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12510
12511#if USE_LIBCLANG
12512 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12513#endif
12514
12515 // we would like to show the versionString earlier, but we first have to handle the configuration file
12516 // to know the value of the QUIET setting.
12517 QCString versionString = getFullVersion();
12518 msg("Doxygen version used: {}\n",versionString);
12519
12521
12522 /**************************************************************************
12523 * Make sure the output directory exists
12524 **************************************************************************/
12525 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12526 if (!g_singleComment)
12527 {
12528 if (outputDirectory.isEmpty())
12529 {
12530 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12531 }
12532 else
12533 {
12534 Dir dir(outputDirectory.str());
12535 if (!dir.exists())
12536 {
12537 dir.setPath(Dir::currentDirPath());
12538 if (!dir.mkdir(outputDirectory.str()))
12539 {
12540 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12541 "exist and cannot be created\n",outputDirectory);
12542 }
12543 else
12544 {
12545 msg("Notice: Output directory '{}' does not exist. "
12546 "I have created it for you.\n", outputDirectory);
12547 }
12548 dir.setPath(outputDirectory.str());
12549 }
12550 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12551 }
12552 }
12553 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12554
12555 /**************************************************************************
12556 * Initialize global lists and dictionaries
12557 **************************************************************************/
12558
12559 // also scale lookup cache with SYMBOL_CACHE_SIZE
12560 int cacheSize = Config_getInt(LOOKUP_CACHE_SIZE);
12561 if (cacheSize<0) cacheSize=0;
12562 if (cacheSize>9) cacheSize=9;
12563 uint32_t lookupSize = 65536 << cacheSize;
12566
12567#ifdef HAS_SIGNALS
12568 signal(SIGINT, stopDoxygen);
12569#endif
12570
12571 uint32_t pid = Portable::pid();
12572 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12573 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12574
12575 /**************************************************************************
12576 * Check/create output directories *
12577 **************************************************************************/
12578
12579 bool generateHtml = Config_getBool(GENERATE_HTML);
12580 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12581 bool generateXml = Config_getBool(GENERATE_XML);
12582 bool generateLatex = Config_getBool(GENERATE_LATEX);
12583 bool generateRtf = Config_getBool(GENERATE_RTF);
12584 bool generateMan = Config_getBool(GENERATE_MAN);
12585 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12586 QCString htmlOutput;
12587 QCString docbookOutput;
12588 QCString xmlOutput;
12589 QCString latexOutput;
12590 QCString rtfOutput;
12591 QCString manOutput;
12592 QCString sqlOutput;
12593
12594 if (!g_singleComment)
12595 {
12596 if (generateHtml)
12597 {
12598 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12599 Config_updateString(HTML_OUTPUT,htmlOutput);
12600
12601 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12602 bool generateSitemap = !sitemapUrl.isEmpty();
12603 if (generateSitemap && !sitemapUrl.endsWith("/"))
12604 {
12605 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12606 }
12607
12608 // add HTML indexers that are enabled
12609 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12610 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12611 bool generateQhp = Config_getBool(GENERATE_QHP);
12612 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12613 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12614 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12615 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12616 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12617 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12618 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12619 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12620 Doxygen::indexList->addIndex<Crawlmap>();
12621 Doxygen::indexList->initialize();
12622 }
12623
12624 if (generateDocbook)
12625 {
12626 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12627 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12628 }
12629
12630 if (generateXml)
12631 {
12632 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12633 Config_updateString(XML_OUTPUT,xmlOutput);
12634 }
12635
12636 if (generateLatex)
12637 {
12638 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12639 Config_updateString(LATEX_OUTPUT,latexOutput);
12640 }
12641
12642 if (generateRtf)
12643 {
12644 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12645 Config_updateString(RTF_OUTPUT,rtfOutput);
12646 }
12647
12648 if (generateMan)
12649 {
12650 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12651 Config_updateString(MAN_OUTPUT,manOutput);
12652 }
12653
12654 if (generateSql)
12655 {
12656 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12657 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12658 }
12659 }
12660
12661 if (Config_getBool(HAVE_DOT))
12662 {
12663 QCString curFontPath = Config_getString(DOT_FONTPATH);
12664 if (curFontPath.isEmpty())
12665 {
12666 Portable::getenv("DOTFONTPATH");
12667 QCString newFontPath = ".";
12668 if (!curFontPath.isEmpty())
12669 {
12670 newFontPath+=Portable::pathListSeparator();
12671 newFontPath+=curFontPath;
12672 }
12673 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12674 }
12675 else
12676 {
12677 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12678 }
12679 }
12680
12681 /**************************************************************************
12682 * Handle layout file *
12683 **************************************************************************/
12684
12686 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12687 bool defaultLayoutUsed = FALSE;
12688 if (layoutFileName.isEmpty())
12689 {
12690 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12691 defaultLayoutUsed = TRUE;
12692 }
12693 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12694
12695 FileInfo fi(layoutFileName.str());
12696 if (fi.exists())
12697 {
12698 msg("Parsing layout file {}...\n",layoutFileName);
12699 LayoutDocManager::instance().parse(layoutFileName);
12700 }
12701 else if (!defaultLayoutUsed)
12702 {
12703 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12704 }
12705 printLayout();
12706
12707 /**************************************************************************
12708 * Read and preprocess input *
12709 **************************************************************************/
12710
12711 // prevent search in the output directories
12712 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12713 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12714 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12715 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12716 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12717 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12718 if (generateMan) exclPatterns.push_back(manOutput.str());
12719 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12720
12721 if (!g_singleComment)
12722 {
12724
12726 }
12727
12728 // Notice: the order of the function calls below is very important!
12729
12730 if (generateHtml && !Config_getBool(USE_MATHJAX))
12731 {
12733 }
12734 if (generateRtf)
12735 {
12737 }
12738 if (generateDocbook)
12739 {
12741 }
12742
12744
12745 /**************************************************************************
12746 * Handle Tag Files *
12747 **************************************************************************/
12748
12749 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12750
12751 if (!g_singleComment)
12752 {
12753 msg("Reading and parsing tag files\n");
12754 const StringVector &tagFileList = Config_getList(TAGFILES);
12755 for (const auto &s : tagFileList)
12756 {
12757 readTagFile(root,s.c_str());
12758 }
12759 }
12760
12761 /**************************************************************************
12762 * Parse source files *
12763 **************************************************************************/
12764
12765 addSTLSupport(root);
12766
12767 g_s.begin("Parsing files\n");
12768 if (g_singleComment)
12769 {
12770 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12771 if (g_commentFileName=="-")
12772 {
12773 std::string text = fileToString(g_commentFileName).str();
12774 addTerminalCharIfMissing(text,'\n');
12775 generateHtmlForComment("stdin.md",text);
12776 }
12777 else if (FileInfo(g_commentFileName.str()).isFile())
12778 {
12779 std::string text;
12781 addTerminalCharIfMissing(text,'\n');
12783 }
12784 else
12785 {
12786 }
12788 exit(0);
12789 }
12790 else
12791 {
12792 if (Config_getInt(NUM_PROC_THREADS)==1)
12793 {
12795 }
12796 else
12797 {
12799 }
12800 }
12801 g_s.end();
12802
12803 /**************************************************************************
12804 * Gather information *
12805 **************************************************************************/
12806
12807 g_s.begin("Building macro definition list...\n");
12809 g_s.end();
12810
12811 g_s.begin("Building group list...\n");
12812 buildGroupList(root.get());
12813 organizeSubGroups(root.get());
12814 g_s.end();
12815
12816 g_s.begin("Building directory list...\n");
12818 findDirDocumentation(root.get());
12819 g_s.end();
12820
12821 g_s.begin("Building namespace list...\n");
12822 buildNamespaceList(root.get());
12823 findUsingDirectives(root.get());
12824 g_s.end();
12825
12826 g_s.begin("Building file list...\n");
12827 buildFileList(root.get());
12828 g_s.end();
12829
12830 g_s.begin("Building class list...\n");
12831 buildClassList(root.get());
12832 g_s.end();
12833
12834 g_s.begin("Building concept list...\n");
12835 buildConceptList(root.get());
12836 g_s.end();
12837
12838 // build list of using declarations here (global list)
12839 buildListOfUsingDecls(root.get());
12840 g_s.end();
12841
12842 g_s.begin("Computing nesting relations for classes...\n");
12844 g_s.end();
12845 // 1.8.2-20121111: no longer add nested classes to the group as well
12846 //distributeClassGroupRelations();
12847
12848 // calling buildClassList may result in cached relations that
12849 // become invalid after resolveClassNestingRelations(), that's why
12850 // we need to clear the cache here
12851 Doxygen::typeLookupCache->clear();
12852 // we don't need the list of using declaration anymore
12853 g_usingDeclarations.clear();
12854
12855 g_s.begin("Associating documentation with classes...\n");
12856 buildClassDocList(root.get());
12857 g_s.end();
12858
12859 g_s.begin("Associating documentation with concepts...\n");
12860 buildConceptDocList(root.get());
12862 g_s.end();
12863
12864 g_s.begin("Associating documentation with modules...\n");
12865 findModuleDocumentation(root.get());
12866 g_s.end();
12867
12868 g_s.begin("Building example list...\n");
12869 buildExampleList(root.get());
12870 g_s.end();
12871
12872 g_s.begin("Searching for enumerations...\n");
12873 findEnums(root.get());
12874 g_s.end();
12875
12876 // Since buildVarList calls isVarWithConstructor
12877 // and this calls getResolvedClass we need to process
12878 // typedefs first so the relations between classes via typedefs
12879 // are properly resolved. See bug 536385 for an example.
12880 g_s.begin("Searching for documented typedefs...\n");
12881 buildTypedefList(root.get());
12882 g_s.end();
12883
12884 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12885 {
12886 g_s.begin("Searching for documented sequences...\n");
12887 buildSequenceList(root.get());
12888 g_s.end();
12889
12890 g_s.begin("Searching for documented dictionaries...\n");
12891 buildDictionaryList(root.get());
12892 g_s.end();
12893 }
12894
12895 g_s.begin("Searching for members imported via using declarations...\n");
12896 // this should be after buildTypedefList in order to properly import
12897 // used typedefs
12898 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12899 findUsingDeclarations(root.get(),FALSE); // then the rest
12900 g_s.end();
12901
12902 g_s.begin("Searching for included using directives...\n");
12904 g_s.end();
12905
12906 g_s.begin("Searching for documented variables...\n");
12907 buildVarList(root.get());
12908 g_s.end();
12909
12910 g_s.begin("Building interface member list...\n");
12911 buildInterfaceAndServiceList(root.get()); // UNO IDL
12912
12913 g_s.begin("Building member list...\n"); // using class info only !
12914 buildFunctionList(root.get());
12915 g_s.end();
12916
12917 g_s.begin("Searching for friends...\n");
12918 findFriends();
12919 g_s.end();
12920
12921 g_s.begin("Searching for documented defines...\n");
12922 findDefineDocumentation(root.get());
12923 g_s.end();
12924
12925 g_s.begin("Computing class inheritance relations...\n");
12926 findClassEntries(root.get());
12928 g_s.end();
12929
12930 g_s.begin("Computing class usage relations...\n");
12932 g_s.end();
12933
12934 if (Config_getBool(INLINE_SIMPLE_STRUCTS))
12935 {
12936 g_s.begin("Searching for tag less structs...\n");
12938 g_s.end();
12939 }
12940
12941 g_s.begin("Flushing cached template relations that have become invalid...\n");
12943 g_s.end();
12944
12945 g_s.begin("Warn for undocumented namespaces...\n");
12947 g_s.end();
12948
12949 g_s.begin("Computing class relations...\n");
12952 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12953 {
12955 }
12957 g_classEntries.clear();
12958 g_s.end();
12959
12960 g_s.begin("Add enum values to enums...\n");
12961 addEnumValuesToEnums(root.get());
12962 findEnumDocumentation(root.get());
12963 g_s.end();
12964
12965 g_s.begin("Searching for member function documentation...\n");
12966 findObjCMethodDefinitions(root.get());
12967 findMemberDocumentation(root.get()); // may introduce new members !
12968 findUsingDeclImports(root.get()); // may introduce new members !
12969 g_usingClassMap.clear();
12973 g_s.end();
12974
12975 // moved to after finding and copying documentation,
12976 // as this introduces new members see bug 722654
12977 g_s.begin("Creating members for template instances...\n");
12979 g_s.end();
12980
12981 g_s.begin("Building page list...\n");
12982 buildPageList(root.get());
12983 g_s.end();
12984
12985 g_s.begin("Building requirements list...\n");
12986 buildRequirementsList(root.get());
12987 g_s.end();
12988
12989 g_s.begin("Search for main page...\n");
12990 findMainPage(root.get());
12991 findMainPageTagFiles(root.get());
12992 g_s.end();
12993
12994 g_s.begin("Computing page relations...\n");
12995 computePageRelations(root.get());
12997 g_s.end();
12998
12999 g_s.begin("Determining the scope of groups...\n");
13000 findGroupScope(root.get());
13001 g_s.end();
13002
13003 g_s.begin("Computing module relations...\n");
13004 auto &mm = ModuleManager::instance();
13005 mm.resolvePartitions();
13006 mm.resolveImports();
13007 mm.collectExportedSymbols();
13008 g_s.end();
13009
13010 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
13011 {
13012 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
13013 n2->memberName().data()+getPrefixIndex(n2->memberName())
13014 )<0;
13015 };
13016
13017 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
13018 {
13019 if (Config_getBool(SORT_BY_SCOPE_NAME))
13020 {
13021 return qstricmp_sort(c1->name(), c2->name())<0;
13022 }
13023 else
13024 {
13025 int i = qstricmp_sort(c1->className(), c2->className());
13026 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
13027 }
13028 };
13029
13030 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13031 {
13032 return qstricmp_sort(n1->name(),n2->name())<0;
13033 };
13034
13035 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13036 {
13037 return qstricmp_sort(c1->name(),c2->name())<0;
13038 };
13039
13040 g_s.begin("Sorting lists...\n");
13041 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13043 memberNameComp);
13044 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13046 memberNameComp);
13047 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13049 classComp);
13050 std::stable_sort(Doxygen::classLinkedMap->begin(),
13052 classComp);
13053 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13055 conceptComp);
13056 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13058 namespaceComp);
13059 g_s.end();
13060
13061 g_s.begin("Determining which enums are documented\n");
13063 g_s.end();
13064
13065 g_s.begin("Computing member relations...\n");
13068 g_s.end();
13069
13070 g_s.begin("Building full member lists recursively...\n");
13072 g_s.end();
13073
13074 g_s.begin("Adding members to member groups.\n");
13076 g_s.end();
13077
13078 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13079 {
13080 g_s.begin("Distributing member group documentation.\n");
13082 g_s.end();
13083 }
13084
13085 g_s.begin("Computing member references...\n");
13087 g_s.end();
13088
13089 if (Config_getBool(INHERIT_DOCS))
13090 {
13091 g_s.begin("Inheriting documentation...\n");
13093 g_s.end();
13094 }
13095
13096
13097 // compute the shortest possible names of all files
13098 // without losing the uniqueness of the file names.
13099 g_s.begin("Generating disk names...\n");
13101 g_s.end();
13102
13103 g_s.begin("Adding source references...\n");
13105 g_s.end();
13106
13107 g_s.begin("Adding xrefitems...\n");
13110 g_s.end();
13111
13112 g_s.begin("Adding requirements...\n");
13115 g_s.end();
13116
13117 g_s.begin("Sorting member lists...\n");
13119 g_s.end();
13120
13121 g_s.begin("Setting anonymous enum type...\n");
13123 g_s.end();
13124
13125 g_s.begin("Computing dependencies between directories...\n");
13127 g_s.end();
13128
13129 g_s.begin("Generating citations page...\n");
13131 g_s.end();
13132
13133 g_s.begin("Counting members...\n");
13134 countMembers();
13135 g_s.end();
13136
13137 g_s.begin("Counting data structures...\n");
13139 g_s.end();
13140
13141 g_s.begin("Resolving user defined references...\n");
13143 g_s.end();
13144
13145 g_s.begin("Finding anchors and sections in the documentation...\n");
13147 g_s.end();
13148
13149 g_s.begin("Transferring function references...\n");
13151 g_s.end();
13152
13153 g_s.begin("Combining using relations...\n");
13155 g_s.end();
13156
13158 g_s.begin("Adding members to index pages...\n");
13160 addToIndices();
13161 g_s.end();
13162
13163 g_s.begin("Correcting members for VHDL...\n");
13165 g_s.end();
13166
13167 g_s.begin("Computing tooltip texts...\n");
13169 g_s.end();
13170
13171 if (Config_getBool(SORT_GROUP_NAMES))
13172 {
13173 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13175 [](const auto &g1,const auto &g2)
13176 { return g1->groupTitle() < g2->groupTitle(); });
13177
13178 for (const auto &gd : *Doxygen::groupLinkedMap)
13179 {
13180 gd->sortSubGroups();
13181 }
13182 }
13183
13184 printNavTree(root.get(),0);
13186}
Definition cache.h:32
static CitationManager & instance()
Definition cite.cpp:85
void generatePage()
Generate the citations page.
Definition cite.cpp:331
A class that generates docset files.
Definition docsets.h:36
static bool clangAssistedParsing
Definition doxygen.h:137
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:23
bool isFile() const
Definition fileinfo.cpp:63
void initFromRepository(const QCString &dir)
Definition formula.cpp:60
void checkRepositories()
Definition formula.cpp:173
A class that generated the HTML Help specific files.
Definition htmlhelp.h:36
static Index & instance()
Definition index.cpp:106
void countDataStructures()
Definition index.cpp:262
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1470
std::unique_ptr< MemberName > Ptr
Definition linkedmap.h:38
bool endsWith(const char *s) const
Definition qcstring.h:524
Definition qhp.h:27
static RequirementManager & instance()
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:1119
void computeDirDependencies()
Definition dirdef.cpp:1193
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:48
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5327
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:431
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2057
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9461
static void computeTemplateClassRelations()
Definition doxygen.cpp:5421
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5600
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2210
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9699
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5376
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:5290
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8419
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5490
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4448
static void addMembersToMemberGroup()
Definition doxygen.cpp:9326
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9869
static void distributeConceptGroups()
Definition doxygen.cpp:1347
static void transferFunctionDocumentation()
Definition doxygen.cpp:4367
static void setAnonymousEnumType()
Definition doxygen.cpp:9066
static void sortMemberLists()
Definition doxygen.cpp:8971
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8547
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4497
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7560
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3436
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:446
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9612
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7530
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9364
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7764
static void resolveUserReferences()
Definition doxygen.cpp:9931
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9760
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3573
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3536
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1719
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2460
static void countMembers()
Definition doxygen.cpp:9080
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:490
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4270
static void findEnums(const Entry *root)
Definition doxygen.cpp:7588
static void addListReferences()
Definition doxygen.cpp:5591
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8209
static void findMainPage(Entry *root)
Definition doxygen.cpp:9799
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:1901
static void addSourceReferences()
Definition doxygen.cpp:8844
static void buildExampleList(Entry *root)
static void inheritDocumentation()
Definition doxygen.cpp:9266
static void flushUnresolvedRelations()
Definition doxygen.cpp:9515
static QCString g_commentFileName
Definition doxygen.cpp:193
static void findDocumentedEnumValues()
Definition doxygen.cpp:8201
static void findTagLessClasses()
Definition doxygen.cpp:1695
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8251
static void computeClassRelations()
Definition doxygen.cpp:5396
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:3965
static void checkPageRelations()
Definition doxygen.cpp:9911
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1315
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8089
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9881
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static StringSet g_usingDeclarations
Definition doxygen.cpp:190
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3554
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1150
static void buildPageList(Entry *root)
Definition doxygen.cpp:9772
static void addRequirementReferences()
Definition doxygen.cpp:5583
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:194
static void findSectionsInDocumentation()
Definition doxygen.cpp:9402
static void mergeCategories()
Definition doxygen.cpp:8566
static void buildFileList(const Entry *root)
Definition doxygen.cpp:502
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1140
static void findUsedTemplateInstances()
Definition doxygen.cpp:5360
static void computeTooltipTexts()
Definition doxygen.cpp:9020
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8588
static void combineUsingRelations()
Definition doxygen.cpp:9301
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2208
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 void transferFunctionReferences()
Definition doxygen.cpp:4400
static void buildDefineList()
Definition doxygen.cpp:8923
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3668
static void computeMemberRelations()
Definition doxygen.cpp:8531
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2044
static std::multimap< std::string, const Entry * > g_classEntries
Definition doxygen.cpp:187
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:517
QCString pathListSeparator()
Definition portable.cpp:384
uint32_t pid()
Definition portable.cpp:249
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:687
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:84
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
Definition util.cpp:5533
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1474
int getPrefixIndex(const QCString &name)
Definition util.cpp:3215

References Dir::absPath(), addEnumValuesToEnums(), addListReferences(), addMembersToIndex(), addMembersToMemberGroup(), addRequirementReferences(), addSourceReferences(), addSTLSupport(), addTerminalCharIfMissing(), addToIndices(), AUTO_TRACE, AUTO_TRACE_ADD, 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(), 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(), countMembers(), createOutputDirectory(), createTemplateInstanceMembers(), Dir::currentDirPath(), distributeConceptGroups(), distributeMemberGroupDocumentation(), end(), QCString::endsWith(), Dir::exists(), FileInfo::exists(), exitDoxygen(), FALSE, 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(), initSearchIndexer(), CitationManager::instance(), FormulaManager::instance(), Index::instance(), LayoutDocManager::instance(), ModuleManager::instance(), RequirementManager::instance(), QCString::isEmpty(), FileInfo::isFile(), Doxygen::memberNameLinkedMap, mergeCategories(), Dir::mkdir(), msg, Doxygen::namespaceLinkedMap, organizeSubGroups(), LayoutDocManager::parse(), parseFilesMultiThreading(), parseFilesSingleThreading(), Portable::pathListSeparator(), Portable::pid(), printLayout(), printNavTree(), printSectionsTree(), qPrint(), qstricmp_sort(), readInputFile(), readTagFile(), resolveClassNestingRelations(), resolveUserReferences(), searchInputFiles(), setAnonymousEnumType(), Portable::setenv(), Dir::setPath(), sortMemberLists(), stopDoxygen(), QCString::str(), Doxygen::symbolLookupCache, term, transferFunctionDocumentation(), transferFunctionReferences(), transferRelatedFunctionDocumentation(), transferStaticInstanceInitializers(), TRUE, Doxygen::typeLookupCache, vhdlCorrectMemberProperties(), warn_uncond, and warnUndocumentedNamespaces().

Referenced by main().

◆ readConfiguration()

void readConfiguration ( int argc,
char ** argv )

Definition at line 11571 of file doxygen.cpp.

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

References FileInfo::absFilePath(), Config::checkAndCorrect(), cleanUpDoxygen(), compareDoxyfile(), Config::Compressed, Config::CompressedNoEnv, Config_getBool, Config_getEnum, Config_updateBool, QCString::data(), devUsage(), err, FileInfo::exists(), Config::Full, g_commentFileName, g_dumpSymbolMap, g_singleComment, generateConfigFile(), getArg(), Config::init(), initTracing(), EmojiEntityMapper::instance(), QCString::isEmpty(), msg, openOutputFile(), Config::parse(), Config::postProcess(), qstrcmp(), qstricmp(), Debug::setFlagStr(), setPerlModDoxyfile(), setTranslator(), QCString::str(), TRACE, TRUE, 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 QCString & 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 11217 of file doxygen.cpp.

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

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

Referenced by searchInputFiles().