Doxygen
Loading...
Searching...
No Matches
doxygen.h File Reference
#include <mutex>
#include "containers.h"
#include "membergroup.h"
#include "dirdef.h"
#include "memberlist.h"
#include "define.h"
#include "cache.h"
#include "symbolmap.h"
#include "searchindex.h"
Include dependency graph for doxygen.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  LookupInfo
struct  InputFileEncoding
struct  NamespaceAliasInfo
class  Doxygen
 This class serves as a namespace for global variables used by doxygen. More...

Macros

#define THREAD_LOCAL   thread_local
#define AtomicInt   std::atomic_int

Typedefs

using InputFileEncodingList = std::vector<InputFileEncoding>
using ClangUsrMap = std::unordered_map<std::string,const Definition *>
using StaticInitMap = std::unordered_map<std::string,BodyInfo>
using NamespaceAliasInfoMap = std::unordered_map<std::string,NamespaceAliasInfo>

Functions

void initDoxygen ()
void readConfiguration (int argc, char **argv)
void checkConfiguration ()
 check and resolve config options
void adjustConfiguration ()
 adjust globals that depend on configuration settings.
void parseInput ()
void generateOutput ()
void cleanUpDoxygen ()
void readFileOrDirectory (const QCString &s, FileNameLinkedMap *fnDict, StringUnorderedSet *exclSet, const StringVector *patList, const StringVector *exclPatList, StringVector *resultList, StringUnorderedSet *resultSet, bool recursive, bool errorIfNotExist=TRUE, StringUnorderedSet *killSet=nullptr, StringUnorderedSet *paths=nullptr)

Macro Definition Documentation

◆ AtomicInt

#define AtomicInt   std::atomic_int

Definition at line 31 of file doxygen.h.

◆ THREAD_LOCAL

#define THREAD_LOCAL   thread_local

Definition at line 30 of file doxygen.h.

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

Typedef Documentation

◆ ClangUsrMap

using ClangUsrMap = std::unordered_map<std::string,const Definition *>

Definition at line 83 of file doxygen.h.

◆ InputFileEncodingList

Definition at line 81 of file doxygen.h.

◆ NamespaceAliasInfoMap

using NamespaceAliasInfoMap = std::unordered_map<std::string,NamespaceAliasInfo>

Definition at line 87 of file doxygen.h.

◆ StaticInitMap

using StaticInitMap = std::unordered_map<std::string,BodyInfo>

Definition at line 85 of file doxygen.h.

Function Documentation

◆ adjustConfiguration()

void adjustConfiguration ( )

adjust globals that depend on configuration settings.

Definition at line 11887 of file doxygen.cpp.

11888{
11889 AUTO_TRACE();
11890 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
11900
11901 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11902
11903 /* Set the global html file extension. */
11904 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
11905
11906
11908 Config_getBool(CALLER_GRAPH) ||
11909 Config_getBool(REFERENCES_RELATION) ||
11910 Config_getBool(REFERENCED_BY_RELATION);
11911
11912 /**************************************************************************
11913 * Add custom extension mappings
11914 **************************************************************************/
11915
11916 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
11917 for (const auto &mapping : extMaps)
11918 {
11919 QCString mapStr = mapping;
11920 int i=mapStr.find('=');
11921 if (i==-1)
11922 {
11923 continue;
11924 }
11925 else
11926 {
11927 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
11928 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
11929 if (ext.isEmpty() || language.isEmpty())
11930 {
11931 continue;
11932 }
11933
11934 if (!updateLanguageMapping(ext,language))
11935 {
11936 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
11937 "Check the EXTENSION_MAPPING setting in the config file.\n",
11938 ext,language);
11939 }
11940 else
11941 {
11942 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11943 ext,language);
11944 }
11945 }
11946 }
11947 // create input file exncodings
11948
11949 // check INPUT_ENCODING
11950 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
11951 if (cd==reinterpret_cast<void *>(-1))
11952 {
11953 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
11954 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11955 Config_getString(INPUT_ENCODING),strerror(errno));
11956 }
11957 else
11958 {
11960 }
11961
11962 // check and split INPUT_FILE_ENCODING
11963 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
11964 for (const auto &mapping : fileEncod)
11965 {
11966 QCString mapStr = mapping;
11967 int i=mapStr.find('=');
11968 if (i==-1)
11969 {
11970 continue;
11971 }
11972 else
11973 {
11974 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
11975 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
11976 if (pattern.isEmpty() || encoding.isEmpty())
11977 {
11978 continue;
11979 }
11980 cd = portable_iconv_open("UTF-8",encoding.data());
11981 if (cd==reinterpret_cast<void *>(-1))
11982 {
11983 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
11984 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11985 encoding,strerror(errno));
11986 }
11987 else
11988 {
11990 }
11991
11992 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
11993 }
11994 }
11995
11996 // add predefined macro name to a dictionary
11997 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
11998 for (const auto &s : expandAsDefinedList)
11999 {
12001 }
12002
12003 // read aliases and store them in a dictionary
12004 readAliases();
12005
12006 // store number of spaces in a tab into Doxygen::spaces
12007 int tabSize = Config_getInt(TAB_SIZE);
12008 Doxygen::spaces.resize(tabSize);
12009 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
12010 Doxygen::spaces.at(tabSize)='\0';
12011}
void readAliases()
Definition aliases.cpp:170
static FileNameLinkedMap * plantUmlFileNameLinkedMap
Definition doxygen.h:110
static bool parseSourcesNeeded
Definition doxygen.h:123
static StringUnorderedSet expandAsDefinedSet
Definition doxygen.h:119
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:105
static InputFileEncodingList inputFileEncodingList
Definition doxygen.h:140
static FileNameLinkedMap * dotFileNameLinkedMap
Definition doxygen.h:107
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static FileNameLinkedMap * imageNameLinkedMap
Definition doxygen.h:106
static FileNameLinkedMap * mscFileNameLinkedMap
Definition doxygen.h:108
static QCString spaces
Definition doxygen.h:135
static FileNameLinkedMap * diaFileNameLinkedMap
Definition doxygen.h:109
static QCString htmlFileExtension
Definition doxygen.h:122
static std::unique_ptr< NamespaceDef > globalNamespaceDef
Definition doxygen.h:120
static FileNameLinkedMap * includeNameLinkedMap
Definition doxygen.h:102
static FileNameLinkedMap * exampleNameLinkedMap
Definition doxygen.h:103
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:46
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:5002

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

11877{
11878 AUTO_TRACE();
11879
11884}
void initWarningFormat()
Definition message.cpp:237
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 11402 of file doxygen.cpp.

11403{
11407
11408 delete Doxygen::indexList;
11417 Doxygen::mainPage.reset();
11421 Doxygen::globalScope = nullptr;
11423 delete theTranslator;
11424 delete g_outputList;
11425
11430 delete Doxygen::dirLinkedMap;
11431 delete Doxygen::symbolMap;
11432}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:115
static std::unique_ptr< PageDef > mainPage
Definition doxygen.h:101
static ParserManager * parserManager
Definition doxygen.h:131
static MemberNameLinkedMap * functionNameLinkedMap
Definition doxygen.h:112
static PageLinkedMap * exampleLinkedMap
Definition doxygen.h:99
static IndexList * indexList
Definition doxygen.h:134
static PageLinkedMap * pageLinkedMap
Definition doxygen.h:100
static DirLinkedMap * dirLinkedMap
Definition doxygen.h:129
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:54
void clear()
Definition linkedmap.h:212
static ModuleManager & instance()
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:178
static OutputList * g_outputList
Definition doxygen.cpp:188
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 13052 of file doxygen.cpp.

