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

11957{
11958 AUTO_TRACE();
11959 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
11969
11970 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11971
11972 /* Set the global html file extension. */
11973 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
11974
11975
11977 Config_getBool(CALLER_GRAPH) ||
11978 Config_getBool(REFERENCES_RELATION) ||
11979 Config_getBool(REFERENCED_BY_RELATION);
11980
11981 /**************************************************************************
11982 * Add custom extension mappings
11983 **************************************************************************/
11984
11985 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
11986 for (const auto &mapping : extMaps)
11987 {
11988 QCString mapStr = mapping;
11989 int i=mapStr.find('=');
11990 if (i==-1)
11991 {
11992 continue;
11993 }
11994 else
11995 {
11996 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
11997 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
11998 if (ext.isEmpty() || language.isEmpty())
11999 {
12000 continue;
12001 }
12002
12003 if (!updateLanguageMapping(ext,language))
12004 {
12005 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
12006 "Check the EXTENSION_MAPPING setting in the config file.\n",
12007 ext,language);
12008 }
12009 else
12010 {
12011 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
12012 ext,language);
12013 }
12014 }
12015 }
12016 // create input file exncodings
12017
12018 // check INPUT_ENCODING
12019 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
12020 if (cd==reinterpret_cast<void *>(-1))
12021 {
12022 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12023 "Check the 'INPUT_ENCODING' setting in the config file!\n",
12024 Config_getString(INPUT_ENCODING),strerror(errno));
12025 }
12026 else
12027 {
12029 }
12030
12031 // check and split INPUT_FILE_ENCODING
12032 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
12033 for (const auto &mapping : fileEncod)
12034 {
12035 QCString mapStr = mapping;
12036 int i=mapStr.find('=');
12037 if (i==-1)
12038 {
12039 continue;
12040 }
12041 else
12042 {
12043 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
12044 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
12045 if (pattern.isEmpty() || encoding.isEmpty())
12046 {
12047 continue;
12048 }
12049 cd = portable_iconv_open("UTF-8",encoding.data());
12050 if (cd==reinterpret_cast<void *>(-1))
12051 {
12052 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
12053 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
12054 encoding,strerror(errno));
12055 }
12056 else
12057 {
12059 }
12060
12061 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
12062 }
12063 }
12064
12065 // add predefined macro name to a dictionary
12066 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
12067 for (const auto &s : expandAsDefinedList)
12068 {
12070 }
12071
12072 // read aliases and store them in a dictionary
12073 readAliases();
12074
12075 // store number of spaces in a tab into Doxygen::spaces
12076 int tabSize = Config_getInt(TAB_SIZE);
12077 Doxygen::spaces.resize(tabSize);
12078 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12079 Doxygen::spaces.at(tabSize)='\0';
12080}
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:137
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:132
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:5104

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

11946{
11947 AUTO_TRACE();
11948
11953}
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 11483 of file doxygen.cpp.

11484{
11488
11489 delete Doxygen::indexList;
11498 Doxygen::mainPage.reset();
11502 Doxygen::globalScope = nullptr;
11504 delete theTranslator;
11505 delete g_outputList;
11506
11511 delete Doxygen::dirLinkedMap;
11512 delete Doxygen::symbolMap;
11513}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:114
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:100
static ParserManager * parserManager
Definition doxygen.h:128
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:111
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:98
static IndexList * indexList
Definition doxygen.h:131
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:99
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:126
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: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:187
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 13124 of file doxygen.cpp.

