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

11865{
11866 AUTO_TRACE();
11867 Doxygen::globalNamespaceDef = createNamespaceDef("<globalScope>",1,1,"<globalScope>");
11877
11878 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11879
11880 /* Set the global html file extension. */
11881 Doxygen::htmlFileExtension = Config_getString(HTML_FILE_EXTENSION);
11882
11883
11885 Config_getBool(CALLER_GRAPH) ||
11886 Config_getBool(REFERENCES_RELATION) ||
11887 Config_getBool(REFERENCED_BY_RELATION);
11888
11889 /**************************************************************************
11890 * Add custom extension mappings
11891 **************************************************************************/
11892
11893 const StringVector &extMaps = Config_getList(EXTENSION_MAPPING);
11894 for (const auto &mapping : extMaps)
11895 {
11896 QCString mapStr = mapping.c_str();
11897 int i=mapStr.find('=');
11898 if (i==-1)
11899 {
11900 continue;
11901 }
11902 else
11903 {
11904 QCString ext = mapStr.left(i).stripWhiteSpace().lower();
11905 QCString language = mapStr.mid(i+1).stripWhiteSpace().lower();
11906 if (ext.isEmpty() || language.isEmpty())
11907 {
11908 continue;
11909 }
11910
11911 if (!updateLanguageMapping(ext,language))
11912 {
11913 err("Failed to map file extension '{}' to unsupported language '{}'.\n"
11914 "Check the EXTENSION_MAPPING setting in the config file.\n",
11915 ext,language);
11916 }
11917 else
11918 {
11919 msg("Adding custom extension mapping: '{}' will be treated as language '{}'\n",
11920 ext,language);
11921 }
11922 }
11923 }
11924 // create input file exncodings
11925
11926 // check INPUT_ENCODING
11927 void *cd = portable_iconv_open("UTF-8",Config_getString(INPUT_ENCODING).data());
11928 if (cd==reinterpret_cast<void *>(-1))
11929 {
11930 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
11931 "Check the 'INPUT_ENCODING' setting in the config file!\n",
11932 Config_getString(INPUT_ENCODING),strerror(errno));
11933 }
11934 else
11935 {
11937 }
11938
11939 // check and split INPUT_FILE_ENCODING
11940 const StringVector &fileEncod = Config_getList(INPUT_FILE_ENCODING);
11941 for (const auto &mapping : fileEncod)
11942 {
11943 QCString mapStr = mapping.c_str();
11944 int i=mapStr.find('=');
11945 if (i==-1)
11946 {
11947 continue;
11948 }
11949 else
11950 {
11951 QCString pattern = mapStr.left(i).stripWhiteSpace().lower();
11952 QCString encoding = mapStr.mid(i+1).stripWhiteSpace().lower();
11953 if (pattern.isEmpty() || encoding.isEmpty())
11954 {
11955 continue;
11956 }
11957 cd = portable_iconv_open("UTF-8",encoding.data());
11958 if (cd==reinterpret_cast<void *>(-1))
11959 {
11960 term("unsupported character conversion: '{}'->'UTF-8': {}\n"
11961 "Check the 'INPUT_FILE_ENCODING' setting in the config file!\n",
11962 encoding,strerror(errno));
11963 }
11964 else
11965 {
11967 }
11968
11969 Doxygen::inputFileEncodingList.emplace_back(pattern, encoding);
11970 }
11971 }
11972
11973 // add predefined macro name to a dictionary
11974 const StringVector &expandAsDefinedList =Config_getList(EXPAND_AS_DEFINED);
11975 for (const auto &s : expandAsDefinedList)
11976 {
11977 Doxygen::expandAsDefinedSet.insert(s.c_str());
11978 }
11979
11980 // read aliases and store them in a dictionary
11981 readAliases();
11982
11983 // store number of spaces in a tab into Doxygen::spaces
11984 int tabSize = Config_getInt(TAB_SIZE);
11985 Doxygen::spaces.resize(tabSize);
11986 for (int sp=0; sp<tabSize; sp++) Doxygen::spaces.at(sp)=' ';
11987 Doxygen::spaces.at(tabSize)='\0';
11988}
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:226
QCString lower() const
Definition qcstring.h:234
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:245
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:159
QCString left(size_t len) const
Definition qcstring.h:214
#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:5613

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

11854{
11855 AUTO_TRACE();
11856
11861}
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 11379 of file doxygen.cpp.

11380{
11384
11385 delete Doxygen::indexList;
11394 Doxygen::mainPage.reset();
11398 Doxygen::globalScope = nullptr;
11400 delete theTranslator;
11401 delete g_outputList;
11402
11407 delete Doxygen::dirLinkedMap;
11408 delete Doxygen::symbolMap;
11409}
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 13029 of file doxygen.cpp.

