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

11983{
11984 AUTO_TRACE();
11985 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
11995
11996 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11997
11998 /* Set the global html file extension. */
11999 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
12000
12001
12003 Config_getBool(CALLER_GRAPH) ||
12004 Config_getBool(REFERENCES_RELATION) ||
12005 Config_getBool(REFERENCED_BY_RELATION);
12006
12007 /**************************************************************************
12008 * Add custom extension mappings
12009 **************************************************************************/
12010
12011 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
12012 for (const auto &mapping : extMaps)
12013 {
12014 QCString mapStr = mapping;
12015 int i=mapStr.find('=');
12016 if (i==-1)
12017 {
12018 continue;
12019 }
12020 else
12021 {
12022 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
12023 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12024 if (ext.isEmpty() || language.isEmpty())
12025 {
12026 continue;
12027 }
12028
12029 if (!updateLanguageMapping(ext,language))
12030 {
12031 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12032 "Check the EXTENSION_MAPPING setting in the config file.\n",
12033 ext,language);
12034 }
12035 else
12036 {
12037 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12038 ext,language);
12039 }
12040 }
12041 }
12042 // create input file exncodings
12043
12044 // check INPUT_ENCODING
12045 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12046 if (cd==reinterpret_cast<void *>(-1))
12047 {
12048 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12049 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12050 Config_getString(INPUT_ENCODING),strerror(errno));
12051 }
12052 else
12053 {
12055 }
12056
12057 // check and split INPUT_FILE_ENCODING
12058 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
12059 for (const auto &mapping : fileEncod)
12060 {
12061 QCString mapStr = mapping;
12062 int i=mapStr.find('=');
12063 if (i==-1)
12064 {
12065 continue;
12066 }
12067 else
12068 {
12069 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
12070 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12071 if (pattern.isEmpty() || encoding.isEmpty())
12072 {
12073 continue;
12074 }
12075 cd = portable_iconv_open("UTF-8",encoding.data());
12076 if (cd==reinterpret_cast<void *>(-1))
12077 {
12078 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12079 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12080 encoding,strerror(errno));
12081 }
12082 else
12083 {
12085 }
12086
12087 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12088 }
12089 }
12090
12091 // add predefined macro name to a dictionary
12092 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
12093 for (const auto &s : expandAsDefinedList)
12094 {
12096 }
12097
12098 // read aliases and store them in a dictionary
12099 readAliases();
12100
12101 // store number of spaces in a tab into Doxygen::spaces
12102 int tabSize = Config_getInt(TAB_SIZE);
12103 Doxygen::spaces.resize(tabSize);
12104 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12105 Doxygen::spaces.at(tabSize)='\0';
12106}
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:5086

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

11972{
11973 AUTO_TRACE();
11974
11979}
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 11493 of file doxygen.cpp.

11494{
11498
11499 delete Doxygen::indexList;
11508 Doxygen::mainPage.reset();
11512 Doxygen::globalScope = nullptr;
11514 delete theTranslator;
11515 delete g_outputList;
11516
11521 delete Doxygen::dirLinkedMap;
11522 delete Doxygen::symbolMap;
11523}
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 13158 of file doxygen.cpp.

