[CMake] How to have a target depend on an External Project

David Cole david.cole at kitware.com
Wed Jan 12 14:12:07 EST 2011


add_dependencies does work to make sure that ExternalProject targets build
before internal targets, if you need that.

But, like Marcus said, you probably need the ExternalProject to be
configured and built before your own calls to find_package... so if you have
that chicken and egg problem, you should also build your project as an
ExternalProject.

Almost all of the projects I know of that are using ExternalProject are
producing a so-called "SuperBuild" of themselves, wherein all the targets of
the SuperBuild are ExternalProject_Add calls, and the last one is the
"project of interest."


HTH,
David


On Wed, Jan 12, 2011 at 2:09 PM, Allen D Byrne <byrn at hdfgroup.org> wrote:

>  While Marcus states what is likely the preferred way, I just added an
> ADD_DEPENDENCIES(internal_target external_target) statement that seems to
> always work?
>
> Allen
>
> > Date: Wed, 12 Jan 2011 13:23:52 -0500
>
> > From: "Marcus D. Hanwell" <marcus.hanwell at kitware.com>
>
> > Subject: Re: [CMake] How to have a target depend on an External
>
> >         Project
>
> > To: kent williams <nkwmailinglists at gmail.com>
>
> > Cc: CMake ML <cmake at cmake.org>
>
> > Message-ID:
>
> >         <AANLkTinDoc6guEnK7rxQ=0yy+sXacOium52iX8ZiHmcz at mail.gmail.com<0yy%2BsXacOium52iX8ZiHmcz at mail.gmail.com>
> >
>
> > Content-Type: text/plain; charset=ISO-8859-1
>
> >
>
> > On Wed, Jan 12, 2011 at 12:53 PM, kent williams
>
> > <nkwmailinglists at gmail.com> wrote:
>
> > > For better or worse (mostly better) we are now heavy users of
>
> > > ExternalProject. ?That module works really well to pull in external
>
> > > dependencies and get them built.
>
> > >
>
> > > ExternalProject_add has a DEPENDS keyword that lets you specify
>
> > > dependencies on other External Projects. ?But an ExternalProject isn't
>
> > > an actual CMake target, so I can't figure out how to make a regular
>
> > > CMake target depend on an External Project.
>
> > >
>
> > > Suggestions?
>
> >
>
> > Don't mix external projects and real targets. An external project
>
> > dependency is different to a target dependency. When expressing
>
> > external project dependencies you are stating that this external
>
> > project needs these others to be built before it is even configured.
>
> >
>
> > With regular targets there is an assumption that the dependency is
>
> > part of the current build, and so CMake knows everything about it, or
>
> > it was already built. If you have Qt in an external project, and a Qt
>
> > based application depending on it, the find_package(Qt4) will fail
>
> > during initial configure, as there is no Qt built/installed.
>
> >
>
> > Instead you would normally have your own project as an external
>
> > project that depends on the others it requires to build. That way,
>
> > when your external project is configured the others will have been
>
> > built and therefore could be found.
>
> >
>
> > I hope that makes the mechanism a little clearer. You could take a
>
> > look at the Titan project as one example where we have many external
>
> > projects that we build, and the Libraries/Applications external
>
> > projects that depend upon them and use them.
>
> >
>
> > Marcus
>
> >
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110112/f4e3c722/attachment-0002.htm>


More information about the CMake mailing list