[CMake] Concerning IDE support for superbuilds

Craig Scott craig.scott at crascit.com
Sun Jan 21 06:22:51 EST 2018


Please excuse the brevity of this response, but a couple of links you may
want to read which may be somewhat related or provide further ideas for you:


   - The new FetchContent module
   <https://cmake.org/cmake/help/git-master/module/FetchContent.html> which
   is on master but not yet in any release. I expect it will be available in
   3.11.0 when it comes out. This offers an alternative way of incorporating
   dependencies in a way which will make them all appear directly in an IDE
   just like the rest of the project.
   - Invoking a nested build to provide something that can be used
   immediately in the main CMake run is discussed in this stackoverflow
   question and answer <https://stackoverflow.com/q/36084785/1938798> (by
   me). Pay special attention to the comments in the Updated section about
   what can happen if a CMake run is aborted/interrupted, leaving the main
   build trapped by the sub-build.



On Sun, Jan 21, 2018 at 9:16 PM, Kai Wolf <kai.wolf at gmail.com> wrote:

> Hi all,
>
> a common approach for dealing with larger dependencies in a project is
> using a superbuild approach, where all dependencies get downloaded in a
> separate repository using ExternalProject_Add() and the actual project is
> included as a sub repository (e.g. using git submodules) and also build as
> an external project [1], [2], [3]. This is necessary since external
> projects don’t play well as a direct dependency for internal targets, as
> the external projects won’t be created and available until build time,
> whereas CMake needs some information already at configure time for creating
> a proper build system.
>
> As discussed previously on this mailing list this approach has some
> significant drawbacks: Since the actual project is also build as an
> external project, CMake treats it as an external source respectively and
> IDE support is not available. One possible solution to this problem is to
> let the outer project generate a cache file which subsequently can be used
> in the actual project to configure all paths to the previously downloaded
> and built external dependencies:
>
>     +----------------+
>     |   Superbuild   |  ----> generates init-cache.cmake
>     +----------------+
>
>     +----------------+
>     | actual project |  ----> uses: cmake -C init-cache.cmake
>     +----------------+
>
> However, this means we now need two steps to configure and build the
> actual project and also cannot easily maintain the external dependencies
> within one large project.
>
> After thinking about this for a while I came up with the following hackish
> solution and would like to ask you, if you see any drawback in using this.
> Basically all I’m doing is to include the actual project first as a dummy
> external project and set the external projects as dependencies, thus
> they’ll get built beforehand and in the BUILD_COMMAND of the actual project
> I’m calling CMake to the project’s CMakeLists.txt again to trigger a
> reconfigure, writing a cache file and set a specific variable
> |project_deps_installed| which is used as an indicator in the CMakeLists.
> configuration to include the actual project via add_subdirectory(). For
> instance:
>
>     CMakeLists.txt:
>     option(BUILD_MYPROJECT „Build the actual project“ ON)
>     if(BUILD_MYPROJECT)
>       if(project_deps_installed)
>         include(${CMAKE_CURRENT_BINARY_DIR}/init-cache.cmake)
>         add_subdirectory(MyProject)
>       else()
>         include(External_project)
>       endif()
>     endif()
>
>     External_project.cmake
>     ExternalProject_Add(MyProject
>       SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MyProject
>       BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR}
>         ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}
>       INSTALL_COMMAND „"
>       DEPENDS ${external_deps})
>
>     write_cmake_cache_file(„${cache_script}“ „${cache_args}“)
>     set(project_deps_installed TRUE CACHE BOOL „“)
>
> As a result, all external dependencies get build and installed via
> ExternalProject_Add() and the actual project is configured properly and
> included via add_subdirectory(), thus it can continue using find_package()
> as usual and will be pointed to the previously configured dependencies. So
> far, I haven’t found any downside to this and consider making this part of
> CMake itself, in case you don’t see any problems using this approach?
>
>
> Thanks in advance for your input.
>
>
> [1] https://github.com/OpenChemistry/openchemistry
> [2] https://github.com/MITK/MITK
> [3] https://github.com/SuperElastix/SuperElastix
>
>
> --
>
> 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/
> opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
>
>


-- 
Craig Scott
Melbourne, Australia
https://crascit.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180121/d255e90a/attachment.html>


More information about the CMake mailing list