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

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

11962{
11963 AUTO_TRACE();
11964 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
11975
11976 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11977
11978 /* Set the global html file extension. */
11979 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
11980
11981
11983 Config_getBool(CALLER_GRAPH) ||
11984 Config_getBool(REFERENCES_RELATION) ||
11985 Config_getBool(REFERENCED_BY_RELATION);
11986
11987 /**************************************************************************
11988 * Add custom extension mappings
11989 **************************************************************************/
11990
11991 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
11992 for (const auto &mapping : extMaps)
11993 {
11994 QCString mapStr = mapping;
11995 int i=mapStr.find('=');
11996 if (i==-1)
11997 {
11998 continue;
11999 }
12000 else
12001 {
12002 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
12003 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
12004 if (ext.isEmpty() || language.isEmpty())
12005 {
12006 continue;
12007 }
12008
12009 if (!updateLanguageMapping(ext,language))
12010 {
12011 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12012 "Check the EXTENSION_MAPPING setting in the config file.\n",
12013 ext,language);
12014 }
12015 else
12016 {
12017 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12018 ext,language);
12019 }
12020 }
12021 }
12022 // create input file exncodings
12023
12024 // check INPUT_ENCODING
12025 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12026 if (cd==reinterpret_cast<void *>(-1))
12027 {
12028 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12029 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12030 Config_getString(INPUT_ENCODING),strerror(errno));
12031 }
12032 else
12033 {
12035 }
12036
12037 // check and split INPUT_FILE_ENCODING
12038 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
12039 for (const auto &mapping : fileEncod)
12040 {
12041 QCString mapStr = mapping;
12042 int i=mapStr.find('=');
12043 if (i==-1)
12044 {
12045 continue;
12046 }
12047 else
12048 {
12049 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
12050 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12051 if (pattern.isEmpty() || encoding.isEmpty())
12052 {
12053 continue;
12054 }
12055 cd = portable_iconv_open("UTF-8",encoding.data());
12056 if (cd==reinterpret_cast<void *>(-1))
12057 {
12058 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12059 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12060 encoding,strerror(errno));
12061 }
12062 else
12063 {
12065 }
12066
12067 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12068 }
12069 }
12070
12071 // add predefined macro name to a dictionary
12072 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
12073 for (const auto &s : expandAsDefinedList)
12074 {
12076 }
12077
12078 // read aliases and store them in a dictionary
12079 readAliases();
12080
12081 // store number of spaces in a tab into Doxygen::spaces
12082 int tabSize = Config_getInt(TAB_SIZE);
12083 Doxygen::spaces.resize(tabSize);
12084 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12085 Doxygen::spaces.at(tabSize)='\0';
12086}
void readAliases()
Definition aliases.cpp:161
static FileNameLinkedMap * plantUmlFileNameLinkedMap
Definition doxygen.h:109
static bool parseSourcesNeeded
Definition doxygen.h:123
static StringUnorderedSet expandAsDefinedSet
Definition doxygen.h:119
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:104
static InputFileEncodingList inputFileEncodingList
Definition doxygen.h:138
static FileNameLinkedMap * dotFileNameLinkedMap
Definition doxygen.h:106
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static FileNameLinkedMap * imageNameLinkedMap
Definition doxygen.h:105
static FileNameLinkedMap * mscFileNameLinkedMap
Definition doxygen.h:107
static FileNameLinkedMap * mermaidFileNameLinkedMap
Definition doxygen.h:110
static QCString spaces
Definition doxygen.h:133
static FileNameLinkedMap * diaFileNameLinkedMap
Definition doxygen.h:108
static QCString htmlFileExtension
Definition doxygen.h:122
static std::unique_ptr< NamespaceDef > globalNamespaceDef
Definition doxygen.h:120
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:48
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:5109

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(), Doxygen::mermaidFileNameLinkedMap, 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 11950 of file doxygen.cpp.

11951{
11952 AUTO_TRACE();
11953
11958}
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 11487 of file doxygen.cpp.

11488{
11492
11493 delete Doxygen::indexList;
11503 Doxygen::mainPage.reset();
11507 Doxygen::globalScope = nullptr;
11509 delete theTranslator;
11510 delete g_outputList;
11511
11516 delete Doxygen::dirLinkedMap;
11517 delete Doxygen::symbolMap;
11518}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:115
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:100
static ParserManager * parserManager
Definition doxygen.h:129
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:112
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:98
static IndexList * indexList
Definition doxygen.h:132
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:127
static MemberNameLinkedMap * memberNameLinkedMap
Definition doxygen.h:111
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:125
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:114
static FormulaManager & instance()
Definition formula.cpp:53
void clear()
Definition linkedmap.h:212
static ModuleManager & instance()
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
static OutputList * g_outputList
Definition doxygen.cpp:189
Translator * theTranslator
Definition language.cpp:71

References FormulaManager::clear(), LinkedMap< T, Hash, KeyEqual, Map >::clear(), ModuleManager::clear(), Doxygen::diaFileNameLinkedMap, Doxygen::dirLinkedMap, Doxygen::dotFileNameLinkedMap, Doxygen::exampleLinkedMap, Doxygen::exampleNameLinkedMap, Doxygen::functionNameLinkedMap, g_outputList, Doxygen::globalNamespaceDef, Doxygen::globalScope, Doxygen::groupLinkedMap, Doxygen::imageNameLinkedMap, Doxygen::includeNameLinkedMap, Doxygen::indexList, Doxygen::inputNameLinkedMap, FormulaManager::instance(), ModuleManager::instance(), SectionManager::instance(), Doxygen::mainPage, Doxygen::memberNameLinkedMap, Doxygen::mermaidFileNameLinkedMap, Doxygen::mscFileNameLinkedMap, Doxygen::namespaceLinkedMap, Doxygen::pageLinkedMap, Doxygen::parserManager, Doxygen::plantUmlFileNameLinkedMap, Doxygen::symbolMap, and theTranslator.

Referenced by generateOutput(), parseInput(), readConfiguration(), and stopDoxygen().

◆ generateOutput()

void generateOutput ( )

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

Definition at line 13148 of file doxygen.cpp.

