Use cascading-if for per-config test and install code

When generating per-config blocks in test and install scripts replace
the form

  IF()
    # config == A
  ENDIF()
  IF()
    # config == B
  ENDIF()

with

  IF()
    # config == A
  ELSEIF()
    # config == B
  ELSE()
    # no config matches
  ENDIF()

for clarity and to support the else() case cleanly.
This commit is contained in:
Brad King 2011-06-10 08:48:20 -04:00
parent 9ccefd55c5
commit 77ddb6a0cd
2 changed files with 14 additions and 2 deletions

View File

@ -209,6 +209,7 @@ void cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream& os,
// In a multi-configuration generator we produce a separate rule
// in a block for each configuration that is built. We restrict
// the list of configurations to those to which this rule applies.
bool first = true;
for(std::vector<std::string>::const_iterator i =
this->ConfigurationTypes->begin();
i != this->ConfigurationTypes->end(); ++i)
@ -218,10 +219,19 @@ void cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream& os,
{
// Generate a per-configuration block.
std::string config_test = this->CreateConfigTest(config);
os << indent << "IF(" << config_test << ")\n";
os << indent << (first? "IF(" : "ELSEIF(") << config_test << ")\n";
this->GenerateScriptForConfig(os, config, indent.Next());
os << indent << "ENDIF(" << config_test << ")\n";
first = false;
}
}
if(!first)
{
if(this->NeedsScriptNoConfig())
{
os << indent << "ELSE()\n";
this->GenerateScriptNoConfig(os, indent.Next());
}
os << indent << "ENDIF()\n";
}
}
}

View File

@ -65,6 +65,8 @@ protected:
virtual void GenerateScriptForConfig(std::ostream& os,
const char* config,
Indent const& indent);
virtual void GenerateScriptNoConfig(std::ostream&, Indent const&) {}
virtual bool NeedsScriptNoConfig() const { return false; }
// Test if this generator does something for a given configuration.
bool GeneratesForConfig(const char*);