diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index f8eb2f0b77..22b45bb601 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -3841,7 +3841,7 @@ static const struct SourcePropertyNode : public cmGeneratorExpressionNode std::string Evaluate( std::vector 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; diff --git a/Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local.cmake b/Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local.cmake index 6ff5a7430d..91e379fd18 100644 --- a/Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local.cmake +++ b/Tests/RunCMake/GenEx-SOURCE_PROPERTY/Local.cmake @@ -42,5 +42,23 @@ string (APPEND GENERATE_CONTENT "check_value (\"\" \"$\" \"${reference}\")\n") +set_property(SOURCE foo.c PROPERTY INCLUDE_DIRECTORIES "$<$:${CMAKE_CURRENT_SOURCE_DIR}>") +string (APPEND GENERATE_CONTENT + "check_value (\"\" \"$\" \"${CMAKE_CURRENT_SOURCE_DIR}\")\n") + +set_property(SOURCE foo.c PROPERTY COMPILE_DEFINITIONS "$<$:SRC_DEF>") +string (APPEND GENERATE_CONTENT + "check_value (\"\" \"$\" \"SRC_DEF\")\n") + +set_property(SOURCE foo.c PROPERTY COMPILE_OPTIONS "$<$:SRC_OPT>") +string (APPEND GENERATE_CONTENT + "check_value (\"\" \"$\" \"SRC_OPT\")\n") + +if(NOT CMAKE_GENERATOR MATCHES "Xcode|FASTBuild") + set_property(SOURCE foo.c PROPERTY OBJECT_NAME "$<$:bar>") + string (APPEND GENERATE_CONTENT + "check_value (\"\" \"$\" \"bar\")\n") +endif() + file (GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Local-generated.cmake" CONTENT "${GENERATE_CONTENT}")