13053{
13054 AUTO_TRACE();
13055 /**************************************************************************
13056 * Initialize output generators *
13057 **************************************************************************/
13058
13059 /// add extra languages for which we can only produce syntax highlighted code
13061
13062 //// dump all symbols
13063 if (g_dumpSymbolMap)
13064 {
13065 dumpSymbolMap();
13066 exit(0);
13067 }
13068
13069 bool generateHtml = Config_getBool(GENERATE_HTML);
13070 bool generateLatex = Config_getBool(GENERATE_LATEX);
13071 bool generateMan = Config_getBool(GENERATE_MAN);
13072 bool generateRtf = Config_getBool(GENERATE_RTF);
13073 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13074
13075
13077 if (generateHtml)
13078 {
13082 }
13083 if (generateLatex)
13084 {
13087 }
13088 if (generateDocbook)
13089 {
13092 }
13093 if (generateMan)
13094 {
13095 g_outputList->add<ManGenerator>();
13097 }
13098 if (generateRtf)
13099 {
13100 g_outputList->add<RTFGenerator>();
13102 }
13103 if (Config_getBool(USE_HTAGS))
13104 {
13106 QCString htmldir = Config_getString(HTML_OUTPUT);
13107 if (!Htags::execute(htmldir))
13108 err("USE_HTAGS is YES but htags(1) failed. \n");
13109 else if (!Htags::loadFilemap(htmldir))
13110 err("htags(1) ended normally but failed to load the filemap. \n");
13111 }
13112
13113 /**************************************************************************
13114 * Generate documentation *
13115 **************************************************************************/
13116
13117 g_s.begin("Generating style sheet...\n");
13118 //printf("writing style info\n");
13119 g_outputList->writeStyleInfo(0); // write first part
13120 g_s.end();
13121
13122 bool searchEngine = Config_getBool(SEARCHENGINE);
13123 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13124
13125 g_s.begin("Generating search indices...\n");
13126 if (searchEngine && !serverBasedSearch && generateHtml)
13127 {
13129 }
13130
13131 // generate search indices (need to do this before writing other HTML
13132 // pages as these contain a drop down menu with options depending on
13133 // what categories we find in this function.
13134 if (generateHtml && searchEngine)
13135 {
13136 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13137 Dir searchDir(searchDirName.str());
13138 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13139 {
13140 term("Could not create search results directory '{}' $PWD='{}'\n",
13141 searchDirName,Dir::currentDirPath());
13142 }
13143 HtmlGenerator::writeSearchData(searchDirName);
13144 if (!serverBasedSearch) // client side search index
13145 {
13147 }
13148 }
13149 g_s.end();
13150
13151 // copy static stuff
13152 if (generateHtml)
13153 {
13155 copyLogo(Config_getString(HTML_OUTPUT));
13156 copyIcon(Config_getString(HTML_OUTPUT));
13157 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13158 }
13159 if (generateLatex)
13160 {
13162 copyLogo(Config_getString(LATEX_OUTPUT));
13163 copyIcon(Config_getString(LATEX_OUTPUT));
13164 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13165 }
13166 if (generateDocbook)
13167 {
13168 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13169 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13170 }
13171 if (generateRtf)
13172 {
13173 copyLogo(Config_getString(RTF_OUTPUT));
13174 copyIcon(Config_getString(RTF_OUTPUT));
13175 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13176 }
13177
13179 if (fm.hasFormulas() && generateHtml
13180 && !Config_getBool(USE_MATHJAX))
13181 {
13182 g_s.begin("Generating images for formulas in HTML...\n");
13183 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13185 g_s.end();
13186 }
13187 if (fm.hasFormulas() && generateRtf)
13188 {
13189 g_s.begin("Generating images for formulas in RTF...\n");
13191 g_s.end();
13192 }
13193
13194 if (fm.hasFormulas() && generateDocbook)
13195 {
13196 g_s.begin("Generating images for formulas in Docbook...\n");
13198 g_s.end();
13199 }
13200
13201 g_s.begin("Generating example documentation...\n");
13203 g_s.end();
13204
13205 g_s.begin("Generating file sources...\n");
13207 g_s.end();
13208
13209 g_s.begin("Generating file documentation...\n");
13211 g_s.end();
13212
13213 g_s.begin("Generating page documentation...\n");
13215 g_s.end();
13216
13217 g_s.begin("Generating group documentation...\n");
13219 g_s.end();
13220
13221 g_s.begin("Generating class documentation...\n");
13223 g_s.end();
13224
13225 g_s.begin("Generating concept documentation...\n");
13227 g_s.end();
13228
13229 g_s.begin("Generating module documentation...\n");
13231 g_s.end();
13232
13233 g_s.begin("Generating namespace documentation...\n");
13235 g_s.end();
13236
13237 if (Config_getBool(GENERATE_LEGEND))
13238 {
13239 g_s.begin("Generating graph info page...\n");
13241 g_s.end();
13242 }
13243
13244 g_s.begin("Generating directory documentation...\n");
13246 g_s.end();
13247
13248 if (g_outputList->size()>0)
13249 {
13251 }
13252
13253 g_s.begin("finalizing index lists...\n");
13254 Doxygen::indexList->finalize();
13255 g_s.end();
13256
13257 g_s.begin("writing tag file...\n");
13258 writeTagFile();
13259 g_s.end();
13260
13261 if (Config_getBool(GENERATE_XML))
13262 {
13263 g_s.begin("Generating XML output...\n");
13265 generateXML();
13267 g_s.end();
13268 }
13269 if (Config_getBool(GENERATE_SQLITE3))
13270 {
13271 g_s.begin("Generating SQLITE3 output...\n");
13273 g_s.end();
13274 }
13275
13276 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13277 {
13278 g_s.begin("Generating AutoGen DEF output...\n");
13279 generateDEF();
13280 g_s.end();
13281 }
13282 if (Config_getBool(GENERATE_PERLMOD))
13283 {
13284 g_s.begin("Generating Perl module output...\n");
13286 g_s.end();
13287 }
13288 if (generateHtml && searchEngine && serverBasedSearch)
13289 {
13290 g_s.begin("Generating search index\n");
13291 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13292 {
13294 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13295 }
13296 else // write data for external search index
13297 {
13299 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13300 if (searchDataFile.isEmpty())
13301 {
13302 searchDataFile="searchdata.xml";
13303 }
13304 if (!Portable::isAbsolutePath(searchDataFile.data()))
13305 {
13306 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13307 }
13308 Doxygen::searchIndex.write(searchDataFile);
13309 }
13310 g_s.end();
13311 }
13312
13313 if (generateRtf)
13314 {
13315 g_s.begin("Combining RTF output...\n");
13316 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13317 {
13318 err("An error occurred during post-processing the RTF files!\n");
13319 }
13320 g_s.end();
13321 }
13322
13323 g_s.begin("Running plantuml with JAVA...\n");
13325 g_s.end();
13326
13327 if (Config_getBool(HAVE_DOT))
13328 {
13329 g_s.begin("Running dot...\n");
13331 g_s.end();
13332 }
13333
13334 if (generateHtml &&
13335 Config_getBool(GENERATE_HTMLHELP) &&
13336 !Config_getString(HHC_LOCATION).isEmpty())
13337 {
13338 g_s.begin("Running html help compiler...\n");
13340 g_s.end();
13341 }
13342
13343 if ( generateHtml &&
13344 Config_getBool(GENERATE_QHP) &&
13345 !Config_getString(QHG_LOCATION).isEmpty())
13346 {
13347 g_s.begin("Running qhelpgenerator...\n");
13349 g_s.end();
13350 }
13351
13352 g_outputList->cleanup();
13353
13354 msg("type lookup cache used {}/{} hits={} misses={}\n",
13356 Doxygen::typeLookupCache->capacity(),
13358 Doxygen::typeLookupCache->misses());
13359 msg("symbol lookup cache used {}/{} hits={} misses={}\n",
13361 Doxygen::symbolLookupCache->capacity(),
13363 Doxygen::symbolLookupCache->misses());
13364 int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
13365 int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
13366 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13367 if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
13368 {
13369 msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13370 }
13371
13373 {
13374
13375 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13376 if (numThreads<1) numThreads=1;
13377 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13378 (static_cast<double>(Debug::elapsedTime())),
13379 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13380 );
13381 g_s.print();
13382
13384 msg("finished...\n");
13386 }
13387 else
13388 {
13389 msg("finished...\n");
13390 }
13391
13392
13393 /**************************************************************************
13394 * Start cleaning up *
13395 **************************************************************************/
13396
13398
13400 Dir thisDir;
13401 thisDir.remove(Doxygen::filterDBFileName.str());
13403 exitTracing();
13405 delete Doxygen::clangUsrMap;
13407
13408 //dumpDocNodeSizes();
13409}
@ 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:201
static void setFlag(const DebugMask mask)
Definition debug.cpp:117
Class representing a directory in the file system.
Definition dir.h:75
static std::string currentDirPath()
Definition dir.cpp:342
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition dir.cpp:314
static void init()
bool run()
Definition dot.cpp:128
static DotManager * instance()
Definition dot.cpp:78
static Cache< std::string, LookupInfo > * typeLookupCache
Definition doxygen.h:127
static Cache< std::string, LookupInfo > * symbolLookupCache
Definition doxygen.h:128
static QCString filterDBFileName
Definition doxygen.h:133
static bool generatingXmlOutput
Definition doxygen.h:136
static SearchIndexIntf searchIndex
Definition doxygen.h:124
static ClangUsrMap * clangUsrMap
Definition doxygen.h:126
bool hasFormulas() const
Definition formula.cpp:720
void generateImages(const QCString &outputDir, Format format, HighDPI hd=HighDPI::Off)
Definition formula.cpp:636
Generator for HTML output.
Definition htmlgen.h:96
static void init()
Definition htmlgen.cpp:1203
static void writeSearchPage()
Definition htmlgen.cpp:3170
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1354
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1363
static void writeExternalSearchPage()
Definition htmlgen.cpp:3269
Generator for LaTeX output.
Definition latexgen.h:94
static void init()
Definition latexgen.cpp:633
Generator for Man page output.
Definition mangen.h:69
static void init()
Definition mangen.cpp:272
void writeDocumentation(OutputList &ol)
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
static PlantumlManager & instance()
Definition plantuml.cpp:231
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:389
QCString & prepend(const char *s)
Definition qcstring.h:422
const std::string & str() const
Definition qcstring.h:552
Generator for RTF output.
Definition rtfgen.h:80
static void init()
Definition rtfgen.cpp:461
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
Definition rtfgen.cpp:2461
void generateDEF()
Definition defgen.cpp:482
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1193
static void copyLatexStyleSheet()
static void runQHelpGenerator()
class Statistics g_s
static void copyStyleSheet()
static void generateGroupDocs()
static void generateExampleDocs()
Definition doxygen.cpp:9963
static void dumpSymbolMap()
static void generateFileDocs()
Definition doxygen.cpp:8672
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9878
static void generateFileSources()
Definition doxygen.cpp:8506
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9107
static int computeIdealCacheParam(size_t v)
static void copyExtraFiles(const StringVector &files, const QCString &filesOption, const QCString &outputOption)
static void runHtmlHelpCompiler()
static bool g_dumpSymbolMap
Definition doxygen.cpp:191
static bool g_successfulRun
Definition doxygen.cpp:190
static void generateNamespaceDocs()
static void writeTagFile()
void cleanUpDoxygen()
static void generateConceptDocs()
Definition doxygen.cpp:9133
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4053
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5759
void finishWarnExit()
Definition message.cpp:295
void deinit()
bool isAbsolutePath(const QCString &fileName)
Definition portable.cpp:498
double getSysElapsedTime()
Definition portable.cpp:98
void generatePerlMod()
#define TRUE
Definition qcstring.h:37
void finalizeSearchIndexer()
void createJavaScriptSearchIndex()
void writeJavaScriptSearchIndex()
void generateSqlite3()
static bool execute(const QCString &htmldir)
Definition htags.cpp:38
static bool loadFilemap(const QCString &htmldir)
Definition htags.cpp:107
static bool useHtags
Definition htags.h:23
void exitTracing()
Definition trace.cpp:52
void addCodeOnlyMappings()
Definition util.cpp:5101
void generateXML()
Definition xmlgen.cpp:2214