13159{
13160 AUTO_TRACE();
13161 /**************************************************************************
13162 * Initialize output generators *
13163 **************************************************************************/
13164
13165 /// add extra languages for which we can only produce syntax highlighted code
13167
13168 //// dump all symbols
13169 if (g_dumpSymbolMap)
13170 {
13171 dumpSymbolMap();
13172 exit(0);
13173 }
13174
13175 bool generateHtml = Config_getBool(GENERATE_HTML);
13176 bool generateLatex = Config_getBool(GENERATE_LATEX);
13177 bool generateMan = Config_getBool(GENERATE_MAN);
13178 bool generateRtf = Config_getBool(GENERATE_RTF);
13179 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13180
13181
13183 if (generateHtml)
13184 {
13188 }
13189 if (generateLatex)
13190 {
13193 }
13194 if (generateDocbook)
13195 {
13198 }
13199 if (generateMan)
13200 {
13201 g_outputList->add<ManGenerator>();
13203 }
13204 if (generateRtf)
13205 {
13206 g_outputList->add<RTFGenerator>();
13208 }
13209 if (Config_getBool(USE_HTAGS))
13210 {
13212 QCString htmldir = Config_getString(HTML_OUTPUT);
13213 if (!Htags::execute(htmldir))
13214 err("USE_HTAGS is YES but htags(1) failed. \n");
13215 else if (!Htags::loadFilemap(htmldir))
13216 err("htags(1) ended normally but failed to load the filemap. \n");
13217 }
13218
13219 /**************************************************************************
13220 * Generate documentation *
13221 **************************************************************************/
13222
13223 g_s.begin("Generating style sheet...\n");
13224 //printf("writing style info\n");
13225 g_outputList->writeStyleInfo(0); // write first part
13226 g_s.end();
13227
13228 bool searchEngine = Config_getBool(SEARCHENGINE);
13229 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13230
13231 g_s.begin("Generating search indices...\n");
13232 if (searchEngine && !serverBasedSearch && generateHtml)
13233 {
13235 }
13236
13237 // generate search indices (need to do this before writing other HTML
13238 // pages as these contain a drop down menu with options depending on
13239 // what categories we find in this function.
13240 if (generateHtml && searchEngine)
13241 {
13242 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13243 Dir searchDir(searchDirName.str());
13244 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13245 {
13246 term("Could not create search results directory '{}' $PWD='{}'\n",
13247 searchDirName,Dir::currentDirPath());
13248 }
13249 HtmlGenerator::writeSearchData(searchDirName);
13250 if (!serverBasedSearch) // client side search index
13251 {
13253 }
13254 }
13255 g_s.end();
13256
13257 // copy static stuff
13258 if (generateHtml)
13259 {
13261 copyLogo(Config_getString(HTML_OUTPUT));
13262 copyIcon(Config_getString(HTML_OUTPUT));
13263 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13264 }
13265 if (generateLatex)
13266 {
13268 copyLogo(Config_getString(LATEX_OUTPUT));
13269 copyIcon(Config_getString(LATEX_OUTPUT));
13270 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13271 }
13272 if (generateDocbook)
13273 {
13274 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13275 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13276 }
13277 if (generateRtf)
13278 {
13279 copyLogo(Config_getString(RTF_OUTPUT));
13280 copyIcon(Config_getString(RTF_OUTPUT));
13281 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13282 }
13283
13285 if (fm.hasFormulas() && generateHtml
13286 && !Config_getBool(USE_MATHJAX))
13287 {
13288 g_s.begin("Generating images for formulas in HTML...\n");
13289 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13291 g_s.end();
13292 }
13293 if (fm.hasFormulas() && generateRtf)
13294 {
13295 g_s.begin("Generating images for formulas in RTF...\n");
13297 g_s.end();
13298 }
13299
13300 if (fm.hasFormulas() && generateDocbook)
13301 {
13302 g_s.begin("Generating images for formulas in Docbook...\n");
13304 g_s.end();
13305 }
13306
13307 g_s.begin("Generating example documentation...\n");
13309 g_s.end();
13310
13311 g_s.begin("Generating file sources...\n");
13313 g_s.end();
13314
13315 g_s.begin("Generating file documentation...\n");
13317 g_s.end();
13318
13319 g_s.begin("Generating page documentation...\n");
13321 g_s.end();
13322
13323 g_s.begin("Generating group documentation...\n");
13325 g_s.end();
13326
13327 g_s.begin("Generating class documentation...\n");
13329 g_s.end();
13330
13331 g_s.begin("Generating concept documentation...\n");
13333 g_s.end();
13334
13335 g_s.begin("Generating module documentation...\n");
13337 g_s.end();
13338
13339 g_s.begin("Generating namespace documentation...\n");
13341 g_s.end();
13342
13343 if (Config_getBool(GENERATE_LEGEND))
13344 {
13345 g_s.begin("Generating graph info page...\n");
13347 g_s.end();
13348 }
13349
13350 g_s.begin("Generating directory documentation...\n");
13352 g_s.end();
13353
13354 if (g_outputList->size()>0)
13355 {
13357 }
13358
13359 g_s.begin("finalizing index lists...\n");
13360 Doxygen::indexList->finalize();
13361 g_s.end();
13362
13363 g_s.begin("writing tag file...\n");
13364 writeTagFile();
13365 g_s.end();
13366
13367 if (Config_getBool(GENERATE_XML))
13368 {
13369 g_s.begin("Generating XML output...\n");
13371 generateXML();
13373 g_s.end();
13374 }
13375 if (Config_getBool(GENERATE_SQLITE3))
13376 {
13377 g_s.begin("Generating SQLITE3 output...\n");
13379 g_s.end();
13380 }
13381
13382 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13383 {
13384 g_s.begin("Generating AutoGen DEF output...\n");
13385 generateDEF();
13386 g_s.end();
13387 }
13388 if (Config_getBool(GENERATE_PERLMOD))
13389 {
13390 g_s.begin("Generating Perl module output...\n");
13392 g_s.end();
13393 }
13394 if (generateHtml && searchEngine && serverBasedSearch)
13395 {
13396 g_s.begin("Generating search index\n");
13397 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13398 {
13400 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13401 }
13402 else // write data for external search index
13403 {
13405 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13406 if (searchDataFile.isEmpty())
13407 {
13408 searchDataFile="searchdata.xml";
13409 }
13410 if (!Portable::isAbsolutePath(searchDataFile.data()))
13411 {
13412 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13413 }
13414 Doxygen::searchIndex.write(searchDataFile);
13415 }
13416 g_s.end();
13417 }
13418
13419 if (generateRtf)
13420 {
13421 g_s.begin("Combining RTF output...\n");
13422 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13423 {
13424 err("An error occurred during post-processing the RTF files!\n");
13425 }
13426 g_s.end();
13427 }
13428
13429 g_s.begin("Running plantuml with JAVA...\n");
13431 g_s.end();
13432
13433 if (Config_getBool(HAVE_DOT))
13434 {
13435 g_s.begin("Running dot...\n");
13437 g_s.end();
13438 }
13439
13440 if (generateHtml &&
13441 Config_getBool(GENERATE_HTMLHELP) &&
13442 !Config_getString(HHC_LOCATION).isEmpty())
13443 {
13444 g_s.begin("Running html help compiler...\n");
13446 g_s.end();
13447 }
13448
13449 if ( generateHtml &&
13450 Config_getBool(GENERATE_QHP) &&
13451 !Config_getString(QHG_LOCATION).isEmpty())
13452 {
13453 g_s.begin("Running qhelpgenerator...\n");
13455 g_s.end();
13456 }
13457
13458 g_outputList->cleanup();
13460
13461 msg("type lookup cache used {}/{} hits={} misses={}\n",
13463 Doxygen::typeLookupCache->capacity(),
13465 Doxygen::typeLookupCache->misses());
13466 msg("symbol lookup cache used {}/{} hits={} misses={}\n",
13468 Doxygen::symbolLookupCache->capacity(),
13470 Doxygen::symbolLookupCache->misses());
13471 int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
13472 int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
13473 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13474 if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
13475 {
13476 msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13477 }
13478
13480 {
13481
13482 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13483 if (numThreads<1) numThreads=1;
13484 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13485 (static_cast<double>(Debug::elapsedTime())),
13486 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13487 );
13488 g_s.print();
13489
13491 msg("finished...\n");
13493 }
13494 else
13495 {
13496 msg("finished...\n");
13497 }
13498
13499
13500 /**************************************************************************
13501 * Start cleaning up *
13502 **************************************************************************/
13503
13505
13507 Dir thisDir;
13508 thisDir.remove(Doxygen::filterDBFileName.str());
13510 exitTracing();
13512 delete Doxygen::clangUsrMap;
13514
13515 //dumpDocNodeSizes();
13516}
@ 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:1193
static void writeSearchPage()
Definition htmlgen.cpp:3160
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1344
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1353
static void writeExternalSearchPage()
Definition htmlgen.cpp:3259
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:8754
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9969
static void generateFileSources()
Definition doxygen.cpp:8588
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9189
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:9215
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:5185
void cleanupInlineGraph()
Definition util.cpp:6990
void generateXML()
Definition xmlgen.cpp:2270

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

