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

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

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

11848{
11849 AUTO_TRACE();
11850
11855}
void initWarningFormat()
Definition message.cpp:218
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 11373 of file doxygen.cpp.

11374{
11378
11379 delete Doxygen::indexList;
11388 Doxygen::mainPage.reset();
11392 Doxygen::globalScope = nullptr;
11394 delete theTranslator;
11395 delete g_outputList;
11396
11401 delete Doxygen::dirLinkedMap;
11402 delete Doxygen::symbolMap;
11403}
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 13018 of file doxygen.cpp.

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

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(), FTVHelp::generateTreeViewImages(), 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 11304 of file doxygen.cpp.

11305{
11306 initResources();
11307 QCString lang = Portable::getenv("LC_ALL");
11308 if (!lang.isEmpty()) Portable::setenv("LANG",lang);
11309 std::setlocale(LC_ALL,"");
11310 std::setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
11311 std::setlocale(LC_NUMERIC,"C");
11312
11314
11338
11339 // register any additional parsers here...
11340
11342
11343#if USE_LIBCLANG
11345#endif
11354 Doxygen::pageLinkedMap = new PageLinkedMap; // all doc pages
11355 Doxygen::exampleLinkedMap = new PageLinkedMap; // all examples
11356 //Doxygen::tagDestinationDict.setAutoDelete(TRUE);
11358
11359 // initialization of these globals depends on
11360 // configuration switches so we need to postpone these
11361 Doxygen::globalScope = nullptr;
11370
11371}
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:5632

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

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

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

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

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(), 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 11067 of file doxygen.cpp.

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

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