References addCodeOnlyMappings(), AUTO_TRACE, FormulaManager::Bitmap, Doxygen::clangUsrMap, cleanUpDoxygen(), Debug::clearFlag(), computeIdealCacheParam(), Config_getBool, Config_getEnum, Config_getInt, Config_getList, Config_getString, copyExtraFiles(), copyIcon(), copyLatexStyleSheet(), copyLogo(), copyStyleSheet(), createJavaScriptSearchIndex(), Dir::currentDirPath(), QCString::data(), Config::deinit(), dumpSymbolMap(), Debug::elapsedTime(), err, Htags::execute(), Dir::exists(), exitTracing(), FALSE, Doxygen::filterDBFileName, finalizeSearchIndexer(), finishWarnExit(), g_dumpSymbolMap, g_outputList, g_s, g_successfulRun, generateClassDocs(), generateConceptDocs(), generateDEF(), generateDirDocs(), generateExampleDocs(), generateFileDocs(), generateFileSources(), generateGroupDocs(), FormulaManager::generateImages(), generateNamespaceDocs(), generatePageDocs(), generatePerlMod(), generateSqlite3(), generateXML(), Doxygen::generatingXmlOutput, Portable::getSysElapsedTime(), FormulaManager::hasFormulas(), Doxygen::indexList, DocbookGenerator::init(), HtmlGenerator::init(), LatexGenerator::init(), ManGenerator::init(), RTFGenerator::init(), DotManager::instance(), FormulaManager::instance(), ModuleManager::instance(), PlantumlManager::instance(), SearchIndexIntf::Internal, Portable::isAbsolutePath(), QCString::isEmpty(), Debug::isFlagSet(), Htags::loadFilemap(), Dir::mkdir(), msg, FormulaManager::On, QCString::prepend(), RTFGenerator::preProcessFileInplace(), Dir::remove(), DotManager::run(), PlantumlManager::run(), runHtmlHelpCompiler(), runQHelpGenerator(), Doxygen::searchIndex, Debug::setFlag(), QCString::str(), Doxygen::symbolLookupCache, term, Debug::Time, TRUE, Doxygen::typeLookupCache, Htags::useHtags, FormulaManager::Vector, ModuleManager::writeDocumentation(), HtmlGenerator::writeExternalSearchPage(), writeGraphInfo(), writeIndexHierarchy(), writeJavaScriptSearchIndex(), HtmlGenerator::writeSearchData(), HtmlGenerator::writeSearchPage(), HtmlGenerator::writeTabData(), and writeTagFile().

Referenced by main().

◆ initDoxygen()

void initDoxygen ( )

Definition at line 11333 of file doxygen.cpp.

11334{
11335 initResources();
11336 QCString lang = Portable::getenv("LC_ALL");
11337 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11338 std::setlocale(LC_ALL,"");
11339 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11340 std::setlocale(LC_NUMERIC,"C");
11341
11343
11367
11368 // register any additional parsers here...
11369
11371
11372#if USE_LIBCLANG
11374#endif
11383 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11384 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11385 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11387
11388 // initialization of these globals depends on
11389 // configuration switches so we need to postpone these
11390 Doxygen::globalScope = nullptr;
11399
11400}
static void startTimer()
Definition debug.cpp:196
A linked map of directories.
Definition dirdef.h:173
static ConceptLinkedMap * conceptLinkedMap
Definition doxygen.h:98
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:96
static ClassLinkedMap * hiddenClassLinkedMap
Definition doxygen.h:97
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:147
std::function< std::unique_ptr< T >() > make_parser_factory()
void initResources()
std::unordered_map< std::string, const Definition * > ClangUsrMap
Definition doxygen.h:83
void setenv(const QCString &variable, const QCString &value)
Definition portable.cpp:287
QCString getenv(const QCString &variable)
Definition portable.cpp:322
void initDefaultExtensionMapping()
Definition util.cpp:5034

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

