ENH: Improved parsing of GCCXML_FLAGS to improve generation of gccxml rule. Also added ADD_DEFINITIONS arguments to the generated rule.

This commit is contained in:
Brad King 2001-10-11 17:20:39 -04:00
parent 8a72356cff
commit b6158ac39c
1 changed files with 39 additions and 10 deletions

View File

@ -61,6 +61,8 @@ public:
void AddParsedFlags(std::vector<std::string>& resultArgs); void AddParsedFlags(std::vector<std::string>& resultArgs);
private: private:
void AddFlag(const std::string&);
std::vector<std::string> m_Flags; std::vector<std::string> m_Flags;
}; };
@ -69,24 +71,23 @@ void cmCableWrapTclCommand::cmGccXmlFlagsParser::Parse(const char* in_flags)
// Prepare a work string for searching. // Prepare a work string for searching.
std::string flags = in_flags; std::string flags = in_flags;
// Look for " -" separating arguments. Currently the find_*_options // Look for " -" separating arguments.
// scripts always output a single space between arguments, so we don't
// need to worry about removing extra whitespace.
// The first argument starts at the beginning of the string. // The first argument starts at the first "-" character.
std::string::size_type leftPos = 0; std::string::size_type leftPos = flags.find_first_of("-");
if(leftPos == std::string::npos) { return; }
std::string::size_type rightPos = flags.find(" -", leftPos); std::string::size_type rightPos = flags.find(" -", leftPos);
while(rightPos != std::string::npos) while(rightPos != std::string::npos)
{ {
// Pull out and store this argument. // Pull out and store this argument.
m_Flags.push_back(flags.substr(leftPos, rightPos-leftPos)); this->AddFlag(flags.substr(leftPos, rightPos-leftPos));
// The next argument starts at the '-' from the previously found " -". // The next argument starts at the '-' from the previously found " -".
leftPos = rightPos+1; leftPos = rightPos+1;
rightPos = flags.find(" -", leftPos); rightPos = flags.find(" -", leftPos);
} }
// Pull out and store the last argument. // Pull out and store the last argument.
m_Flags.push_back(flags.substr(leftPos, std::string::npos)); this->AddFlag(flags.substr(leftPos, std::string::npos));
} }
void void
@ -100,6 +101,33 @@ cmCableWrapTclCommand::cmGccXmlFlagsParser
} }
} }
/**
* Used by Parse() to insert a parsed flag. Strips trailing whitespace from
* the argument.
*
* Includes a hack to split "-o /dev/null" into two arguments since
* the parser only splits arguments with " -" occurrences.
*/
void
cmCableWrapTclCommand::cmGccXmlFlagsParser
::AddFlag(const std::string& flag)
{
std::string tmp = flag.substr(0, flag.find_last_not_of(" \t")+1);
if(tmp == "-o /dev/null")
{
m_Flags.push_back("-o");
m_Flags.push_back("/dev/null");
}
else if(tmp == "-D__int64='long long'")
{
m_Flags.push_back("-D__int64='long");
m_Flags.push_back("long'");
}
else
{
m_Flags.push_back(tmp);
}
}
cmCableWrapTclCommand::cmCableWrapTclCommand(): cmCableWrapTclCommand::cmCableWrapTclCommand():
m_CableClassSet(NULL), m_MakeDepend(new cmMakeDepend) m_CableClassSet(NULL), m_MakeDepend(new cmMakeDepend)
@ -404,12 +432,11 @@ void cmCableWrapTclCommand::GenerateCableClassFiles(const char* name,
std::vector<std::string> commandArgs; std::vector<std::string> commandArgs;
this->AddGccXmlFlagsFromCache(commandArgs); this->AddGccXmlFlagsFromCache(commandArgs);
//commandArgs.push_back(m_Makefile->GetDefineFlags());
{ {
std::string tmp = "-I"; std::string tmp = "-I";
tmp += m_Makefile->GetStartDirectory(); tmp += m_Makefile->GetStartDirectory();
commandArgs.push_back(cmSystemTools::EscapeSpaces(tmp.c_str())); commandArgs.push_back(tmp.c_str());
} }
const std::vector<std::string>& includes = const std::vector<std::string>& includes =
@ -419,7 +446,8 @@ void cmCableWrapTclCommand::GenerateCableClassFiles(const char* name,
{ {
std::string tmp = "-I"; std::string tmp = "-I";
tmp += i->c_str(); tmp += i->c_str();
commandArgs.push_back(cmSystemTools::EscapeSpaces(tmp.c_str())); m_Makefile->ExpandVariablesInString(tmp);
commandArgs.push_back(tmp.c_str());
} }
std::string tmp = "-fxml="; std::string tmp = "-fxml=";
tmp += classXmlName; tmp += classXmlName;
@ -556,6 +584,7 @@ cmCableWrapTclCommand
parser = new cmGccXmlFlagsParser("cmGccXmlFlagsParser"); parser = new cmGccXmlFlagsParser("cmGccXmlFlagsParser");
m_Makefile->RegisterData(parser); m_Makefile->RegisterData(parser);
parser->Parse(this->GetGccXmlFlagsFromCache().c_str()); parser->Parse(this->GetGccXmlFlagsFromCache().c_str());
parser->Parse(m_Makefile->GetDefineFlags());
} }
// Use the parsed flags in the single instance. // Use the parsed flags in the single instance.