13030{
13031 AUTO_TRACE();
13032 /**************************************************************************
13033 * Initialize output generators *
13034 **************************************************************************/
13035
13036 /// add extra languages for which we can only produce syntax highlighted code
13038
13039 //// dump all symbols
13040 if (g_dumpSymbolMap)
13041 {
13042 dumpSymbolMap();
13043 exit(0);
13044 }
13045
13046 bool generateHtml = Config_getBool(GENERATE_HTML);
13047 bool generateLatex = Config_getBool(GENERATE_LATEX);
13048 bool generateMan = Config_getBool(GENERATE_MAN);
13049 bool generateRtf = Config_getBool(GENERATE_RTF);
13050 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13051
13052
13054 if (generateHtml)
13055 {
13059 }
13060 if (generateLatex)
13061 {
13064 }
13065 if (generateDocbook)
13066 {
13069 }
13070 if (generateMan)
13071 {
13072 g_outputList->add<ManGenerator>();
13074 }
13075 if (generateRtf)
13076 {
13077 g_outputList->add<RTFGenerator>();
13079 }
13080 if (Config_getBool(USE_HTAGS))
13081 {
13083 QCString htmldir = Config_getString(HTML_OUTPUT);
13084 if (!Htags::execute(htmldir))
13085 err("USE_HTAGS is YES but htags(1) failed. \n");
13086 else if (!Htags::loadFilemap(htmldir))
13087 err("htags(1) ended normally but failed to load the filemap. \n");
13088 }
13089
13090 /**************************************************************************
13091 * Generate documentation *
13092 **************************************************************************/
13093
13094 g_s.begin("Generating style sheet...\n");
13095 //printf("writing style info\n");
13096 g_outputList->writeStyleInfo(0); // write first part
13097 g_s.end();
13098
13099 bool searchEngine = Config_getBool(SEARCHENGINE);
13100 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13101
13102 g_s.begin("Generating search indices...\n");
13103 if (searchEngine && !serverBasedSearch && generateHtml)
13104 {
13106 }
13107
13108 // generate search indices (need to do this before writing other HTML
13109 // pages as these contain a drop down menu with options depending on
13110 // what categories we find in this function.
13111 if (generateHtml && searchEngine)
13112 {
13113 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13114 Dir searchDir(searchDirName.str());
13115 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13116 {
13117 term("Could not create search results directory '{}' $PWD='{}'\n",
13118 searchDirName,Dir::currentDirPath());
13119 }
13120 HtmlGenerator::writeSearchData(searchDirName);
13121 if (!serverBasedSearch) // client side search index
13122 {
13124 }
13125 }
13126 g_s.end();
13127
13128 // copy static stuff
13129 if (generateHtml)
13130 {
13132 copyLogo(Config_getString(HTML_OUTPUT));
13133 copyIcon(Config_getString(HTML_OUTPUT));
13134 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13135 }
13136 if (generateLatex)
13137 {
13139 copyLogo(Config_getString(LATEX_OUTPUT));
13140 copyIcon(Config_getString(LATEX_OUTPUT));
13141 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13142 }
13143 if (generateDocbook)
13144 {
13145 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13146 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13147 }
13148 if (generateRtf)
13149 {
13150 copyLogo(Config_getString(RTF_OUTPUT));
13151 copyIcon(Config_getString(RTF_OUTPUT));
13152 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13153 }
13154
13156 if (fm.hasFormulas() && generateHtml
13157 && !Config_getBool(USE_MATHJAX))
13158 {
13159 g_s.begin("Generating images for formulas in HTML...\n");
13160 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13162 g_s.end();
13163 }
13164 if (fm.hasFormulas() && generateRtf)
13165 {
13166 g_s.begin("Generating images for formulas in RTF...\n");
13168 g_s.end();
13169 }
13170
13171 if (fm.hasFormulas() && generateDocbook)
13172 {
13173 g_s.begin("Generating images for formulas in Docbook...\n");
13175 g_s.end();
13176 }
13177
13178 g_s.begin("Generating example documentation...\n");
13180 g_s.end();
13181
13182 g_s.begin("Generating file sources...\n");
13184 g_s.end();
13185
13186 g_s.begin("Generating file documentation...\n");
13188 g_s.end();
13189
13190 g_s.begin("Generating page documentation...\n");
13192 g_s.end();
13193
13194 g_s.begin("Generating group documentation...\n");
13196 g_s.end();
13197
13198 g_s.begin("Generating class documentation...\n");
13200 g_s.end();
13201
13202 g_s.begin("Generating concept documentation...\n");
13204 g_s.end();
13205
13206 g_s.begin("Generating module documentation...\n");
13208 g_s.end();
13209
13210 g_s.begin("Generating namespace documentation...\n");
13212 g_s.end();
13213
13214 if (Config_getBool(GENERATE_LEGEND))
13215 {
13216 g_s.begin("Generating graph info page...\n");
13218 g_s.end();
13219 }
13220
13221 g_s.begin("Generating directory documentation...\n");
13223 g_s.end();
13224
13225 if (g_outputList->size()>0)
13226 {
13228 }
13229
13230 g_s.begin("finalizing index lists...\n");
13231 Doxygen::indexList->finalize();
13232 g_s.end();
13233
13234 g_s.begin("writing tag file...\n");
13235 writeTagFile();
13236 g_s.end();
13237
13238 if (Config_getBool(GENERATE_XML))
13239 {
13240 g_s.begin("Generating XML output...\n");
13242 generateXML();
13244 g_s.end();
13245 }
13246 if (Config_getBool(GENERATE_SQLITE3))
13247 {
13248 g_s.begin("Generating SQLITE3 output...\n");
13250 g_s.end();
13251 }
13252
13253 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13254 {
13255 g_s.begin("Generating AutoGen DEF output...\n");
13256 generateDEF();
13257 g_s.end();
13258 }
13259 if (Config_getBool(GENERATE_PERLMOD))
13260 {
13261 g_s.begin("Generating Perl module output...\n");
13263 g_s.end();
13264 }
13265 if (generateHtml && searchEngine && serverBasedSearch)
13266 {
13267 g_s.begin("Generating search index\n");
13268 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13269 {
13271 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13272 }
13273 else // write data for external search index
13274 {
13276 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13277 if (searchDataFile.isEmpty())
13278 {
13279 searchDataFile="searchdata.xml";
13280 }
13281 if (!Portable::isAbsolutePath(searchDataFile.data()))
13282 {
13283 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13284 }
13285 Doxygen::searchIndex.write(searchDataFile);
13286 }
13287 g_s.end();
13288 }
13289
13290 if (generateRtf)
13291 {
13292 g_s.begin("Combining RTF output...\n");
13293 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13294 {
13295 err("An error occurred during post-processing the RTF files!\n");
13296 }
13297 g_s.end();
13298 }
13299
13300 g_s.begin("Running plantuml with JAVA...\n");
13302 g_s.end();
13303
13304 if (Config_getBool(HAVE_DOT))
13305 {
13306 g_s.begin("Running dot...\n");
13308 g_s.end();
13309 }
13310
13311 if (generateHtml &&
13312 Config_getBool(GENERATE_HTMLHELP) &&
13313 !Config_getString(HHC_LOCATION).isEmpty())
13314 {
13315 g_s.begin("Running html help compiler...\n");
13317 g_s.end();
13318 }
13319
13320 if ( generateHtml &&
13321 Config_getBool(GENERATE_QHP) &&
13322 !Config_getString(QHG_LOCATION).isEmpty())
13323 {
13324 g_s.begin("Running qhelpgenerator...\n");
13326 g_s.end();
13327 }
13328
13329 g_outputList->cleanup();
13330
13331 msg("type lookup cache used {}/{} hits={} misses={}\n",
13333 Doxygen::typeLookupCache->capacity(),
13335 Doxygen::typeLookupCache->misses());
13336 msg("symbol lookup cache used {}/{} hits={} misses={}\n",
13338 Doxygen::symbolLookupCache->capacity(),
13340 Doxygen::symbolLookupCache->misses());
13341 int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
13342 int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
13343 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13344 if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
13345 {
13346 msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13347 }
13348
13350 {
13351
13352 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13353 if (numThreads<1) numThreads=1;
13354 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13355 (static_cast<double>(Debug::elapsedTime())),
13356 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13357 );
13358 g_s.print();
13359
13361 msg("finished...\n");
13363 }
13364 else
13365 {
13366 msg("finished...\n");
13367 }
13368
13369
13370 /**************************************************************************
13371 * Start cleaning up *
13372 **************************************************************************/
13373
13375
13377 Dir thisDir;
13378 thisDir.remove(Doxygen::filterDBFileName.str());
13380 exitTracing();
13382 delete Doxygen::clangUsrMap;
13384
13385 //dumpDocNodeSizes();
13386}
@ 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:1160
static void writeSearchPage()
Definition htmlgen.cpp:3123
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1311
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1320
static void writeExternalSearchPage()
Definition htmlgen.cpp:3222
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:314
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:407
const std::string & str() const
Definition qcstring.h:537
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:1176
static void copyLatexStyleSheet()
static void runQHelpGenerator()
class Statistics g_s
static void copyStyleSheet()
static void generateGroupDocs()
Definition doxygen.cpp:9991
static void generateExampleDocs()
Definition doxygen.cpp:9947
static void dumpSymbolMap()
static void generateFileDocs()
Definition doxygen.cpp:8667
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9862
static void generateFileSources()
Definition doxygen.cpp:8501
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9093
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:9119
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4063
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5761
void finishWarnExit()
Definition message.cpp:295
void deinit()
bool isAbsolutePath(const QCString &fileName)
Definition portable.cpp:514
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:5712
void generateXML()
Definition xmlgen.cpp:2196

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

