|
@@ -508,6 +508,105 @@ static const struct TargetNameNode : public cmGeneratorExpressionNode
|
|
|
|
|
|
|
|
} targetNameNode;
|
|
} targetNameNode;
|
|
|
|
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
|
|
+static const char* targetPolicyWhitelist[] = {
|
|
|
|
|
+ "CMP0003"
|
|
|
|
|
+ , "CMP0004"
|
|
|
|
|
+ , "CMP0008"
|
|
|
|
|
+ , "CMP0020"
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+cmPolicies::PolicyStatus statusForTarget(cmTarget *tgt, const char *policy)
|
|
|
|
|
+{
|
|
|
|
|
+#define RETURN_POLICY(POLICY) \
|
|
|
|
|
+ if (strcmp(policy, #POLICY) == 0) \
|
|
|
|
|
+ { \
|
|
|
|
|
+ return tgt->GetPolicyStatus ## POLICY (); \
|
|
|
|
|
+ } \
|
|
|
|
|
+
|
|
|
|
|
+ RETURN_POLICY(CMP0003)
|
|
|
|
|
+ RETURN_POLICY(CMP0004)
|
|
|
|
|
+ RETURN_POLICY(CMP0008)
|
|
|
|
|
+ RETURN_POLICY(CMP0020)
|
|
|
|
|
+
|
|
|
|
|
+#undef RETURN_POLICY
|
|
|
|
|
+
|
|
|
|
|
+ assert("!Unreachable code. Not a valid policy");
|
|
|
|
|
+ return cmPolicies::WARN;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+cmPolicies::PolicyID policyForString(const char *policy_id)
|
|
|
|
|
+{
|
|
|
|
|
+#define RETURN_POLICY_ID(POLICY_ID) \
|
|
|
|
|
+ if (strcmp(policy_id, #POLICY_ID) == 0) \
|
|
|
|
|
+ { \
|
|
|
|
|
+ return cmPolicies:: POLICY_ID; \
|
|
|
|
|
+ } \
|
|
|
|
|
+
|
|
|
|
|
+ RETURN_POLICY_ID(CMP0003)
|
|
|
|
|
+ RETURN_POLICY_ID(CMP0004)
|
|
|
|
|
+ RETURN_POLICY_ID(CMP0008)
|
|
|
|
|
+ RETURN_POLICY_ID(CMP0020)
|
|
|
|
|
+
|
|
|
|
|
+#undef RETURN_POLICY_ID
|
|
|
|
|
+
|
|
|
|
|
+ assert("!Unreachable code. Not a valid policy");
|
|
|
|
|
+ return cmPolicies::CMP0002;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
|
|
+static const struct TargetPolicyNode : public cmGeneratorExpressionNode
|
|
|
|
|
+{
|
|
|
|
|
+ TargetPolicyNode() {}
|
|
|
|
|
+
|
|
|
|
|
+ virtual int NumExpectedParameters() const { return 1; }
|
|
|
|
|
+
|
|
|
|
|
+ std::string Evaluate(const std::vector<std::string> ¶meters,
|
|
|
|
|
+ cmGeneratorExpressionContext *context ,
|
|
|
|
|
+ const GeneratorExpressionContent *content,
|
|
|
|
|
+ cmGeneratorExpressionDAGChecker *) const
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!context->HeadTarget)
|
|
|
|
|
+ {
|
|
|
|
|
+ reportError(context, content->GetOriginalExpression(),
|
|
|
|
|
+ "$<TARGET_POLICY:prop> may only be used with targets. It may not "
|
|
|
|
|
+ "be used with add_custom_command.");
|
|
|
|
|
+ return std::string();
|
|
|
|
|
+ }
|
|
|
|
|
+ for (size_t i = 0;
|
|
|
|
|
+ i < (sizeof(targetPolicyWhitelist) /
|
|
|
|
|
+ sizeof(*targetPolicyWhitelist));
|
|
|
|
|
+ ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ const char *policy = targetPolicyWhitelist[i];
|
|
|
|
|
+ if (parameters.front() == policy)
|
|
|
|
|
+ {
|
|
|
|
|
+ cmMakefile *mf = context->HeadTarget->GetMakefile();
|
|
|
|
|
+ switch(statusForTarget(context->HeadTarget, policy))
|
|
|
|
|
+ {
|
|
|
|
|
+ case cmPolicies::WARN:
|
|
|
|
|
+ mf->IssueMessage(cmake::AUTHOR_WARNING,
|
|
|
|
|
+ mf->GetPolicies()->
|
|
|
|
|
+ GetPolicyWarning(policyForString(policy)));
|
|
|
|
|
+ case cmPolicies::REQUIRED_IF_USED:
|
|
|
|
|
+ case cmPolicies::REQUIRED_ALWAYS:
|
|
|
|
|
+ case cmPolicies::OLD:
|
|
|
|
|
+ return "0";
|
|
|
|
|
+ case cmPolicies::NEW:
|
|
|
|
|
+ return "1";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ reportError(context, content->GetOriginalExpression(),
|
|
|
|
|
+ "$<TARGET_POLICY:prop> may only be used with a limited number of "
|
|
|
|
|
+ "policies. Currently it may be used with policies CMP0003, CMP0004, "
|
|
|
|
|
+ "CMP0008 and CMP0020."
|
|
|
|
|
+ );
|
|
|
|
|
+ return std::string();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+} targetPolicyNode;
|
|
|
|
|
+
|
|
|
//----------------------------------------------------------------------------
|
|
//----------------------------------------------------------------------------
|
|
|
template<bool linker, bool soname>
|
|
template<bool linker, bool soname>
|
|
|
struct TargetFilesystemArtifactResultCreator
|
|
struct TargetFilesystemArtifactResultCreator
|
|
@@ -735,6 +834,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
|
|
|
return &targetPropertyNode;
|
|
return &targetPropertyNode;
|
|
|
else if (identifier == "TARGET_NAME")
|
|
else if (identifier == "TARGET_NAME")
|
|
|
return &targetNameNode;
|
|
return &targetNameNode;
|
|
|
|
|
+ else if (identifier == "TARGET_POLICY")
|
|
|
|
|
+ return &targetPolicyNode;
|
|
|
else if (identifier == "BUILD_INTERFACE")
|
|
else if (identifier == "BUILD_INTERFACE")
|
|
|
return &buildInterfaceNode;
|
|
return &buildInterfaceNode;
|
|
|
else if (identifier == "INSTALL_INTERFACE")
|
|
else if (identifier == "INSTALL_INTERFACE")
|