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 <[email protected]> on behalf of Björn Blissing
<[email protected]>
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 <[email protected]>
Sent: Thursday, October 4, 2018 5:10 PM
To: Björn Blissing <[email protected]>
Cc: CMake Mailinglist <[email protected]>
Subject: Re: [CMake] Trouble with conditional generator expression inside
target_link_libraries
Le jeu. 4 oct. 2018 à 16:53, Björn Blissing
<[email protected]<mailto:[email protected]>> 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