[cmake-developers] TARGET_OBJECTS and buildsystem replacement macros
Stephen Kelly
steveire at gmail.com
Thu Mar 20 05:52:00 EDT 2014
Brad King wrote:
> On 03/19/2014 01:41 PM, Stephen Kelly wrote:
>> However, should the macro remain when generating the buildsystem files?
>
> If the place in those files where the values get written is per-config
> then they can be replaced with the literal config names. Otherwise the
> macros must be left so that the build system can substitute the config
> name at build time.
Exactly. I don't have the information to determine that.
>>> This is necessary for universal binary builds because the architecture
>>> is substituted at build time by Xcode.
>>
>> This seems to be the remaining unknowable, right?
>
> Yes. When not building universal binaries we can probably hard-code
> the one architecture to be built instead of using the placeholder.
> When building universal binaries with Xcode anything that the project
> does with the value of the generator expression will have to be aware
> of multiple architectures anyway so perhaps we can just leave the
> placeholder and let them deal with it.
I was thinking of something like this:
add_library(objlib OBJECT foo.cpp)
macro(install_objlib_hack)
foreach(lib ${ARGN})
set(dest objects)
install(FILES $<TARGET_OBJECTS:${lib}> DESTINATION ${dest})
file(GENERATE OUTPUT ${lib}Target.cmake
CONTENT "
add_library(Prefix::${lib} INTERFACE IMPORTED)
set(objects \"$<TARGET_OBJECTS:${lib}>\")
foreach(obj \${objects})
get_filename_component(objname \${obj} NAME)
list(APPEND srcs \"\${IMPORT_PREFIX}/${dest}/\${objname}\")
endforeach()
set_property(TARGET Prefix::${lib} PROPERTY
INTERFACE_SOURCES \"\${srcs}\")
")
endforeach()
endmacro()
install_objlib_hack(objlib)
It would be better with $<EACH> and $<REPLACE> expressions, but we can
ignore that for now.
If only the buildsystem tool knows the correct arch, does that mean that
CMake can not learn a built-in feature for installing object libraries,
because it is not possible to implement install() correctly for the files
for Xcode?
----
The immediate question is what to do about the the target-sources-refactor
topic I've re-merged to next.
1) I can modify the TargetObjectsNode to replace the CfgIntDir macros with
the actual configuration, but that will affect the generated buildsystem
files too
2) We can leave things as they are in the branch, meaning install(FILES)
won't work well with $<TARGET_OBJECTS> and let users of file(GENERATE) deal
with the output.
3) We can make it an error to use $<TARGET_OBJECTS> in any user-context of
generator expressions. That will also affect the use of
$<TARGET_PROPERTY:SOURCES> when object libraries are involved.
Thanks,
Steve.
More information about the cmake-developers
mailing list