13149{
13150 AUTO_TRACE();
13151 /**************************************************************************
13152 * Initialize output generators *
13153 **************************************************************************/
13154
13155 /// add extra languages for which we can only produce syntax highlighted code
13157
13158 //// dump all symbols
13159 if (g_dumpSymbolMap)
13160 {
13161 dumpSymbolMap();
13162 exit(0);
13163 }
13164
13165 bool generateHtml = Config_getBool(GENERATE_HTML);
13166 bool generateLatex = Config_getBool(GENERATE_LATEX);
13167 bool generateMan = Config_getBool(GENERATE_MAN);
13168 bool generateRtf = Config_getBool(GENERATE_RTF);
13169 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13170
13171
13173 if (generateHtml)
13174 {
13178 }
13179 if (generateLatex)
13180 {
13183 }
13184 if (generateDocbook)
13185 {
13188 }
13189 if (generateMan)
13190 {
13191 g_outputList->add<ManGenerator>();
13193 }
13194 if (generateRtf)
13195 {
13196 g_outputList->add<RTFGenerator>();
13198 }
13199 if (Config_getBool(USE_HTAGS))
13200 {
13202 QCString htmldir = Config_getString(HTML_OUTPUT);
13203 if (!Htags::execute(htmldir))
13204 err("USE_HTAGS is YES but htags(1) failed. \n");
13205 else if (!Htags::loadFilemap(htmldir))
13206 err("htags(1) ended normally but failed to load the filemap. \n");
13207 }
13208
13209 /**************************************************************************
13210 * Generate documentation *
13211 **************************************************************************/
13212
13213 g_s.begin("Generating style sheet...\n");
13214 //printf("writing style info\n");
13215 g_outputList->writeStyleInfo(0); // write first part
13216 g_s.end();
13217
13218 bool searchEngine = Config_getBool(SEARCHENGINE);
13219 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13220
13221 g_s.begin("Generating search indices...\n");
13222 if (searchEngine && !serverBasedSearch && generateHtml)
13223 {
13225 }
13226
13227 // generate search indices (need to do this before writing other HTML
13228 // pages as these contain a drop down menu with options depending on
13229 // what categories we find in this function.
13230 if (generateHtml && searchEngine)
13231 {
13232 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13233 Dir searchDir(searchDirName.str());
13234 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13235 {
13236 term("Could not create search results directory '{}' $PWD='{}'\n",
13237 searchDirName,Dir::currentDirPath());
13238 }
13239 HtmlGenerator::writeSearchData(searchDirName);
13240 if (!serverBasedSearch) // client side search index
13241 {
13243 }
13244 }
13245 g_s.end();
13246
13247 // copy static stuff
13248 if (generateHtml)
13249 {
13251 copyLogo(Config_getString(HTML_OUTPUT));
13252 copyIcon(Config_getString(HTML_OUTPUT));
13253 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13254 }
13255 if (generateLatex)
13256 {
13258 copyLogo(Config_getString(LATEX_OUTPUT));
13259 copyIcon(Config_getString(LATEX_OUTPUT));
13260 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13261 }
13262 if (generateDocbook)
13263 {
13264 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13265 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13266 }
13267 if (generateRtf)
13268 {
13269 copyLogo(Config_getString(RTF_OUTPUT));
13270 copyIcon(Config_getString(RTF_OUTPUT));
13271 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13272 }
13273
13275 if (fm.hasFormulas() && generateHtml
13276 && !Config_getBool(USE_MATHJAX))
13277 {
13278 g_s.begin("Generating images for formulas in HTML...\n");
13279 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13281 g_s.end();
13282 }
13283 if (fm.hasFormulas() && generateRtf)
13284 {
13285 g_s.begin("Generating images for formulas in RTF...\n");
13287 g_s.end();
13288 }
13289
13290 if (fm.hasFormulas() && generateDocbook)
13291 {
13292 g_s.begin("Generating images for formulas in Docbook...\n");
13294 g_s.end();
13295 }
13296
13297 g_s.begin("Generating example documentation...\n");
13299 g_s.end();
13300
13301 g_s.begin("Generating file sources...\n");
13303 g_s.end();
13304
13305 g_s.begin("Generating file documentation...\n");
13307 g_s.end();
13308
13309 g_s.begin("Generating page documentation...\n");
13311 g_s.end();
13312
13313 g_s.begin("Generating group documentation...\n");
13315 g_s.end();
13316
13317 g_s.begin("Generating class documentation...\n");
13319 g_s.end();
13320
13321 g_s.begin("Generating concept documentation...\n");
13323 g_s.end();
13324
13325 g_s.begin("Generating module documentation...\n");
13327 g_s.end();
13328
13329 g_s.begin("Generating namespace documentation...\n");
13331 g_s.end();
13332
13333 if (Config_getBool(GENERATE_LEGEND))
13334 {
13335 g_s.begin("Generating graph info page...\n");
13337 g_s.end();
13338 }
13339
13340 g_s.begin("Generating directory documentation...\n");
13342 g_s.end();
13343
13344 if (g_outputList->size()>0)
13345 {
13347 }
13348
13349 g_s.begin("finalizing index lists...\n");
13350 Doxygen::indexList->finalize();
13351 g_s.end();
13352
13353 g_s.begin("writing tag file...\n");
13354 writeTagFile();
13355 g_s.end();
13356
13357 if (Config_getBool(GENERATE_XML))
13358 {
13359 g_s.begin("Generating XML output...\n");
13361 generateXML();
13363 g_s.end();
13364 }
13365 if (Config_getBool(GENERATE_SQLITE3))
13366 {
13367 g_s.begin("Generating SQLITE3 output...\n");
13369 g_s.end();
13370 }
13371
13372 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13373 {
13374 g_s.begin("Generating AutoGen DEF output...\n");
13375 generateDEF();
13376 g_s.end();
13377 }
13378 if (Config_getBool(GENERATE_PERLMOD))
13379 {
13380 g_s.begin("Generating Perl module output...\n");
13382 g_s.end();
13383 }
13384 if (generateHtml && searchEngine && serverBasedSearch)
13385 {
13386 g_s.begin("Generating search index\n");
13387 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13388 {
13390 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13391 }
13392 else // write data for external search index
13393 {
13395 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13396 if (searchDataFile.isEmpty())
13397 {
13398 searchDataFile="searchdata.xml";
13399 }
13400 if (!Portable::isAbsolutePath(searchDataFile.data()))
13401 {
13402 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13403 }
13404 Doxygen::searchIndex.write(searchDataFile);
13405 }
13406 g_s.end();
13407 }
13408
13409 if (generateRtf)
13410 {
13411 g_s.begin("Combining RTF output...\n");
13412 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13413 {
13414 err("An error occurred during post-processing the RTF files!\n");
13415 }
13416 g_s.end();
13417 }
13418
13419 g_s.begin("Running plantuml with JAVA...\n");
13421 g_s.end();
13422
13423 g_s.begin("Running mermaid (mmdc)...\n");
13425 g_s.end();
13426
13427 if (Config_getBool(HAVE_DOT))
13428 {
13429 g_s.begin("Running dot...\n");
13431 g_s.end();
13432 }
13433
13434 if (generateHtml &&
13435 Config_getBool(GENERATE_HTMLHELP) &&
13436 !Config_getString(HHC_LOCATION).isEmpty())
13437 {
13438 g_s.begin("Running html help compiler...\n");
13440 g_s.end();
13441 }
13442
13443 if ( generateHtml &&
13444 Config_getBool(GENERATE_QHP) &&
13445 !Config_getString(QHG_LOCATION).isEmpty())
13446 {
13447 g_s.begin("Running qhelpgenerator...\n");
13449 g_s.end();
13450 }
13451
13452 g_outputList->cleanup();
13454
13456
13458 {
13459
13460 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13461 if (numThreads<1) numThreads=1;
13462 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13463 (static_cast<double>(Debug::elapsedTime())),
13464 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13465 );
13466 g_s.print();
13467
13469 msg("finished...\n");
13471 }
13472 else
13473 {
13474 msg("finished...\n");
13475 }
13476
13477
13478 /**************************************************************************
13479 * Start cleaning up *
13480 **************************************************************************/
13481
13483
13485 Dir thisDir;
13486 thisDir.remove(Doxygen::filterDBFileName.str());
13488 exitTracing();
13490 delete Doxygen::clangUsrMap;
13492
13493 //dumpDocNodeSizes();
13494}
@ Time
Definition debug.h:35
static void clearFlag(const DebugMask mask)
Definition debug.cpp:123
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133
static double elapsedTime()
Definition debug.cpp:201
static void setFlag(const DebugMask mask)
Definition debug.cpp:118
Class representing a directory in the file system.
Definition dir.h:75
static std::string currentDirPath()
Definition dir.cpp:342
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:314
static void init()
bool run()
Definition dot.cpp:128
static DotManager * instance()
Definition dot.cpp:78
static QCString filterDBFileName
Definition doxygen.h:131
static bool generatingXmlOutput
Definition doxygen.h:134
static SearchIndexIntf searchIndex
Definition doxygen.h:124
static ClangUsrMap * clangUsrMap
Definition doxygen.h:126
bool hasFormulas() const
Definition formula.cpp:719
void generateImages(const QCString &outputDir, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:635
Generator for HTML output.
Definition htmlgen.h:96
static void init()
Definition htmlgen.cpp:1210
static void writeSearchPage()
Definition htmlgen.cpp:3210
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1370
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1379
static void writeExternalSearchPage()
Definition htmlgen.cpp:3309
Generator for LaTeX output.
Definition latexgen.h:94
static void init()
Definition latexgen.cpp:632
Generator for Man page output.
Definition mangen.h:69
static void init()
Definition mangen.cpp:272
void run()
Run mmdc tool for all collected diagrams.
Definition mermaid.cpp:178
static MermaidManager & instance()
Definition mermaid.cpp:32
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
static void showCacheUsage()
Show usage of the type lookup cache.
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:8785
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9962
static void generateFileSources()
Definition doxygen.cpp:8619
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9220
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:9246
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4116
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5830
void finishWarnExit()
Definition message.cpp:294
void deinit()
bool isAbsolutePath(const QCString &fileName)
Definition portable.cpp:497
double getSysElapsedTime()
Definition portable.cpp:97
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:5208
void cleanupInlineGraph()
Definition util.cpp:7013
void generateXML()
Definition xmlgen.cpp:2335

References addCodeOnlyMappings(), AUTO_TRACE, FormulaManager::Bitmap, Doxygen::clangUsrMap, cleanUpDoxygen(), cleanupInlineGraph(), Debug::clearFlag(), 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(), MermaidManager::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(), MermaidManager::run(), PlantumlManager::run(), runHtmlHelpCompiler(), runQHelpGenerator(), Doxygen::searchIndex, Debug::setFlag(), SymbolResolver::showCacheUsage(), QCString::str(), term, Debug::Time, TRUE, 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 11417 of file doxygen.cpp.

11418{
11419 initResources();
11420 QCString lang = Portable::getenv("LC_ALL");
11421 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11422 std::setlocale(LC_ALL,"");
11423 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11424 std::setlocale(LC_NUMERIC,"C");
11425
11427
11451
11452 // register any additional parsers here...
11453
11455
11456#if USE_LIBCLANG
11458#endif
11467 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11468 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11469 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11471
11472 // initialization of these globals depends on
11473 // configuration switches so we need to postpone these
11474 Doxygen::globalScope = nullptr;
11484
11485}
static void startTimer()
Definition debug.cpp:196
A linked map of directories.
Definition dirdef.h:175
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:97
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:95
static ClassLinkedMap * hiddenClassLinkedMap
Definition doxygen.h:96
A list of index interfaces.
Definition indexlist.h:64
Ordered dictionary of MemberName objects.
Definition membername.h:63
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:286
QCString getenv(const QCString &variable)
Definition portable.cpp:321
void initDefaultExtensionMapping()
Definition util.cpp:5141

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::mermaidFileNameLinkedMap, 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 12472 of file doxygen.cpp.

12473{
12474 AUTO_TRACE();
12475 std::atexit(exitDoxygen);
12476
12477 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12478
12479#if USE_LIBCLANG
12480 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12481#endif
12482
12483 // we would like to show the versionString earlier, but we first have to handle the configuration file
12484 // to know the value of the QUIET setting.
12485 QCString versionString = getFullVersion();
12486 msg("Doxygen version used: {}\n",versionString);
12487
12489
12490 /**************************************************************************
12491 * Make sure the output directory exists
12492 **************************************************************************/
12493 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12494 if (!g_singleComment)
12495 {
12496 if (outputDirectory.isEmpty())
12497 {
12498 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12499 }
12500 else
12501 {
12502 Dir dir(outputDirectory.str());
12503 if (!dir.exists())
12504 {
12505 dir.setPath(Dir::currentDirPath());
12506 if (!dir.mkdir(outputDirectory.str()))
12507 {
12508 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12509 "exist and cannot be created\n",outputDirectory);
12510 }
12511 else
12512 {
12513 msg("Notice: Output directory '{}' does not exist. "
12514 "I have created it for you.\n", outputDirectory);
12515 }
12516 dir.setPath(outputDirectory.str());
12517 }
12518 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12519 }
12520 }
12521 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12522
12523 /**************************************************************************
12524 * Initialize global lists and dictionaries
12525 **************************************************************************/
12526
12527#ifdef HAS_SIGNALS
12528 signal(SIGINT, stopDoxygen);
12529#endif
12530
12531 uint32_t pid = Portable::pid();
12532 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12533 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12534
12535 /**************************************************************************
12536 * Check/create output directories *
12537 **************************************************************************/
12538
12539 bool generateHtml = Config_getBool(GENERATE_HTML);
12540 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12541 bool generateXml = Config_getBool(GENERATE_XML);
12542 bool generateLatex = Config_getBool(GENERATE_LATEX);
12543 bool generateRtf = Config_getBool(GENERATE_RTF);
12544 bool generateMan = Config_getBool(GENERATE_MAN);
12545 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12546 QCString htmlOutput;
12547 QCString docbookOutput;
12548 QCString xmlOutput;
12549 QCString latexOutput;
12550 QCString rtfOutput;
12551 QCString manOutput;
12552 QCString sqlOutput;
12553
12554 if (!g_singleComment)
12555 {
12556 if (generateHtml)
12557 {
12558 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12559 Config_updateString(HTML_OUTPUT,htmlOutput);
12560
12561 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12562 bool generateSitemap = !sitemapUrl.isEmpty();
12563 if (generateSitemap && !sitemapUrl.endsWith("/"))
12564 {
12565 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12566 }
12567
12568 // add HTML indexers that are enabled
12569 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12570 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12571 bool generateQhp = Config_getBool(GENERATE_QHP);
12572 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12573 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12574 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12575 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12576 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12577 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12578 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12579 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12580 Doxygen::indexList->addIndex<Crawlmap>();
12581 Doxygen::indexList->initialize();
12582 }
12583
12584 if (generateDocbook)
12585 {
12586 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12587 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12588 }
12589
12590 if (generateXml)
12591 {
12592 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12593 Config_updateString(XML_OUTPUT,xmlOutput);
12594 }
12595
12596 if (generateLatex)
12597 {
12598 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12599 Config_updateString(LATEX_OUTPUT,latexOutput);
12600 }
12601
12602 if (generateRtf)
12603 {
12604 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12605 Config_updateString(RTF_OUTPUT,rtfOutput);
12606 }
12607
12608 if (generateMan)
12609 {
12610 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12611 Config_updateString(MAN_OUTPUT,manOutput);
12612 }
12613
12614 if (generateSql)
12615 {
12616 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12617 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12618 }
12619 }
12620
12621 if (Config_getBool(HAVE_DOT))
12622 {
12623 QCString curFontPath = Config_getString(DOT_FONTPATH);
12624 if (curFontPath.isEmpty())
12625 {
12626 Portable::getenv("DOTFONTPATH");
12627 QCString newFontPath = ".";
12628 if (!curFontPath.isEmpty())
12629 {
12630 newFontPath+=Portable::pathListSeparator();
12631 newFontPath+=curFontPath;
12632 }
12633 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12634 }
12635 else
12636 {
12637 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12638 }
12639 }
12640
12641 /**************************************************************************
12642 * Handle layout file *
12643 **************************************************************************/
12644
12646 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12647 bool defaultLayoutUsed = FALSE;
12648 if (layoutFileName.isEmpty())
12649 {
12650 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12651 defaultLayoutUsed = TRUE;
12652 }
12653 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12654
12655 FileInfo fi(layoutFileName.str());
12656 if (fi.exists())
12657 {
12658 msg("Parsing layout file {}...\n",layoutFileName);
12659 LayoutDocManager::instance().parse(layoutFileName);
12660 }
12661 else if (!defaultLayoutUsed)
12662 {
12663 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12664 }
12665 printLayout();
12666
12667 /**************************************************************************
12668 * Read and preprocess input *
12669 **************************************************************************/
12670
12671 // prevent search in the output directories
12672 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12673 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12674 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12675 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12676 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12677 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12678 if (generateMan) exclPatterns.push_back(manOutput.str());
12679 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12680
12681 if (!g_singleComment)
12682 {
12684
12686 }
12687
12688 // Notice: the order of the function calls below is very important!
12689
12690 if (generateHtml && !Config_getBool(USE_MATHJAX))
12691 {
12693 }
12694 if (generateRtf)
12695 {
12697 }
12698 if (generateDocbook)
12699 {
12701 }
12702
12704
12705 /**************************************************************************
12706 * Handle Tag Files *
12707 **************************************************************************/
12708
12709 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12710
12711 if (!g_singleComment)
12712 {
12713 msg("Reading and parsing tag files\n");
12714 const StringVector &tagFileList = Config_getList(TAGFILES);
12715 for (const auto &s : tagFileList)
12716 {
12717 readTagFile(root,s.c_str());
12718 }
12719 }
12720
12721 /**************************************************************************
12722 * Parse source files *
12723 **************************************************************************/
12724
12725 addSTLSupport(root);
12726
12727 g_s.begin("Parsing files\n");
12728 if (g_singleComment)
12729 {
12730 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12731 if (g_commentFileName=="-")
12732 {
12733 std::string text = fileToString(g_commentFileName).str();
12734 addTerminalCharIfMissing(text,'\n');
12735 generateHtmlForComment("stdin.md",text);
12736 }
12737 else if (FileInfo(g_commentFileName.str()).isFile())
12738 {
12739 std::string text;
12741 addTerminalCharIfMissing(text,'\n');
12743 }
12744 else
12745 {
12746 }
12748 exit(0);
12749 }
12750 else
12751 {
12752 if (Config_getInt(NUM_PROC_THREADS)==1)
12753 {
12755 }
12756 else
12757 {
12759 }
12760 }
12761 g_s.end();
12762
12763 /**************************************************************************
12764 * Gather information *
12765 **************************************************************************/
12766
12767 g_s.begin("Building macro definition list...\n");
12769 g_s.end();
12770
12771 g_s.begin("Building group list...\n");
12772 buildGroupList(root.get());
12773 organizeSubGroups(root.get());
12774 g_s.end();
12775
12776 g_s.begin("Building directory list...\n");
12778 findDirDocumentation(root.get());
12779 g_s.end();
12780
12781 g_s.begin("Building namespace list...\n");
12782 buildNamespaceList(root.get());
12783 findUsingDirectives(root.get());
12784 g_s.end();
12785
12786 g_s.begin("Building file list...\n");
12787 buildFileList(root.get());
12788 g_s.end();
12789
12790 g_s.begin("Building class list...\n");
12791 buildClassList(root.get());
12792 g_s.end();
12793
12794 g_s.begin("Building concept list...\n");
12795 buildConceptList(root.get());
12796 g_s.end();
12797
12798 // build list of using declarations here (global list)
12799 buildListOfUsingDecls(root.get());
12800 g_s.end();
12801
12802 g_s.begin("Computing nesting relations for classes...\n");
12804 g_s.end();
12805 // 1.8.2-20121111: no longer add nested classes to the group as well
12806 //distributeClassGroupRelations();
12807
12808 // calling buildClassList may result in cached relations that
12809 // become invalid after resolveClassNestingRelations(), that's why
12810 // we need to clear the cache here
12812 // we don't need the list of using declaration anymore
12813 g_usingDeclarations.clear();
12814
12815 g_s.begin("Associating documentation with classes...\n");
12816 buildClassDocList(root.get());
12817 g_s.end();
12818
12819 g_s.begin("Associating documentation with concepts...\n");
12820 buildConceptDocList(root.get());
12822 g_s.end();
12823
12824 g_s.begin("Associating documentation with modules...\n");
12825 findModuleDocumentation(root.get());
12826 g_s.end();
12827
12828 g_s.begin("Building example list...\n");
12829 buildExampleList(root.get());
12830 g_s.end();
12831
12832 g_s.begin("Searching for enumerations...\n");
12833 findEnums(root.get());
12834 g_s.end();
12835
12836 // Since buildVarList calls isVarWithConstructor
12837 // and this calls getResolvedClass we need to process
12838 // typedefs first so the relations between classes via typedefs
12839 // are properly resolved. See bug 536385 for an example.
12840 g_s.begin("Searching for documented typedefs...\n");
12841 buildTypedefList(root.get());
12842 g_s.end();
12843
12844 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12845 {
12846 g_s.begin("Searching for documented sequences...\n");
12847 buildSequenceList(root.get());
12848 g_s.end();
12849
12850 g_s.begin("Searching for documented dictionaries...\n");
12851 buildDictionaryList(root.get());
12852 g_s.end();
12853 }
12854
12855 g_s.begin("Searching for members imported via using declarations...\n");
12856 // this should be after buildTypedefList in order to properly import
12857 // used typedefs
12858 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12859 findUsingDeclarations(root.get(),FALSE); // then the rest
12860 g_s.end();
12861
12862 g_s.begin("Searching for included using directives...\n");
12864 g_s.end();
12865
12866 g_s.begin("Searching for documented variables...\n");
12867 buildVarList(root.get());
12868 g_s.end();
12869
12870 g_s.begin("Building interface member list...\n");
12871 buildInterfaceAndServiceList(root.get()); // UNO IDL
12872
12873 g_s.begin("Building member list...\n"); // using class info only !
12874 buildFunctionList(root.get());
12875 g_s.end();
12876
12877 g_s.begin("Searching for friends...\n");
12878 findFriends();
12879 g_s.end();
12880
12881 g_s.begin("Searching for documented defines...\n");
12882 findDefineDocumentation(root.get());
12883 g_s.end();
12884
12885 g_s.begin("Computing class inheritance relations...\n");
12886 findClassEntries(root.get());
12888 g_s.end();
12889
12890 g_s.begin("Computing class usage relations...\n");
12892 g_s.end();
12893
12894 if (Config_getBool(INLINE_SIMPLE_STRUCTS))
12895 {
12896 g_s.begin("Searching for tag less structs...\n");
12898 g_s.end();
12899 }
12900
12901 g_s.begin("Flushing cached template relations that have become invalid...\n");
12903 g_s.end();
12904
12905 g_s.begin("Warn for undocumented namespaces...\n");
12907 g_s.end();
12908
12909 g_s.begin("Computing class relations...\n");
12912 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12913 {
12915 }
12917 g_classEntries.clear();
12918 g_s.end();
12919
12920 g_s.begin("Add enum values to enums...\n");
12921 addEnumValuesToEnums(root.get());
12922 findEnumDocumentation(root.get());
12923 g_s.end();
12924
12925 g_s.begin("Searching for member function documentation...\n");
12926 findObjCMethodDefinitions(root.get());
12927 findMemberDocumentation(root.get()); // may introduce new members !
12928 findUsingDeclImports(root.get()); // may introduce new members !
12929 g_usingClassMap.clear();
12933 g_s.end();
12934
12935 // moved to after finding and copying documentation,
12936 // as this introduces new members see bug 722654
12937 g_s.begin("Creating members for template instances...\n");
12939 g_s.end();
12940
12941 g_s.begin("Building page list...\n");
12942 buildPageList(root.get());
12943 g_s.end();
12944
12945 g_s.begin("Building requirements list...\n");
12946 buildRequirementsList(root.get());
12947 g_s.end();
12948
12949 g_s.begin("Search for main page...\n");
12950 findMainPage(root.get());
12951 findMainPageTagFiles(root.get());
12952 g_s.end();
12953
12954 g_s.begin("Computing page relations...\n");
12955 computePageRelations(root.get());
12957 g_s.end();
12958
12959 g_s.begin("Determining the scope of groups...\n");
12960 findGroupScope(root.get());
12961 g_s.end();
12962
12963 g_s.begin("Computing module relations...\n");
12964 auto &mm = ModuleManager::instance();
12965 mm.resolvePartitions();
12966 mm.resolveImports();
12967 mm.collectExportedSymbols();
12968 g_s.end();
12969
12970 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
12971 {
12972 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
12973 n2->memberName().data()+getPrefixIndex(n2->memberName())
12974 )<0;
12975 };
12976
12977 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
12978 {
12979 if (Config_getBool(SORT_BY_SCOPE_NAME))
12980 {
12981 return qstricmp_sort(c1->name(), c2->name())<0;
12982 }
12983 else
12984 {
12985 int i = qstricmp_sort(c1->className(), c2->className());
12986 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12987 }
12988 };
12989
12990 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
12991 {
12992 return qstricmp_sort(n1->name(),n2->name())<0;
12993 };
12994
12995 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
12996 {
12997 return qstricmp_sort(c1->name(),c2->name())<0;
12998 };
12999
13000 g_s.begin("Sorting lists...\n");
13001 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
13003 memberNameComp);
13004 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
13006 memberNameComp);
13007 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
13009 classComp);
13010 std::stable_sort(Doxygen::classLinkedMap->begin(),
13012 classComp);
13013 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
13015 conceptComp);
13016 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
13018 namespaceComp);
13019 g_s.end();
13020
13021 g_s.begin("Determining which enums are documented\n");
13023 g_s.end();
13024
13025 g_s.begin("Computing member relations...\n");
13028 g_s.end();
13029
13030 g_s.begin("Building full member lists recursively...\n");
13032 g_s.end();
13033
13034 g_s.begin("Adding members to member groups.\n");
13036 g_s.end();
13037
13038 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13039 {
13040 g_s.begin("Distributing member group documentation.\n");
13042 g_s.end();
13043 }
13044
13045 g_s.begin("Computing member references...\n");
13047 g_s.end();
13048
13049 if (Config_getBool(INHERIT_DOCS))
13050 {
13051 g_s.begin("Inheriting documentation...\n");
13053 g_s.end();
13054 }
13055
13056
13057 // compute the shortest possible names of all files
13058 // without losing the uniqueness of the file names.
13059 g_s.begin("Generating disk names...\n");
13061 g_s.end();
13062
13063 g_s.begin("Adding source references...\n");
13065 g_s.end();
13066
13067 g_s.begin("Adding xrefitems...\n");
13070 g_s.end();
13071
13072 g_s.begin("Adding requirements...\n");
13075 g_s.end();
13076
13077 g_s.begin("Sorting member lists...\n");
13079 g_s.end();
13080
13081 g_s.begin("Setting anonymous enum type...\n");
13083 g_s.end();
13084
13085 g_s.begin("Computing dependencies between directories...\n");
13087 g_s.end();
13088
13089 g_s.begin("Generating citations page...\n");
13091 g_s.end();
13092
13093 g_s.begin("Counting members...\n");
13094 countMembers();
13095 g_s.end();
13096
13097 g_s.begin("Counting data structures...\n");
13099 g_s.end();
13100
13101 g_s.begin("Resolving user defined references...\n");
13103 g_s.end();
13104
13105 g_s.begin("Finding anchors and sections in the documentation...\n");
13107 g_s.end();
13108
13109 g_s.begin("Transferring function references...\n");
13111 g_s.end();
13112
13113 g_s.begin("Combining using relations...\n");
13115 g_s.end();
13116
13118 g_s.begin("Adding members to index pages...\n");
13120 addToIndices();
13121 g_s.end();
13122
13123 g_s.begin("Correcting members for VHDL...\n");
13125 g_s.end();
13126
13127 g_s.begin("Computing tooltip texts...\n");
13129 g_s.end();
13130
13131 if (Config_getBool(SORT_GROUP_NAMES))
13132 {
13133 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13135 [](const auto &g1,const auto &g2)
13136 { return g1->groupTitle() < g2->groupTitle(); });
13137
13138 for (const auto &gd : *Doxygen::groupLinkedMap)
13139 {
13140 gd->sortSubGroups();
13141 }
13142 }
13143
13144 printNavTree(root.get(),0);
13146}
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:136
Generator for Eclipse help files.
Definition eclipsehelp.h:44
A class that generates a dynamic tree view side panel.
Definition ftvhelp.h:41
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
bool isFile() const
Definition fileinfo.cpp:63
void initFromRepository(const QCString &dir)
Definition formula.cpp:59
void checkRepositories()
Definition formula.cpp:172
A class that generated the HTML Help specific files.
Definition htmlhelp.h:36
static Index & instance()
Definition index.cpp:108
void countDataStructures()
Definition index.cpp:264
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 clearTypeLookupCache(ClearScope scope)
static void computeVhdlComponentRelations()
#define Config_updateString(name, value)
Definition config.h:39
#define Config_updateList(name,...)
Definition config.h:43
DirIterator begin(DirIterator it) noexcept
Definition dir.cpp:170
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
void buildDirectories()
Definition dirdef.cpp:1119
void computeDirDependencies()
Definition dirdef.cpp:1193
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:49
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5328
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:432
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2058
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9462
static void computeTemplateClassRelations()
Definition doxygen.cpp:5422
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5601
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2211
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9662
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5377
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1326
static void resolveClassNestingRelations()
Definition doxygen.cpp:1381
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5291
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8420
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5491
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4449
static void addMembersToMemberGroup()
Definition doxygen.cpp:9327
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9832
static void distributeConceptGroups()
Definition doxygen.cpp:1348
static void transferFunctionDocumentation()
Definition doxygen.cpp:4368
static void setAnonymousEnumType()
Definition doxygen.cpp:9067
static void sortMemberLists()
Definition doxygen.cpp:8972
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8548
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4498
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7561
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3437
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:447
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9575
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7531
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9365
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7765
static void resolveUserReferences()
Definition doxygen.cpp:9894
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9723
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3574
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3537
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1720
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2461
static void countMembers()
Definition doxygen.cpp:9081
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:491
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4271
static void findEnums(const Entry *root)
Definition doxygen.cpp:7589
static void addListReferences()
Definition doxygen.cpp:5592
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8210
static void findMainPage(Entry *root)
Definition doxygen.cpp:9762
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:1902
static void addSourceReferences()
Definition doxygen.cpp:8845
static void buildExampleList(Entry *root)
Definition doxygen.cpp:9979
static void inheritDocumentation()
Definition doxygen.cpp:9267
static void flushUnresolvedRelations()
Definition doxygen.cpp:9504
static QCString g_commentFileName
Definition doxygen.cpp:193
static void findDocumentedEnumValues()
Definition doxygen.cpp:8202
static void findTagLessClasses()
Definition doxygen.cpp:1696
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8252
static void computeClassRelations()
Definition doxygen.cpp:5397
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:3966
static void checkPageRelations()
Definition doxygen.cpp:9874
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1316
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8090
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9844
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:3555
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1151
static void buildPageList(Entry *root)
Definition doxygen.cpp:9735
static void addRequirementReferences()
Definition doxygen.cpp:5584
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:194
static void findSectionsInDocumentation()
Definition doxygen.cpp:9403
static void mergeCategories()
Definition doxygen.cpp:8567
static void buildFileList(const Entry *root)
Definition doxygen.cpp:503
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1141
static void findUsedTemplateInstances()
Definition doxygen.cpp:5361
static void computeTooltipTexts()
Definition doxygen.cpp:9021
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8589
static void combineUsingRelations()
Definition doxygen.cpp:9302
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2209
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1336
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void transferFunctionReferences()
Definition doxygen.cpp:4401
static void buildDefineList()
Definition doxygen.cpp:8924
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3669
static void computeMemberRelations()
Definition doxygen.cpp:8532
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2045
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:516
QCString pathListSeparator()
Definition portable.cpp:383
uint32_t pid()
Definition portable.cpp:248
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:5553
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1494
int getPrefixIndex(const QCString &name)
Definition util.cpp:3235