11311{
11312 initResources();
11313 QCString lang = Portable::getenv("LC_ALL");
11314 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11315 std::setlocale(LC_ALL,"");
11316 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11317 std::setlocale(LC_NUMERIC,"C");
11318
11320
11344
11345 // register any additional parsers here...
11346
11348
11349#if USE_LIBCLANG
11351#endif
11360 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11361 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11362 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11364
11365 // initialization of these globals depends on
11366 // configuration switches so we need to postpone these
11367 Doxygen::globalScope = nullptr;
11376
11377}
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:303
QCString getenv(const QCString &variable)
Definition portable.cpp:338
void initDefaultExtensionMapping()
Definition util.cpp:5645

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

12355{
12356 AUTO_TRACE();
12357 std::atexit(exitDoxygen);
12358
12359 Portable::correctPath(Config_getList(EXTERNAL_TOOL_PATH));
12360
12361#if USE_LIBCLANG
12362 Doxygen::clangAssistedParsing = Config_getBool(CLANG_ASSISTED_PARSING);
12363#endif
12364
12365 // we would like to show the versionString earlier, but we first have to handle the configuration file
12366 // to know the value of the QUIET setting.
12367 QCString versionString = getFullVersion();
12368 msg("Doxygen version used: {}\n",versionString);
12369
12371
12372 /**************************************************************************
12373 * Make sure the output directory exists
12374 **************************************************************************/
12375 QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
12376 if (!g_singleComment)
12377 {
12378 if (outputDirectory.isEmpty())
12379 {
12380 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,Dir::currentDirPath().c_str());
12381 }
12382 else
12383 {
12384 Dir dir(outputDirectory.str());
12385 if (!dir.exists())
12386 {
12387 dir.setPath(Dir::currentDirPath());
12388 if (!dir.mkdir(outputDirectory.str()))
12389 {
12390 term("tag OUTPUT_DIRECTORY: Output directory '{}' does not "
12391 "exist and cannot be created\n",outputDirectory);
12392 }
12393 else
12394 {
12395 msg("Notice: Output directory '{}' does not exist. "
12396 "I have created it for you.\n", outputDirectory);
12397 }
12398 dir.setPath(outputDirectory.str());
12399 }
12400 outputDirectory = Config_updateString(OUTPUT_DIRECTORY,dir.absPath().c_str());
12401 }
12402 }
12403 AUTO_TRACE_ADD("outputDirectory={}",outputDirectory);
12404
12405 /**************************************************************************
12406 * Initialize global lists and dictionaries
12407 **************************************************************************/
12408
12409 // also scale lookup cache with SYMBOL_CACHE_SIZE
12410 int cacheSize = Config_getInt(LOOKUP_CACHE_SIZE);
12411 if (cacheSize<0) cacheSize=0;
12412 if (cacheSize>9) cacheSize=9;
12413 uint32_t lookupSize = 65536 << cacheSize;
12416
12417#ifdef HAS_SIGNALS
12418 signal(SIGINT, stopDoxygen);
12419#endif
12420
12421 uint32_t pid = Portable::pid();
12422 Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid);
12423 Doxygen::filterDBFileName.prepend(outputDirectory+"/");
12424
12425 /**************************************************************************
12426 * Check/create output directories *
12427 **************************************************************************/
12428
12429 bool generateHtml = Config_getBool(GENERATE_HTML);
12430 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
12431 bool generateXml = Config_getBool(GENERATE_XML);
12432 bool generateLatex = Config_getBool(GENERATE_LATEX);
12433 bool generateRtf = Config_getBool(GENERATE_RTF);
12434 bool generateMan = Config_getBool(GENERATE_MAN);
12435 bool generateSql = Config_getBool(GENERATE_SQLITE3);
12436 QCString htmlOutput;
12437 QCString docbookOutput;
12438 QCString xmlOutput;
12439 QCString latexOutput;
12440 QCString rtfOutput;
12441 QCString manOutput;
12442 QCString sqlOutput;
12443
12444 if (!g_singleComment)
12445 {
12446 if (generateHtml)
12447 {
12448 htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html");
12449 Config_updateString(HTML_OUTPUT,htmlOutput);
12450
12451 QCString sitemapUrl = Config_getString(SITEMAP_URL);
12452 bool generateSitemap = !sitemapUrl.isEmpty();
12453 if (generateSitemap && !sitemapUrl.endsWith("/"))
12454 {
12455 Config_updateString(SITEMAP_URL,sitemapUrl+"/");
12456 }
12457
12458 // add HTML indexers that are enabled
12459 bool generateHtmlHelp = Config_getBool(GENERATE_HTMLHELP);
12460 bool generateEclipseHelp = Config_getBool(GENERATE_ECLIPSEHELP);
12461 bool generateQhp = Config_getBool(GENERATE_QHP);
12462 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
12463 bool generateDocSet = Config_getBool(GENERATE_DOCSET);
12464 if (generateEclipseHelp) Doxygen::indexList->addIndex<EclipseHelp>();
12465 if (generateHtmlHelp) Doxygen::indexList->addIndex<HtmlHelp>();
12466 if (generateQhp) Doxygen::indexList->addIndex<Qhp>();
12467 if (generateSitemap) Doxygen::indexList->addIndex<Sitemap>();
12468 if (generateTreeView) Doxygen::indexList->addIndex<FTVHelp>(TRUE);
12469 if (generateDocSet) Doxygen::indexList->addIndex<DocSets>();
12470 Doxygen::indexList->addIndex<Crawlmap>();
12471 Doxygen::indexList->initialize();
12472 }
12473
12474 if (generateDocbook)
12475 {
12476 docbookOutput = createOutputDirectory(outputDirectory,Config_getString(DOCBOOK_OUTPUT),"/docbook");
12477 Config_updateString(DOCBOOK_OUTPUT,docbookOutput);
12478 }
12479
12480 if (generateXml)
12481 {
12482 xmlOutput = createOutputDirectory(outputDirectory,Config_getString(XML_OUTPUT),"/xml");
12483 Config_updateString(XML_OUTPUT,xmlOutput);
12484 }
12485
12486 if (generateLatex)
12487 {
12488 latexOutput = createOutputDirectory(outputDirectory,Config_getString(LATEX_OUTPUT), "/latex");
12489 Config_updateString(LATEX_OUTPUT,latexOutput);
12490 }
12491
12492 if (generateRtf)
12493 {
12494 rtfOutput = createOutputDirectory(outputDirectory,Config_getString(RTF_OUTPUT),"/rtf");
12495 Config_updateString(RTF_OUTPUT,rtfOutput);
12496 }
12497
12498 if (generateMan)
12499 {
12500 manOutput = createOutputDirectory(outputDirectory,Config_getString(MAN_OUTPUT),"/man");
12501 Config_updateString(MAN_OUTPUT,manOutput);
12502 }
12503
12504 if (generateSql)
12505 {
12506 sqlOutput = createOutputDirectory(outputDirectory,Config_getString(SQLITE3_OUTPUT),"/sqlite3");
12507 Config_updateString(SQLITE3_OUTPUT,sqlOutput);
12508 }
12509 }
12510
12511 if (Config_getBool(HAVE_DOT))
12512 {
12513 QCString curFontPath = Config_getString(DOT_FONTPATH);
12514 if (curFontPath.isEmpty())
12515 {
12516 Portable::getenv("DOTFONTPATH");
12517 QCString newFontPath = ".";
12518 if (!curFontPath.isEmpty())
12519 {
12520 newFontPath+=Portable::pathListSeparator();
12521 newFontPath+=curFontPath;
12522 }
12523 Portable::setenv("DOTFONTPATH",qPrint(newFontPath));
12524 }
12525 else
12526 {
12527 Portable::setenv("DOTFONTPATH",qPrint(curFontPath));
12528 }
12529 }
12530
12531 /**************************************************************************
12532 * Handle layout file *
12533 **************************************************************************/
12534
12536 QCString layoutFileName = Config_getString(LAYOUT_FILE);
12537 bool defaultLayoutUsed = FALSE;
12538 if (layoutFileName.isEmpty())
12539 {
12540 layoutFileName = Config_updateString(LAYOUT_FILE,"DoxygenLayout.xml");
12541 defaultLayoutUsed = TRUE;
12542 }
12543 AUTO_TRACE_ADD("defaultLayoutUsed={}, layoutFileName={}",defaultLayoutUsed,layoutFileName);
12544
12545 FileInfo fi(layoutFileName.str());
12546 if (fi.exists())
12547 {
12548 msg("Parsing layout file {}...\n",layoutFileName);
12549 LayoutDocManager::instance().parse(layoutFileName);
12550 }
12551 else if (!defaultLayoutUsed)
12552 {
12553 warn_uncond("failed to open layout file '{}' for reading! Using default settings.\n",layoutFileName);
12554 }
12555 printLayout();
12556
12557 /**************************************************************************
12558 * Read and preprocess input *
12559 **************************************************************************/
12560
12561 // prevent search in the output directories
12562 StringVector exclPatterns = Config_getList(EXCLUDE_PATTERNS);
12563 if (generateHtml) exclPatterns.push_back(htmlOutput.str());
12564 if (generateDocbook) exclPatterns.push_back(docbookOutput.str());
12565 if (generateXml) exclPatterns.push_back(xmlOutput.str());
12566 if (generateLatex) exclPatterns.push_back(latexOutput.str());
12567 if (generateRtf) exclPatterns.push_back(rtfOutput.str());
12568 if (generateMan) exclPatterns.push_back(manOutput.str());
12569 Config_updateList(EXCLUDE_PATTERNS,exclPatterns);
12570
12571 if (!g_singleComment)
12572 {
12574
12576 }
12577
12578 // Notice: the order of the function calls below is very important!
12579
12580 if (generateHtml && !Config_getBool(USE_MATHJAX))
12581 {
12583 }
12584 if (generateRtf)
12585 {
12587 }
12588 if (generateDocbook)
12589 {
12591 }
12592
12594
12595 /**************************************************************************
12596 * Handle Tag Files *
12597 **************************************************************************/
12598
12599 std::shared_ptr<Entry> root = std::make_shared<Entry>();
12600
12601 if (!g_singleComment)
12602 {
12603 msg("Reading and parsing tag files\n");
12604 const StringVector &tagFileList = Config_getList(TAGFILES);
12605 for (const auto &s : tagFileList)
12606 {
12607 readTagFile(root,s.c_str());
12608 }
12609 }
12610
12611 /**************************************************************************
12612 * Parse source files *
12613 **************************************************************************/
12614
12615 addSTLSupport(root);
12616
12617 g_s.begin("Parsing files\n");
12618 if (g_singleComment)
12619 {
12620 //printf("Parsing comment %s\n",qPrint(g_commentFileName));
12621 if (g_commentFileName=="-")
12622 {
12623 std::string text = fileToString(g_commentFileName).str();
12624 addTerminalCharIfMissing(text,'\n');
12625 generateHtmlForComment("stdin.md",text);
12626 }
12627 else if (FileInfo(g_commentFileName.str()).isFile())
12628 {
12629 std::string text;
12631 addTerminalCharIfMissing(text,'\n');
12633 }
12634 else
12635 {
12636 }
12638 exit(0);
12639 }
12640 else
12641 {
12642 if (Config_getInt(NUM_PROC_THREADS)==1)
12643 {
12645 }
12646 else
12647 {
12649 }
12650 }
12651 g_s.end();
12652
12653 /**************************************************************************
12654 * Gather information *
12655 **************************************************************************/
12656
12657 g_s.begin("Building macro definition list...\n");
12659 g_s.end();
12660
12661 g_s.begin("Building group list...\n");
12662 buildGroupList(root.get());
12663 organizeSubGroups(root.get());
12664 g_s.end();
12665
12666 g_s.begin("Building directory list...\n");
12668 findDirDocumentation(root.get());
12669 g_s.end();
12670
12671 g_s.begin("Building namespace list...\n");
12672 buildNamespaceList(root.get());
12673 findUsingDirectives(root.get());
12674 g_s.end();
12675
12676 g_s.begin("Building file list...\n");
12677 buildFileList(root.get());
12678 g_s.end();
12679
12680 g_s.begin("Building class list...\n");
12681 buildClassList(root.get());
12682 g_s.end();
12683
12684 g_s.begin("Building concept list...\n");
12685 buildConceptList(root.get());
12686 g_s.end();
12687
12688 // build list of using declarations here (global list)
12689 buildListOfUsingDecls(root.get());
12690 g_s.end();
12691
12692 g_s.begin("Computing nesting relations for classes...\n");
12694 g_s.end();
12695 // 1.8.2-20121111: no longer add nested classes to the group as well
12696 //distributeClassGroupRelations();
12697
12698 // calling buildClassList may result in cached relations that
12699 // become invalid after resolveClassNestingRelations(), that's why
12700 // we need to clear the cache here
12701 Doxygen::typeLookupCache->clear();
12702 // we don't need the list of using declaration anymore
12703 g_usingDeclarations.clear();
12704
12705 g_s.begin("Associating documentation with classes...\n");
12706 buildClassDocList(root.get());
12707 g_s.end();
12708
12709 g_s.begin("Associating documentation with concepts...\n");
12710 buildConceptDocList(root.get());
12712 g_s.end();
12713
12714 g_s.begin("Associating documentation with modules...\n");
12715 findModuleDocumentation(root.get());
12716 g_s.end();
12717
12718 g_s.begin("Building example list...\n");
12719 buildExampleList(root.get());
12720 g_s.end();
12721
12722 g_s.begin("Searching for enumerations...\n");
12723 findEnums(root.get());
12724 g_s.end();
12725
12726 // Since buildVarList calls isVarWithConstructor
12727 // and this calls getResolvedClass we need to process
12728 // typedefs first so the relations between classes via typedefs
12729 // are properly resolved. See bug 536385 for an example.
12730 g_s.begin("Searching for documented typedefs...\n");
12731 buildTypedefList(root.get());
12732 g_s.end();
12733
12734 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
12735 {
12736 g_s.begin("Searching for documented sequences...\n");
12737 buildSequenceList(root.get());
12738 g_s.end();
12739
12740 g_s.begin("Searching for documented dictionaries...\n");
12741 buildDictionaryList(root.get());
12742 g_s.end();
12743 }
12744
12745 g_s.begin("Searching for members imported via using declarations...\n");
12746 // this should be after buildTypedefList in order to properly import
12747 // used typedefs
12748 findUsingDeclarations(root.get(),TRUE); // do for python packages first
12749 findUsingDeclarations(root.get(),FALSE); // then the rest
12750 g_s.end();
12751
12752 g_s.begin("Searching for included using directives...\n");
12754 g_s.end();
12755
12756 g_s.begin("Searching for documented variables...\n");
12757 buildVarList(root.get());
12758 g_s.end();
12759
12760 g_s.begin("Building interface member list...\n");
12761 buildInterfaceAndServiceList(root.get()); // UNO IDL
12762
12763 g_s.begin("Building member list...\n"); // using class info only !
12764 buildFunctionList(root.get());
12765 g_s.end();
12766
12767 g_s.begin("Searching for friends...\n");
12768 findFriends();
12769 g_s.end();
12770
12771 g_s.begin("Searching for documented defines...\n");
12772 findDefineDocumentation(root.get());
12773 g_s.end();
12774
12775 g_s.begin("Computing class inheritance relations...\n");
12776 findClassEntries(root.get());
12778 g_s.end();
12779
12780 g_s.begin("Computing class usage relations...\n");
12782 g_s.end();
12783
12784 if (Config_getBool(INLINE_SIMPLE_STRUCTS))
12785 {
12786 g_s.begin("Searching for tag less structs...\n");
12788 g_s.end();
12789 }
12790
12791 g_s.begin("Flushing cached template relations that have become invalid...\n");
12793 g_s.end();
12794
12795 g_s.begin("Warn for undocumented namespaces...\n");
12797 g_s.end();
12798
12799 g_s.begin("Computing class relations...\n");
12802 if (Config_getBool(OPTIMIZE_OUTPUT_VHDL))
12803 {
12805 }
12807 g_classEntries.clear();
12808 g_s.end();
12809
12810 g_s.begin("Add enum values to enums...\n");
12811 addEnumValuesToEnums(root.get());
12812 findEnumDocumentation(root.get());
12813 g_s.end();
12814
12815 g_s.begin("Searching for member function documentation...\n");
12816 findObjCMethodDefinitions(root.get());
12817 findMemberDocumentation(root.get()); // may introduce new members !
12818 findUsingDeclImports(root.get()); // may introduce new members !
12819 g_usingClassMap.clear();
12823 g_s.end();
12824
12825 // moved to after finding and copying documentation,
12826 // as this introduces new members see bug 722654
12827 g_s.begin("Creating members for template instances...\n");
12829 g_s.end();
12830
12831 g_s.begin("Building page list...\n");
12832 buildPageList(root.get());
12833 g_s.end();
12834
12835 g_s.begin("Search for main page...\n");
12836 findMainPage(root.get());
12837 findMainPageTagFiles(root.get());
12838 g_s.end();
12839
12840 g_s.begin("Computing page relations...\n");
12841 computePageRelations(root.get());
12843 g_s.end();
12844
12845 g_s.begin("Determining the scope of groups...\n");
12846 findGroupScope(root.get());
12847 g_s.end();
12848
12849 g_s.begin("Computing module relations...\n");
12850 auto &mm = ModuleManager::instance();
12851 mm.resolvePartitions();
12852 mm.resolveImports();
12853 mm.collectExportedSymbols();
12854 g_s.end();
12855
12856 auto memberNameComp = [](const MemberNameLinkedMap::Ptr &n1,const MemberNameLinkedMap::Ptr &n2)
12857 {
12858 return qstricmp_sort(n1->memberName().data()+getPrefixIndex(n1->memberName()),
12859 n2->memberName().data()+getPrefixIndex(n2->memberName())
12860 )<0;
12861 };
12862
12863 auto classComp = [](const ClassLinkedMap::Ptr &c1,const ClassLinkedMap::Ptr &c2)
12864 {
12865 if (Config_getBool(SORT_BY_SCOPE_NAME))
12866 {
12867 return qstricmp_sort(c1->name(), c2->name())<0;
12868 }
12869 else
12870 {
12871 int i = qstricmp_sort(c1->className(), c2->className());
12872 return i==0 ? qstricmp_sort(c1->name(), c2->name())<0 : i<0;
12873 }
12874 };
12875
12876 auto namespaceComp = [](const NamespaceLinkedMap::Ptr &n1,const NamespaceLinkedMap::Ptr &n2)
12877 {
12878 return qstricmp_sort(n1->name(),n2->name())<0;
12879 };
12880
12881 auto conceptComp = [](const ConceptLinkedMap::Ptr &c1,const ConceptLinkedMap::Ptr &c2)
12882 {
12883 return qstricmp_sort(c1->name(),c2->name())<0;
12884 };
12885
12886 g_s.begin("Sorting lists...\n");
12887 std::stable_sort(Doxygen::memberNameLinkedMap->begin(),
12889 memberNameComp);
12890 std::stable_sort(Doxygen::functionNameLinkedMap->begin(),
12892 memberNameComp);
12893 std::stable_sort(Doxygen::hiddenClassLinkedMap->begin(),
12895 classComp);
12896 std::stable_sort(Doxygen::classLinkedMap->begin(),
12898 classComp);
12899 std::stable_sort(Doxygen::conceptLinkedMap->begin(),
12901 conceptComp);
12902 std::stable_sort(Doxygen::namespaceLinkedMap->begin(),
12904 namespaceComp);
12905 g_s.end();
12906
12907 g_s.begin("Determining which enums are documented\n");
12909 g_s.end();
12910
12911 g_s.begin("Computing member relations...\n");
12914 g_s.end();
12915
12916 g_s.begin("Building full member lists recursively...\n");
12918 g_s.end();
12919
12920 g_s.begin("Adding members to member groups.\n");
12922 g_s.end();
12923
12924 if (Config_getBool(DISTRIBUTE_GROUP_DOC))
12925 {
12926 g_s.begin("Distributing member group documentation.\n");
12928 g_s.end();
12929 }
12930
12931 g_s.begin("Computing member references...\n");
12933 g_s.end();
12934
12935 if (Config_getBool(INHERIT_DOCS))
12936 {
12937 g_s.begin("Inheriting documentation...\n");
12939 g_s.end();
12940 }
12941
12942
12943 // compute the shortest possible names of all files
12944 // without losing the uniqueness of the file names.
12945 g_s.begin("Generating disk names...\n");
12947 g_s.end();
12948
12949 g_s.begin("Adding source references...\n");
12951 g_s.end();
12952
12953 g_s.begin("Adding xrefitems...\n");
12956 g_s.end();
12957
12958 g_s.begin("Sorting member lists...\n");
12960 g_s.end();
12961
12962 g_s.begin("Setting anonymous enum type...\n");
12964 g_s.end();
12965
12966 g_s.begin("Computing dependencies between directories...\n");
12968 g_s.end();
12969
12970 g_s.begin("Generating citations page...\n");
12972 g_s.end();
12973
12974 g_s.begin("Counting members...\n");
12975 countMembers();
12976 g_s.end();
12977
12978 g_s.begin("Counting data structures...\n");
12980 g_s.end();
12981
12982 g_s.begin("Resolving user defined references...\n");
12984 g_s.end();
12985
12986 g_s.begin("Finding anchors and sections in the documentation...\n");
12988 g_s.end();
12989
12990 g_s.begin("Transferring function references...\n");
12992 g_s.end();
12993
12994 g_s.begin("Combining using relations...\n");
12996 g_s.end();
12997
12999 g_s.begin("Adding members to index pages...\n");
13001 addToIndices();
13002 g_s.end();
13003
13004 g_s.begin("Correcting members for VHDL...\n");
13006 g_s.end();
13007
13008 g_s.begin("Computing tooltip texts...\n");
13010 g_s.end();
13011
13012 if (Config_getBool(SORT_GROUP_NAMES))
13013 {
13014 std::stable_sort(Doxygen::groupLinkedMap->begin(),
13016 [](const auto &g1,const auto &g2)
13017 { return g1->groupTitle() < g2->groupTitle(); });
13018
13019 for (const auto &gd : *Doxygen::groupLinkedMap)
13020 {
13021 gd->sortSubGroups();
13022 }
13023 }
13024
13025 printNavTree(root.get(),0);
13027}
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:509
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:1085
void computeDirDependencies()
Definition dirdef.cpp:1159
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:47
static void findInheritedTemplateInstances()
Definition doxygen.cpp:5245
void printNavTree(Entry *root, int indent)
Definition doxygen.cpp:9908
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:9335
static void computeTemplateClassRelations()
Definition doxygen.cpp:5339
void printSectionsTree()
Definition doxygen.cpp:9931
static void generateXRefPages()
Definition doxygen.cpp:5511
static void findUsingDeclImports(const Entry *root)
Definition doxygen.cpp:2158
static void findDirDocumentation(const Entry *root)
Definition doxygen.cpp:9572
static void warnUndocumentedNamespaces()
Definition doxygen.cpp:5294
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:5208
static void vhdlCorrectMemberProperties()
Definition doxygen.cpp:8302
static void stopDoxygen(int)
static void computeMemberReferences()
Definition doxygen.cpp:5408
static void transferRelatedFunctionDocumentation()
Definition doxygen.cpp:4364
static void addMembersToMemberGroup()
Definition doxygen.cpp:9200
static void findMainPageTagFiles(Entry *root)
Definition doxygen.cpp:9732
static void distributeConceptGroups()
Definition doxygen.cpp:1298
static void transferFunctionDocumentation()
Definition doxygen.cpp:4283
static void setAnonymousEnumType()
Definition doxygen.cpp:8940
static void sortMemberLists()
Definition doxygen.cpp:8845
static void createTemplateInstanceMembers()
Definition doxygen.cpp:8430
void transferStaticInstanceInitializers()
Definition doxygen.cpp:4413
static void findObjCMethodDefinitions(const Entry *root)
Definition doxygen.cpp:7445
static void buildTypedefList(const Entry *root)
Definition doxygen.cpp:3354
static void findGroupScope(const Entry *root)
Definition doxygen.cpp:440
static void findDefineDocumentation(Entry *root)
Definition doxygen.cpp:9486
static void findMemberDocumentation(const Entry *root)
Definition doxygen.cpp:7415
static void distributeMemberGroupDocumentation()
Definition doxygen.cpp:9238
static void addEnumValuesToEnums(const Entry *root)
Definition doxygen.cpp:7648
static void resolveUserReferences()
Definition doxygen.cpp:9794
static void buildVarList(const Entry *root)
Definition doxygen.cpp:3490
static void buildSequenceList(const Entry *root)
Definition doxygen.cpp:3453
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:8954
static void organizeSubGroups(const Entry *root)
Definition doxygen.cpp:484
void searchInputFiles()
static void findFriends()
Definition doxygen.cpp:4186
static void findEnums(const Entry *root)
Definition doxygen.cpp:7473
static void addListReferences()
Definition doxygen.cpp:5442
static void exitDoxygen() noexcept
static void addMembersToIndex()
Definition doxygen.cpp:8092
static void findMainPage(Entry *root)
Definition doxygen.cpp:9662
static void findUsingDirectives(const Entry *root)
Definition doxygen.cpp:1850
static void addSourceReferences()
Definition doxygen.cpp:8727
static void buildExampleList(Entry *root)
Definition doxygen.cpp:9879
static void inheritDocumentation()
Definition doxygen.cpp:9140
static void flushUnresolvedRelations()
Definition doxygen.cpp:9389
static QCString g_commentFileName
Definition doxygen.cpp:192
static void findDocumentedEnumValues()
Definition doxygen.cpp:8084
static void findTagLessClasses()
Definition doxygen.cpp:1646
static void generateDiskNames()
static void addToIndices()
Definition doxygen.cpp:8134
static void computeClassRelations()
Definition doxygen.cpp:5314
static void buildFunctionList(const Entry *root)
Definition doxygen.cpp:3880
static void checkPageRelations()
Definition doxygen.cpp:9774
static void findModuleDocumentation(const Entry *root)
Definition doxygen.cpp:1266
static void findEnumDocumentation(const Entry *root)
Definition doxygen.cpp:7972
static void computePageRelations(Entry *root)
Definition doxygen.cpp:9744
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:3471
static void buildClassDocList(const Entry *root)
Definition doxygen.cpp:1137
static void buildPageList(Entry *root)
Definition doxygen.cpp:9635
static void computeVerifiedDotPath()
static bool g_singleComment
Definition doxygen.cpp:193
static void findSectionsInDocumentation()
Definition doxygen.cpp:9276
static void mergeCategories()
Definition doxygen.cpp:8449
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:5278
static void computeTooltipTexts()
Definition doxygen.cpp:8894
static void parseFilesSingleThreading(const std::shared_ptr< Entry > &root)
parse the list of input files
static void buildCompleteMemberLists()
Definition doxygen.cpp:8471
static void combineUsingRelations()
Definition doxygen.cpp:9175
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:4316
static void buildDefineList()
Definition doxygen.cpp:8806
static void buildInterfaceAndServiceList(const Entry *root)
Definition doxygen.cpp:3584
static void computeMemberRelations()
Definition doxygen.cpp:8414
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:533
QCString pathListSeparator()
Definition portable.cpp:400
uint32_t pid()
Definition portable.cpp:265
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:672
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:6047
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1442
int getPrefixIndex(const QCString &name)
Definition util.cpp:3749

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

