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 <[email protected]>
Sent: Thursday, October 4, 2018 6:16 PM
To: Björn Blissing <[email protected]>; Eric Noulard
<[email protected]>
Cc: CMake Mailinglist <[email protected]>
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 <[email protected]<mailto:[email protected]>>
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 <[email protected]<mailto:[email protected]>>
Sent: Thursday, October 4, 2018 5:54 PM
To: Björn Blissing <[email protected]<mailto:[email protected]>>; Eric
Noulard <[email protected]<mailto:[email protected]>>
Cc: CMake Mailinglist <[email protected]<mailto:[email protected]>>
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 <[email protected]<mailto:[email protected]>> on behalf
of Björn Blissing <[email protected]<mailto:[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]<mailto:[email protected]>>
Sent: Thursday, October 4, 2018 5:10 PM
To: Björn Blissing <[email protected]<mailto:[email protected]>>
Cc: CMake Mailinglist <[email protected]<mailto:[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