References Dir::absPath(), addEnumValuesToEnums(), addListReferences(), addMembersToIndex(), addMembersToMemberGroup(), addRequirementReferences(), addSourceReferences(), addSTLSupport(), addTerminalCharIfMissing(), addToIndices(), SymbolResolver::All, 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(), SymbolResolver::clearTypeLookupCache(), combineUsingRelations(), computeClassRelations(), computeDirDependencies(), computeMemberReferences(), computeMemberRelations(), computePageRelations(), computeTemplateClassRelations(), computeTooltipTexts(), computeVerifiedDotPath(), VhdlDocGen::computeVhdlComponentRelations(), Doxygen::conceptLinkedMap, Config_getBool, Config_getInt, Config_getList, Config_getString, Config_updateList, Config_updateString, Portable::correctPath(), Index::countDataStructures(), 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(), term, transferFunctionDocumentation(), transferFunctionReferences(), transferRelatedFunctionDocumentation(), transferStaticInstanceInitializers(), TRUE, vhdlCorrectMemberProperties(), warn_uncond, and warnUndocumentedNamespaces().

Referenced by main().

◆ readConfiguration()

void readConfiguration ( int argc,
char ** argv )

Definition at line 11520 of file doxygen.cpp.

11521{
11522 QCString versionString = getFullVersion();
11523
11524 // helper that calls \a func to write to file \a fileName via a TextStream
11525 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11526 {
11527 std::ofstream f;
11528 if (openOutputFile(fileName,f))
11529 {
11530 TextStream t(&f);
11531 func(t);
11532 return true;
11533 }
11534 return false;
11535 };
11536
11537
11538 /**************************************************************************
11539 * Handle arguments *
11540 **************************************************************************/
11541
11542 int optInd=1;
11543 QCString configName;
11544 QCString traceName;
11545 bool genConfig=false;
11546 bool shortList=false;
11547 bool traceTiming=false;
11549 bool updateConfig=false;
11550 bool quiet = false;
11551 while (optInd<argc && argv[optInd][0]=='-' &&
11552 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11553 argv[optInd][1]=='-')
11554 )
11555 {
11556 switch(argv[optInd][1])
11557 {
11558 case 'g':
11559 {
11560 genConfig=TRUE;
11561 }
11562 break;
11563 case 'l':
11564 {
11565 QCString layoutName;
11566 if (optInd+1>=argc)
11567 {
11568 layoutName="DoxygenLayout.xml";
11569 }
11570 else
11571 {
11572 layoutName=argv[optInd+1];
11573 }
11574 writeDefaultLayoutFile(layoutName);
11576 exit(0);
11577 }
11578 break;
11579 case 'c':
11580 if (optInd+1>=argc) // no file name given
11581 {
11582 msg("option \"-c\" is missing the file name to read\n");
11583 devUsage();
11585 exit(1);
11586 }
11587 else
11588 {
11589 g_commentFileName=argv[optInd+1];
11590 optInd++;
11591 }
11592 g_singleComment=true;
11593 quiet=true;
11594 break;
11595 case 'd':
11596 {
11597 QCString debugLabel=getArg(argc,argv,optInd);
11598 if (debugLabel.isEmpty())
11599 {
11600 devUsage();
11602 exit(0);
11603 }
11604 int retVal = Debug::setFlagStr(debugLabel);
11605 if (!retVal)
11606 {
11607 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11608 devUsage();
11610 exit(1);
11611 }
11612 }
11613 break;
11614 case 't':
11615 {
11616#if ENABLE_TRACING
11617 if (!strcmp(argv[optInd]+1,"t_time"))
11618 {
11619 traceTiming = true;
11620 }
11621 else if (!strcmp(argv[optInd]+1,"t"))
11622 {
11623 traceTiming = false;
11624 }
11625 else
11626 {
11627 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11629 exit(1);
11630 }
11631 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11632 {
11633 traceName="stdout";
11634 }
11635 else
11636 {
11637 traceName=argv[optInd+1];
11638 optInd++;
11639 }
11640#else
11641 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11643 exit(1);
11644#endif
11645 }
11646 break;
11647 case 'x':
11648 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11649 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11650 else
11651 {
11652 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11654 exit(1);
11655 }
11656 break;
11657 case 's':
11658 shortList=TRUE;
11659 break;
11660 case 'u':
11661 updateConfig=TRUE;
11662 break;
11663 case 'e':
11664 {
11665 QCString formatName=getArg(argc,argv,optInd);
11666 if (formatName.isEmpty())
11667 {
11668 err("option \"-e\" is missing format specifier rtf.\n");
11670 exit(1);
11671 }
11672 if (qstricmp(formatName.data(),"rtf")==0)
11673 {
11674 if (optInd+1>=argc)
11675 {
11676 err("option \"-e rtf\" is missing an extensions file name\n");
11678 exit(1);
11679 }
11680 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11682 exit(0);
11683 }
11684 err("option \"-e\" has invalid format specifier.\n");
11686 exit(1);
11687 }
11688 break;
11689 case 'f':
11690 {
11691 QCString listName=getArg(argc,argv,optInd);
11692 if (listName.isEmpty())
11693 {
11694 err("option \"-f\" is missing list specifier.\n");
11696 exit(1);
11697 }
11698 if (qstricmp(listName.data(),"emoji")==0)
11699 {
11700 if (optInd+1>=argc)
11701 {
11702 err("option \"-f emoji\" is missing an output file name\n");
11704 exit(1);
11705 }
11706 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11708 exit(0);
11709 }
11710 err("option \"-f\" has invalid list specifier.\n");
11712 exit(1);
11713 }
11714 break;
11715 case 'w':
11716 {
11717 QCString formatName=getArg(argc,argv,optInd);
11718 if (formatName.isEmpty())
11719 {
11720 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11722 exit(1);
11723 }
11724 if (qstricmp(formatName.data(),"rtf")==0)
11725 {
11726 if (optInd+1>=argc)
11727 {
11728 err("option \"-w rtf\" is missing a style sheet file name\n");
11730 exit(1);
11731 }
11732 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11733 {
11734 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11736 exit(1);
11737 }
11739 exit(0);
11740 }
11741 else if (qstricmp(formatName.data(),"html")==0)
11742 {
11743 Config::init();
11744 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11745 // explicit config file mentioned or default found on disk
11746 {
11747 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11748 if (!Config::parse(df)) // parse the config file
11749 {
11750 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11752 exit(1);
11753 }
11754 }
11755 if (optInd+3>=argc)
11756 {
11757 err("option \"-w html\" does not have enough arguments\n");
11759 exit(1);
11760 }
11764 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11765 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11766 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11767 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11769 exit(0);
11770 }
11771 else if (qstricmp(formatName.data(),"latex")==0)
11772 {
11773 Config::init();
11774 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11775 {
11776 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11777 if (!Config::parse(df))
11778 {
11779 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11781 exit(1);
11782 }
11783 }
11784 if (optInd+3>=argc)
11785 {
11786 err("option \"-w latex\" does not have enough arguments\n");
11788 exit(1);
11789 }
11793 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11794 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11795 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11796 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11798 exit(0);
11799 }
11800 else
11801 {
11802 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11804 exit(1);
11805 }
11806 }
11807 break;
11808 case 'm':
11810 break;
11811 case 'v':
11812 version(false);
11814 exit(0);
11815 break;
11816 case 'V':
11817 version(true);
11819 exit(0);
11820 break;
11821 case '-':
11822 if (qstrcmp(&argv[optInd][2],"help")==0)
11823 {
11824 usage(argv[0],versionString);
11825 exit(0);
11826 }
11827 else if (qstrcmp(&argv[optInd][2],"version")==0)
11828 {
11829 version(false);
11831 exit(0);
11832 }
11833 else if ((qstrcmp(&argv[optInd][2],"Version")==0) ||
11834 (qstrcmp(&argv[optInd][2],"VERSION")==0))
11835 {
11836 version(true);
11838 exit(0);
11839 }
11840 else
11841 {
11842 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11843 usage(argv[0],versionString);
11844 exit(1);
11845 }
11846 break;
11847 case 'b':
11848 setvbuf(stdout,nullptr,_IONBF,0);
11849 break;
11850 case 'q':
11851 quiet = true;
11852 break;
11853 case 'h':
11854 case '?':
11855 usage(argv[0],versionString);
11856 exit(0);
11857 break;
11858 default:
11859 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11860 usage(argv[0],versionString);
11861 exit(1);
11862 }
11863 optInd++;
11864 }
11865
11866 /**************************************************************************
11867 * Parse or generate the config file *
11868 **************************************************************************/
11869
11870 initTracing(traceName.data(),traceTiming);
11871 TRACE("Doxygen version used: {}",getFullVersion());
11872 Config::init();
11873
11874 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11875 if (optInd>=argc)
11876 {
11877 if (configFileInfo1.exists())
11878 {
11879 configName="Doxyfile";
11880 }
11881 else if (configFileInfo2.exists())
11882 {
11883 configName="doxyfile";
11884 }
11885 else if (genConfig)
11886 {
11887 configName="Doxyfile";
11888 }
11889 else
11890 {
11891 err("Doxyfile not found and no input file specified!\n");
11892 usage(argv[0],versionString);
11893 exit(1);
11894 }
11895 }
11896 else
11897 {
11898 FileInfo fi(argv[optInd]);
11899 if (fi.exists() || qstrcmp(argv[optInd],"-")==0 || genConfig)
11900 {
11901 configName=argv[optInd];
11902 }
11903 else
11904 {
11905 err("configuration file {} not found!\n",argv[optInd]);
11906 usage(argv[0],versionString);
11907 exit(1);
11908 }
11909 }
11910
11911 if (genConfig)
11912 {
11913 generateConfigFile(configName,shortList);
11915 exit(0);
11916 }
11917
11918 if (!Config::parse(configName,updateConfig,diffList))
11919 {
11920 err("could not open or read configuration file {}!\n",configName);
11922 exit(1);
11923 }
11924
11925 if (diffList!=Config::CompareMode::Full)
11926 {
11928 compareDoxyfile(diffList);
11930 exit(0);
11931 }
11932
11933 if (updateConfig)
11934 {
11936 generateConfigFile(configName,shortList,TRUE);
11938 exit(0);
11939 }
11940
11941 /* Perlmod wants to know the path to the config file.*/
11942 FileInfo configFileInfo(configName.str());
11943 setPerlModDoxyfile(configFileInfo.absFilePath());
11944
11945 /* handle -q option */
11946 if (quiet) Config_updateBool(QUIET,TRUE);
11947}
static bool setFlagStr(const QCString &label)
Definition debug.cpp:104
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
Definition emoji.cpp:1978
void writeEmojiFile(TextStream &t)
Writes the list of supported emojis to the given file.
Definition emoji.cpp:1999
bool exists() const
Definition fileinfo.cpp:30
static void writeFooterFile(TextStream &t)
Definition htmlgen.cpp:1553
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1541
static void writeHeaderFile(TextStream &t, const QCString &cssname)
Definition htmlgen.cpp:1547
static void writeFooterFile(TextStream &t)
Definition latexgen.cpp:696
static void writeStyleSheetFile(TextStream &t)
Definition latexgen.cpp:702
static void writeHeaderFile(TextStream &t)
Definition latexgen.cpp:690
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:6319

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

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

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