11424{
11425 QCString versionString = getFullVersion();
11426
11427 // helper that calls \a func to write to file \a fileName via a TextStream
11428 auto writeFile = [](const char *fileName,std::function<void(TextStream&)> func) -> bool
11429 {
11430 std::ofstream f;
11431 if (openOutputFile(fileName,f))
11432 {
11433 TextStream t(&f);
11434 func(t);
11435 return true;
11436 }
11437 return false;
11438 };
11439
11440
11441 /**************************************************************************
11442 * Handle arguments *
11443 **************************************************************************/
11444
11445 int optInd=1;
11446 QCString configName;
11447 QCString traceName;
11448 bool genConfig=false;
11449 bool shortList=false;
11450 bool traceTiming=false;
11452 bool updateConfig=false;
11453 bool quiet = false;
11454 while (optInd<argc && argv[optInd][0]=='-' &&
11455 (isalpha(argv[optInd][1]) || argv[optInd][1]=='?' ||
11456 argv[optInd][1]=='-')
11457 )
11458 {
11459 switch(argv[optInd][1])
11460 {
11461 case 'g':
11462 {
11463 genConfig=TRUE;
11464 }
11465 break;
11466 case 'l':
11467 {
11468 QCString layoutName;
11469 if (optInd+1>=argc)
11470 {
11471 layoutName="DoxygenLayout.xml";
11472 }
11473 else
11474 {
11475 layoutName=argv[optInd+1];
11476 }
11477 writeDefaultLayoutFile(layoutName);
11479 exit(0);
11480 }
11481 break;
11482 case 'c':
11483 if (optInd+1>=argc) // no file name given
11484 {
11485 msg("option \"-c\" is missing the file name to read\n");
11486 devUsage();
11488 exit(1);
11489 }
11490 else
11491 {
11492 g_commentFileName=argv[optInd+1];
11493 optInd++;
11494 }
11495 g_singleComment=true;
11496 quiet=true;
11497 break;
11498 case 'd':
11499 {
11500 QCString debugLabel=getArg(argc,argv,optInd);
11501 if (debugLabel.isEmpty())
11502 {
11503 devUsage();
11505 exit(0);
11506 }
11507 int retVal = Debug::setFlagStr(debugLabel);
11508 if (!retVal)
11509 {
11510 msg("option \"-d\" has unknown debug specifier: \"{}\".\n",debugLabel);
11511 devUsage();
11513 exit(1);
11514 }
11515 }
11516 break;
11517 case 't':
11518 {
11519#if ENABLE_TRACING
11520 if (!strcmp(argv[optInd]+1,"t_time"))
11521 {
11522 traceTiming = true;
11523 }
11524 else if (!strcmp(argv[optInd]+1,"t"))
11525 {
11526 traceTiming = false;
11527 }
11528 else
11529 {
11530 err("option should be \"-t\" or \"-t_time\", found: \"{}\".\n",argv[optInd]);
11532 exit(1);
11533 }
11534 if (optInd+1>=argc || argv[optInd+1][0] == '-') // no file name given
11535 {
11536 traceName="stdout";
11537 }
11538 else
11539 {
11540 traceName=argv[optInd+1];
11541 optInd++;
11542 }
11543#else
11544 err("support for option \"-t\" has not been compiled in (use a debug build or a release build with tracing enabled).\n");
11546 exit(1);
11547#endif
11548 }
11549 break;
11550 case 'x':
11551 if (!strcmp(argv[optInd]+1,"x_noenv")) diffList=Config::CompareMode::CompressedNoEnv;
11552 else if (!strcmp(argv[optInd]+1,"x")) diffList=Config::CompareMode::Compressed;
11553 else
11554 {
11555 err("option should be \"-x\" or \"-x_noenv\", found: \"{}\".\n",argv[optInd]);
11557 exit(1);
11558 }
11559 break;
11560 case 's':
11561 shortList=TRUE;
11562 break;
11563 case 'u':
11564 updateConfig=TRUE;
11565 break;
11566 case 'e':
11567 {
11568 QCString formatName=getArg(argc,argv,optInd);
11569 if (formatName.isEmpty())
11570 {
11571 err("option \"-e\" is missing format specifier rtf.\n");
11573 exit(1);
11574 }
11575 if (qstricmp(formatName.data(),"rtf")==0)
11576 {
11577 if (optInd+1>=argc)
11578 {
11579 err("option \"-e rtf\" is missing an extensions file name\n");
11581 exit(1);
11582 }
11583 writeFile(argv[optInd+1],RTFGenerator::writeExtensionsFile);
11585 exit(0);
11586 }
11587 err("option \"-e\" has invalid format specifier.\n");
11589 exit(1);
11590 }
11591 break;
11592 case 'f':
11593 {
11594 QCString listName=getArg(argc,argv,optInd);
11595 if (listName.isEmpty())
11596 {
11597 err("option \"-f\" is missing list specifier.\n");
11599 exit(1);
11600 }
11601 if (qstricmp(listName.data(),"emoji")==0)
11602 {
11603 if (optInd+1>=argc)
11604 {
11605 err("option \"-f emoji\" is missing an output file name\n");
11607 exit(1);
11608 }
11609 writeFile(argv[optInd+1],[](TextStream &t) { EmojiEntityMapper::instance().writeEmojiFile(t); });
11611 exit(0);
11612 }
11613 err("option \"-f\" has invalid list specifier.\n");
11615 exit(1);
11616 }
11617 break;
11618 case 'w':
11619 {
11620 QCString formatName=getArg(argc,argv,optInd);
11621 if (formatName.isEmpty())
11622 {
11623 err("option \"-w\" is missing format specifier rtf, html or latex\n");
11625 exit(1);
11626 }
11627 if (qstricmp(formatName.data(),"rtf")==0)
11628 {
11629 if (optInd+1>=argc)
11630 {
11631 err("option \"-w rtf\" is missing a style sheet file name\n");
11633 exit(1);
11634 }
11635 if (!writeFile(argv[optInd+1],RTFGenerator::writeStyleSheetFile))
11636 {
11637 err("error opening RTF style sheet file {}!\n",argv[optInd+1]);
11639 exit(1);
11640 }
11642 exit(0);
11643 }
11644 else if (qstricmp(formatName.data(),"html")==0)
11645 {
11646 Config::init();
11647 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11648 // explicit config file mentioned or default found on disk
11649 {
11650 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11651 if (!Config::parse(df)) // parse the config file
11652 {
11653 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11655 exit(1);
11656 }
11657 }
11658 if (optInd+3>=argc)
11659 {
11660 err("option \"-w html\" does not have enough arguments\n");
11662 exit(1);
11663 }
11667 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11668 writeFile(argv[optInd+1],[&](TextStream &t) { HtmlGenerator::writeHeaderFile(t,argv[optInd+3]); });
11669 writeFile(argv[optInd+2],HtmlGenerator::writeFooterFile);
11670 writeFile(argv[optInd+3],HtmlGenerator::writeStyleSheetFile);
11672 exit(0);
11673 }
11674 else if (qstricmp(formatName.data(),"latex")==0)
11675 {
11676 Config::init();
11677 if (optInd+4<argc || FileInfo("Doxyfile").exists() || FileInfo("doxyfile").exists())
11678 {
11679 QCString df = optInd+4<argc ? argv[optInd+4] : (FileInfo("Doxyfile").exists() ? QCString("Doxyfile") : QCString("doxyfile"));
11680 if (!Config::parse(df))
11681 {
11682 err("error opening or reading configuration file {}!\n",argv[optInd+4]);
11684 exit(1);
11685 }
11686 }
11687 if (optInd+3>=argc)
11688 {
11689 err("option \"-w latex\" does not have enough arguments\n");
11691 exit(1);
11692 }
11696 setTranslator(Config_getEnum(OUTPUT_LANGUAGE));
11697 writeFile(argv[optInd+1],LatexGenerator::writeHeaderFile);
11698 writeFile(argv[optInd+2],LatexGenerator::writeFooterFile);
11699 writeFile(argv[optInd+3],LatexGenerator::writeStyleSheetFile);
11701 exit(0);
11702 }
11703 else
11704 {
11705 err("Illegal format specifier \"{}\": should be one of rtf, html or latex\n",formatName);
11707 exit(1);
11708 }
11709 }
11710 break;
11711 case 'm':
11713 break;
11714 case 'v':
11715 version(false);
11717 exit(0);
11718 break;
11719 case 'V':
11720 version(true);
11722 exit(0);
11723 break;
11724 case '-':
11725 if (qstrcmp(&argv[optInd][2],"help")==0)
11726 {
11727 usage(argv[0],versionString);
11728 exit(0);
11729 }
11730 else if (qstrcmp(&argv[optInd][2],"version")==0)
11731 {
11732 version(false);
11734 exit(0);
11735 }
11736 else if ((qstrcmp(&argv[optInd][2],"Version")==0) ||
11737 (qstrcmp(&argv[optInd][2],"VERSION")==0))
11738 {
11739 version(true);
11741 exit(0);
11742 }
11743 else
11744 {
11745 err("Unknown option \"-{}\"\n",&argv[optInd][1]);
11746 usage(argv[0],versionString);
11747 exit(1);
11748 }
11749 break;
11750 case 'b':
11751 setvbuf(stdout,nullptr,_IONBF,0);
11752 break;
11753 case 'q':
11754 quiet = true;
11755 break;
11756 case 'h':
11757 case '?':
11758 usage(argv[0],versionString);
11759 exit(0);
11760 break;
11761 default:
11762 err("Unknown option \"-{:c}\"\n",argv[optInd][1]);
11763 usage(argv[0],versionString);
11764 exit(1);
11765 }
11766 optInd++;
11767 }
11768
11769 /**************************************************************************
11770 * Parse or generate the config file *
11771 **************************************************************************/
11772
11773 initTracing(traceName.data(),traceTiming);
11774 TRACE("Doxygen version used: {}",getFullVersion());
11775 Config::init();
11776
11777 FileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
11778 if (optInd>=argc)
11779 {
11780 if (configFileInfo1.exists())
11781 {
11782 configName="Doxyfile";
11783 }
11784 else if (configFileInfo2.exists())
11785 {
11786 configName="doxyfile";
11787 }
11788 else if (genConfig)
11789 {
11790 configName="Doxyfile";
11791 }
11792 else
11793 {
11794 err("Doxyfile not found and no input file specified!\n");
11795 usage(argv[0],versionString);
11796 exit(1);
11797 }
11798 }
11799 else
11800 {
11801 FileInfo fi(argv[optInd]);
11802 if (fi.exists() || qstrcmp(argv[optInd],"-")==0 || genConfig)
11803 {
11804 configName=argv[optInd];
11805 }
11806 else
11807 {
11808 err("configuration file {} not found!\n",argv[optInd]);
11809 usage(argv[0],versionString);
11810 exit(1);
11811 }
11812 }
11813
11814 if (genConfig)
11815 {
11816 generateConfigFile(configName,shortList);
11818 exit(0);
11819 }
11820
11821 if (!Config::parse(configName,updateConfig,diffList))
11822 {
11823 err("could not open or read configuration file {}!\n",configName);
11825 exit(1);
11826 }
11827
11828 if (diffList!=Config::CompareMode::Full)
11829 {
11831 compareDoxyfile(diffList);
11833 exit(0);
11834 }
11835
11836 if (updateConfig)
11837 {
11839 generateConfigFile(configName,shortList,TRUE);
11841 exit(0);
11842 }
11843
11844 /* Perlmod wants to know the path to the config file.*/
11845 FileInfo configFileInfo(configName.str());
11846 setPerlModDoxyfile(configFileInfo.absFilePath());
11847
11848 /* handle -q option */
11849 if (quiet) Config_updateBool(QUIET,TRUE);
11850}
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:1494
static void writeStyleSheetFile(TextStream &t)
Definition htmlgen.cpp:1482
static void writeHeaderFile(TextStream &t, const QCString &cssname)
Definition htmlgen.cpp:1488
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:442
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:6807

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

