I have a CMakeLists.txt that does this:
get_target_property(myloc mytarget LOCATION)
It used to work fine, but CMake 3.0 deprecated using LOCATION
(see https://cmake.org/cmake/help/v3.0/policy/CMP0026.html). So I tried using a generator expression:
set(myloc $<TARGET_FILE:mytarget>)
This seemed like it would work, except that generator expressions are not evaluated everywhere, they only seem to work when setting properties of other targets, and are resolved during the "generation" step, not the earlier "configuration" step. The problem is, I need to know the target location in an install()
rule, something like this (the real use is not strip
but that doesn't matter):
install(CODE "execute_process(COMMAND strip ${myloc})")
This worked fine when using LOCATION
but now that's deprecated and I can't figure out the right way to do this. The root of the problem seems to be that install()
is invoked during the "configuration" step, when the target path is not known.
How can I bridge this gap, and discover the target output path as I used to do, before calling install()
?
Ideally, it would be done via generator expressions:
Unfortunately, support for generator expressions in CODE and SCRIPT modes of
install
command has been added only in CMake 3.14 (see documentation of install command in that version).Before CMake 3.14 you may work only with single-configuration generators (e.g. with Makefile but not with Visual Studio).
In such conditions, you may either disable CMP0026 warning, as suggested in the Th.Thielemann's answer and read LOCATION property.
Or you may use
install(SCRIPT)
flow of the command, where the script is prepared with file(GENERATE) command which is likeconfigure_file
but works with generator expressions:Note, that the approach with
file(GENERATE)
still doesn't work with multi-configuration generators: CMake requires filename forOUTPUT
clause to be unique between the configurations. One may "fix" that withbut this still won't work: in multi-configuration generators
CMAKE_BUILD_TYPE
is evaluated to empty string.(Replacing
${CMAKE_BUILD_TYPE}
with$<CONFIG>
ininstall(SCRIPT)
command would work only in CMake 3.14 and after, but in these versions the wholefile(GENERATE)
is not needed and one may just use the very first snippet.)You can try to use/re-enable the < v3.0 behaviour.
See cmake-policies