11425{
11426 initResources();
11427 QCString lang = Portable::getenv("LC_ALL");
11428 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11429 std::setlocale(LC_ALL,"");
11430 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11431 std::setlocale(LC_NUMERIC,"C");
11432
11434
11458
11459 // register any additional parsers here...
11460
11462
11463#if USE_LIBCLANG
11465#endif
11474 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11475 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11476 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11478
11479 // initialization of these globals depends on
11480 // configuration switches so we need to postpone these
11481 Doxygen::globalScope = nullptr;
11490
11491}
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:5118

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

12475{
12476 AUTO_TRACE();
12477 std::atexit(exitDoxygen);
12478
12479 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12480
12481#if USE_LIBCLANG
12482 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12483#endif
12484
12485 // we would like to show the versionString earlier, but we first have to handle the configuration file
12486 // to know the value of the QUIET setting.
12487 QCString versionString = getFullVersion();
12488 msg("Doxygen version used: {}\n",versionString);
12489
12491
12492 /**************************************************************************
12493 * Make sure the output directory exists
12494 **************************************************************************/
12495 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12496 if (!g_singleComment)
12497 {
12498 if (outputDirectory.isEmpty())
12499 {
12500 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12501 }
12502 else
12503 {
12504 Dir dir(outputDirectory.str());
12505 if (!dir.exists())
12506 {
12507 dir.setPath(Dir::currentDirPath());
12508 if (!dir.mkdir(outputDirectory.str()))
12509 {
12510 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12511 "exist and cannot be created\n",outputDirectory);
12512 }
12513 else
12514 {
12515 msg("Notice: Output directory '{}' does not exist. "
12516 "I have created it for you.\n", outputDirectory);
12517 }
12518 dir.setPath(outputDirectory.str());
12519 }
12520 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12521 }
12522 }
12523 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12524
12525 /**************************************************************************
12526 * Initialize global lists and dictionaries
12527 **************************************************************************/
12528
12529 // also scale lookup cache with SYMBOL_CACHE_SIZE
12530 int cacheSize = Config_getInt(LOOKUP_CACHE_SIZE);
12531 if (cacheSize<0) cacheSize=0;
12532 if (cacheSize>9) cacheSize=9;
12533 uint32_t lookupSize = 65536 << cacheSize;
12536
12537#ifdef HAS_SIGNALS
12538 signal(SIGINT, stopDoxygen);
12539#endif
12540
12541 uint32_t pid = Portable::pid();
12542 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12543 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12544
12545 /**************************************************************************
12546 * Check/create output directories *
12547 **************************************************************************/
12548
12549 bool generateHtml = Config_getBool(GENERATE_HTML);
12550 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12551 bool generateXml = Config_getBool(GENERATE_XML);
12552 bool generateLatex = Config_getBool(GENERATE_LATEX);
12553 bool generateRtf = Config_getBool(GENERATE_RTF);
12554 bool generateMan = Config_getBool(GENERATE_MAN);
12555 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12556 QCString htmlOutput;
12557 QCString docbookOutput;
12558 QCString xmlOutput;
12559 QCString latexOutput;
12560 QCString rtfOutput;
12561 QCString manOutput;
12562 QCString sqlOutput;
12563
12564 if (!g_singleComment)
12565 {
12566 if (generateHtml)
12567 {
12568 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12569 Config_updateString(HTML_OUTPUT,htmlOutput);
12570
12571 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12572 bool generateSitemap = !sitemapUrl.isEmpty();
12573 if (generateSitemap && !sitemapUrl.endsWith("/"))
12574 {
12575 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12576 }
12577
12578 // add HTML indexers that are enabled
12579 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12580 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12581 bool generateQhp = Config_getBool(GENERATE_QHP);
12582 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12583 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12584 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12585 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12586 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12587 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12588 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12589 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12590 Doxygen::indexList->addIndex<Crawlmap>();
12591 Doxygen::indexList->initialize();
12592 }
12593
12594 if (generateDocbook)
12595 {
12596 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12597 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12598 }
12599
12600 if (generateXml)
12601 {
12602 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12603 Config_updateString(XML_OUTPUT,xmlOutput);
12604 }
12605
12606 if (generateLatex)
12607 {
12608 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12609 Config_updateString(LATEX_OUTPUT,latexOutput);
12610 }
12611
12612 if (generateRtf)
12613 {
12614 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12615 Config_updateString(RTF_OUTPUT,rtfOutput);
12616 }
12617
12618 if (generateMan)
12619 {
12620 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12621 Config_updateString(MAN_OUTPUT,manOutput);
12622 }
12623
12624 if (generateSql)
12625 {
12626 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12627 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12628 }
12629 }
12630
12631 if (Config_getBool(HAVE_DOT))
12632 {
12633 QCString curFontPath = Config_getString(DOT_FONTPATH);
12634 if (curFontPath.isEmpty())
12635 {
12636 Portable::getenv("DOTFONTPATH");
12637 QCString newFontPath = ".";
12638 if (!curFontPath.isEmpty())
12639 {
12640 newFontPath+=Portable::pathListSeparator();
12641 newFontPath+=curFontPath;
12642 }
12643 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12644 }
12645 else
12646 {
12647 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12648 }
12649 }
12650
12651 /**************************************************************************
12652 * Handle layout file *
12653 **************************************************************************/
12654
12656 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12657 bool defaultLayoutUsed = FALSE;
12658 if (layoutFileName.isEmpty())
12659 {
12660 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12661 defaultLayoutUsed = TRUE;
12662 }
12663 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12664
12665 FileInfo fi(layoutFileName.str());
12666 if (fi.exists())
12667 {
12668 msg("Parsing layout file {}...\n",layoutFileName);
12669 LayoutDocManager::instance().parse(layoutFileName);
12670 }
12671 else if (!defaultLayoutUsed)
12672 {
12673 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12674 }
12675 printLayout();
12676
12677 /**************************************************************************
12678 * Read and preprocess input *
12679 **************************************************************************/
12680
12681 // prevent search in the output directories
12682 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12683 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12684 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12685 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12686 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12687 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12688 if (generateMan) exclPatterns.push_back(manOutput.str());
12689 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12690
12691 if (!g_singleComment)
12692 {
12694
12696 }
12697
12698 // Notice: the order of the function calls below is very important!
12699
12700 if (generateHtml && !Config_getBool(USE_MATHJAX))
12701 {
12703 }
12704 if (generateRtf)
12705 {
12707 }
12708 if (generateDocbook)
12709 {
12711 }
12712
12714
12715 /**************************************************************************
12716 * Handle Tag Files *
12717 **************************************************************************/
12718
12719 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12720
12721 if (!g_singleComment)
12722 {
12723 msg("Reading and parsing tag files\n");
12724 const StringVector &tagFileList = Config_getList(TAGFILES);
12725 for (const auto &s : tagFileList)
12726 {
12727 readTagFile(root,s.c_str());
12728 }
12729 }
12730
12731 /**************************************************************************
12732 * Parse source files *
12733 **************************************************************************/
12734
12735 addSTLSupport(root);
12736
12737 g_s.begin("Parsing files\n");
12738 if (g_singleComment)
12739 {
12740 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12741 if (g_commentFileName=="-")
12742 {
12743 std::string text = fileToString(g_commentFileName).str();
12744 addTerminalCharIfMissing(text,'\n');
12745 generateHtmlForComment("stdin.md",text);
12746 }
12747 else if (FileInfo(g_commentFileName.str()).isFile())
12748 {
12749 std::string text;
12751 addTerminalCharIfMissing(text,'\n');
12753 }
12754 else
12755 {
12756 }
12758 exit(0);
12759 }
12760 else
12761 {
12762 if (Config_getInt(NUM_PROC_THREADS)==1)
12763 {
12765 }
12766 else
12767 {
12769 }
12770 }
12771 g_s.end();
12772
12773 /**************************************************************************
12774 * Gather information *
12775 **************************************************************************/
12776
12777 g_s.begin("Building macro definition list...\n");
12779 g_s.end();
12780
12781 g_s.begin("Building group list...\n");
12782 buildGroupList(root.get());
12783 organizeSubGroups(root.get());
12784 g_s.end();
12785
12786 g_s.begin("Building directory list...\n");
12788 findDirDocumentation(root.get());
12789 g_s.end();
12790
12791 g_s.begin("Building namespace list...\n");
12792 buildNamespaceList(root.get());
12793 findUsingDirectives(root.get());
12794 g_s.end();
12795
12796 g_s.begin("Building file list...\n");
12797 buildFileList(root.get());
12798 g_s.end();
12799
12800 g_s.begin("Building class list...\n");
12801 buildClassList(root.get());
12802 g_s.end();
12803
12804 g_s.begin("Building concept list...\n");
12805 buildConceptList(root.get());
12806 g_s.end();
12807
12808 // build list of using declarations here (global list)
12809 buildListOfUsingDecls(root.get());
12810 g_s.end();
12811
12812 g_s.begin("Computing nesting relations for classes...\n");
12814 g_s.end();
12815 // 1.8.2-20121111: no longer add nested classes to the group as well
12816 //distributeClassGroupRelations();
12817
12818 // calling buildClassList may result in cached relations that
12819 // become invalid after resolveClassNestingRelations(), that's why
12820 // we need to clear the cache here
12821 Doxygen::typeLookupCache->clear();
12822 // we don't need the list of using declaration anymore
12823 g_usingDeclarations.clear();
12824
12825 g_s.begin("Associating documentation with classes...\n");
12826 buildClassDocList(root.get());
12827 g_s.end();
12828
12829 g_s.begin("Associating documentation with concepts...\n");
12830 buildConceptDocList(root.get());
12832 g_s.end();
12833
12834 g_s.begin("Associating documentation with modules...\n");
12835 findModuleDocumentation(root.get());
12836 g_s.end();
12837
12838 g_s.begin("Building example list...\n");
12839 buildExampleList(root.get());
12840 g_s.end();
12841
12842 g_s.begin("Searching for enumerations...\n");
12843 findEnums(root.get());
12844 g_s.end();
12845
12846 // Since buildVarList calls isVarWithConstructor
12847 // and this calls getResolvedClass we need to process
12848 // typedefs first so the relations between classes via typedefs
12849 // are properly resolved. See bug 536385 for an example.
12850 g_s.begin("Searching for documented typedefs...\n");
12851 buildTypedefList(root.get());
12852 g_s.end();
12853
12854 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12855 {
12856 g_s.begin("Searching for documented sequences...\n");
12857 buildSequenceList(root.get());
12858 g_s.end();
12859
12860 g_s.begin("Searching for documented dictionaries...\n");
12861 buildDictionaryList(root.get());
12862 g_s.end();
12863 }
12864
12865 g_s.begin("Searching for members imported via using declarations...\n");
12866 // this should be after buildTypedefList in order to properly import
12867 // used typedefs
12868 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12869 findUsingDeclarations(root.get(),FALSE); // then the rest
12870 g_s.end();
12871
12872 g_s.begin("Searching for included using directives...\n");
12874 g_s.end();
12875
12876 g_s.begin("Searching for documented variables...\n");
12877 buildVarList(root.get());
12878 g_s.end();
12879
12880 g_s.begin("Building interface member list...\n");
12881 buildInterfaceAndServiceList(root.get()); // UNO IDL
12882
12883 g_s.begin("Building member list...\n"); // using class info only !
12884 buildFunctionList(root.get());
12885 g_s.end();
12886
12887 g_s.begin("Searching for friends...\n");
12888 findFriends();
12889 g_s.end();
12890
12891 g_s.begin("Searching for documented defines...\n");
12892 findDefineDocumentation(root.get());
12893 g_s.end();
12894
12895 g_s.begin("Computing class inheritance relations...\n");
12896 findClassEntries(root.get());
12898 g_s.end();
12899
12900 g_s.begin("Computing class usage relations...\n");
12902 g_s.end();
12903
12904 if (Config_getBool(INLINE_SIMPLE_STRUCTS))
12905 {
12906 g_s.begin("Searching for tag less structs...\n");
12908 g_s.end();
12909 }
12910
12911 g_s.begin("Flushing cached template relations that have become invalid...\n");
12913 g_s.end();
12914
12915 g_s.begin("Warn for undocumented namespaces...\n");
12917 g_s.end();
12918
12919 g_s.begin("Computing class relations...\n");
12922 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12923 {
12925 }
12927 g_classEntries.clear();
12928 g_s.end();
12929
12930 g_s.begin("Add enum values to enums...\n");
12931 addEnumValuesToEnums(root.get());
12932 findEnumDocumentation(root.get());
12933 g_s.end();
12934
12935 g_s.begin("Searching for member function documentation...\n");
12936 findObjCMethodDefinitions(root.get());
12937 findMemberDocumentation(root.get()); // may introduce new members !
12938 findUsingDeclImports(root.get()); // may introduce new members !
12939 g_usingClassMap.clear();
12943 g_s.end();
12944
12945 // moved to after finding and copying documentation,
12946 // as this introduces new members see bug 722654
12947 g_s.begin("Creating members for template instances...\n");
12949 g_s.end();
12950
12951 g_s.begin("Building page list...\n");
12952 buildPageList(root.get());
12953 g_s.end();
12954
12955 g_s.begin("Building requirements list...\n");
12956 buildRequirementsList(root.get());
12957 g_s.end();
12958
12959 g_s.begin("Search for main page...\n");
12960 findMainPage(root.get());
12961 findMainPageTagFiles(root.get());
12962 g_s.end();
12963
12964 g_s.begin("Computing page relations...\n");
12965 computePageRelations(root.get());
12967 g_s.end();
12968
12969 g_s.begin("Determining the scope of groups...\n");
12970 findGroupScope(root.get());
12971 g_s.end();
12972
12973 g_s.begin("Computing module relations...\n");
12974 auto &mm = ModuleManager::instance();
12975 mm.resolvePartitions();
12976 mm.resolveImports();
12977 mm.collectExportedSymbols();
12978 g_s.end();
12979
12980 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
12981 {
12982 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
12983 n2->memberName().data()+getPrefixIndex(n2->memberName())
12984 )<0;
12985 };
12986
12987 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
12988 {
12989 if (Config_getBool(SORT_BY_SCOPE_NAME))
12990 {
12991 return qstricmp_sort(c1->name(), c2->name())<0;
12992 }
12993 else
12994 {
12995 int i = qstricmp_sort(c1->className(), c2->className());
12996 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12997 }
12998 };
12999
13000 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
13001 {
13002 return qstricmp_sort(n1->name(),n2->name())<0;
13003 };
13004
13005 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
13006 {
13007 return qstricmp_sort(c1->name(),c2->name())<0;
13008 };
13009
13010 g_s.begin("Sorting lists...\n");
13011 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13013 memberNameComp);
13014 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13016 memberNameComp);
13017 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13019 classComp);
13020 std::stable_sort(Doxygen::classLinkedMap->begin(),
13022 classComp);
13023 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13025 conceptComp);
13026 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13028 namespaceComp);
13029 g_s.end();
13030
13031 g_s.begin("Determining which enums are documented\n");
13033 g_s.end();
13034
13035 g_s.begin("Computing member relations...\n");
13038 g_s.end();
13039
13040 g_s.begin("Building full member lists recursively...\n");
13042 g_s.end();
13043
13044 g_s.begin("Adding members to member groups.\n");
13046 g_s.end();
13047
13048 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13049 {
13050 g_s.begin("Distributing member group documentation.\n");
13052 g_s.end();
13053 }
13054
13055 g_s.begin("Computing member references...\n");
13057 g_s.end();
13058
13059 if (Config_getBool(INHERIT_DOCS))
13060 {
13061 g_s.begin("Inheriting documentation...\n");
13063 g_s.end();
13064 }
13065
13066
13067 // compute the shortest possible names of all files
13068 // without losing the uniqueness of the file names.
13069 g_s.begin("Generating disk names...\n");
13071 g_s.end();
13072
13073 g_s.begin("Adding source references...\n");
13075 g_s.end();
13076
13077 g_s.begin("Adding xrefitems...\n");
13080 g_s.end();
13081
13082 g_s.begin("Adding requirements...\n");
13085 g_s.end();
13086
13087 g_s.begin("Sorting member lists...\n");
13089 g_s.end();
13090
13091 g_s.begin("Setting anonymous enum type...\n");
13093 g_s.end();
13094
13095 g_s.begin("Computing dependencies between directories...\n");
13097 g_s.end();
13098
13099 g_s.begin("Generating citations page...\n");
13101 g_s.end();
13102
13103 g_s.begin("Counting members...\n");
13104 countMembers();
13105 g_s.end();
13106
13107 g_s.begin("Counting data structures...\n");
13109 g_s.end();
13110
13111 g_s.begin("Resolving user defined references...\n");
13113 g_s.end();
13114
13115 g_s.begin("Finding anchors and sections in the documentation...\n");
13117 g_s.end();
13118
13119 g_s.begin("Transferring function references...\n");
13121 g_s.end();
13122
13123 g_s.begin("Combining using relations...\n");
13125 g_s.end();
13126
13128 g_s.begin("Adding members to index pages...\n");
13130 addToIndices();
13131 g_s.end();
13132
13133 g_s.begin("Correcting members for VHDL...\n");
13135 g_s.end();
13136
13137 g_s.begin("Computing tooltip texts...\n");
13139 g_s.end();
13140
13141 if (Config_getBool(SORT_GROUP_NAMES))
13142 {
13143 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13145 [](const auto &g1,const auto &g2)
13146 { return g1->groupTitle() < g2->groupTitle(); });
13147
13148 for (const auto &gd : *Doxygen::groupLinkedMap)
13149 {
13150 gd->sortSubGroups();
13151 }
13152 }
13153
13154 printNavTree(root.get(),0);
13156}
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:5298
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:9431
static void computeTemplateClassRelations()
Definition doxygen.cpp:5392
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5571
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2210
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9669
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5347
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:5261
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8389
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5461
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4419
static void addMembersToMemberGroup()
Definition doxygen.cpp:9296
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9839
static void distributeConceptGroups()
Definition doxygen.cpp:1347
static void transferFunctionDocumentation()
Definition doxygen.cpp:4338
static void setAnonymousEnumType()
Definition doxygen.cpp:9036
static void sortMemberLists()
Definition doxygen.cpp:8941
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8517
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4468
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7530
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3407
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:446
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9582
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7500
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9334
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7734
static void resolveUserReferences()
Definition doxygen.cpp:9901
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9730
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3544
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3507
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:9050
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:490
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4241
static void findEnums(const Entry *root)
Definition doxygen.cpp:7558
static void addListReferences()
Definition doxygen.cpp:5562
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8179
static void findMainPage(Entry *root)
Definition doxygen.cpp:9769
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:1901
static void addSourceReferences()
Definition doxygen.cpp:8814
static void buildExampleList(Entry *root)
Definition doxygen.cpp:9986
static void inheritDocumentation()
Definition doxygen.cpp:9236
static void flushUnresolvedRelations()
Definition doxygen.cpp:9485
static QCString g_commentFileName
Definition doxygen.cpp:193
static void findDocumentedEnumValues()
Definition doxygen.cpp:8171
static void findTagLessClasses()
Definition doxygen.cpp:1695
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8221
static void computeClassRelations()
Definition doxygen.cpp:5367
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:3936
static void checkPageRelations()
Definition doxygen.cpp:9881
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1315
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8059
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9851
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:3525
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1150
static void buildPageList(Entry *root)
Definition doxygen.cpp:9742
static void addRequirementReferences()
Definition doxygen.cpp:5554
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:194
static void findSectionsInDocumentation()
Definition doxygen.cpp:9372
static void mergeCategories()
Definition doxygen.cpp:8536
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:5331
static void computeTooltipTexts()
Definition doxygen.cpp:8990
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8558
static void combineUsingRelations()
Definition doxygen.cpp:9271
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:4371
static void buildDefineList()
Definition doxygen.cpp:8893
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3639
static void computeMemberRelations()
Definition doxygen.cpp:8501
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:5530
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1471
int getPrefixIndex(const QCString &name)
Definition util.cpp:3212

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

