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 don't know if other CMake functions will react similarly bad to the list/bool operator combo. Regards, Björn From: Andrew Fuller <aful...@teradici.com> Sent: Thursday, October 4, 2018 6:16 PM To: Björn Blissing <bjorn.bliss...@vti.se>; Eric Noulard <eric.noul...@gmail.com> Cc: CMake Mailinglist <cmake@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.bliss...@vti.se<mailto:bjorn.bliss...@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 <aful...@teradici.com<mailto:aful...@teradici.com>> Sent: Thursday, October 4, 2018 5:54 PM To: Björn Blissing <bjorn.bliss...@vti.se<mailto:bjorn.bliss...@vti.se>>; Eric Noulard <eric.noul...@gmail.com<mailto:eric.noul...@gmail.com>> Cc: CMake Mailinglist <cmake@cmake.org<mailto:cmake@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-boun...@cmake.org<mailto:cmake-boun...@cmake.org>> on behalf of Björn Blissing <bjorn.bliss...@vti.se<mailto:bjorn.bliss...@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.noul...@gmail.com<mailto:eric.noul...@gmail.com>> Sent: Thursday, October 4, 2018 5:10 PM To: Björn Blissing <bjorn.bliss...@vti.se<mailto:bjorn.bliss...@vti.se>> Cc: CMake Mailinglist <cmake@cmake.org<mailto:cmake@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.bliss...@vti.se<mailto:bjorn.bliss...@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
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake