cmGeneratorTarget: add a target-level query for "needs dyndep"
This can still be overridden per-source, but it indicates the state of the target's default behavior.
This commit is contained in:
parent
f909fc2f92
commit
dff511ad28
@ -9374,11 +9374,25 @@ bool cmGeneratorTarget::NeedDyndepForSource(std::string const& lang,
|
||||
return true;
|
||||
}
|
||||
|
||||
auto targetDyndep = this->NeedCxxDyndep(config);
|
||||
if (targetDyndep == CxxModuleSupport::Unavailable) {
|
||||
return false;
|
||||
}
|
||||
auto const sfProp = sf->GetProperty("CXX_SCAN_FOR_MODULES");
|
||||
if (sfProp.IsSet()) {
|
||||
return sfProp.IsOn();
|
||||
}
|
||||
return targetDyndep == CxxModuleSupport::Enabled;
|
||||
}
|
||||
|
||||
cmGeneratorTarget::CxxModuleSupport cmGeneratorTarget::NeedCxxDyndep(
|
||||
std::string const& config) const
|
||||
{
|
||||
bool haveRule = false;
|
||||
switch (this->HaveCxxModuleSupport(config)) {
|
||||
case Cxx20SupportLevel::MissingCxx:
|
||||
case Cxx20SupportLevel::NoCxx20:
|
||||
return false;
|
||||
return CxxModuleSupport::Unavailable;
|
||||
case Cxx20SupportLevel::MissingRule:
|
||||
break;
|
||||
case Cxx20SupportLevel::Supported:
|
||||
@ -9388,28 +9402,29 @@ bool cmGeneratorTarget::NeedDyndepForSource(std::string const& lang,
|
||||
bool haveGeneratorSupport =
|
||||
this->GetGlobalGenerator()->CheckCxxModuleSupport(
|
||||
cmGlobalGenerator::CxxModuleSupportQuery::Inspect);
|
||||
auto const sfProp = sf->GetProperty("CXX_SCAN_FOR_MODULES");
|
||||
if (sfProp.IsSet()) {
|
||||
return sfProp.IsOn();
|
||||
}
|
||||
auto const tgtProp = this->GetProperty("CXX_SCAN_FOR_MODULES");
|
||||
if (tgtProp.IsSet()) {
|
||||
return tgtProp.IsOn();
|
||||
return tgtProp.IsOn() ? CxxModuleSupport::Enabled
|
||||
: CxxModuleSupport::Disabled;
|
||||
}
|
||||
|
||||
bool policyAnswer = false;
|
||||
CxxModuleSupport policyAnswer = CxxModuleSupport::Unavailable;
|
||||
switch (this->GetPolicyStatusCMP0155()) {
|
||||
case cmPolicies::WARN:
|
||||
case cmPolicies::OLD:
|
||||
// The OLD behavior is to not scan the source.
|
||||
policyAnswer = false;
|
||||
policyAnswer = CxxModuleSupport::Disabled;
|
||||
break;
|
||||
case cmPolicies::REQUIRED_ALWAYS:
|
||||
case cmPolicies::REQUIRED_IF_USED:
|
||||
case cmPolicies::NEW:
|
||||
// The NEW behavior is to scan the source if the compiler supports
|
||||
// scanning and the generator supports it.
|
||||
policyAnswer = haveRule && haveGeneratorSupport;
|
||||
if (haveRule && haveGeneratorSupport) {
|
||||
policyAnswer = CxxModuleSupport::Enabled;
|
||||
} else {
|
||||
policyAnswer = CxxModuleSupport::Disabled;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return policyAnswer;
|
||||
|
@ -1327,6 +1327,13 @@ public:
|
||||
cmSourceFile const* sf) const;
|
||||
bool NeedDyndepForSource(std::string const& lang, std::string const& config,
|
||||
cmSourceFile const* sf) const;
|
||||
enum class CxxModuleSupport
|
||||
{
|
||||
Unavailable,
|
||||
Enabled,
|
||||
Disabled,
|
||||
};
|
||||
CxxModuleSupport NeedCxxDyndep(std::string const& config) const;
|
||||
|
||||
private:
|
||||
void BuildFileSetInfoCache(std::string const& config) const;
|
||||
|
Loading…
Reference in New Issue
Block a user