11542{
11543 QCString versionString = getFullVersion();
11544
11545 // helper that calls \a func to write to file \a fileName via a TextStream
11546 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11547 {
11548 std::ofstream f;
11549 if (openOutputFile(fileName,f))
11550 {
11551 TextStream t(&f);
11552 func(t);
11553 return true;
11554 }
11555 return false;
11556 };
11557
11558
11559 /**************************************************************************
11560 * Handle arguments *
11561 **************************************************************************/
11562
11563 int optInd=1;
11564 QCString configName;
11565 QCString traceName;
11566 bool genConfig=false;
11567 bool shortList=false;
11568 bool traceTiming=false;
11570 bool updateConfig=false;
11571 bool quiet = false;
11572 while (optInd<argc && argv[optInd][0]=='-' &&
11573 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11574 argv[optInd][1]=='-')
11575 )
11576 {
11577 switch(argv[optInd][1])
11578 {
11579 case 'g':
11580 {
11581 genConfig=TRUE;
11582 }
11583 break;
11584 case 'l':
11585 {
11586 QCString layoutName;
11587 if (optInd+1>=argc)
11588 {
11589 layoutName="DoxygenLayout.xml";
11590 }
11591 else
11592 {
11593 layoutName=argv[optInd+1];
11594 }
11595 writeDefaultLayoutFile(layoutName);
11597 exit(0);
11598 }
11599 break;
11600 case 'c':
11601 if (optInd+1>=argc) // no file name given
11602 {
11603 msg("option \"-c\" is missing the file name to read\n");
11604 devUsage();
11606 exit(1);
11607 }
11608 else
11609 {
11610 g_commentFileName=argv[optInd+1];
11611 optInd++;
11612 }
11613 g_singleComment=true;
11614 quiet=true;
11615 break;
11616 case 'd':
11617 {
11618 QCString debugLabel=getArg(argc,argv,optInd);
11619 if (debugLabel.isEmpty())
11620 {
11621 devUsage();
11623 exit(0);
11624 }
11625 int retVal = Debug::setFlagStr(debugLabel);
11626 if (!retVal)
11627 {
11628 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11629 devUsage();
11631 exit(1);
11632 }
11633 }
11634 break;
11635 case 't':
11636 {
11637#if ENABLE_TRACING
11638 if (!strcmp(argv[optInd]+1,"t_time"))
11639 {
11640 traceTiming = true;
11641 }
11642 else if (!strcmp(argv[optInd]+1,"t"))
11643 {
11644 traceTiming = false;
11645 }
11646 else
11647 {
11648 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11650 exit(1);
11651 }
11652 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11653 {
11654 traceName="stdout";
11655 }
11656 else
11657 {
11658 traceName=argv[optInd+1];
11659 optInd++;
11660 }
11661#else
11662 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11664 exit(1);
11665#endif
11666 }
11667 break;
11668 case 'x':
11669 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11670 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11671 else
11672 {
11673 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11675 exit(1);
11676 }
11677 break;
11678 case 's':
11679 shortList=TRUE;
11680 break;
11681 case 'u':
11682 updateConfig=TRUE;
11683 break;
11684 case 'e':
11685 {
11686 QCString formatName=getArg(argc,argv,optInd);
11687 if (formatName.isEmpty())
11688 {
11689 err("option \"-e\" is missing format specifier rtf.\n");
11691 exit(1);
11692 }
11693 if (qstricmp(formatName.data(),"rtf")==0)
11694 {
11695 if (optInd+1>=argc)
11696 {
11697 err("option \"-e rtf\" is missing an extensions file name\n");
11699 exit(1);
11700 }
11701 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11703 exit(0);
11704 }
11705 err("option \"-e\" has invalid format specifier.\n");
11707 exit(1);
11708 }
11709 break;
11710 case 'f':
11711 {
11712 QCString listName=getArg(argc,argv,optInd);
11713 if (listName.isEmpty())
11714 {
11715 err("option \"-f\" is missing list specifier.\n");
11717 exit(1);
11718 }
11719 if (qstricmp(listName.data(),"emoji")==0)
11720 {
11721 if (optInd+1>=argc)
11722 {
11723 err("option \"-f emoji\" is missing an output file name\n");
11725 exit(1);
11726 }
11727 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11729 exit(0);
11730 }
11731 err("option \"-f\" has invalid list specifier.\n");
11733 exit(1);
11734 }
11735 break;
11736 case 'w':
11737 {
11738 QCString formatName=getArg(argc,argv,optInd);
11739 if (formatName.isEmpty())
11740 {
11741 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11743 exit(1);
11744 }
11745 if (qstricmp(formatName.data(),"rtf")==0)
11746 {
11747 if (optInd+1>=argc)
11748 {
11749 err("option \"-w rtf\" is missing a style sheet file name\n");
11751 exit(1);
11752 }
11753 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11754 {
11755 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11757 exit(1);
11758 }
11760 exit(0);
11761 }
11762 else if (qstricmp(formatName.data(),"html")==0)
11763 {
11764 Config::init();
11765 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11766 // explicit config file mentioned or default found on disk
11767 {
11768 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11769 if (!Config::parse(df)) // parse the config file
11770 {
11771 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11773 exit(1);
11774 }
11775 }
11776 if (optInd+3>=argc)
11777 {
11778 err("option \"-w html\" does not have enough arguments\n");
11780 exit(1);
11781 }
11785 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11786 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11787 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11788 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11790 exit(0);
11791 }
11792 else if (qstricmp(formatName.data(),"latex")==0)
11793 {
11794 Config::init();
11795 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11796 {
11797 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11798 if (!Config::parse(df))
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 latex\" does not have enough arguments\n");
11809 exit(1);
11810 }
11814 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11815 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11816 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11817 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11819 exit(0);
11820 }
11821 else
11822 {
11823 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11825 exit(1);
11826 }
11827 }
11828 break;
11829 case 'm':
11831 break;
11832 case 'v':
11833 version(false);
11835 exit(0);
11836 break;
11837 case 'V':
11838 version(true);
11840 exit(0);
11841 break;
11842 case '-':
11843 if (qstrcmp(&argv[optInd][2],"help")==0)
11844 {
11845 usage(argv[0],versionString);
11846 exit(0);
11847 }
11848 else if (qstrcmp(&argv[optInd][2],"version")==0)
11849 {
11850 version(false);
11852 exit(0);
11853 }
11854 else if ((qstrcmp(&argv[optInd][2],"Version")==0) ||
11855 (qstrcmp(&argv[optInd][2],"VERSION")==0))
11856 {
11857 version(true);
11859 exit(0);
11860 }
11861 else
11862 {
11863 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11864 usage(argv[0],versionString);
11865 exit(1);
11866 }
11867 break;
11868 case 'b':
11869 setvbuf(stdout,nullptr,_IONBF,0);
11870 break;
11871 case 'q':
11872 quiet = true;
11873 break;
11874 case 'h':
11875 case '?':
11876 usage(argv[0],versionString);
11877 exit(0);
11878 break;
11879 default:
11880 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11881 usage(argv[0],versionString);
11882 exit(1);
11883 }
11884 optInd++;
11885 }
11886
11887 /**************************************************************************
11888 * Parse or generate the config file *
11889 **************************************************************************/
11890
11891 initTracing(traceName.data(),traceTiming);
11892 TRACE("Doxygen version used: {}",getFullVersion());
11893 Config::init();
11894
11895 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11896 if (optInd>=argc)
11897 {
11898 if (configFileInfo1.exists())
11899 {
11900 configName="Doxyfile";
11901 }
11902 else if (configFileInfo2.exists())
11903 {
11904 configName="doxyfile";
11905 }
11906 else if (genConfig)
11907 {
11908 configName="Doxyfile";
11909 }
11910 else
11911 {
11912 err("Doxyfile not found and no input file specified!\n");
11913 usage(argv[0],versionString);
11914 exit(1);
11915 }
11916 }
11917 else
11918 {
11919 FileInfo fi(argv[optInd]);
11920 if (fi.exists() || qstrcmp(argv[optInd],"-")==0 || genConfig)
11921 {
11922 configName=argv[optInd];
11923 }
11924 else
11925 {
11926 err("configuration file {} not found!\n",argv[optInd]);
11927 usage(argv[0],versionString);
11928 exit(1);
11929 }
11930 }
11931
11932 if (genConfig)
11933 {
11934 generateConfigFile(configName,shortList);
11936 exit(0);
11937 }
11938
11939 if (!Config::parse(configName,updateConfig,diffList))
11940 {
11941 err("could not open or read configuration file {}!\n",configName);
11943 exit(1);
11944 }
11945
11946 if (diffList!=Config::CompareMode::Full)
11947 {
11949 compareDoxyfile(diffList);
11951 exit(0);
11952 }
11953
11954 if (updateConfig)
11955 {
11957 generateConfigFile(configName,shortList,TRUE);
11959 exit(0);
11960 }
11961
11962 /* Perlmod wants to know the path to the config file.*/
11963 FileInfo configFileInfo(configName.str());
11964 setPerlModDoxyfile(configFileInfo.absFilePath());
11965
11966 /* handle -q option */
11967 if (quiet) Config_updateBool(QUIET,TRUE);
11968}
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:1527
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1515
static void writeHeaderFile(TextStream &t, const QCString &cssname)
Definition htmlgen.cpp:1521
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:6296

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

