Fixed #5529 (Further control in selecting what configurations to consider)

This commit is contained in:
Julian Santander 2014-03-10 15:49:02 +01:00 committed by Daniel Marjamäki
parent 5e0a575091
commit fae8ef48b8
3 changed files with 65 additions and 5 deletions

View File

@ -65,7 +65,7 @@ static void AddFilesToList(const std::string& FileList, std::vector<std::string>
}
}
static void AddInclPathsToList(const std::string& FileList, std::list<std::string>& PathNames)
static void AddInclPathsToList(const std::string& FileList, std::list<std::string>* PathNames)
{
// to keep things initially simple, if the file can't be opened, just be
// silent and move on
@ -81,12 +81,19 @@ static void AddInclPathsToList(const std::string& FileList, std::list<std::strin
if (PathName[PathName.length()-1] != '/')
PathName += '/';
PathNames.push_back(PathName);
PathNames->push_back(PathName);
}
}
}
}
static void AddPathsToSet(const std::string& FileName, std::set<std::string>* set)
{
std::list<std::string> templist;
AddInclPathsToList(FileName, &templist);
set->insert(templist.begin(), templist.end());
}
CmdLineParser::CmdLineParser(Settings *settings)
: _settings(settings)
, _showHelp(false)
@ -435,7 +442,14 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
_settings->userIncludes.push_back(path);
} else if (std::strncmp(argv[i], "--includes-file=", 16) == 0) {
// open this file and read every input file (1 file name per line)
AddInclPathsToList(16 + argv[i], _settings->_includePaths);
AddInclPathsToList(16 + argv[i], &_settings->_includePaths);
} else if (std::strncmp(argv[i], "--config-exclude=",17) ==0) {
std::string path = argv[i] + 17;
path = Path::fromNativeSeparators(path);
_settings->configExcludePaths.insert(path);
} else if (std::strncmp(argv[i], "--config-excludes-file=", 23) == 0) {
// open this file and read every input file (1 file name per line)
AddPathsToSet(23 + argv[i], &_settings->configExcludePaths);
}
// file list specified
@ -825,6 +839,13 @@ void CmdLineParser::PrintHelp()
" First given path is searched for contained header\n"
" files first. If paths are relative to source files,\n"
" this is not needed.\n"
" --config-exclude=<dir>\n"
" Path (prefix) to be excluded from configuration checking.\n"
" Preprocessor configurations defined in headers (but not sources)\n"
" matching the prefix will not be considered for evaluation\n"
" of configuration alternatives\n"
" --config-excludes-file=<file>\n"
" A file that contains a list of config-excludes\n"
" --include=<file>\n"
" Force inclusion of a file before the checked file. Can\n"
" be used for example when checking the Linux kernel,\n"

View File

@ -1204,13 +1204,14 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
// constants defined through "#define" in the code..
std::set<std::string> defines;
std::map<std::string, std::string> alldefinesmap(defs);
std::stack<std::pair<std::string,bool> > includeStack;
includeStack.push(std::pair<std::string,bool>(filename,false));
// How deep into included files are we currently parsing?
// 0=>Source file, 1=>Included by source file, 2=>included by header that was included by source file, etc
int filelevel = 0;
bool includeguard = false;
unsigned int linenr = 0;
std::istringstream istr(filedata);
std::string line;
@ -1228,12 +1229,23 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
if (line.compare(0, 6, "#file ") == 0) {
includeguard = true;
std::string::size_type start=line.find("\"");
std::string::size_type end=line.find("\"",start+1);
std::string includeFile=line.substr(start+1,end-start-1);
bool fileExcluded = false;
++filelevel;
if (! _settings) {
fileExcluded = false;
} else {
fileExcluded = _settings->configurationExcluded(includeFile);
}
includeStack.push(std::pair<std::string,bool>(includeFile,fileExcluded));
continue;
}
else if (line == "#endfile") {
includeguard = false;
includeStack.pop();
if (filelevel > 0)
--filelevel;
continue;
@ -1404,7 +1416,16 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
}
if (std::find(ret.begin(), ret.end(), def) == ret.end()) {
ret.push_back(def);
if (!includeStack.top().second) {
ret.push_back(def);
} else {
if (_errorLogger && _settings && _settings->debugwarnings) {
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
const ErrorLogger::ErrorMessage errmsg(locationList, Severity::debug,
"Configuration not considered: " + def +" for file:"+includeStack.top().first, "debug", false);
_errorLogger->reportErr(errmsg);
}
}
}
}

View File

@ -175,6 +175,10 @@ public:
/** @brief forced includes given by the user */
std::list<std::string> userIncludes;
/** @brief include paths excluded from checking the configuration */
std::set<std::string> configExcludePaths;
/** @brief --report-progress */
bool reportProgress;
@ -251,6 +255,20 @@ public:
platformType == Win32W ||
platformType == Win64;
}
/**
* @brief return true if a file is to be excluded from configuration checking
* @return true for the file to be excluded.
*/
bool configurationExcluded(const std::string &file) const {
for (std::set<std::string>::const_iterator i=configExcludePaths.begin(); i!=configExcludePaths.end(); ++i) {
if (file.length()>=i->length() && file.compare(0,i->length(),*i)==0) {
return true;
}
}
return false;
}
};
/// @}