|
|
@@ -300,6 +300,37 @@ static const struct InListNode : public cmGeneratorExpressionNode
|
|
|
}
|
|
|
} inListNode;
|
|
|
|
|
|
+static const struct TargetExistsNode : public cmGeneratorExpressionNode
|
|
|
+{
|
|
|
+ TargetExistsNode() {}
|
|
|
+
|
|
|
+ int NumExpectedParameters() const override { return 1; }
|
|
|
+
|
|
|
+ std::string Evaluate(
|
|
|
+ const std::vector<std::string>& parameters,
|
|
|
+ cmGeneratorExpressionContext* context,
|
|
|
+ const GeneratorExpressionContent* content,
|
|
|
+ cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override
|
|
|
+ {
|
|
|
+ if (parameters.size() != 1) {
|
|
|
+ reportError(context, content->GetOriginalExpression(),
|
|
|
+ "$<TARGET_EXISTS:...> expression requires one parameter");
|
|
|
+ return std::string();
|
|
|
+ }
|
|
|
+
|
|
|
+ std::string targetName = parameters.front();
|
|
|
+ if (targetName.empty() ||
|
|
|
+ !cmGeneratorExpression::IsValidTargetName(targetName)) {
|
|
|
+ reportError(context, content->GetOriginalExpression(),
|
|
|
+ "$<TARGET_EXISTS:tgt> expression requires a non-empty "
|
|
|
+ "valid target name.");
|
|
|
+ return std::string();
|
|
|
+ }
|
|
|
+
|
|
|
+ return context->LG->GetMakefile()->FindTargetToUse(targetName) ? "1" : "0";
|
|
|
+ }
|
|
|
+} targetExistsNode;
|
|
|
+
|
|
|
static const struct LowerCaseNode : public cmGeneratorExpressionNode
|
|
|
{
|
|
|
LowerCaseNode() {}
|
|
|
@@ -1865,6 +1896,7 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode(
|
|
|
nodeMap["TARGET_NAME"] = &targetNameNode;
|
|
|
nodeMap["TARGET_OBJECTS"] = &targetObjectsNode;
|
|
|
nodeMap["TARGET_POLICY"] = &targetPolicyNode;
|
|
|
+ nodeMap["TARGET_EXISTS"] = &targetExistsNode;
|
|
|
nodeMap["BUILD_INTERFACE"] = &buildInterfaceNode;
|
|
|
nodeMap["INSTALL_INTERFACE"] = &installInterfaceNode;
|
|
|
nodeMap["INSTALL_PREFIX"] = &installPrefixNode;
|