13125{
13126 AUTO_TRACE();
13127 /**************************************************************************
13128 * Initialize output generators *
13129 **************************************************************************/
13130
13131 /// add extra languages for which we can only produce syntax highlighted code
13133
13134 //// dump all symbols
13135 if (g_dumpSymbolMap)
13136 {
13137 dumpSymbolMap();
13138 exit(0);
13139 }
13140
13141 bool generateHtml = Config_getBool(GENERATE_HTML);
13142 bool generateLatex = Config_getBool(GENERATE_LATEX);
13143 bool generateMan = Config_getBool(GENERATE_MAN);
13144 bool generateRtf = Config_getBool(GENERATE_RTF);
13145 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13146
13147
13149 if (generateHtml)
13150 {
13154 }
13155 if (generateLatex)
13156 {
13159 }
13160 if (generateDocbook)
13161 {
13164 }
13165 if (generateMan)
13166 {
13167 g_outputList->add<ManGenerator>();
13169 }
13170 if (generateRtf)
13171 {
13172 g_outputList->add<RTFGenerator>();
13174 }
13175 if (Config_getBool(USE_HTAGS))
13176 {
13178 QCString htmldir = Config_getString(HTML_OUTPUT);
13179 if (!Htags::execute(htmldir))
13180 err("USE_HTAGS is YES but htags(1) failed. \n");
13181 else if (!Htags::loadFilemap(htmldir))
13182 err("htags(1) ended normally but failed to load the filemap. \n");
13183 }
13184
13185 /**************************************************************************
13186 * Generate documentation *
13187 **************************************************************************/
13188
13189 g_s.begin("Generating style sheet...\n");
13190 //printf("writing style info\n");
13191 g_outputList->writeStyleInfo(0); // write first part
13192 g_s.end();
13193
13194 bool searchEngine = Config_getBool(SEARCHENGINE);
13195 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13196
13197 g_s.begin("Generating search indices...\n");
13198 if (searchEngine && !serverBasedSearch && generateHtml)
13199 {
13201 }
13202
13203 // generate search indices (need to do this before writing other HTML
13204 // pages as these contain a drop down menu with options depending on
13205 // what categories we find in this function.
13206 if (generateHtml && searchEngine)
13207 {
13208 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13209 Dir searchDir(searchDirName.str());
13210 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13211 {
13212 term("Could not create search results directory '{}' $PWD='{}'\n",
13213 searchDirName,Dir::currentDirPath());
13214 }
13215 HtmlGenerator::writeSearchData(searchDirName);
13216 if (!serverBasedSearch) // client side search index
13217 {
13219 }
13220 }
13221 g_s.end();
13222
13223 // copy static stuff
13224 if (generateHtml)
13225 {
13227 copyLogo(Config_getString(HTML_OUTPUT));
13228 copyIcon(Config_getString(HTML_OUTPUT));
13229 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13230 }
13231 if (generateLatex)
13232 {
13234 copyLogo(Config_getString(LATEX_OUTPUT));
13235 copyIcon(Config_getString(LATEX_OUTPUT));
13236 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13237 }
13238 if (generateDocbook)
13239 {
13240 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13241 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13242 }
13243 if (generateRtf)
13244 {
13245 copyLogo(Config_getString(RTF_OUTPUT));
13246 copyIcon(Config_getString(RTF_OUTPUT));
13247 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13248 }
13249
13251 if (fm.hasFormulas() && generateHtml
13252 && !Config_getBool(USE_MATHJAX))
13253 {
13254 g_s.begin("Generating images for formulas in HTML...\n");
13255 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13257 g_s.end();
13258 }
13259 if (fm.hasFormulas() && generateRtf)
13260 {
13261 g_s.begin("Generating images for formulas in RTF...\n");
13263 g_s.end();
13264 }
13265
13266 if (fm.hasFormulas() && generateDocbook)
13267 {
13268 g_s.begin("Generating images for formulas in Docbook...\n");
13270 g_s.end();
13271 }
13272
13273 g_s.begin("Generating example documentation...\n");
13275 g_s.end();
13276
13277 g_s.begin("Generating file sources...\n");
13279 g_s.end();
13280
13281 g_s.begin("Generating file documentation...\n");
13283 g_s.end();
13284
13285 g_s.begin("Generating page documentation...\n");
13287 g_s.end();
13288
13289 g_s.begin("Generating group documentation...\n");
13291 g_s.end();
13292
13293 g_s.begin("Generating class documentation...\n");
13295 g_s.end();
13296
13297 g_s.begin("Generating concept documentation...\n");
13299 g_s.end();
13300
13301 g_s.begin("Generating module documentation...\n");
13303 g_s.end();
13304
13305 g_s.begin("Generating namespace documentation...\n");
13307 g_s.end();
13308
13309 if (Config_getBool(GENERATE_LEGEND))
13310 {
13311 g_s.begin("Generating graph info page...\n");
13313 g_s.end();
13314 }
13315
13316 g_s.begin("Generating directory documentation...\n");
13318 g_s.end();
13319
13320 if (g_outputList->size()>0)
13321 {
13323 }
13324
13325 g_s.begin("finalizing index lists...\n");
13326 Doxygen::indexList->finalize();
13327 g_s.end();
13328
13329 g_s.begin("writing tag file...\n");
13330 writeTagFile();
13331 g_s.end();
13332
13333 if (Config_getBool(GENERATE_XML))
13334 {
13335 g_s.begin("Generating XML output...\n");
13337 generateXML();
13339 g_s.end();
13340 }
13341 if (Config_getBool(GENERATE_SQLITE3))
13342 {
13343 g_s.begin("Generating SQLITE3 output...\n");
13345 g_s.end();
13346 }
13347
13348 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13349 {
13350 g_s.begin("Generating AutoGen DEF output...\n");
13351 generateDEF();
13352 g_s.end();
13353 }
13354 if (Config_getBool(GENERATE_PERLMOD))
13355 {
13356 g_s.begin("Generating Perl module output...\n");
13358 g_s.end();
13359 }
13360 if (generateHtml && searchEngine && serverBasedSearch)
13361 {
13362 g_s.begin("Generating search index\n");
13363 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13364 {
13366 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13367 }
13368 else // write data for external search index
13369 {
13371 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13372 if (searchDataFile.isEmpty())
13373 {
13374 searchDataFile="searchdata.xml";
13375 }
13376 if (!Portable::isAbsolutePath(searchDataFile.data()))
13377 {
13378 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13379 }
13380 Doxygen::searchIndex.write(searchDataFile);
13381 }
13382 g_s.end();
13383 }
13384
13385 if (generateRtf)
13386 {
13387 g_s.begin("Combining RTF output...\n");
13388 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13389 {
13390 err("An error occurred during post-processing the RTF files!\n");
13391 }
13392 g_s.end();
13393 }
13394
13395 g_s.begin("Running plantuml with JAVA...\n");
13397 g_s.end();
13398
13399 if (Config_getBool(HAVE_DOT))
13400 {
13401 g_s.begin("Running dot...\n");
13403 g_s.end();
13404 }
13405
13406 if (generateHtml &&
13407 Config_getBool(GENERATE_HTMLHELP) &&
13408 !Config_getString(HHC_LOCATION).isEmpty())
13409 {
13410 g_s.begin("Running html help compiler...\n");
13412 g_s.end();
13413 }
13414
13415 if ( generateHtml &&
13416 Config_getBool(GENERATE_QHP) &&
13417 !Config_getString(QHG_LOCATION).isEmpty())
13418 {
13419 g_s.begin("Running qhelpgenerator...\n");
13421 g_s.end();
13422 }
13423
13424 g_outputList->cleanup();
13426
13428
13430 {
13431
13432 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13433 if (numThreads<1) numThreads=1;
13434 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13435 (static_cast<double>(Debug::elapsedTime())),
13436 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13437 );
13438 g_s.print();
13439
13441 msg("finished...\n");
13443 }
13444 else
13445 {
13446 msg("finished...\n");
13447 }
13448
13449
13450 /**************************************************************************
13451 * Start cleaning up *
13452 **************************************************************************/
13453
13455
13457 Dir thisDir;
13458 thisDir.remove(Doxygen::filterDBFileName.str());
13460 exitTracing();
13462 delete Doxygen::clangUsrMap;
13464
13465 //dumpDocNodeSizes();
13466}
@ 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 QCString filterDBFileName
Definition doxygen.h:130
static bool generatingXmlOutput
Definition doxygen.h:133
static SearchIndexIntf searchIndex
Definition doxygen.h:123
static ClangUsrMap * clangUsrMap
Definition doxygen.h:125
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:1197
static void writeSearchPage()
Definition htmlgen.cpp:3197
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1357
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1366
static void writeExternalSearchPage()
Definition htmlgen.cpp:3296
Generator for LaTeX output.
Definition latexgen.h:94
static void init()
Definition latexgen.cpp:632
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
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:8782
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9959
static void generateFileSources()
Definition doxygen.cpp:8616
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9217
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
static void runHtmlHelpCompiler()
static bool g_dumpSymbolMap
Definition doxygen.cpp:190
static bool g_successfulRun
Definition doxygen.cpp:189
static void generateNamespaceDocs()
static void writeTagFile()
void cleanUpDoxygen()
static void generateConceptDocs()
Definition doxygen.cpp:9243
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:5203
void cleanupInlineGraph()
Definition util.cpp:7008
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(), 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(), 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 11414 of file doxygen.cpp.