12378{
12379 AUTO_TRACE();
12380 std::atexit(exitDoxygen);
12381
12382 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12383
12384#if USE_LIBCLANG
12385 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12386#endif
12387
12388 // we would like to show the versionString earlier, but we first have to handle the configuration file
12389 // to know the value of the QUIET setting.
12390 QCString versionString = getFullVersion();
12391 msg("Doxygen version used: {}\n",versionString);
12392
12394
12395 /**************************************************************************
12396 * Make sure the output directory exists
12397 **************************************************************************/
12398 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12399 if (!g_singleComment)
12400 {
12401 if (outputDirectory.isEmpty())
12402 {
12403 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath());
12404 }
12405 else
12406 {
12407 Dir dir(outputDirectory.str());
12408 if (!dir.exists())
12409 {
12410 dir.setPath(Dir::currentDirPath());
12411 if (!dir.mkdir(outputDirectory.str()))
12412 {
12413 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12414 "exist and cannot be created\n",outputDirectory);
12415 }
12416 else
12417 {
12418 msg("Notice: Output directory '{}' does not exist. "
12419 "I have created it for you.\n", outputDirectory);
12420 }
12421 dir.setPath(outputDirectory.str());
12422 }
12423 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath());
12424 }
12425 }
12426 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12427
12428 /**************************************************************************
12429 * Initialize global lists and dictionaries
12430 **************************************************************************/
12431
12432 // also scale lookup cache with SYMBOL_CACHE_SIZE
12433 int cacheSize = Config_getInt(LOOKUP_CACHE_SIZE);
12434 if (cacheSize<0) cacheSize=0;
12435 if (cacheSize>9) cacheSize=9;
12436 uint32_t lookupSize = 65536 << cacheSize;
12439
12440#ifdef HAS_SIGNALS
12441 signal(SIGINT, stopDoxygen);
12442#endif
12443
12444 uint32_t pid = Portable::pid();
12445 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12446 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12447
12448 /**************************************************************************
12449 * Check/create output directories *
12450 **************************************************************************/
12451
12452 bool generateHtml = Config_getBool(GENERATE_HTML);
12453 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12454 bool generateXml = Config_getBool(GENERATE_XML);
12455 bool generateLatex = Config_getBool(GENERATE_LATEX);
12456 bool generateRtf = Config_getBool(GENERATE_RTF);
12457 bool generateMan = Config_getBool(GENERATE_MAN);
12458 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12459 QCString htmlOutput;
12460 QCString docbookOutput;
12461 QCString xmlOutput;
12462 QCString latexOutput;
12463 QCString rtfOutput;
12464 QCString manOutput;
12465 QCString sqlOutput;
12466
12467 if (!g_singleComment)
12468 {
12469 if (generateHtml)
12470 {
12471 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12472 Config_updateString(HTML_OUTPUT,htmlOutput);
12473
12474 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12475 bool generateSitemap = !sitemapUrl.isEmpty();
12476 if (generateSitemap && !sitemapUrl.endsWith("/"))
12477 {
12478 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12479 }
12480
12481 // add HTML indexers that are enabled
12482 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12483 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12484 bool generateQhp = Config_getBool(GENERATE_QHP);
12485 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12486 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12487 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12488 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12489 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12490 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12491 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12492 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12493 Doxygen::indexList->addIndex<Crawlmap>();
12494 Doxygen::indexList->initialize();
12495 }
12496
12497 if (generateDocbook)
12498 {
12499 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12500 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12501 }
12502
12503 if (generateXml)
12504 {
12505 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12506 Config_updateString(XML_OUTPUT,xmlOutput);
12507 }
12508
12509 if (generateLatex)
12510 {
12511 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12512 Config_updateString(LATEX_OUTPUT,latexOutput);
12513 }
12514
12515 if (generateRtf)
12516 {
12517 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12518 Config_updateString(RTF_OUTPUT,rtfOutput);
12519 }
12520
12521 if (generateMan)
12522 {
12523 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12524 Config_updateString(MAN_OUTPUT,manOutput);
12525 }
12526
12527 if (generateSql)
12528 {
12529 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12530 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12531 }
12532 }
12533
12534 if (Config_getBool(HAVE_DOT))
12535 {
12536 QCString curFontPath = Config_getString(DOT_FONTPATH);
12537 if (curFontPath.isEmpty())
12538 {
12539 Portable::getenv("DOTFONTPATH");
12540 QCString newFontPath = ".";
12541 if (!curFontPath.isEmpty())
12542 {
12543 newFontPath+=Portable::pathListSeparator();
12544 newFontPath+=curFontPath;
12545 }
12546 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12547 }
12548 else
12549 {
12550 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12551 }
12552 }
12553
12554 /**************************************************************************
12555 * Handle layout file *
12556 **************************************************************************/
12557
12559 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12560 bool defaultLayoutUsed = FALSE;
12561 if (layoutFileName.isEmpty())
12562 {
12563 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12564 defaultLayoutUsed = TRUE;
12565 }
12566 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12567
12568 FileInfo fi(layoutFileName.str());
12569 if (fi.exists())
12570 {
12571 msg("Parsing layout file {}...\n",layoutFileName);
12572 LayoutDocManager::instance().parse(layoutFileName);
12573 }
12574 else if (!defaultLayoutUsed)
12575 {
12576 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12577 }
12578 printLayout();
12579
12580 /**************************************************************************
12581 * Read and preprocess input *
12582 **************************************************************************/
12583
12584 // prevent search in the output directories
12585 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12586 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12587 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12588 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12589 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12590 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12591 if (generateMan) exclPatterns.push_back(manOutput.str());
12592 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12593
12594 if (!g_singleComment)
12595 {
12597
12599 }
12600
12601 // Notice: the order of the function calls below is very important!
12602
12603 if (generateHtml && !Config_getBool(USE_MATHJAX))
12604 {
12606 }
12607 if (generateRtf)
12608 {
12610 }
12611 if (generateDocbook)
12612 {
12614 }
12615
12617
12618 /**************************************************************************
12619 * Handle Tag Files *
12620 **************************************************************************/
12621
12622 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12623
12624 if (!g_singleComment)
12625 {
12626 msg("Reading and parsing tag files\n");
12627 const StringVector &tagFileList = Config_getList(TAGFILES);
12628 for (const auto &s : tagFileList)
12629 {
12630 readTagFile(root,s.c_str());
12631 }
12632 }
12633
12634 /**************************************************************************
12635 * Parse source files *
12636 **************************************************************************/
12637
12638 addSTLSupport(root);
12639
12640 g_s.begin("Parsing files\n");
12641 if (g_singleComment)
12642 {
12643 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12644 if (g_commentFileName=="-")
12645 {
12646 std::string text = fileToString(g_commentFileName).str();
12647 addTerminalCharIfMissing(text,'\n');
12648 generateHtmlForComment("stdin.md",text);
12649 }
12650 else if (FileInfo(g_commentFileName.str()).isFile())
12651 {
12652 std::string text;
12654 addTerminalCharIfMissing(text,'\n');
12656 }
12657 else
12658 {
12659 }
12661 exit(0);
12662 }
12663 else
12664 {
12665 if (Config_getInt(NUM_PROC_THREADS)==1)
12666 {
12668 }
12669 else
12670 {
12672 }
12673 }
12674 g_s.end();
12675
12676 /**************************************************************************
12677 * Gather information *
12678 **************************************************************************/
12679
12680 g_s.begin("Building macro definition list...\n");
12682 g_s.end();
12683
12684 g_s.begin("Building group list...\n");
12685 buildGroupList(root.get());
12686 organizeSubGroups(root.get());
12687 g_s.end();
12688
12689 g_s.begin("Building directory list...\n");
12691 findDirDocumentation(root.get());
12692 g_s.end();
12693
12694 g_s.begin("Building namespace list...\n");
12695 buildNamespaceList(root.get());
12696 findUsingDirectives(root.get());
12697 g_s.end();
12698
12699 g_s.begin("Building file list...\n");
12700 buildFileList(root.get());
12701 g_s.end();
12702
12703 g_s.begin("Building class list...\n");
12704 buildClassList(root.get());
12705 g_s.end();
12706
12707 g_s.begin("Building concept list...\n");
12708 buildConceptList(root.get());
12709 g_s.end();
12710
12711 // build list of using declarations here (global list)
12712 buildListOfUsingDecls(root.get());
12713 g_s.end();
12714
12715 g_s.begin("Computing nesting relations for classes...\n");
12717 g_s.end();
12718 // 1.8.2-20121111: no longer add nested classes to the group as well
12719 //distributeClassGroupRelations();
12720
12721 // calling buildClassList may result in cached relations that
12722 // become invalid after resolveClassNestingRelations(), that's why
12723 // we need to clear the cache here
12724 Doxygen::typeLookupCache->clear();
12725 // we don't need the list of using declaration anymore
12726 g_usingDeclarations.clear();
12727
12728 g_s.begin("Associating documentation with classes...\n");
12729 buildClassDocList(root.get());
12730 g_s.end();
12731
12732 g_s.begin("Associating documentation with concepts...\n");
12733 buildConceptDocList(root.get());
12735 g_s.end();
12736
12737 g_s.begin("Associating documentation with modules...\n");
12738 findModuleDocumentation(root.get());
12739 g_s.end();
12740
12741 g_s.begin("Building example list...\n");
12742 buildExampleList(root.get());
12743 g_s.end();
12744
12745 g_s.begin("Searching for enumerations...\n");
12746 findEnums(root.get());
12747 g_s.end();
12748
12749 // Since buildVarList calls isVarWithConstructor
12750 // and this calls getResolvedClass we need to process
12751 // typedefs first so the relations between classes via typedefs
12752 // are properly resolved. See bug 536385 for an example.
12753 g_s.begin("Searching for documented typedefs...\n");
12754 buildTypedefList(root.get());
12755 g_s.end();
12756
12757 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12758 {
12759 g_s.begin("Searching for documented sequences...\n");
12760 buildSequenceList(root.get());
12761 g_s.end();
12762
12763 g_s.begin("Searching for documented dictionaries...\n");
12764 buildDictionaryList(root.get());
12765 g_s.end();
12766 }
12767
12768 g_s.begin("Searching for members imported via using declarations...\n");
12769 // this should be after buildTypedefList in order to properly import
12770 // used typedefs
12771 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12772 findUsingDeclarations(root.get(),FALSE); // then the rest
12773 g_s.end();
12774
12775 g_s.begin("Searching for included using directives...\n");
12777 g_s.end();
12778
12779 g_s.begin("Searching for documented variables...\n");
12780 buildVarList(root.get());
12781 g_s.end();
12782
12783 g_s.begin("Building interface member list...\n");
12784 buildInterfaceAndServiceList(root.get()); // UNO IDL
12785
12786 g_s.begin("Building member list...\n"); // using class info only !
12787 buildFunctionList(root.get());
12788 g_s.end();
12789
12790 g_s.begin("Searching for friends...\n");
12791 findFriends();
12792 g_s.end();
12793
12794 g_s.begin("Searching for documented defines...\n");
12795 findDefineDocumentation(root.get());
12796 g_s.end();
12797
12798 g_s.begin("Computing class inheritance relations...\n");
12799 findClassEntries(root.get());
12801 g_s.end();
12802
12803 g_s.begin("Computing class usage relations...\n");
12805 g_s.end();
12806
12807 if (Config_getBool(INLINE_SIMPLE_STRUCTS))
12808 {
12809 g_s.begin("Searching for tag less structs...\n");
12811 g_s.end();
12812 }
12813
12814 g_s.begin("Flushing cached template relations that have become invalid...\n");
12816 g_s.end();
12817
12818 g_s.begin("Warn for undocumented namespaces...\n");
12820 g_s.end();
12821
12822 g_s.begin("Computing class relations...\n");
12825 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12826 {
12828 }
12830 g_classEntries.clear();
12831 g_s.end();
12832
12833 g_s.begin("Add enum values to enums...\n");
12834 addEnumValuesToEnums(root.get());
12835 findEnumDocumentation(root.get());
12836 g_s.end();
12837
12838 g_s.begin("Searching for member function documentation...\n");
12839 findObjCMethodDefinitions(root.get());
12840 findMemberDocumentation(root.get()); // may introduce new members !
12841 findUsingDeclImports(root.get()); // may introduce new members !
12842 g_usingClassMap.clear();
12846 g_s.end();
12847
12848 // moved to after finding and copying documentation,
12849 // as this introduces new members see bug 722654
12850 g_s.begin("Creating members for template instances...\n");
12852 g_s.end();
12853
12854 g_s.begin("Building page list...\n");
12855 buildPageList(root.get());
12856 g_s.end();
12857
12858 g_s.begin("Search for main page...\n");
12859 findMainPage(root.get());
12860 findMainPageTagFiles(root.get());
12861 g_s.end();
12862
12863 g_s.begin("Computing page relations...\n");
12864 computePageRelations(root.get());
12866 g_s.end();
12867
12868 g_s.begin("Determining the scope of groups...\n");
12869 findGroupScope(root.get());
12870 g_s.end();
12871
12872 g_s.begin("Computing module relations...\n");
12873 auto &mm = ModuleManager::instance();
12874 mm.resolvePartitions();
12875 mm.resolveImports();
12876 mm.collectExportedSymbols();
12877 g_s.end();
12878
12879 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
12880 {
12881 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
12882 n2->memberName().data()+getPrefixIndex(n2->memberName())
12883 )<0;
12884 };
12885
12886 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
12887 {
12888 if (Config_getBool(SORT_BY_SCOPE_NAME))
12889 {
12890 return qstricmp_sort(c1->name(), c2->name())<0;
12891 }
12892 else
12893 {
12894 int i = qstricmp_sort(c1->className(), c2->className());
12895 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12896 }
12897 };
12898
12899 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
12900 {
12901 return qstricmp_sort(n1->name(),n2->name())<0;
12902 };
12903
12904 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
12905 {
12906 return qstricmp_sort(c1->name(),c2->name())<0;
12907 };
12908
12909 g_s.begin("Sorting lists...\n");
12910 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
12912 memberNameComp);
12913 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
12915 memberNameComp);
12916 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
12918 classComp);
12919 std::stable_sort(Doxygen::classLinkedMap->begin(),
12921 classComp);
12922 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
12924 conceptComp);
12925 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
12927 namespaceComp);
12928 g_s.end();
12929
12930 g_s.begin("Determining which enums are documented\n");
12932 g_s.end();
12933
12934 g_s.begin("Computing member relations...\n");
12937 g_s.end();
12938
12939 g_s.begin("Building full member lists recursively...\n");
12941 g_s.end();
12942
12943 g_s.begin("Adding members to member groups.\n");
12945 g_s.end();
12946
12947 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
12948 {
12949 g_s.begin("Distributing member group documentation.\n");
12951 g_s.end();
12952 }
12953
12954 g_s.begin("Computing member references...\n");
12956 g_s.end();
12957
12958 if (Config_getBool(INHERIT_DOCS))
12959 {
12960 g_s.begin("Inheriting documentation...\n");
12962 g_s.end();
12963 }
12964
12965
12966 // compute the shortest possible names of all files
12967 // without losing the uniqueness of the file names.
12968 g_s.begin("Generating disk names...\n");
12970 g_s.end();
12971
12972 g_s.begin("Adding source references...\n");
12974 g_s.end();
12975
12976 g_s.begin("Adding xrefitems...\n");
12979 g_s.end();
12980
12981 g_s.begin("Sorting member lists...\n");
12983 g_s.end();
12984
12985 g_s.begin("Setting anonymous enum type...\n");
12987 g_s.end();
12988
12989 g_s.begin("Computing dependencies between directories...\n");
12991 g_s.end();
12992
12993 g_s.begin("Generating citations page...\n");
12995 g_s.end();
12996
12997 g_s.begin("Counting members...\n");
12998 countMembers();
12999 g_s.end();
13000
13001 g_s.begin("Counting data structures...\n");
13003 g_s.end();
13004
13005 g_s.begin("Resolving user defined references...\n");
13007 g_s.end();
13008
13009 g_s.begin("Finding anchors and sections in the documentation...\n");
13011 g_s.end();
13012
13013 g_s.begin("Transferring function references...\n");
13015 g_s.end();
13016
13017 g_s.begin("Combining using relations...\n");
13019 g_s.end();
13020
13022 g_s.begin("Adding members to index pages...\n");
13024 addToIndices();
13025 g_s.end();
13026
13027 g_s.begin("Correcting members for VHDL...\n");
13029 g_s.end();
13030
13031 g_s.begin("Computing tooltip texts...\n");
13033 g_s.end();
13034
13035 if (Config_getBool(SORT_GROUP_NAMES))
13036 {
13037 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13039 [](const auto &g1,const auto &g2)
13040 { return g1->groupTitle() < g2->groupTitle(); });
13041
13042 for (const auto &gd : *Doxygen::groupLinkedMap)
13043 {
13044 gd->sortSubGroups();
13045 }
13046 }
13047
13048 printNavTree(root.get(),0);
13050}
Definition cache.h:32
static CitationManager & instance()
Definition cite.cpp:86
void generatePage()
Generate the citations page.
Definition cite.cpp:333
A class that generates docset files.
Definition docsets.h:36
static bool clangAssistedParsing
Definition doxygen.h:138
Generator for Eclipse help files.
Definition eclipsehelp.h:44
A class that generates a dynamic tree view side panel.
Definition ftvhelp.h:41
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
bool isFile() const
Definition fileinfo.cpp:63
void initFromRepository(const QCString &dir)
Definition formula.cpp:60
void checkRepositories()
Definition formula.cpp:173
A class that generated the HTML Help specific files.
Definition htmlhelp.h:36
static Index & instance()
Definition index.cpp:106
void countDataStructures()
Definition index.cpp:262
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1435
void parse(const QCString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1468
std::unique_ptr< MemberName > Ptr
Definition linkedmap.h:38
bool endsWith(const char *s) const
Definition qcstring.h:524
Definition qhp.h:27
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:1102
void computeDirDependencies()
Definition dirdef.cpp:1176
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:47
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5243
void printNavTree(Entry *root, int indent)
Definition doxygen.cpp:9924
static void buildGroupList(const Entry *root)
Definition doxygen.cpp:425
static void findUsingDeclarations(const Entry *root, bool filterPythonPackages)
Definition doxygen.cpp:2005
static void flushCachedTemplateRelations()
Definition doxygen.cpp:9349
static void computeTemplateClassRelations()
Definition doxygen.cpp:5337
void printSectionsTree()
Definition doxygen.cpp:9947
static void generateXRefPages()
Definition doxygen.cpp:5509
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2158
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9588
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5292
static void buildConceptList(const Entry *root)
Definition doxygen.cpp:1276
static void resolveClassNestingRelations()
Definition doxygen.cpp:1331
static void findClassEntries(const Entry *root)
Definition doxygen.cpp:5206
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8307
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5406
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4362
static void addMembersToMemberGroup()
Definition doxygen.cpp:9214
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9748
static void distributeConceptGroups()
Definition doxygen.cpp:1298
static void transferFunctionDocumentation()
Definition doxygen.cpp:4281
static void setAnonymousEnumType()
Definition doxygen.cpp:8954
static void sortMemberLists()
Definition doxygen.cpp:8859
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8435
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4411
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7451
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3352
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:440
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9501
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7421
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9252
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7654
static void resolveUserReferences()
Definition doxygen.cpp:9810
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3488
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3451
static void buildNamespaceList(const Entry *root)
Definition doxygen.cpp:1670
static void readTagFile(const std::shared_ptr< Entry > &root, const QCString &tagLine)
static void findIncludedUsingDirectives()
Definition doxygen.cpp:2408
static void countMembers()
Definition doxygen.cpp:8968
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:484
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4184
static void findEnums(const Entry *root)
Definition doxygen.cpp:7479
static void addListReferences()
Definition doxygen.cpp:5440
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8097
static void findMainPage(Entry *root)
Definition doxygen.cpp:9678
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:1850
static void addSourceReferences()
Definition doxygen.cpp:8732
static void buildExampleList(Entry *root)
Definition doxygen.cpp:9895
static void inheritDocumentation()
Definition doxygen.cpp:9154
static void flushUnresolvedRelations()
Definition doxygen.cpp:9403
static QCString g_commentFileName
Definition doxygen.cpp:192
static void findDocumentedEnumValues()
Definition doxygen.cpp:8089
static void findTagLessClasses()
Definition doxygen.cpp:1646
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8139
static void computeClassRelations()
Definition doxygen.cpp:5312
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:3878
static void checkPageRelations()
Definition doxygen.cpp:9790
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1266
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:7977
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9760
static QCString createOutputDirectory(const QCString &baseDirName, const QCString &formatDirName, const char *defaultDirName)
static StringSet g_usingDeclarations
Definition doxygen.cpp:189
static void buildDictionaryList(const Entry *root)
Definition doxygen.cpp:3469
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1137
static void buildPageList(Entry *root)
Definition doxygen.cpp:9651
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:193
static void findSectionsInDocumentation()
Definition doxygen.cpp:9290
static void mergeCategories()
Definition doxygen.cpp:8454
static void buildFileList(const Entry *root)
Definition doxygen.cpp:496
static void buildClassList(const Entry *root)
Definition doxygen.cpp:1127
static void findUsedTemplateInstances()
Definition doxygen.cpp:5276
static void computeTooltipTexts()
Definition doxygen.cpp:8908
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8476
static void combineUsingRelations()
Definition doxygen.cpp:9189
static void checkMarkdownMainfile()
static std::unordered_map< std::string, std::vector< ClassDefMutable * > > g_usingClassMap
Definition doxygen.cpp:2156
static void buildConceptDocList(const Entry *root)
Definition doxygen.cpp:1286
static void parseFilesMultiThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void transferFunctionReferences()
Definition doxygen.cpp:4314
static void buildDefineList()
Definition doxygen.cpp:8811
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3582
static void computeMemberRelations()
Definition doxygen.cpp:8419
static void buildListOfUsingDecls(const Entry *root)
Definition doxygen.cpp:1992
static std::multimap< std::string, const Entry * > g_classEntries
Definition doxygen.cpp:186
void printLayout()
Definition layout.cpp:1820
#define warn_uncond(fmt,...)
Definition message.h:122
void correctPath(const StringVector &list)
Correct a possible wrong PATH variable.
Definition portable.cpp:517
QCString pathListSeparator()
Definition portable.cpp:384
uint32_t pid()
Definition portable.cpp:249
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:687
void initSearchIndexer()
void generateHtmlForComment(const std::string &fn, const std::string &text)
Helper for implemented the -c option of doxygen, which produces HTML output for a given doxygen forma...
void addSTLSupport(std::shared_ptr< Entry > &root)
Add stub entries for the most used classes in the standard template library.
void addTerminalCharIfMissing(std::string &s, char c)
Definition stringutil.h:84
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
Definition util.cpp:5446
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1439
int getPrefixIndex(const QCString &name)
Definition util.cpp:3158

References Dir::absPath(), addEnumValuesToEnums(), addListReferences(), addMembersToIndex(), addMembersToMemberGroup(), addSourceReferences(), addSTLSupport(), addTerminalCharIfMissing(), addToIndices(), AUTO_TRACE, AUTO_TRACE_ADD, begin(), buildClassDocList(), buildClassList(), buildCompleteMemberLists(), buildConceptDocList(), buildConceptList(), buildDefineList(), buildDictionaryList(), buildDirectories(), buildExampleList(), buildFileList(), buildFunctionList(), buildGroupList(), buildInterfaceAndServiceList(), buildListOfUsingDecls(), buildNamespaceList(), buildPageList(), buildSequenceList(), buildTypedefList(), buildVarList(), checkMarkdownMainfile(), checkPageRelations(), FormulaManager::checkRepositories(), Doxygen::clangAssistedParsing, Doxygen::classLinkedMap, cleanUpDoxygen(), combineUsingRelations(), computeClassRelations(), computeDirDependencies(), computeMemberReferences(), computeMemberRelations(), computePageRelations(), computeTemplateClassRelations(), computeTooltipTexts(), computeVerifiedDotPath(), VhdlDocGen::computeVhdlComponentRelations(), Doxygen::conceptLinkedMap, Config_getBool, Config_getInt, Config_getList, Config_getString, Config_updateList, Config_updateString, Portable::correctPath(), Index::countDataStructures(), countMembers(), createOutputDirectory(), createTemplateInstanceMembers(), Dir::currentDirPath(), distributeConceptGroups(), distributeMemberGroupDocumentation(), end(), QCString::endsWith(), Dir::exists(), FileInfo::exists(), exitDoxygen(), FALSE, fileToString(), Doxygen::filterDBFileName, findClassEntries(), findDefineDocumentation(), findDirDocumentation(), findDocumentedEnumValues(), findEnumDocumentation(), findEnums(), findFriends(), findGroupScope(), findIncludedUsingDirectives(), findInheritedTemplateInstances(), findMainPage(), findMainPageTagFiles(), findMemberDocumentation(), findModuleDocumentation(), findObjCMethodDefinitions(), findSectionsInDocumentation(), findTagLessClasses(), findUsedTemplateInstances(), findUsingDeclarations(), findUsingDeclImports(), findUsingDirectives(), flushCachedTemplateRelations(), flushUnresolvedRelations(), Doxygen::functionNameLinkedMap, g_classEntries, g_commentFileName, g_s, g_singleComment, g_usingClassMap, g_usingDeclarations, generateDiskNames(), generateHtmlForComment(), CitationManager::generatePage(), 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(), QCString::isEmpty(), FileInfo::isFile(), Doxygen::memberNameLinkedMap, mergeCategories(), Dir::mkdir(), msg, Doxygen::namespaceLinkedMap, organizeSubGroups(), LayoutDocManager::parse(), parseFilesMultiThreading(), parseFilesSingleThreading(), Portable::pathListSeparator(), Portable::pid(), printLayout(), printNavTree(), printSectionsTree(), qPrint(), qstricmp_sort(), readInputFile(), readTagFile(), resolveClassNestingRelations(), resolveUserReferences(), searchInputFiles(), setAnonymousEnumType(), Portable::setenv(), Dir::setPath(), sortMemberLists(), stopDoxygen(), QCString::str(), Doxygen::symbolLookupCache, term, transferFunctionDocumentation(), transferFunctionReferences(), transferRelatedFunctionDocumentation(), transferStaticInstanceInitializers(), TRUE, Doxygen::typeLookupCache, vhdlCorrectMemberProperties(), warn_uncond, and warnUndocumentedNamespaces().

Referenced by main().

◆ readConfiguration()

void readConfiguration ( int argc,
char ** argv )

Definition at line 11446 of file doxygen.cpp.

11447{
11448 QCString versionString = getFullVersion();
11449
11450 // helper that calls \a func to write to file \a fileName via a TextStream
11451 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11452 {
11453 std::ofstream f;
11454 if (openOutputFile(fileName,f))
11455 {
11456 TextStream t(&f);
11457 func(t);
11458 return true;
11459 }
11460 return false;
11461 };
11462
11463
11464 /**************************************************************************
11465 * Handle arguments *
11466 **************************************************************************/
11467
11468 int optInd=1;
11469 QCString configName;
11470 QCString traceName;
11471 bool genConfig=false;
11472 bool shortList=false;
11473 bool traceTiming=false;
11475 bool updateConfig=false;
11476 bool quiet = false;
11477 while (optInd<argc && argv[optInd][0]=='-' &&
11478 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11479 argv[optInd][1]=='-')
11480 )
11481 {
11482 switch(argv[optInd][1])
11483 {
11484 case 'g':
11485 {
11486 genConfig=TRUE;
11487 }
11488 break;
11489 case 'l':
11490 {
11491 QCString layoutName;
11492 if (optInd+1>=argc)
11493 {
11494 layoutName="DoxygenLayout.xml";
11495 }
11496 else
11497 {
11498 layoutName=argv[optInd+1];
11499 }
11500 writeDefaultLayoutFile(layoutName);
11502 exit(0);
11503 }
11504 break;
11505 case 'c':
11506 if (optInd+1>=argc) // no file name given
11507 {
11508 msg("option \"-c\" is missing the file name to read\n");
11509 devUsage();
11511 exit(1);
11512 }
11513 else
11514 {
11515 g_commentFileName=argv[optInd+1];
11516 optInd++;
11517 }
11518 g_singleComment=true;
11519 quiet=true;
11520 break;
11521 case 'd':
11522 {
11523 QCString debugLabel=getArg(argc,argv,optInd);
11524 if (debugLabel.isEmpty())
11525 {
11526 devUsage();
11528 exit(0);
11529 }
11530 int retVal = Debug::setFlagStr(debugLabel);
11531 if (!retVal)
11532 {
11533 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11534 devUsage();
11536 exit(1);
11537 }
11538 }
11539 break;
11540 case 't':
11541 {
11542#if ENABLE_TRACING
11543 if (!strcmp(argv[optInd]+1,"t_time"))
11544 {
11545 traceTiming = true;
11546 }
11547 else if (!strcmp(argv[optInd]+1,"t"))
11548 {
11549 traceTiming = false;
11550 }
11551 else
11552 {
11553 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11555 exit(1);
11556 }
11557 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11558 {
11559 traceName="stdout";
11560 }
11561 else
11562 {
11563 traceName=argv[optInd+1];
11564 optInd++;
11565 }
11566#else
11567 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11569 exit(1);
11570#endif
11571 }
11572 break;
11573 case 'x':
11574 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11575 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11576 else
11577 {
11578 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11580 exit(1);
11581 }
11582 break;
11583 case 's':
11584 shortList=TRUE;
11585 break;
11586 case 'u':
11587 updateConfig=TRUE;
11588 break;
11589 case 'e':
11590 {
11591 QCString formatName=getArg(argc,argv,optInd);
11592 if (formatName.isEmpty())
11593 {
11594 err("option \"-e\" is missing format specifier rtf.\n");
11596 exit(1);
11597 }
11598 if (qstricmp(formatName.data(),"rtf")==0)
11599 {
11600 if (optInd+1>=argc)
11601 {
11602 err("option \"-e rtf\" is missing an extensions file name\n");
11604 exit(1);
11605 }
11606 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11608 exit(0);
11609 }
11610 err("option \"-e\" has invalid format specifier.\n");
11612 exit(1);
11613 }
11614 break;
11615 case 'f':
11616 {
11617 QCString listName=getArg(argc,argv,optInd);
11618 if (listName.isEmpty())
11619 {
11620 err("option \"-f\" is missing list specifier.\n");
11622 exit(1);
11623 }
11624 if (qstricmp(listName.data(),"emoji")==0)
11625 {
11626 if (optInd+1>=argc)
11627 {
11628 err("option \"-f emoji\" is missing an output file name\n");
11630 exit(1);
11631 }
11632 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11634 exit(0);
11635 }
11636 err("option \"-f\" has invalid list specifier.\n");
11638 exit(1);
11639 }
11640 break;
11641 case 'w':
11642 {
11643 QCString formatName=getArg(argc,argv,optInd);
11644 if (formatName.isEmpty())
11645 {
11646 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11648 exit(1);
11649 }
11650 if (qstricmp(formatName.data(),"rtf")==0)
11651 {
11652 if (optInd+1>=argc)
11653 {
11654 err("option \"-w rtf\" is missing a style sheet file name\n");
11656 exit(1);
11657 }
11658 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11659 {
11660 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11662 exit(1);
11663 }
11665 exit(0);
11666 }
11667 else if (qstricmp(formatName.data(),"html")==0)
11668 {
11669 Config::init();
11670 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11671 // explicit config file mentioned or default found on disk
11672 {
11673 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11674 if (!Config::parse(df)) // parse the config file
11675 {
11676 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11678 exit(1);
11679 }
11680 }
11681 if (optInd+3>=argc)
11682 {
11683 err("option \"-w html\" does not have enough arguments\n");
11685 exit(1);
11686 }
11690 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11691 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11692 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11693 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11695 exit(0);
11696 }
11697 else if (qstricmp(formatName.data(),"latex")==0)
11698 {
11699 Config::init();
11700 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11701 {
11702 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11703 if (!Config::parse(df))
11704 {
11705 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11707 exit(1);
11708 }
11709 }
11710 if (optInd+3>=argc)
11711 {
11712 err("option \"-w latex\" does not have enough arguments\n");
11714 exit(1);
11715 }
11719 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11720 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11721 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11722 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11724 exit(0);
11725 }
11726 else
11727 {
11728 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11730 exit(1);
11731 }
11732 }
11733 break;
11734 case 'm':
11736 break;
11737 case 'v':
11738 version(false);
11740 exit(0);
11741 break;
11742 case 'V':
11743 version(true);
11745 exit(0);
11746 break;
11747 case '-':
11748 if (qstrcmp(&argv[optInd][2],"help")==0)
11749 {
11750 usage(argv[0],versionString);
11751 exit(0);
11752 }
11753 else if (qstrcmp(&argv[optInd][2],"version")==0)
11754 {
11755 version(false);
11757 exit(0);
11758 }
11759 else if ((qstrcmp(&argv[optInd][2],"Version")==0) ||
11760 (qstrcmp(&argv[optInd][2],"VERSION")==0))
11761 {
11762 version(true);
11764 exit(0);
11765 }
11766 else
11767 {
11768 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11769 usage(argv[0],versionString);
11770 exit(1);
11771 }
11772 break;
11773 case 'b':
11774 setvbuf(stdout,nullptr,_IONBF,0);
11775 break;
11776 case 'q':
11777 quiet = true;
11778 break;
11779 case 'h':
11780 case '?':
11781 usage(argv[0],versionString);
11782 exit(0);
11783 break;
11784 default:
11785 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11786 usage(argv[0],versionString);
11787 exit(1);
11788 }
11789 optInd++;
11790 }
11791
11792 /**************************************************************************
11793 * Parse or generate the config file *
11794 **************************************************************************/
11795
11796 initTracing(traceName.data(),traceTiming);
11797 TRACE("Doxygen version used: {}",getFullVersion());
11798 Config::init();
11799
11800 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11801 if (optInd>=argc)
11802 {
11803 if (configFileInfo1.exists())
11804 {
11805 configName="Doxyfile";
11806 }
11807 else if (configFileInfo2.exists())
11808 {
11809 configName="doxyfile";
11810 }
11811 else if (genConfig)
11812 {
11813 configName="Doxyfile";
11814 }
11815 else
11816 {
11817 err("Doxyfile not found and no input file specified!\n");
11818 usage(argv[0],versionString);
11819 exit(1);
11820 }
11821 }
11822 else
11823 {
11824 FileInfo fi(argv[optInd]);
11825 if (fi.exists() || qstrcmp(argv[optInd],"-")==0 || genConfig)
11826 {
11827 configName=argv[optInd];
11828 }
11829 else
11830 {
11831 err("configuration file {} not found!\n",argv[optInd]);
11832 usage(argv[0],versionString);
11833 exit(1);
11834 }
11835 }
11836
11837 if (genConfig)
11838 {
11839 generateConfigFile(configName,shortList);
11841 exit(0);
11842 }
11843
11844 if (!Config::parse(configName,updateConfig,diffList))
11845 {
11846 err("could not open or read configuration file {}!\n",configName);
11848 exit(1);
11849 }
11850
11851 if (diffList!=Config::CompareMode::Full)
11852 {
11854 compareDoxyfile(diffList);
11856 exit(0);
11857 }
11858
11859 if (updateConfig)
11860 {
11862 generateConfigFile(configName,shortList,TRUE);
11864 exit(0);
11865 }
11866
11867 /* Perlmod wants to know the path to the config file.*/
11868 FileInfo configFileInfo(configName.str());
11869 setPerlModDoxyfile(configFileInfo.absFilePath());
11870
11871 /* handle -q option */
11872 if (quiet) Config_updateBool(QUIET,TRUE);
11873}
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:1537
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1525
static void writeHeaderFile(TextStream &t, const QCString &cssname)
Definition htmlgen.cpp:1531
static void writeFooterFile(TextStream &t)
Definition latexgen.cpp:697
static void writeStyleSheetFile(TextStream &t)
Definition latexgen.cpp:703
static void writeHeaderFile(TextStream &t)
Definition latexgen.cpp:691
static void writeStyleSheetFile(TextStream &t)
Definition rtfgen.cpp:394
static void writeExtensionsFile(TextStream &t)
Definition rtfgen.cpp:409
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_updateBool(name, value)
Definition config.h:40
static void generateConfigFile(const QCString &configFile, bool shortList, bool updateOnly=FALSE)
static void compareDoxyfile(Config::CompareMode diffList)
static void usage(const QCString &name, const QCString &versionString)
static void devUsage()
static void version(const bool extended)
static const char * getArg(int argc, char **argv, int &optInd)
void writeDefaultLayoutFile(const QCString &fileName)
Definition layout.cpp:1732
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:447
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:6206

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

