[CMake] To include external libraries using Cmake

James Sutherland James.Sutherland at utah.edu
Fri Jan 13 18:53:17 EST 2017


I found this solution helpful:
  https://crascit.com/2015/07/25/cmake-gtest
It is unfortunate that CMake doesn't have a proper way to accomplish this.
--James


On Thu, Jan 5, 2017 at 12:21 PM, Matthew Woehlke <
matthew.woehlke at kitware.com> wrote:

> On 2017-01-05 05:10, aishwarya selvaraj wrote:
> > Thanks for feedback :
> >
> >> IF (${ARMADILLO} STREQUAL “ARMADILLO-NOTFOUND”)
> >>   # do what you want
> >> ENDIF ()
> > ​
> > I tried this way of writing :
> >
> > IF (${ARMADILLO} STREQUAL "ARMADILLO-NOTFOUND")
> >     include(ExternalProject)
> >     ExternalProject_Add(armadillo
> >     URL https://github.com/lsolanka/armadillo/archive/master.zip
> >      PREFIX ${CMAKE_CURRENT_BINARY_DIR}/armadillo-latest)
> > ENDIF()
> >
> > and
> >
> > IF (ARMADILLO STREQUAL ARMADILLO-NOTFOUND)
> >    include(ExternalProject)
> >    MESSAGE(STATUS "Trying to install armadillo...")
> >     ExternalProject_Add(armadillo
> >     URL https://github.com/lsolanka/armadillo/archive/master.zip
> >     PREFIX ${CMAKE_CURRENT_BINARY_DIR}/armadillo-latest)
> > ENDIF()
>
> `if(NOT ARMADILLO)` is probably better...
>
> > ​But both of them gave me an error :
> >   CMake Error: The following variables are used in this project, but
> >   they are set to NOTFOUND. Please set them or make sure they are set
> >   and tested correctly in the CMake files:
> >   ARMADILLO
> >     linked by target "tsm" in directory /home/computing9/TSM_cmake
> >   SNDFILE
> >     linked by target "tsm" in directory /home/computing9/TSM_cmake
>
> Ah... I was mostly replying to Parag; I hadn't actually looked that
> closely at your original problem.
>
> What you're trying to do is similar to a "superbuild" with optional
> components. The usual way to do this is to treat *your own project* as
> one of several external projects, so that the "superbuild" consists
> solely of external projects. Something like:
>
>   set(mydeps)
>   if(NOT armadillo)
>     externalproject_add(armadillo ...)
>     list(APPEND mydeps armadillo
>   endif()
>   # similar for other externals
>   externalproject_add(myproject ... DEPENDS ${mydeps})
>
> This way, by the time your project configures, the library exists.
> (You'll probably end up looking for the library twice; once in the
> superbuild to decide whether to build it, and again in your project
> proper where you'll a) assume it exists and hard error otherwise, and b)
> want to specify as an additional search path where the superbuild will
> produce it.)
>
> Without this, trying to set up the rules so that you can both link the
> library that will be created, and also get the dependencies correct so
> that the build knows how to produce it when needed, is probably going to
> be tricky. (Read: I'm not convinced it's impossible, but I've never seen
> someone actually doing this and wouldn't recommend it.)
>
> An alternative that may work is to set up the externals as subprojects
> and have CMake fetch them at configure time if they are needed, and then
> incorporate their builds directly in your own build (i.e. using
> add_subdirectory rather than externalproject_add); then you can link to
> the library target names when you build them yourself, and everything
> will work.
>
> p.s. I don't recommend always obtaining the current master of externals.
> It's usually safer to pick a SHA and bump it as needed, so that you are
> insulated against breaking changes upstream. I'm also not sure why you
> are fetching snapshots instead of just using the git repositories directly.
>
> --
> Matthew
> --
>
> 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/opensou
> rce/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20170113/f477ef48/attachment-0001.html>


More information about the CMake mailing list