11199{
11200 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11201 // strip trailing slashes
11202 if (s.isEmpty()) return;
11203
11204 g_pathsVisited.clear();
11205
11206 FileInfo fi(s.str());
11207 //printf("readFileOrDirectory(%s)\n",s);
11208 {
11209 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11210 {
11211 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11212 {
11213 }
11214 else if (!fi.exists() || !fi.isReadable())
11215 {
11216 if (errorIfNotExist)
11217 {
11218 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11219 }
11220 }
11221 else if (fi.isFile())
11222 {
11223 std::string dirPath = fi.dirPath(true);
11224 std::string filePath = fi.absFilePath();
11225 if (paths && !dirPath.empty())
11226 {
11227 paths->insert(dirPath);
11228 }
11229 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11230 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11231 {
11232 std::string name=fi.fileName();
11233 if (fnMap)
11234 {
11235 auto fd = createFileDef(dirPath+"/",name);
11236 if (!name.empty())
11237 {
11238 FileName *fn = fnMap->add(name,filePath);
11239 fn->push_back(std::move(fd));
11240 }
11241 }
11242 if (resultList || resultSet)
11243 {
11244 if (resultList) resultList->push_back(filePath);
11245 if (resultSet) resultSet->insert(filePath);
11246 }
11247
11248 if (killSet) killSet->insert(fi.absFilePath());
11249 }
11250 }
11251 else if (fi.isDir()) // readable dir
11252 {
11253 readDir(&fi,fnMap,exclSet,patList,
11254 exclPatList,resultList,resultSet,errorIfNotExist,
11255 recursive,killSet,paths);
11256 }
11257 }
11258 }
11259}
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().