Superbuild subprojects and find_package()

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Superbuild subprojects and find_package()

John Gallagher
Hello all,

Some Googling has led me to questions that have been asked that are similar to this one but I haven't seen a definitive answer. I'm trying to set up a CMake "superbuild" where there are dependencies between the subprojects, and some of the subprojects use find_package() to import targets from their dependencies (other subprojects, from the superbuild's point of view). For a stripped down example, suppose I have proj1 and proj2. proj1 can be built and installed on its own, and it writes out a Proj1Config.cmake file (with targets and such). proj2 uses

find_package(Proj1 REQUIRED)

to import those targets. So independent of a CMake superbuild, things work just fine if I configure, build, and install proj1, *then* configure, build, and install proj2. Is there a way to do this using a CMake superbuild? Some ideas (mostly gleaned from the aforementioned googling):

1. Use add_subdirectory() from the superproject. I think the REQUIRED on find_package() would fail though? In my case I can modify the subprojects, but I would like for them to continue to build correctly standalone (not inside the superbuild), as they really are separate projects. Is there a way to make add_subdirectory() work without exploding on find_package?

2. Don't use CMake for the "superbuild" - a shell script or plain Makefile could accomplish this pretty easily, but that seems a little hokey.

3. (This one is unclear.) Somehow build proj1 before configuring proj2, and point proj2 at proj1's build directory so it can find Proj1Config.cmake. This seems fragile at best (prefix, RPATH, etc issues).

Appreciate any advice!

John

--

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
Reply | Threaded
Open this post in threaded view
|

Re: Superbuild subprojects and find_package()

Petr Kmoch
Hi John,

the primary tool for superbuilds in CMake's arsenal is ExternalProject_Add from module ExternalProject. I don't have much experience with it, but you can read its docs to see if it could help you.

Petr


On Thu, Apr 18, 2013 at 5:38 AM, John Gallagher <[hidden email]> wrote:
Hello all,

Some Googling has led me to questions that have been asked that are similar to this one but I haven't seen a definitive answer. I'm trying to set up a CMake "superbuild" where there are dependencies between the subprojects, and some of the subprojects use find_package() to import targets from their dependencies (other subprojects, from the superbuild's point of view). For a stripped down example, suppose I have proj1 and proj2. proj1 can be built and installed on its own, and it writes out a Proj1Config.cmake file (with targets and such). proj2 uses

find_package(Proj1 REQUIRED)

to import those targets. So independent of a CMake superbuild, things work just fine if I configure, build, and install proj1, *then* configure, build, and install proj2. Is there a way to do this using a CMake superbuild? Some ideas (mostly gleaned from the aforementioned googling):

1. Use add_subdirectory() from the superproject. I think the REQUIRED on find_package() would fail though? In my case I can modify the subprojects, but I would like for them to continue to build correctly standalone (not inside the superbuild), as they really are separate projects. Is there a way to make add_subdirectory() work without exploding on find_package?

2. Don't use CMake for the "superbuild" - a shell script or plain Makefile could accomplish this pretty easily, but that seems a little hokey.

3. (This one is unclear.) Somehow build proj1 before configuring proj2, and point proj2 at proj1's build directory so it can find Proj1Config.cmake. This seems fragile at best (prefix, RPATH, etc issues).

Appreciate any advice!

John

--

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


--

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
Reply | Threaded
Open this post in threaded view
|

Re: Superbuild subprojects and find_package()

Andreas Pakulat-2
In reply to this post by John Gallagher
Hi,


On Thu, Apr 18, 2013 at 5:38 AM, John Gallagher <[hidden email]> wrote:
Hello all,

Some Googling has led me to questions that have been asked that are similar to this one but I haven't seen a definitive answer. I'm trying to set up a CMake "superbuild" where there are dependencies between the subprojects, and some of the subprojects use find_package() to import targets from their dependencies (other subprojects, from the superbuild's point of view). For a stripped down example, suppose I have proj1 and proj2. proj1 can be built and installed on its own, and it writes out a Proj1Config.cmake file (with targets and such). proj2 uses

find_package(Proj1 REQUIRED)

to import those targets. So independent of a CMake superbuild, things work just fine if I configure, build, and install proj1, *then* configure, build, and install proj2. Is there a way to do this using a CMake superbuild? Some ideas (mostly gleaned from the aforementioned googling):

I haven't used it yet, but this sounds like you should look into the ExternalProject module of CMake. See http://cmake.org/cmake/help/v2.8.10/cmake.html#module:ExternalProject

Andreas

--

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
Reply | Threaded
Open this post in threaded view
|

Re: Superbuild subprojects and find_package()

markus israelsson
In reply to this post by John Gallagher
Hello John,

Maybe I am missing something but can't you do something like this in proj2s cmakelists.txt?
if( TARGET proj1 )
  list_of_libraries_to_link_against( ${ list_of_libraries_to_link_against} proj1 )
else( TARGET proj1 )
  find( proj1 required )
    list_of_libraries_to_link_against( ${ list_of_libraries_to_link_against} proj1_libraries or whatever)
endif(TARGET proj1 )

Message: 2
Date: Wed, 17 Apr 2013 23:38:36 -0400
From: John Gallagher <[hidden email]>
Subject: [CMake] Superbuild subprojects and find_package()
To: cmake <[hidden email]>
Message-ID:
        <CAFoDJR-oQxjdNgDh020SWRX0_pdcJ8E=+[hidden email]>
Content-Type: text/plain; charset="iso-8859-1"

Hello all,

Some Googling has led me to questions that have been asked that are similar to this one but I haven't seen a definitive answer. I'm trying to set up a CMake "superbuild" where there are dependencies between the subprojects, and some of the subprojects use find_package() to import targets from their dependencies (other subprojects, from the superbuild's point of view). For a stripped down example, suppose I have proj1 and proj2. proj1 can be built and installed on its own, and it writes out a Proj1Config.cmake file (with targets and such). proj2 uses

find_package(Proj1 REQUIRED)

to import those targets. So independent of a CMake superbuild, things work just fine if I configure, build, and install proj1, *then* configure, build, and install proj2. Is there a way to do this using a CMake superbuild? Some ideas (mostly gleaned from the aforementioned googling):

1. Use add_subdirectory() from the superproject. I think the REQUIRED on
find_package() would fail though? In my case I can modify the subprojects, but I would like for them to continue to build correctly standalone (not inside the superbuild), as they really are separate projects. Is there a way to make add_subdirectory() work without exploding on find_package?

2. Don't use CMake for the "superbuild" - a shell script or plain Makefile could accomplish this pretty easily, but that seems a little hokey.

3. (This one is unclear.) Somehow build proj1 before configuring proj2, and point proj2 at proj1's build directory so it can find Proj1Config.cmake.
This seems fragile at best (prefix, RPATH, etc issues).

Appreciate any advice!

John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20130417/3745c678/attachment-0001.htm>

------------------------------


--

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
Reply | Threaded
Open this post in threaded view
|

Re: Superbuild subprojects and find_package()

Benjamin Eikel-2
In reply to this post by John Gallagher
Hello John,

On Wednesday 17 April 2013 23:38:36 John Gallagher wrote:
> 3. (This one is unclear.) Somehow build proj1 before configuring proj2, and
> point proj2 at proj1's build directory so it can find Proj1Config.cmake.
> This seems fragile at best (prefix, RPATH, etc issues).

when using ExternalProject, dependencies between projects can look like this (small excerpt from a superbuild project that I wrote):



include(ExternalProject)

# Build ZLIB first
ExternalProject_Add(EP_ZLIB
        URL http://download.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz
        URL_MD5 "60df6a37c56e7c1366cca812414f7b85"
        PATCH_COMMAND patch -p0 < ${CMAKE_CURRENT_LIST_DIR}/zlib-CMakeLists.txt-OUTPUT_NAME.patch && patch -p0 < ${CMAKE_CURRENT_LIST_DIR}/zlib-CMakeLists.txt-version-script.patch
        INSTALL_DIR ${INSTALL_DIR}
        CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${TOOLCHAIN_FILE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_BUILD_TYPE:STRING=Release
)



# For building CURL, use ZLIB that has been built before
ExternalProject_Add(EP_LIBCURL
        DEPENDS EP_ZLIB
        URL http://curl.haxx.se/download/curl-7.27.0.tar.gz
        URL_MD5 "f0e48fdb635b5939e02a9291b89e5336"
        CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --host=${ARCH_TRIPLET} --disable-static --disable-manual --with-zlib=<INSTALL_DIR> CC=${CMAKE_C_COMPILER} LD=${CMAKE_LINKER}
        INSTALL_DIR ${INSTALL_DIR}
)


Kind regards
Benjamin
--

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
Reply | Threaded
Open this post in threaded view
|

Re: Superbuild subprojects and find_package()

Romain LEGUAY
In reply to this post by John Gallagher
Hello John,

I made some generic scripts to answer has those kind of problem. There is an example in the folder Examples/FrameworkTest.

You can find the scripts on GitHub: https://github.com/Athius/FrameworkCMakeToolkit

I hope this is helpful.

Best regards,

Romain

Le 18/04/13 05:38, John Gallagher a écrit :
Hello all,

Some Googling has led me to questions that have been asked that are similar to this one but I haven't seen a definitive answer. I'm trying to set up a CMake "superbuild" where there are dependencies between the subprojects, and some of the subprojects use find_package() to import targets from their dependencies (other subprojects, from the superbuild's point of view). For a stripped down example, suppose I have proj1 and proj2. proj1 can be built and installed on its own, and it writes out a Proj1Config.cmake file (with targets and such). proj2 uses

find_package(Proj1 REQUIRED)

to import those targets. So independent of a CMake superbuild, things work just fine if I configure, build, and install proj1, *then* configure, build, and install proj2. Is there a way to do this using a CMake superbuild? Some ideas (mostly gleaned from the aforementioned googling):

1. Use add_subdirectory() from the superproject. I think the REQUIRED on find_package() would fail though? In my case I can modify the subprojects, but I would like for them to continue to build correctly standalone (not inside the superbuild), as they really are separate projects. Is there a way to make add_subdirectory() work without exploding on find_package?

2. Don't use CMake for the "superbuild" - a shell script or plain Makefile could accomplish this pretty easily, but that seems a little hokey.

3. (This one is unclear.) Somehow build proj1 before configuring proj2, and point proj2 at proj1's build directory so it can find Proj1Config.cmake. This seems fragile at best (prefix, RPATH, etc issues).

Appreciate any advice!

John


--

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


--

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