[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