[CMake] Link-Time Dependency Injection for Unit Tests

Eric Noulard eric.noulard at gmail.com
Thu Mar 15 04:56:20 EDT 2018


Hi Joshua,


2018-03-15 4:18 GMT+01:00 Joshua Baergen <joshuabaergen at gmail.com>:

> Hello,
>
> I'm attempting to implement link-time dependency injection. In brief, what
> this means is that, for a library A that depends on B, we would normally
> have:
>
>   target_link_libraries(A B)
>
> However, when building unittests for A (done in a subdirectory), we
> instead want:
>
>   target_link_libraries(A MockB)
>
> I've spent a bunch of time looking through CMake documentation and I'm not
> sure how to express this without resorting to manually specifying the link
> line when A is in use. Could someone give me some guidance?
>


Since you want link-time choice I bet you should have a look to some kind
of generator expression
see doc here:
https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html

genex may be used in target_link_libraries.

for example if you can set some property on (all) your unit test target
(I personnally do that globally by defining my own mytest_add_executable
macro)

set_target_properties(<YourTestTarget> PROPERTIES UNITTEST 1)

then may be you can use some genex which check whether an executable if a
unitest:

set(GenEx_IsTest $<STREQUAL:$<TARGET_PROPERTY:UNITTEST>,1>)

and then use some other genex using the previous one in
target_link_libraries

like here for automatic instantiation of source:
https://cmake.org/pipermail/cmake/2015-January/059669.html

I lack time to craft the complete example but I think it's doable with
genex.

It seems that others already played along this line:
https://developer.blender.org/T46725

-- 
Eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180315/7ca047d2/attachment.html>


More information about the CMake mailing list