Allow INTERFACE_SOURCES to specify $<TARGET_OBJECTS> (#14970)

Fix cmTarget::GetSourceFiles to set EvaluateForBuildsystem on the
$<TARGET_PROPERTY:...,INTERFACE_SOURCES> generator expression so that
the $<TARGET_OBJECTS> generator expression is allowed within an
INTERFACE_SOURCES value.

Extend the InterfaceLibrary test to cover this case.  Extend the
RunCMake.TargetObjects test to cover failure of $<TARGET_OBJECTS>
when used through $<TARGET_PROPERTY:...,INTERFACE_SOURCES> in a
non-buildsystem context.
This commit is contained in:
Brad King 2014-07-09 13:11:38 -04:00
parent 55d3e88fb7
commit affe9d56a2
8 changed files with 31 additions and 4 deletions

View File

@ -107,6 +107,12 @@ they may not be installed, exported, or used in the right hand side of
:command:`target_link_libraries`. They also may not be used as the ``TARGET`` :command:`target_link_libraries`. They also may not be used as the ``TARGET``
in a use of the :command:`add_custom_command(TARGET)` command signature. in a use of the :command:`add_custom_command(TARGET)` command signature.
Although object libraries may not be named directly in calls to
the :command:`target_link_libraries` command, they can be "linked"
indirectly by using an :ref:`Interface Library <Interface Libraries>`
whose :prop_tgt:`INTERFACE_SOURCES` target property is set to name
``$<TARGET_OBJECTS:objlib>``.
Build Specification and Usage Requirements Build Specification and Usage Requirements
========================================== ==========================================

View File

@ -1210,6 +1210,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
{ {
cmGeneratorExpression ge(&context->Backtrace); cmGeneratorExpression ge(&context->Backtrace);
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop); cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
std::string result = cge->Evaluate(context->Makefile, std::string result = cge->Evaluate(context->Makefile,
context->Config, context->Config,
context->Quiet, context->Quiet,

View File

@ -6375,6 +6375,7 @@ void cmTargetInternals::AddInterfaceEntries(
"$<TARGET_PROPERTY:" + *it + "," + prop + ">"; "$<TARGET_PROPERTY:" + *it + "," + prop + ">";
cmGeneratorExpression ge(&it->Backtrace); cmGeneratorExpression ge(&it->Backtrace);
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(genex); cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(genex);
cge->SetEvaluateForBuildsystem(true);
entries.push_back( entries.push_back(
new cmTargetInternals::TargetPropertyEntry(cge, *it)); new cmTargetInternals::TargetPropertyEntry(cge, *it));
} }

View File

@ -18,8 +18,12 @@ set_property(TARGET imp::iface APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SOMEPRO
set_property(TARGET imp::iface PROPERTY INTERFACE_SOMEPROP OFF) set_property(TARGET imp::iface PROPERTY INTERFACE_SOMEPROP OFF)
set_property(TARGET imp::iface PROPERTY INTERFACE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/does_not_exist.cpp) set_property(TARGET imp::iface PROPERTY INTERFACE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/does_not_exist.cpp)
add_library(objlib OBJECT obj.cpp)
add_library(iface_objlib INTERFACE)
target_sources(iface_objlib INTERFACE $<TARGET_OBJECTS:objlib>)
add_executable(InterfaceLibrary definetestexe.cpp) add_executable(InterfaceLibrary definetestexe.cpp)
target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface) target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface iface_objlib)
add_subdirectory(libsdir) add_subdirectory(libsdir)

View File

@ -15,9 +15,10 @@
#error Expected IFACE_HEADER_BUILDDIR #error Expected IFACE_HEADER_BUILDDIR
#endif #endif
extern int obj();
extern int sub(); extern int sub();
int main(int,char**) int main(int,char**)
{ {
return sub(); return obj() + sub();
} }

View File

@ -0,0 +1 @@
int obj() { return 0; }

View File

@ -1,4 +1,4 @@
CMake Error at BadContext.cmake:2 \(file\): (CMake Error at BadContext.cmake:4 \(file\):
Error evaluating generator expression: Error evaluating generator expression:
\$<TARGET_OBJECTS:NoTarget> \$<TARGET_OBJECTS:NoTarget>
@ -7,7 +7,17 @@ CMake Error at BadContext.cmake:2 \(file\):
for consumption by CMake. It is not suitable for writing out elsewhere. for consumption by CMake. It is not suitable for writing out elsewhere.
Call Stack \(most recent call first\): Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\) CMakeLists.txt:3 \(include\)
+ *)+
(CMake Error at BadContext.cmake:5 \(file\):
Error evaluating generator expression:
\$<TARGET_OBJECTS:NoTarget>
The evaluation of the TARGET_OBJECTS generator expression is only suitable
for consumption by CMake. It is not suitable for writing out elsewhere.
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
*)+
CMake Error: CMake Error:
Error evaluating generator expression: Error evaluating generator expression:

View File

@ -1,4 +1,7 @@
add_library(iface INTERFACE)
target_sources(iface INTERFACE $<TARGET_OBJECTS:NoTarget>)
file(GENERATE OUTPUT test_output CONTENT $<TARGET_OBJECTS:NoTarget>) file(GENERATE OUTPUT test_output CONTENT $<TARGET_OBJECTS:NoTarget>)
file(GENERATE OUTPUT test_output2 CONTENT $<TARGET_PROPERTY:iface,INTERFACE_SOURCES>)
install(FILES $<TARGET_OBJECTS:NoTarget> DESTINATION objects) install(FILES $<TARGET_OBJECTS:NoTarget> DESTINATION objects)