[CMake] CMake Digest, Vol 137, Issue 50

Craig Scott audiofanatic at gmail.com
Fri Sep 25 19:02:47 EDT 2015


---------- Forwarded message ----------
> From: John Barbero Unenge <john.barbero.unenge at gmail.com>
> To: cmake at cmake.org
> Cc:
> Date: Fri, 25 Sep 2015 11:58:03 +0200
> Subject: [CMake] find_package for both debug and release with Visual Studio
> I'm tearing my hair out about how to include thrid party libraries in my
> cmake project. Currently I build Poco and a bunch of others that all
> generate their respective <LibName>Config.cmake which I use with
> find_package. I have a wrapping build script that builds all of my
> dependencies and package them separately for debug and release (I don't
> want to tweak their cmake-scripts unless I really really really need to
> because maintanance).
>
> I thought I could just do:
>
> find_package(Foo
>             HINTS "${CMAKE_SOURCE_DIR}/some/path/debug/libFoo/lib/cmake"
>             REQUIRED
> )
> get_target_property(LIB_FOO_DEBUG lib_foo LOCATION)
>
> find_package(Foo
>             HINTS "${CMAKE_SOURCE_DIR}/some/path/release/libFoo/lib/cmake"
>             REQUIRED
> )
> get_target_property(LIB_FOO_RELEASE lib_foo LOCATION)
>
> set(LIB_FOO_LIBRARIES optimized "${LIB_FOO_RELEASE}" debug
> "${LIB_FOO_DEBUG}")
>
> message("LIB_FOO_LIBRARIES: \"${LIB_FOO_LIBRARIES}\"")
> # Gives: LIB_FOO_LIBRARIES: "
> optimized;C:/path/to/proj/some/path/debug/libFoo/lib/foo.lib;debug;C:/path/to/proj/some/path/debug/libFoo/lib/foo.lib"
>
> It seems like the first call to find_package for target Foo is cached,
> whis I don't really want.
>
> Am I going about this the wrong way? How do I properly work with 3rd party
> libraries with the Visual Studio generator?
>
> Any pointers are greatly appreciated.
>
> / John
>

Not sure if it will be relevant for you, but if the third party libraries
you want to use are themselves built with CMake, you can make them part of
your build directly. This has the following advantages in your scenario:


   - They will inherit the same debug/release config as your main project.
   - No need to explicitly tell CMake where anything is because all targets
   in the third party library are part of the build. Instead of using
   find_package, you can just link directly to the targets by CMake target
   name.

The trick for this is to download the source of the third party library at
CMake time (caching it so it only downloads once) and then pull it in via
add_subdirectory(). The technique is discussed here with GoogleTest as the
example:

http://crascit.com/2015/07/25/cmake-gtest/

The technique uses ExternalProject to manage the download but it does so by
invoking it as a script to get it to do its thing at CMake time rather than
build time.

-- 
Craig Scott
Melbourne, Australia
http://crascit.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20150926/40edbee8/attachment-0001.html>


More information about the CMake mailing list