11415{
11416 initResources();
11417 QCString lang = Portable::getenv("LC_ALL");
11418 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11419 std::setlocale(LC_ALL,"");
11420 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11421 std::setlocale(LC_NUMERIC,"C");
11422
11424
11448
11449 // register any additional parsers here...
11450
11452
11453#if USE_LIBCLANG
11455#endif
11464 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11465 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11466 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11468
11469 // initialization of these globals depends on
11470 // configuration switches so we need to postpone these
11471 Doxygen::globalScope = nullptr;
11480
11481}
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:286
QCString getenv(const QCString &variable)
Definition portable.cpp:321
void initDefaultExtensionMapping()
Definition util.cpp:5136

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

12449{
12450 AUTO_TRACE();
12451 std::atexit(exitDoxygen);
12452
12453 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12454
12455#if USE_LIBCLANG
12456 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12457#endif
12458
12459 // we would like to show the versionString earlier, but we first have to handle the configuration file
12460 // to know the value of the QUIET setting.
12461 QCString versionString = getFullVersion();
12462 msg("Doxygen version used: {}\n",versionString);
12463
12465
12466 /**************************************************************************
12467 * Make sure the output directory exists
12468 **************************************************************************/
12469 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12470 if (!g_singleComment)
12471 {
12472 if (outputDirectory.isEmpty())
12473 {
12474 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12475 }
12476 else
12477 {
12478 Dir dir(outputDirectory.str());
12479 if (!dir.exists())
12480 {
12481 dir.setPath(Dir::currentDirPath());
12482 if (!dir.mkdir(outputDirectory.str()))
12483 {
12484 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12485 "exist and cannot be created\n",outputDirectory);
12486 }
12487 else
12488 {
12489 msg("Notice: Output directory '{}' does not exist. "
12490 "I have created it for you.\n", outputDirectory);
12491 }
12492 dir.setPath(outputDirectory.str());
12493 }
12494 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12495 }
12496 }
12497 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12498
12499 /**************************************************************************
12500 * Initialize global lists and dictionaries
12501 **************************************************************************/
12502
12503#ifdef HAS_SIGNALS
12504 signal(SIGINT, stopDoxygen);
12505#endif
12506
12507 uint32_t pid = Portable::pid();
12508 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12509 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12510
12511 /**************************************************************************
12512 * Check/create output directories *
12513 **************************************************************************/
12514
12515 bool generateHtml = Config_getBool(GENERATE_HTML);
12516 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12517 bool generateXml = Config_getBool(GENERATE_XML);
12518 bool generateLatex = Config_getBool(GENERATE_LATEX);
12519 bool generateRtf = Config_getBool(GENERATE_RTF);
12520 bool generateMan = Config_getBool(GENERATE_MAN);
12521 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12522 QCString htmlOutput;
12523 QCString docbookOutput;
12524 QCString xmlOutput;
12525 QCString latexOutput;
12526 QCString rtfOutput;
12527 QCString manOutput;
12528 QCString sqlOutput;
12529
12530 if (!g_singleComment)
12531 {
12532 if (generateHtml)
12533 {
12534 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12535 Config_updateString(HTML_OUTPUT,htmlOutput);
12536
12537 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12538 bool generateSitemap = !sitemapUrl.isEmpty();
12539 if (generateSitemap && !sitemapUrl.endsWith("/"))
12540 {
12541 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12542 }
12543
12544 // add HTML indexers that are enabled
12545 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12546 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12547 bool generateQhp = Config_getBool(GENERATE_QHP);
12548 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12549 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12550 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12551 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12552 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12553 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12554 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12555 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12556 Doxygen::indexList->addIndex<Crawlmap>();
12557 Doxygen::indexList->initialize();
12558 }
12559
12560 if (generateDocbook)
12561 {
12562 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12563 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12564 }
12565
12566 if (generateXml)
12567 {
12568 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12569 Config_updateString(XML_OUTPUT,xmlOutput);
12570 }
12571
12572 if (generateLatex)
12573 {
12574 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12575 Config_updateString(LATEX_OUTPUT,latexOutput);
12576 }
12577
12578 if (generateRtf)
12579 {
12580 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12581 Config_updateString(RTF_OUTPUT,rtfOutput);
12582 }
12583
12584 if (generateMan)
12585 {
12586 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12587 Config_updateString(MAN_OUTPUT,manOutput);
12588 }
12589
12590 if (generateSql)
12591 {
12592 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12593 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12594 }
12595 }
12596
12597 if (Config_getBool(HAVE_DOT))
12598 {
12599 QCString curFontPath = Config_getString(DOT_FONTPATH);
12600 if (curFontPath.isEmpty())
12601 {
12602 Portable::getenv("DOTFONTPATH");
12603 QCString newFontPath = ".";
12604 if (!curFontPath.isEmpty())
12605 {
12606 newFontPath+=Portable::pathListSeparator();
12607 newFontPath+=curFontPath;
12608 }
12609 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12610 }
12611 else
12612 {
12613 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12614 }
12615 }
12616
12617 /**************************************************************************
12618 * Handle layout file *
12619 **************************************************************************/
12620
12622 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12623 bool defaultLayoutUsed = FALSE;
12624 if (layoutFileName.isEmpty())
12625 {
12626 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12627 defaultLayoutUsed = TRUE;
12628 }
12629 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12630
12631 FileInfo fi(layoutFileName.str());
12632 if (fi.exists())
12633 {
12634 msg("Parsing layout file {}...\n",layoutFileName);
12635 LayoutDocManager::instance().parse(layoutFileName);
12636 }
12637 else if (!defaultLayoutUsed)
12638 {
12639 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12640 }
12641 printLayout();
12642
12643 /**************************************************************************
12644 * Read and preprocess input *
12645 **************************************************************************/
12646
12647 // prevent search in the output directories
12648 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12649 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12650 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12651 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12652 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12653 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12654 if (generateMan) exclPatterns.push_back(manOutput.str());
12655 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12656
12657 if (!g_singleComment)
12658 {
12660
12662 }
12663
12664 // Notice: the order of the function calls below is very important!
12665
12666 if (generateHtml && !Config_getBool(USE_MATHJAX))
12667 {
12669 }
12670 if (generateRtf)
12671 {
12673 }
12674 if (generateDocbook)
12675 {
12677 }
12678
12680
12681 /**************************************************************************
12682 * Handle Tag Files *
12683 **************************************************************************/
12684
12685 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12686
12687 if (!g_singleComment)
12688 {
12689 msg("Reading and parsing tag files\n");
12690 const StringVector &tagFileList = Config_getList(TAGFILES);
12691 for (const auto &s : tagFileList)
12692 {
12693 readTagFile(root,s.c_str());
12694 }
12695 }
12696
12697 /**************************************************************************
12698 * Parse source files *
12699 **************************************************************************/
12700
12701 addSTLSupport(root);
12702
12703 g_s.begin("Parsing files\n");
12704 if (g_singleComment)
12705 {
12706 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12707 if (g_commentFileName=="-")
12708 {
12709 std::string text = fileToString(g_commentFileName).str();
12710 addTerminalCharIfMissing(text,'\n');
12711 generateHtmlForComment("stdin.md",text);
12712 }
12713 else if (FileInfo(g_commentFileName.str()).isFile())
12714 {
12715 std::string text;
12717 addTerminalCharIfMissing(text,'\n');
12719 }
12720 else
12721 {
12722 }
12724 exit(0);
12725 }
12726 else
12727 {
12728 if (Config_getInt(NUM_PROC_THREADS)==1)
12729 {
12731 }
12732 else
12733 {
12735 }
12736 }
12737 g_s.end();
12738
12739 /**************************************************************************
12740 * Gather information *
12741 **************************************************************************/
12742
12743 g_s.begin("Building macro definition list...\n");
12745 g_s.end();
12746
12747 g_s.begin("Building group list...\n");
12748 buildGroupList(root.get());
12749 organizeSubGroups(root.get());
12750 g_s.end();
12751
12752 g_s.begin("Building directory list...\n");
12754 findDirDocumentation(root.get());
12755 g_s.end();
12756
12757 g_s.begin("Building namespace list...\n");
12758 buildNamespaceList(root.get());
12759 findUsingDirectives(root.get());
12760 g_s.end();
12761
12762 g_s.begin("Building file list...\n");
12763 buildFileList(root.get());
12764 g_s.end();
12765
12766 g_s.begin("Building class list...\n");
12767 buildClassList(root.get());
12768 g_s.end();
12769
12770 g_s.begin("Building concept list...\n");
12771 buildConceptList(root.get());
12772 g_s.end();
12773
12774 // build list of using declarations here (global list)
12775 buildListOfUsingDecls(root.get());
12776 g_s.end();
12777
12778 g_s.begin("Computing nesting relations for classes...\n");
12780 g_s.end();
12781 // 1.8.2-20121111: no longer add nested classes to the group as well
12782 //distributeClassGroupRelations();
12783
12784 // calling buildClassList may result in cached relations that
12785 // become invalid after resolveClassNestingRelations(), that's why
12786 // we need to clear the cache here
12788 // we don't need the list of using declaration anymore
12789 g_usingDeclarations.clear();
12790
12791 g_s.begin("Associating documentation with classes...\n");
12792 buildClassDocList(root.get());
12793 g_s.end();
12794
12795 g_s.begin("Associating documentation with concepts...\n");
12796 buildConceptDocList(root.get());
12798 g_s.end();
12799
12800 g_s.begin("Associating documentation with modules...\n");
12801 findModuleDocumentation(root.get());
12802 g_s.end();
12803
12804 g_s.begin("Building example list...\n");
12805 buildExampleList(root.get());
12806 g_s.end();
12807
12808 g_s.begin("Searching for enumerations...\n");
12809 findEnums(root.get());
12810 g_s.end();
12811
12812 // Since buildVarList calls isVarWithConstructor
12813 // and this calls getResolvedClass we need to process
12814 // typedefs first so the relations between classes via typedefs
12815 // are properly resolved. See bug 536385 for an example.
12816 g_s.begin("Searching for documented typedefs...\n");
12817 buildTypedefList(root.get());
12818 g_s.end();
12819
12820 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12821 {
12822 g_s.begin("Searching for documented sequences...\n");
12823 buildSequenceList(root.get());
12824 g_s.end();
12825
12826 g_s.begin("Searching for documented dictionaries...\n");
12827 buildDictionaryList(root.get());
12828 g_s.end();
12829 }
12830
12831 g_s.begin("Searching for members imported via using declarations...\n");
12832 // this should be after buildTypedefList in order to properly import
12833 // used typedefs
12834 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12835 findUsingDeclarations(root.get(),FALSE); // then the rest
12836 g_s.end();
12837
12838 g_s.begin("Searching for included using directives...\n");
12840 g_s.end();
12841
12842 g_s.begin("Searching for documented variables...\n");
12843 buildVarList(root.get());
12844 g_s.end();
12845
12846 g_s.begin("Building interface member list...\n");
12847 buildInterfaceAndServiceList(root.get()); // UNO IDL
12848
12849 g_s.begin("Building member list...\n"); // using class info only !
12850 buildFunctionList(root.get());
12851 g_s.end();
12852
12853 g_s.begin("Searching for friends...\n");
12854 findFriends();
12855 g_s.end();
12856
12857 g_s.begin("Searching for documented defines...\n");
12858 findDefineDocumentation(root.get());
12859 g_s.end();
12860
12861 g_s.begin("Computing class inheritance relations...\n");
12862 findClassEntries(root.get());
12864 g_s.end();
12865
12866 g_s.begin("Computing class usage relations...\n");
12868 g_s.end();
12869
12870 if (Config_getBool(INLINE_SIMPLE_STRUCTS))
12871 {
12872 g_s.begin("Searching for tag less structs...\n");
12874 g_s.end();
12875 }
12876
12877 g_s.begin("Flushing cached template relations that have become invalid...\n");
12879 g_s.end();
12880
12881 g_s.begin("Warn for undocumented namespaces...\n");
12883 g_s.end();
12884
12885 g_s.begin("Computing class relations...\n");
12888 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12889 {
12891 }
12893 g_classEntries.clear();
12894 g_s.end();
12895
12896 g_s.begin("Add enum values to enums...\n");
12897 addEnumValuesToEnums(root.get());
12898 findEnumDocumentation(root.get());
12899 g_s.end();
12900
12901 g_s.begin("Searching for member function documentation...\n");
12902 findObjCMethodDefinitions(root.get());
12903 findMemberDocumentation(root.get()); // may introduce new members !
12904 findUsingDeclImports(root.get()); // may introduce new members !
12905 g_usingClassMap.clear();
12909 g_s.end();
12910
12911 // moved to after finding and copying documentation,
12912 // as this introduces new members see bug 722654
12913 g_s.begin("Creating members for template instances...\n");
12915 g_s.end();
12916
12917 g_s.begin("Building page list...\n");
12918 buildPageList(root.get());
12919 g_s.end();
12920
12921 g_s.begin("Building requirements list...\n");
12922 buildRequirementsList(root.get());
12923 g_s.end();
12924
12925 g_s.begin("Search for main page...\n");
12926 findMainPage(root.get());
12927 findMainPageTagFiles(root.get());
12928 g_s.end();
12929
12930 g_s.begin("Computing page relations...\n");
12931 computePageRelations(root.get());
12933 g_s.end();
12934
12935 g_s.begin("Determining the scope of groups...\n");
12936 findGroupScope(root.get());
12937 g_s.end();
12938
12939 g_s.begin("Computing module relations...\n");
12940 auto &mm = ModuleManager::instance();
12941 mm.resolvePartitions();
12942 mm.resolveImports();
12943 mm.collectExportedSymbols();
12944 g_s.end();
12945
12946 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
12947 {
12948 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
12949 n2->memberName().data()+getPrefixIndex(n2->memberName())
12950 )<0;
12951 };
12952
12953 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
12954 {
12955 if (Config_getBool(SORT_BY_SCOPE_NAME))
12956 {
12957 return qstricmp_sort(c1->name(), c2->name())<0;
12958 }
12959 else
12960 {
12961 int i = qstricmp_sort(c1->className(), c2->className());
12962 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12963 }
12964 };
12965
12966 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
12967 {
12968 return qstricmp_sort(n1->name(),n2->name())<0;
12969 };
12970
12971 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
12972 {
12973 return qstricmp_sort(c1->name(),c2->name())<0;
12974 };
12975
12976 g_s.begin("Sorting lists...\n");
12977 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
12979 memberNameComp);
12980 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
12982 memberNameComp);
12983 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
12985 classComp);
12986 std::stable_sort(Doxygen::classLinkedMap->begin(),
12988 classComp);
12989 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
12991 conceptComp);
12992 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
12994 namespaceComp);
12995 g_s.end();
12996
12997 g_s.begin("Determining which enums are documented\n");
12999 g_s.end();
13000
13001 g_s.begin("Computing member relations...\n");
13004 g_s.end();
13005
13006 g_s.begin("Building full member lists recursively...\n");
13008 g_s.end();
13009
13010 g_s.begin("Adding members to member groups.\n");
13012 g_s.end();
13013
13014 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
13015 {
13016 g_s.begin("Distributing member group documentation.\n");
13018 g_s.end();
13019 }
13020
13021 g_s.begin("Computing member references...\n");
13023 g_s.end();
13024
13025 if (Config_getBool(INHERIT_DOCS))
13026 {
13027 g_s.begin("Inheriting documentation...\n");
13029 g_s.end();
13030 }
13031
13032
13033 // compute the shortest possible names of all files
13034 // without losing the uniqueness of the file names.
13035 g_s.begin("Generating disk names...\n");
13037 g_s.end();
13038
13039 g_s.begin("Adding source references...\n");
13041 g_s.end();
13042
13043 g_s.begin("Adding xrefitems...\n");
13046 g_s.end();
13047
13048 g_s.begin("Adding requirements...\n");
13051 g_s.end();
13052
13053 g_s.begin("Sorting member lists...\n");
13055 g_s.end();
13056
13057 g_s.begin("Setting anonymous enum type...\n");
13059 g_s.end();
13060
13061 g_s.begin("Computing dependencies between directories...\n");
13063 g_s.end();
13064
13065 g_s.begin("Generating citations page...\n");
13067 g_s.end();
13068
13069 g_s.begin("Counting members...\n");
13070 countMembers();
13071 g_s.end();
13072
13073 g_s.begin("Counting data structures...\n");
13075 g_s.end();
13076
13077 g_s.begin("Resolving user defined references...\n");
13079 g_s.end();
13080
13081 g_s.begin("Finding anchors and sections in the documentation...\n");
13083 g_s.end();
13084
13085 g_s.begin("Transferring function references...\n");
13087 g_s.end();
13088
13089 g_s.begin("Combining using relations...\n");
13091 g_s.end();
13092
13094 g_s.begin("Adding members to index pages...\n");
13096 addToIndices();
13097 g_s.end();
13098
13099 g_s.begin("Correcting members for VHDL...\n");
13101 g_s.end();
13102
13103 g_s.begin("Computing tooltip texts...\n");
13105 g_s.end();
13106
13107 if (Config_getBool(SORT_GROUP_NAMES))
13108 {
13109 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13111 [](const auto &g1,const auto &g2)
13112 { return g1->groupTitle() < g2->groupTitle(); });
13113
13114 for (const auto &gd : *Doxygen::groupLinkedMap)
13115 {
13116 gd->sortSubGroups();
13117 }
13118 }
13119
13120 printNavTree(root.get(),0);
13122}
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:135
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:48
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5325
void printNavTree(Entry *root, int indent)
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:429
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2055
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9459
static void computeTemplateClassRelations()
Definition doxygen.cpp:5419
void printSectionsTree()
static void generateXRefPages()
Definition doxygen.cpp:5598
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2208
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9659
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5374
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1323
static void resolveClassNestingRelations()
Definition doxygen.cpp:1378
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5288
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8417
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5488
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4446
static void addMembersToMemberGroup()
Definition doxygen.cpp:9324
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9829
static void distributeConceptGroups()
Definition doxygen.cpp:1345
static void transferFunctionDocumentation()
Definition doxygen.cpp:4365
static void setAnonymousEnumType()
Definition doxygen.cpp:9064
static void sortMemberLists()
Definition doxygen.cpp:8969
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8545
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4495
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7558
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3434
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:444
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9572
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7528
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9362
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7762
static void resolveUserReferences()
Definition doxygen.cpp:9891
static void buildRequirementsList(Entry *root)
Definition doxygen.cpp:9720
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3571
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3534
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1717
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2458
static void countMembers()
Definition doxygen.cpp:9078
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:488
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4268
static void findEnums(const Entry *root)
Definition doxygen.cpp:7586
static void addListReferences()
Definition doxygen.cpp:5589
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8207
static void findMainPage(Entry *root)
Definition doxygen.cpp:9759
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:1899
static void addSourceReferences()
Definition doxygen.cpp:8842
static void buildExampleList(Entry *root)
Definition doxygen.cpp:9976
static void inheritDocumentation()
Definition doxygen.cpp:9264
static void flushUnresolvedRelations()
Definition doxygen.cpp:9501
static QCString g_commentFileName
Definition doxygen.cpp:191
static void findDocumentedEnumValues()
Definition doxygen.cpp:8199
static void findTagLessClasses()
Definition doxygen.cpp:1693
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8249
static void computeClassRelations()
Definition doxygen.cpp:5394
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:3963
static void checkPageRelations()
Definition doxygen.cpp:9871
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1313
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:8087
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9841
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static StringSet g_usingDeclarations
Definition doxygen.cpp:188
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3552
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1148
static void buildPageList(Entry *root)
Definition doxygen.cpp:9732
static void addRequirementReferences()
Definition doxygen.cpp:5581
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:192
static void findSectionsInDocumentation()
Definition doxygen.cpp:9400
static void mergeCategories()
Definition doxygen.cpp:8564
static void buildFileList(const Entry *root)
Definition doxygen.cpp:500
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1138
static void findUsedTemplateInstances()
Definition doxygen.cpp:5358
static void computeTooltipTexts()
Definition doxygen.cpp:9018
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8586
static void combineUsingRelations()
Definition doxygen.cpp:9299
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2206
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1333
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void transferFunctionReferences()
Definition doxygen.cpp:4398
static void buildDefineList()
Definition doxygen.cpp:8921
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3666
static void computeMemberRelations()
Definition doxygen.cpp:8529
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:2042
static std::multimap< std::string, const Entry * > g_classEntries
Definition doxygen.cpp:185
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:5548
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1489
int getPrefixIndex(const QCString &name)
Definition util.cpp:3230

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

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

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

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