Hi,

As part of implementing the INTERFACE_SOURCES feature, a SOURCES property is 
required. 

Unfortunately it already exists and does not contain all sources. It omits 
TARGET_OBJECTS items. Backward compatibility must be preserved. I would want 
to turn TARGET_OBJECTS into a 'real' generator expression which results in a 
list of object file paths, and simply process the SOURCES like other build 
properties, allowing that result.

Configure-time code can not handle generator expressions. 
cmSetSourceFilesPropertiesCommand is documented as being suitable for 
consuming the value of SOURCES from a target. It breaks if a generator 
expression is passed in. Additionally user code can be reading the SOURCES 
property (it is read-only, they can't be writing it), and would break if the 
TARGET_OBJECTS expression were added.

The cmSetSourceFilesPropertiesCommand can be made to ignore generator 
expressions. An alternative would be to execute the property setting after 
generator expression expansion. However, that would be weird:

 add_library(bar bar.cpp)

 add_library(foo foo.cpp $<TARGET_PROPERTY:bar,SOURCES>)
 # get_target_property(res foo SOURCES)
 # message("RES: ${res}")

 get_target_property(foo_srcs foo SOURCES)
 # Sets bar.cpp property at generate-time:
 set_source_files_properties(${foo_srcs} PROPERTIES LABELS fooSRCS)

 get_target_property(bar_srcs bar SOURCES)
 # Sets bar.cpp property at configure-time:
 set_source_files_properties(${bar_srcs} PROPERTIES LABELS barSRCS)


The 'direct' setting of the property is always overridden by the setting on 
foo, because that is evaluated lazily.

User code must also be able to ignore generator expressions. For that, we 
can add a subcommand string(GENEX_STRIP). An alternative is adding 
string(GENEX_SPLIT) and string(FIND_GENEX) instead. Eg:

 'foo;bar;$<1:bing;bang;bat>;baz'

splits to

 'foo' 'bar' '$<1:bing;bang;bat>' 'baz'

and FIND_GENEX can be used to determine whether to skip an element when 
processing.

A policy would be needed to add TARGET_OBJECTS to the SOURCES property. 
Other generator expressions could only appear with changes to user code or 
dependencies. As I think this is quite a significant policy, I'd prefer to 
get it into 3.0 so it can be removed in 4.0 rather than added n 3.1 and 
removed in 5.0. The chosen string() subcommands would also need to be added 
in 3.0 in order to provide a non-deprecated way of stripping the genexes 
from SOURCES.

 prop_tgt/SOURCES
 command/target_sources

An alternative plan would be to deprecate the SOURCES property and introduce 
a new property which contains the generator expressions:

 prop_tgt/COMPILE_SOURCES
 command/target_compile_sources

That name is not great, because the sources may be object files which do not 
get compiled but only linked.

Thanks,

Steve.


-- 

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to