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

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

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

11847{
11848 AUTO_TRACE();
11849
11854}
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 11372 of file doxygen.cpp.

11373{
11377
11378 delete Doxygen::indexList;
11387 Doxygen::mainPage.reset();
11391 Doxygen::globalScope = nullptr;
11393 delete theTranslator;
11394 delete g_outputList;
11395
11400 delete Doxygen::dirLinkedMap;
11401 delete Doxygen::symbolMap;
11402}
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:175
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 13017 of file doxygen.cpp.

13018{
13019 AUTO_TRACE();
13020 /**************************************************************************
13021 * Initialize output generators *
13022 **************************************************************************/
13023
13024 /// add extra languages for which we can only produce syntax highlighted code
13026
13027 //// dump all symbols
13028 if (g_dumpSymbolMap)
13029 {
13030 dumpSymbolMap();
13031 exit(0);
13032 }
13033
13034 bool generateHtml = Config_getBool(GENERATE_HTML);
13035 bool generateLatex = Config_getBool(GENERATE_LATEX);
13036 bool generateMan = Config_getBool(GENERATE_MAN);
13037 bool generateRtf = Config_getBool(GENERATE_RTF);
13038 bool generateDocbook = Config_getBool(GENERATE_DOCBOOK);
13039
13040
13042 if (generateHtml)
13043 {
13047 }
13048 if (generateLatex)
13049 {
13052 }
13053 if (generateDocbook)
13054 {
13057 }
13058 if (generateMan)
13059 {
13060 g_outputList->add<ManGenerator>();
13062 }
13063 if (generateRtf)
13064 {
13065 g_outputList->add<RTFGenerator>();
13067 }
13068 if (Config_getBool(USE_HTAGS))
13069 {
13071 QCString htmldir = Config_getString(HTML_OUTPUT);
13072 if (!Htags::execute(htmldir))
13073 err("USE_HTAGS is YES but htags(1) failed. \n");
13074 else if (!Htags::loadFilemap(htmldir))
13075 err("htags(1) ended normally but failed to load the filemap. \n");
13076 }
13077
13078 /**************************************************************************
13079 * Generate documentation *
13080 **************************************************************************/
13081
13082 g_s.begin("Generating style sheet...\n");
13083 //printf("writing style info\n");
13084 g_outputList->writeStyleInfo(0); // write first part
13085 g_s.end();
13086
13087 bool searchEngine = Config_getBool(SEARCHENGINE);
13088 bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH);
13089
13090 g_s.begin("Generating search indices...\n");
13091 if (searchEngine && !serverBasedSearch && generateHtml)
13092 {
13094 }
13095
13096 // generate search indices (need to do this before writing other HTML
13097 // pages as these contain a drop down menu with options depending on
13098 // what categories we find in this function.
13099 if (generateHtml && searchEngine)
13100 {
13101 QCString searchDirName = Config_getString(HTML_OUTPUT)+"/search";
13102 Dir searchDir(searchDirName.str());
13103 if (!searchDir.exists() && !searchDir.mkdir(searchDirName.str()))
13104 {
13105 term("Could not create search results directory '{}' $PWD='{}'\n",
13106 searchDirName,Dir::currentDirPath());
13107 }
13108 HtmlGenerator::writeSearchData(searchDirName);
13109 if (!serverBasedSearch) // client side search index
13110 {
13112 }
13113 }
13114 g_s.end();
13115
13116 // copy static stuff
13117 if (generateHtml)
13118 {
13120 copyLogo(Config_getString(HTML_OUTPUT));
13121 copyIcon(Config_getString(HTML_OUTPUT));
13122 copyExtraFiles(Config_getList(HTML_EXTRA_FILES),"HTML_EXTRA_FILES",Config_getString(HTML_OUTPUT));
13123 }
13124 if (generateLatex)
13125 {
13127 copyLogo(Config_getString(LATEX_OUTPUT));
13128 copyIcon(Config_getString(LATEX_OUTPUT));
13129 copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT));
13130 }
13131 if (generateDocbook)
13132 {
13133 copyLogo(Config_getString(DOCBOOK_OUTPUT));
13134 copyIcon(Config_getString(DOCBOOK_OUTPUT));
13135 }
13136 if (generateRtf)
13137 {
13138 copyLogo(Config_getString(RTF_OUTPUT));
13139 copyIcon(Config_getString(RTF_OUTPUT));
13140 copyExtraFiles(Config_getList(RTF_EXTRA_FILES),"RTF_EXTRA_FILES",Config_getString(RTF_OUTPUT));
13141 }
13142
13144 if (fm.hasFormulas() && generateHtml
13145 && !Config_getBool(USE_MATHJAX))
13146 {
13147 g_s.begin("Generating images for formulas in HTML...\n");
13148 fm.generateImages(Config_getString(HTML_OUTPUT), Config_getEnum(HTML_FORMULA_FORMAT)==HTML_FORMULA_FORMAT_t::svg ?
13150 g_s.end();
13151 }
13152 if (fm.hasFormulas() && generateRtf)
13153 {
13154 g_s.begin("Generating images for formulas in RTF...\n");
13156 g_s.end();
13157 }
13158
13159 if (fm.hasFormulas() && generateDocbook)
13160 {
13161 g_s.begin("Generating images for formulas in Docbook...\n");
13163 g_s.end();
13164 }
13165
13166 g_s.begin("Generating example documentation...\n");
13168 g_s.end();
13169
13170 g_s.begin("Generating file sources...\n");
13172 g_s.end();
13173
13174 g_s.begin("Generating file documentation...\n");
13176 g_s.end();
13177
13178 g_s.begin("Generating page documentation...\n");
13180 g_s.end();
13181
13182 g_s.begin("Generating group documentation...\n");
13184 g_s.end();
13185
13186 g_s.begin("Generating class documentation...\n");
13188 g_s.end();
13189
13190 g_s.begin("Generating concept documentation...\n");
13192 g_s.end();
13193
13194 g_s.begin("Generating module documentation...\n");
13196 g_s.end();
13197
13198 g_s.begin("Generating namespace documentation...\n");
13200 g_s.end();
13201
13202 if (Config_getBool(GENERATE_LEGEND))
13203 {
13204 g_s.begin("Generating graph info page...\n");
13206 g_s.end();
13207 }
13208
13209 g_s.begin("Generating directory documentation...\n");
13211 g_s.end();
13212
13213 if (g_outputList->size()>0)
13214 {
13216 }
13217
13218 g_s.begin("finalizing index lists...\n");
13219 Doxygen::indexList->finalize();
13220 g_s.end();
13221
13222 g_s.begin("writing tag file...\n");
13223 writeTagFile();
13224 g_s.end();
13225
13226 if (Config_getBool(GENERATE_XML))
13227 {
13228 g_s.begin("Generating XML output...\n");
13230 generateXML();
13232 g_s.end();
13233 }
13234 if (Config_getBool(GENERATE_SQLITE3))
13235 {
13236 g_s.begin("Generating SQLITE3 output...\n");
13238 g_s.end();
13239 }
13240
13241 if (Config_getBool(GENERATE_AUTOGEN_DEF))
13242 {
13243 g_s.begin("Generating AutoGen DEF output...\n");
13244 generateDEF();
13245 g_s.end();
13246 }
13247 if (Config_getBool(GENERATE_PERLMOD))
13248 {
13249 g_s.begin("Generating Perl module output...\n");
13251 g_s.end();
13252 }
13253 if (generateHtml && searchEngine && serverBasedSearch)
13254 {
13255 g_s.begin("Generating search index\n");
13256 if (Doxygen::searchIndex.kind()==SearchIndexIntf::Internal) // write own search index
13257 {
13259 Doxygen::searchIndex.write(Config_getString(HTML_OUTPUT)+"/search/search.idx");
13260 }
13261 else // write data for external search index
13262 {
13264 QCString searchDataFile = Config_getString(SEARCHDATA_FILE);
13265 if (searchDataFile.isEmpty())
13266 {
13267 searchDataFile="searchdata.xml";
13268 }
13269 if (!Portable::isAbsolutePath(searchDataFile.data()))
13270 {
13271 searchDataFile.prepend(Config_getString(OUTPUT_DIRECTORY)+"/");
13272 }
13273 Doxygen::searchIndex.write(searchDataFile);
13274 }
13275 g_s.end();
13276 }
13277
13278 if (generateRtf)
13279 {
13280 g_s.begin("Combining RTF output...\n");
13281 if (!RTFGenerator::preProcessFileInplace(Config_getString(RTF_OUTPUT),"refman.rtf"))
13282 {
13283 err("An error occurred during post-processing the RTF files!\n");
13284 }
13285 g_s.end();
13286 }
13287
13288 g_s.begin("Running plantuml with JAVA...\n");
13290 g_s.end();
13291
13292 if (Config_getBool(HAVE_DOT))
13293 {
13294 g_s.begin("Running dot...\n");
13296 g_s.end();
13297 }
13298
13299 if (generateHtml &&
13300 Config_getBool(GENERATE_HTMLHELP) &&
13301 !Config_getString(HHC_LOCATION).isEmpty())
13302 {
13303 g_s.begin("Running html help compiler...\n");
13305 g_s.end();
13306 }
13307
13308 if ( generateHtml &&
13309 Config_getBool(GENERATE_QHP) &&
13310 !Config_getString(QHG_LOCATION).isEmpty())
13311 {
13312 g_s.begin("Running qhelpgenerator...\n");
13314 g_s.end();
13315 }
13316
13317 g_outputList->cleanup();
13318
13319 msg("type lookup cache used {}/{} hits={} misses={}\n",
13321 Doxygen::typeLookupCache->capacity(),
13323 Doxygen::typeLookupCache->misses());
13324 msg("symbol lookup cache used {}/{} hits={} misses={}\n",
13326 Doxygen::symbolLookupCache->capacity(),
13328 Doxygen::symbolLookupCache->misses());
13329 int typeCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::typeLookupCache->misses()*2/3)); // part of the cache is flushed, hence the 2/3 correction factor
13330 int symbolCacheParam = computeIdealCacheParam(static_cast<size_t>(Doxygen::symbolLookupCache->misses()));
13331 int cacheParam = std::max(typeCacheParam,symbolCacheParam);
13332 if (cacheParam>Config_getInt(LOOKUP_CACHE_SIZE))
13333 {
13334 msg("Note: based on cache misses the ideal setting for LOOKUP_CACHE_SIZE is {} at the cost of higher memory usage.\n",cacheParam);
13335 }
13336
13338 {
13339
13340 std::size_t numThreads = static_cast<std::size_t>(Config_getInt(NUM_PROC_THREADS));
13341 if (numThreads<1) numThreads=1;
13342 msg("Total elapsed time: {:.6f} seconds\n(of which an average of {:.6f} seconds per thread waiting for external tools to finish)\n",
13343 (static_cast<double>(Debug::elapsedTime())),
13344 Portable::getSysElapsedTime()/static_cast<double>(numThreads)
13345 );
13346 g_s.print();
13347
13349 msg("finished...\n");
13351 }
13352 else
13353 {
13354 msg("finished...\n");
13355 }
13356
13357
13358 /**************************************************************************
13359 * Start cleaning up *
13360 **************************************************************************/
13361
13363
13365 Dir thisDir;
13366 thisDir.remove(Doxygen::filterDBFileName.str());
13368 exitTracing();
13370 delete Doxygen::clangUsrMap;
13372
13373 //dumpDocNodeSizes();
13374}
@ 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:340
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:1141
static void writeSearchPage()
Definition htmlgen.cpp:3055
static void writeTabData()
Additional initialization after indices have been created.
Definition htmlgen.cpp:1288
static void writeSearchData(const QCString &dir)
Definition htmlgen.cpp:1297
static void writeExternalSearchPage()
Definition htmlgen.cpp:3154
Generator for LaTeX output.
Definition latexgen.h:94
static void init()
Definition latexgen.cpp:630
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:157
void run()
Run plant UML tool for all images.
Definition plantuml.cpp:315
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:458
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:2458
void generateDEF()
Definition defgen.cpp:482
void generateDirDocs(OutputList &ol)
Definition dirdef.cpp:1171
static void copyLatexStyleSheet()
static void runQHelpGenerator()
class Statistics g_s
static void copyStyleSheet()
static void generateGroupDocs()
Definition doxygen.cpp:9984
static void generateExampleDocs()
Definition doxygen.cpp:9939
static void dumpSymbolMap()
static void generateFileDocs()
Definition doxygen.cpp:8665
static void copyIcon(const QCString &outputOption)
static void generatePageDocs()
Definition doxygen.cpp:9854
static void generateFileSources()
Definition doxygen.cpp:8499
static void copyLogo(const QCString &outputOption)
static void generateClassDocs()
Definition doxygen.cpp:9091
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:9117
void writeGraphInfo(OutputList &ol)
Definition index.cpp:4037
void writeIndexHierarchy(OutputList &ol)
Definition index.cpp:5702
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:5715
void generateXML()
Definition xmlgen.cpp:2136

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

11304{
11305 initResources();
11306 QCString lang = Portable::getenv("LC_ALL");
11307 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11308 std::setlocale(LC_ALL,"");
11309 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11310 std::setlocale(LC_NUMERIC,"C");
11311
11313
11337
11338 // register any additional parsers here...
11339
11341
11342#if USE_LIBCLANG
11344#endif
11353 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11354 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11355 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11357
11358 // initialization of these globals depends on
11359 // configuration switches so we need to postpone these
11360 Doxygen::globalScope = nullptr;
11369
11370}
static void startTimer()
Definition debug.cpp:196
A linked map of directories.
Definition dirdef.h:172
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:63
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:5648

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

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

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

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

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

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