11085{
11086 //printf("killSet count=%d\n",killSet ? (int)killSet->size() : -1);
11087 // strip trailing slashes
11088 if (s.isEmpty()) return;
11089
11090 g_pathsVisited.clear();
11091
11092 FileInfo fi(s.str());
11093 //printf("readFileOrDirectory(%s)\n",s);
11094 {
11095 if (exclSet==nullptr || exclSet->find(fi.absFilePath())==exclSet->end())
11096 {
11097 if (Config_getBool(EXCLUDE_SYMLINKS) && fi.isSymLink())
11098 {
11099 }
11100 else if (!fi.exists() || !fi.isReadable())
11101 {
11102 if (errorIfNotExist)
11103 {
11104 warn_uncond("source '{}' is not a readable file or directory... skipping.\n",s);
11105 }
11106 }
11107 else if (fi.isFile())
11108 {
11109 std::string dirPath = fi.dirPath(true);
11110 std::string filePath = fi.absFilePath();
11111 if (paths && !dirPath.empty())
11112 {
11113 paths->insert(dirPath);
11114 }
11115 //printf("killSet.find(%s)=%d\n",qPrint(fi.absFilePath()),killSet.find(fi.absFilePath())!=killSet.end());
11116 if (killSet==nullptr || killSet->find(filePath)==killSet->end())
11117 {
11118 std::string name=fi.fileName();
11119 if (fnMap)
11120 {
11121 auto fd = createFileDef(QCString(dirPath+"/"),QCString(name));
11122 if (!name.empty())
11123 {
11124 FileName *fn = fnMap->add(QCString(name),QCString(filePath));
11125 fn->push_back(std::move(fd));
11126 }
11127 }
11128 if (resultList || resultSet)
11129 {
11130 if (resultList) resultList->push_back(filePath);
11131 if (resultSet) resultSet->insert(filePath);
11132 }
11133
11134 if (killSet) killSet->insert(fi.absFilePath());
11135 }
11136 }
11137 else if (fi.isDir()) // readable dir
11138 {
11139 readDir(&fi,fnMap,exclSet,patList,
11140 exclPatList,resultList,resultSet,errorIfNotExist,
11141 recursive,killSet,paths);
11142 }
11143 }
11144 }
11145}
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().