1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-20 12:53:55 +08:00

LocalGenerator: refactoring

Introduce method AppendCompileOptions to support
future source file property COMPILE_OPTIONS.
This commit is contained in:
Marc Chevrier
2017-12-15 11:00:52 +01:00
parent 2c6f5baaa7
commit 3f935e690a
8 changed files with 76 additions and 29 deletions

View File

@@ -3521,7 +3521,7 @@ void cmGlobalXCodeGenerator::AppendDefines(
} }
void cmGlobalXCodeGenerator::AppendFlag(std::string& flags, void cmGlobalXCodeGenerator::AppendFlag(std::string& flags,
std::string const& flag) std::string const& flag) const
{ {
// Short-circuit for an empty flag. // Short-circuit for an empty flag.
if (flag.empty()) { if (flag.empty()) {

View File

@@ -104,7 +104,7 @@ public:
bool ShouldStripResourcePath(cmMakefile*) const override; bool ShouldStripResourcePath(cmMakefile*) const override;
bool SetGeneratorToolset(std::string const& ts, cmMakefile* mf) override; bool SetGeneratorToolset(std::string const& ts, cmMakefile* mf) override;
void AppendFlag(std::string& flags, std::string const& flag); void AppendFlag(std::string& flags, std::string const& flag) const;
protected: protected:
void AddExtraIDETargets() override; void AddExtraIDETargets() override;

View File

@@ -792,19 +792,14 @@ void cmLocalGenerator::AddCompileOptions(std::string& flags,
if (const char* langFlagRegexStr = if (const char* langFlagRegexStr =
this->Makefile->GetDefinition(langFlagRegexVar)) { this->Makefile->GetDefinition(langFlagRegexVar)) {
// Filter flags acceptable to this language. // Filter flags acceptable to this language.
cmsys::RegularExpression r(langFlagRegexStr);
std::vector<std::string> opts; std::vector<std::string> opts;
if (const char* targetFlags = target->GetProperty("COMPILE_FLAGS")) { if (const char* targetFlags = target->GetProperty("COMPILE_FLAGS")) {
cmSystemTools::ParseWindowsCommandLine(targetFlags, opts); cmSystemTools::ParseWindowsCommandLine(targetFlags, opts);
} }
target->GetCompileOptions(opts, config, lang); target->GetCompileOptions(opts, config, lang);
for (std::string const& opt : opts) { // (Re-)Escape these flags. COMPILE_FLAGS were already parsed
if (r.find(opt.c_str())) { // as a command line above, and COMPILE_OPTIONS are escaped.
// (Re-)Escape this flag. COMPILE_FLAGS were already parsed this->AppendCompileOptions(flags, opts, langFlagRegexStr);
// as a command line above, and COMPILE_OPTIONS are escaped.
this->AppendFlagEscape(flags, opt);
}
}
} else { } else {
// Use all flags. // Use all flags.
if (const char* targetFlags = target->GetProperty("COMPILE_FLAGS")) { if (const char* targetFlags = target->GetProperty("COMPILE_FLAGS")) {
@@ -813,10 +808,8 @@ void cmLocalGenerator::AddCompileOptions(std::string& flags,
} }
std::vector<std::string> opts; std::vector<std::string> opts;
target->GetCompileOptions(opts, config, lang); target->GetCompileOptions(opts, config, lang);
for (std::string const& opt : opts) { // COMPILE_OPTIONS are escaped.
// COMPILE_OPTIONS are escaped. this->AppendCompileOptions(flags, opts);
this->AppendFlagEscape(flags, opt);
}
} }
for (auto const& it : target->GetMaxLanguageStandards()) { for (auto const& it : target->GetMaxLanguageStandards()) {
@@ -1876,7 +1869,7 @@ void cmLocalGenerator::AddConfigVariableFlags(std::string& flags,
} }
void cmLocalGenerator::AppendFlags(std::string& flags, void cmLocalGenerator::AppendFlags(std::string& flags,
const std::string& newFlags) const std::string& newFlags) const
{ {
if (!newFlags.empty()) { if (!newFlags.empty()) {
if (!flags.empty()) { if (!flags.empty()) {
@@ -1886,7 +1879,8 @@ void cmLocalGenerator::AppendFlags(std::string& flags,
} }
} }
void cmLocalGenerator::AppendFlags(std::string& flags, const char* newFlags) void cmLocalGenerator::AppendFlags(std::string& flags,
const char* newFlags) const
{ {
if (newFlags && *newFlags) { if (newFlags && *newFlags) {
this->AppendFlags(flags, std::string(newFlags)); this->AppendFlags(flags, std::string(newFlags));
@@ -1894,7 +1888,7 @@ void cmLocalGenerator::AppendFlags(std::string& flags, const char* newFlags)
} }
void cmLocalGenerator::AppendFlagEscape(std::string& flags, void cmLocalGenerator::AppendFlagEscape(std::string& flags,
const std::string& rawFlag) const std::string& rawFlag) const
{ {
this->AppendFlags(flags, this->EscapeForShell(rawFlag)); this->AppendFlags(flags, this->EscapeForShell(rawFlag));
} }
@@ -1930,6 +1924,41 @@ void cmLocalGenerator::AppendIPOLinkerFlags(std::string& flags,
} }
} }
void cmLocalGenerator::AppendCompileOptions(std::string& options,
const char* options_list,
const char* regex) const
{
// Short-circuit if there are no options.
if (!options_list) {
return;
}
// Expand the list of options.
std::vector<std::string> options_vec;
cmSystemTools::ExpandListArgument(options_list, options_vec);
this->AppendCompileOptions(options, options_vec, regex);
}
void cmLocalGenerator::AppendCompileOptions(
std::string& options, const std::vector<std::string>& options_vec,
const char* regex) const
{
if (regex != nullptr) {
// Filter flags upon specified reges.
cmsys::RegularExpression r(regex);
for (std::string const& opt : options_vec) {
if (r.find(opt.c_str())) {
this->AppendFlagEscape(options, opt);
}
}
} else {
for (std::string const& opt : options_vec) {
this->AppendFlagEscape(options, opt);
}
}
}
void cmLocalGenerator::AppendDefines(std::set<std::string>& defines, void cmLocalGenerator::AppendDefines(std::set<std::string>& defines,
const char* defines_list) const const char* defines_list) const
{ {

View File

@@ -118,10 +118,11 @@ public:
cmGeneratorTarget const* target, cmGeneratorTarget const* target,
const std::string& lang); const std::string& lang);
///! Append flags to a string. ///! Append flags to a string.
virtual void AppendFlags(std::string& flags, const std::string& newFlags); virtual void AppendFlags(std::string& flags,
virtual void AppendFlags(std::string& flags, const char* newFlags); const std::string& newFlags) const;
virtual void AppendFlags(std::string& flags, const char* newFlags) const;
virtual void AppendFlagEscape(std::string& flags, virtual void AppendFlagEscape(std::string& flags,
const std::string& rawFlag); const std::string& rawFlag) const;
void AppendIPOLinkerFlags(std::string& flags, cmGeneratorTarget* target, void AppendIPOLinkerFlags(std::string& flags, cmGeneratorTarget* target,
const std::string& config, const std::string& config,
const std::string& lang); const std::string& lang);
@@ -165,6 +166,22 @@ public:
void AppendDefines(std::set<std::string>& defines, void AppendDefines(std::set<std::string>& defines,
const std::vector<std::string>& defines_vec) const; const std::vector<std::string>& defines_vec) const;
/**
* Encode a list of compile options for the compiler
* command line.
*/
void AppendCompileOptions(std::string& options, const char* options_list,
const char* regex = nullptr) const;
void AppendCompileOptions(std::string& options,
std::string const& options_list,
const char* regex = nullptr) const
{
this->AppendCompileOptions(options, options_list.c_str(), regex);
}
void AppendCompileOptions(std::string& options,
const std::vector<std::string>& options_vec,
const char* regex = nullptr) const;
/** /**
* Join a set of defines into a definesString with a space separator. * Join a set of defines into a definesString with a space separator.
*/ */

View File

@@ -830,8 +830,8 @@ std::string cmLocalUnixMakefileGenerator3::GetRelativeTargetDirectory(
return dir; return dir;
} }
void cmLocalUnixMakefileGenerator3::AppendFlags(std::string& flags, void cmLocalUnixMakefileGenerator3::AppendFlags(
const std::string& newFlags) std::string& flags, const std::string& newFlags) const
{ {
if (this->IsWatcomWMake() && !newFlags.empty()) { if (this->IsWatcomWMake() && !newFlags.empty()) {
std::string newf = newFlags; std::string newf = newFlags;
@@ -845,7 +845,7 @@ void cmLocalUnixMakefileGenerator3::AppendFlags(std::string& flags,
} }
void cmLocalUnixMakefileGenerator3::AppendFlags(std::string& flags, void cmLocalUnixMakefileGenerator3::AppendFlags(std::string& flags,
const char* newFlags) const char* newFlags) const
{ {
this->cmLocalGenerator::AppendFlags(flags, newFlags); this->cmLocalGenerator::AppendFlags(flags, newFlags);
} }

View File

@@ -88,8 +88,9 @@ public:
const std::string& tgt); const std::string& tgt);
// append flags to a string // append flags to a string
void AppendFlags(std::string& flags, const std::string& newFlags) override; void AppendFlags(std::string& flags,
void AppendFlags(std::string& flags, const char* newFlags) override; const std::string& newFlags) const override;
void AppendFlags(std::string& flags, const char* newFlags) const override;
// append an echo command // append an echo command
enum EchoColor enum EchoColor

View File

@@ -31,10 +31,10 @@ std::string cmLocalXCodeGenerator::GetTargetDirectory(
} }
void cmLocalXCodeGenerator::AppendFlagEscape(std::string& flags, void cmLocalXCodeGenerator::AppendFlagEscape(std::string& flags,
const std::string& rawFlag) const std::string& rawFlag) const
{ {
cmGlobalXCodeGenerator* gg = const cmGlobalXCodeGenerator* gg =
static_cast<cmGlobalXCodeGenerator*>(this->GlobalGenerator); static_cast<const cmGlobalXCodeGenerator*>(this->GlobalGenerator);
gg->AppendFlag(flags, rawFlag); gg->AppendFlag(flags, rawFlag);
} }

View File

@@ -31,7 +31,7 @@ public:
std::string GetTargetDirectory( std::string GetTargetDirectory(
cmGeneratorTarget const* target) const override; cmGeneratorTarget const* target) const override;
void AppendFlagEscape(std::string& flags, void AppendFlagEscape(std::string& flags,
const std::string& rawFlag) override; const std::string& rawFlag) const override;
void Generate() override; void Generate() override;
virtual void GenerateInstallRules(); virtual void GenerateInstallRules();
void ComputeObjectFilenames( void ComputeObjectFilenames(