GenEx SOURCE_PROPERTY: fix evaluation of generation expressions

This commit is contained in:
Marc Chevrier committed 2026-06-03 15:44:16 +02:00
1 parent 80f1d73512
commit 699f4d61a5
2 files changed
+60 -2

No files matched your search

+42 -2
View File
@@ -3841,7 +3841,7 @@ static const struct SourcePropertyNode : public cmGeneratorExpressionNode
std::string Evaluate(
std::vector<std::string> const& parameters, cm::GenEx::Evaluation* eval,
GeneratorExpressionContent const* content,
cmGeneratorExpressionDAGChecker* /*dagCheckerParent*/) const override
cmGeneratorExpressionDAGChecker* dagCheckerParent) const override
{
static cmsys::RegularExpression propertyNameValidator("^[A-Za-z0-9_]+$");
@@ -3891,7 +3891,47 @@ static const struct SourcePropertyNode : public cmGeneratorExpressionNode
return std::string{};
}
return sourceFile->GetPropertyForUser(propertyName);
if (propertyName == "OBJECT_NAME"_s) {
return eval->Context.LG->GetCustomObjectFileName(*sourceFile);
}
std::string result = sourceFile->GetPropertyForUser(propertyName);
if (propertyName == "INCLUDE_DIRECTORIES"_s ||
propertyName == "COMPILE_DEFINITIONS"_s ||
propertyName == "COMPILE_OPTIONS"_s ||
propertyName == "COMPILE_FLAGS"_s ||
propertyName == "OBJECT_OUTPUTS"_s ||
propertyName == "VS_DEPLOYMENT_CONTENT"_s ||
propertyName == "VS_SETTINGS"_s) {
if (eval->HeadTarget) {
cmGeneratorExpressionDAGChecker dagChecker{
eval->HeadTarget, propertyName, content,
dagCheckerParent, eval->Context, eval->Backtrace,
};
switch (dagChecker.Check()) {
case cmGeneratorExpressionDAGChecker::SELF_REFERENCE:
case cmGeneratorExpressionDAGChecker::CYCLIC_REFERENCE: {
dagChecker.ReportError(eval, content->GetOriginalExpression());
return std::string{};
}
case cmGeneratorExpressionDAGChecker::ALREADY_SEEN:
case cmGeneratorExpressionDAGChecker::DAG:
break;
}
return cmGeneratorExpression::StripEmptyListElements(
this->EvaluateDependentExpression(result, eval, eval->HeadTarget,
&dagChecker, eval->CurrentTarget));
}
return cmGeneratorExpression::StripEmptyListElements(
this->EvaluateDependentExpression(result, eval, eval->HeadTarget,
dagCheckerParent,
eval->CurrentTarget));
}
return result;
}
} sourcePropertyNode;
@@ -42,5 +42,23 @@ string (APPEND GENERATE_CONTENT
"check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,VOID>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,VOID>\" \"${reference}\")\n")
set_property(SOURCE foo.c PROPERTY INCLUDE_DIRECTORIES "$<$<BOOL:ON>:${CMAKE_CURRENT_SOURCE_DIR}>")
string (APPEND GENERATE_CONTENT
"check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,INCLUDE_DIRECTORIES>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,INCLUDE_DIRECTORIES>\" \"${CMAKE_CURRENT_SOURCE_DIR}\")\n")
set_property(SOURCE foo.c PROPERTY COMPILE_DEFINITIONS "$<$<BOOL:ON>:SRC_DEF>")
string (APPEND GENERATE_CONTENT
"check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,COMPILE_DEFINITIONS>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,COMPILE_DEFINITIONS>\" \"SRC_DEF\")\n")
set_property(SOURCE foo.c PROPERTY COMPILE_OPTIONS "$<$<BOOL:ON>:SRC_OPT>")
string (APPEND GENERATE_CONTENT
"check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,COMPILE_OPTIONS>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,COMPILE_OPTIONS>\" \"SRC_OPT\")\n")
if(NOT CMAKE_GENERATOR MATCHES "Xcode|FASTBuild")
set_property(SOURCE foo.c PROPERTY OBJECT_NAME "$<$<BOOL:ON>:bar>")
string (APPEND GENERATE_CONTENT
"check_value (\"<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,OBJECT_NAME>\" \"$<SOURCE_PROPERTY:foo.c,TARGET_DIRECTORY:foo,OBJECT_NAME>\" \"bar\")\n")
endif()
file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Local-generated.cmake"
CONTENT "${GENERATE_CONTENT}")