[CMake] Trouble with conditional generator expression inside target_link_libraries
Eric Noulard
eric.noulard at gmail.com
Thu Oct 4 13:09:12 EDT 2018
Le jeu. 4 oct. 2018 à 18:34, Björn Blissing <bjorn.blissing at vti.se> a
écrit :
> Hi Andrew,
>
>
>
> That works, but as previously said. The third party find module I am using
> do not differentiate between debug and release libraries. To make matters
> even worse the keywords “optimized” and “debug” is already in the variable
> list, trying to split them will be painful.
>
>
>
> The workaround I am using right now is to have an IF-statement for the
> list option:
>
> if(${USE_FOOLIB})
>
> target_link_libraries(my_exe
>
> PUBLIC
>
> ${FOO_LIBRARIES}
>
> )
>
> endif()
>
>
>
>
>
> target_link_libraries(my_exe
>
> PUBLIC
>
> $<$<BOOL:${USE_BARLIB}>:bar>
>
> )
>
>
>
> But that breaks the pattern with using generator expressions, as I do for
> the rest of my options.
>
>
>
> I don’t know if this should be considered a bug, but it seems really
> strange that generator expressions should break down for only this special
> case, i.e. the combination using lists with the conditional operator BOOL
> and using it inside target_link_libraries.
>
I think you are right there is a bug.
When you put a list on the right hand-side of $<BOOL:, one gets unevaluated
output.
If you try
>>>>> cut here <<<<
cmake_minimum_required(VERSION 3.12)
project(expansion_error LANGUAGES CXX)
add_executable(my_exe main.cpp)
option(USE_ANYLIB "Use foo.lib" ON)
option(USE_BARLIB "Use bar.lib" ON)
list(APPEND ANY_LIBRARIES any1 any2)
target_link_libraries(my_exe
PUBLIC
$<$<BOOL:${USE_ANYLIB}>:"${ANY_LIBRARIES}">
$<$<BOOL:${USE_BARLIB}>:bar>
)
add_custom_target(ShowMe
COMMAND ${CMAKE_COMMAND} -E echo
$<$<BOOL:${USE_ANYLIB}>:${ANY_LIBRARIES}>
COMMAND ${CMAKE_COMMAND} -E echo $<$<BOOL:${USE_BARLIB}>:bar>
VERBATIM
)
>>>>>>>>> cut here <<<<<<<<<<<<<
then:
$ make ShowMe
gives:
$<1:any1 any2>
bar
which seems wrong too.
In the TLL you get "$<1:any1 -lany2>" in either Makefile or ninja generator
whereas you get proper "-lbar"
I don't know why this happen but it really looks like a bug.
>
>
> I don’t know if other CMake functions will react similarly bad to the
> list/bool operator combo.
>
>
>
> Regards,
>
> Björn
>
>
>
>
>
> *From:* Andrew Fuller <afuller at teradici.com>
> *Sent:* Thursday, October 4, 2018 6:16 PM
> *To:* Björn Blissing <bjorn.blissing at vti.se>; Eric Noulard <
> eric.noulard at gmail.com>
> *Cc:* CMake Mailinglist <cmake at cmake.org>
> *Subject:* Re: [CMake] Trouble with conditional generator expression
> inside target_link_libraries
>
>
>
> What about this:
>
>
>
>
> list(APPEND FOO_LIBRARIES_OPT foo)
> list(APPEND FOO_LIBRARIES_DBG foo_d)
>
> target_link_libraries(my_exe
> PUBLIC
> debug "$<$<BOOL:${USE_FOOLIB}>:${FOO_LIBRARIES_DBG}>"
> optimized "$<$<BOOL:${USE_FOOLIB}>:${FOO_LIBRARIES_OPT}>"
> "$<$<BOOL:${USE_BARLIB}>:bar>"
> )
>
> A little more verbose.
> ------------------------------
>
> *From:* Björn Blissing <bjorn.blissing at vti.se>
> *Sent:* October 4, 2018 9:00:28 AM
> *To:* Andrew Fuller; Eric Noulard
> *Cc:* CMake Mailinglist
> *Subject:* RE: [CMake] Trouble with conditional generator expression
> inside target_link_libraries
>
>
>
> Hi Andrew,
>
>
>
> When I put the genex inside double quotes I get:
>
> optimized.lib;foo.lib;debug.lib;foo_d.lib;bar.lib; --- for both debug and
> release builds
>
> Regards,
>
> Björn
>
>
>
>
>
> *From:* Andrew Fuller <afuller at teradici.com>
> *Sent:* Thursday, October 4, 2018 5:54 PM
> *To:* Björn Blissing <bjorn.blissing at vti.se>; Eric Noulard <
> eric.noulard at gmail.com>
> *Cc:* CMake Mailinglist <cmake at cmake.org>
> *Subject:* Re: [CMake] Trouble with conditional generator expression
> inside target_link_libraries
>
>
>
> What happens if you put the genex inside double quotes?
>
>
>
> target_link_libraries(my_exe
>
> PUBLIC
>
> "$<$<BOOL:${USE_FOOLIB}>:${FOO_LIBRARIES}>"
>
> "$<$<BOOL:${USE_BARLIB}>:bar>"
>
> )
>
>
> ------------------------------
>
> *From:* CMake <cmake-bounces at cmake.org> on behalf of Björn Blissing <
> bjorn.blissing at vti.se>
> *Sent:* October 4, 2018 8:49:19 AM
> *To:* Eric Noulard
> *Cc:* CMake Mailinglist
> *Subject:* Re: [CMake] Trouble with conditional generator expression
> inside target_link_libraries
>
>
>
> Hi Eric,
>
>
>
> I tried to do a self contained minimal example:
>
>
>
> cmake_minimum_required(VERSION 3.12)
>
> project(expension_error LANGUAGES CXX)
>
>
>
> add_executable(my_exe main.cpp)
>
>
>
> option(USE_FOOLIB "Use foo.lib" ON)
>
> option(USE_BARLIB "Use bar.lib" ON)
>
>
>
> list(APPEND FOO_LIBRARIES optimized foo)
>
> list(APPEND FOO_LIBRARIES debug foo_d)
>
>
>
>
>
> target_link_libraries(my_exe
>
> PUBLIC
>
> $<$<BOOL:${USE_FOOLIB}>:${FOO_LIBRARIES}>
>
> $<$<BOOL:${USE_BARLIB}>:bar>
>
> )
>
>
>
> But when I run this script using CMake 3.12.2, it expands to something
> even worse:
>
>
>
> $<1:optimized;foo.lib;foo_d>.lib;bar.lib --- for debug builds
>
> $<1:optimized;foo.lib;>.lib;bar.lib-- for release builds
>
>
>
> So something goes really wrong when I try to use a list inside a
> conditional generator expression inside target_link_libraries().
>
>
>
> Regards,
>
> Björn
>
>
>
>
>
>
>
> *From:* Eric Noulard <eric.noulard at gmail.com>
> *Sent:* Thursday, October 4, 2018 5:10 PM
> *To:* Björn Blissing <bjorn.blissing at vti.se>
> *Cc:* CMake Mailinglist <cmake at cmake.org>
> *Subject:* Re: [CMake] Trouble with conditional generator expression
> inside target_link_libraries
>
>
>
>
>
> Le jeu. 4 oct. 2018 à 16:53, Björn Blissing <bjorn.blissing at vti.se> a
> écrit :
>
> Hello Eric,
>
>
>
> The minimal example was just to display the expansion error. In real life
> the code uses a Boolean variable (and the rest of the CMake code is much
> larger as well).
>
> It was just to show the expansion error you get if you try to use a
> conditional generator expression inside a target_link_libraries function.
>
>
>
> Sometimes the devil is hiding in the details.
>
> Do ou manage to reproduce the genex expansion error on a toy example?
>
>
>
> I do agree that using it would be simpler if I could use:
>
> $<$<CONFIG:Debug>:${MYLIBS_DEBUG}>
>
> $<$<CONFIG:Release>:${MYLIBS_OPTIMIZED}>
>
>
>
> But since I use a third party find module the MYLIB_LIBRARIES variable is
> not separated into these categories. I was hoping to avoid rewriting this
> external find module.
>
>
>
> You can perfectly write a CMake helper function which takes
> MYLIB_LIBRARIES as input and spit out MYLIBS_DEBUG, MYLIBS_OPTIMIZED as an
> output.
>
> This way you don't have to rewrite 3rd party code and keep your code clean.
>
>
>
> --
>
> Eric
>
--
Eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20181004/18d5cf64/attachment-0001.html>
More information about the CMake
mailing list