Merge topic 'TARGET_DEFINED-genex'

2bee6f5 Add the TARGET_DEFINED generator expression
This commit is contained in:
Brad King 2013-01-15 14:34:38 -05:00 committed by CMake Topic Stage
commit 9a7da738f1
4 changed files with 29 additions and 0 deletions

View File

@ -37,6 +37,7 @@
"target in the same buildsystem. Expands to the empty string " \ "target in the same buildsystem. Expands to the empty string " \
"otherwise.\n" \ "otherwise.\n" \
" $<TARGET_FILE:tgt> = main file (.exe, .so.1.2, .a)\n" \ " $<TARGET_FILE:tgt> = main file (.exe, .so.1.2, .a)\n" \
" $<TARGET_DEFINED:tgt> = '1' if tgt is a target, else '0'\n" \
" $<TARGET_LINKER_FILE:tgt> = file used to link (.a, .lib, .so)\n" \ " $<TARGET_LINKER_FILE:tgt> = file used to link (.a, .lib, .so)\n" \
" $<TARGET_SONAME_FILE:tgt> = file with soname (.so.3)\n" \ " $<TARGET_SONAME_FILE:tgt> = file with soname (.so.3)\n" \
"where \"tgt\" is the name of a target. " \ "where \"tgt\" is the name of a target. " \

View File

@ -289,6 +289,22 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode
} configurationTestNode; } configurationTestNode;
static const struct TargetDefinedNode : public cmGeneratorExpressionNode
{
TargetDefinedNode() {}
virtual int NumExpectedParameters() const { return 1; }
std::string Evaluate(const std::vector<std::string> &parameters,
cmGeneratorExpressionContext *context,
const GeneratorExpressionContent *,
cmGeneratorExpressionDAGChecker *) const
{
return context->Makefile->FindTargetToUse(parameters.front().c_str())
? "1" : "0";
}
} targetDefinedNode;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static const char* targetPropertyTransitiveWhitelist[] = { static const char* targetPropertyTransitiveWhitelist[] = {
"INTERFACE_INCLUDE_DIRECTORIES" "INTERFACE_INCLUDE_DIRECTORIES"
@ -702,6 +718,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
return &buildInterfaceNode; return &buildInterfaceNode;
else if (identifier == "INSTALL_INTERFACE") else if (identifier == "INSTALL_INTERFACE")
return &installInterfaceNode; return &installInterfaceNode;
else if (identifier == "TARGET_DEFINED")
return &targetDefinedNode;
return 0; return 0;
} }

View File

@ -23,4 +23,6 @@ add_executable(consumer
target_compile_definitions(consumer target_compile_definitions(consumer
PRIVATE target_compile_definitions importedlib PRIVATE target_compile_definitions importedlib
$<$<TARGET_DEFINED:notdefined>:SHOULD_NOT_BE_DEFINED>
$<$<TARGET_DEFINED:importedlib>:SHOULD_BE_DEFINED>
) )

View File

@ -15,4 +15,12 @@
#error Expected MY_IMPORTEDINTERFACE_DEFINE #error Expected MY_IMPORTEDINTERFACE_DEFINE
#endif #endif
#ifdef SHOULD_NOT_BE_DEFINED
#error Unexpected SHOULD_NOT_BE_DEFINED
#endif
#ifndef SHOULD_BE_DEFINED
#error Expected SHOULD_BE_DEFINED
#endif
int main() { return 0; } int main() { return 0; }