11108{
11109 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11110 // strip trailing slashes
11111 if (s.isEmpty()) return;
11112
11113 g_pathsVisited.clear();
11114
11115 FileInfo fi(s.str());
11116 //printf("readFileOrDirectory(%s)\n",s);
11117 {
11118 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11119 {
11120 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11121 {
11122 }
11123 else if (!fi.exists() || !fi.isReadable())
11124 {
11125 if (errorIfNotExist)
11126 {
11127 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11128 }
11129 }
11130 else if (fi.isFile())
11131 {
11132 std::string dirPath = fi.dirPath(true);
11133 std::string filePath = fi.absFilePath();
11134 if (paths && !dirPath.empty())
11135 {
11136 paths->insert(dirPath);
11137 }
11138 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11139 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11140 {
11141 std::string name=fi.fileName();
11142 if (fnMap)
11143 {
11144 auto fd = createFileDef(dirPath+"/",name);
11145 if (!name.empty())
11146 {
11147 FileName *fn = fnMap->add(name,filePath);
11148 fn->push_back(std::move(fd));
11149 }
11150 }
11151 if (resultList || resultSet)
11152 {
11153 if (resultList) resultList->push_back(filePath);
11154 if (resultSet) resultSet->insert(filePath);
11155 }
11156
11157 if (killSet) killSet->insert(fi.absFilePath());
11158 }
11159 }
11160 else if (fi.isDir()) // readable dir
11161 {
11162 readDir(&fi,fnMap,exclSet,patList,
11163 exclPatList,resultList,resultSet,errorIfNotExist,
11164 recursive,killSet,paths);
11165 }
11166 }
11167 }
11168}
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().