On Fri, Jul 6, 2018 at 8:25 PM, Mads Andreasen <te...@andreasen.cc> wrote:

> Hi,
>
> I am trying to work with FetchContent in cmake 3.11.
> I want to use the jsoncpp library and use FetchContent to get and build it.
>

FetchContent can only download it. You need to build it as a separate step
(you should avoid building things during the configure phase as much as
possible). The expected pattern is to add the downloaded contents to your
existing build via add_subdirectory(). If you want to keep the build
isolated from your main build, then use ExternalProject directly rather
than FetchContent.



>
> I also want to configure the jsoncpp build with some cmake arguments and I
> can't seem to get that right.
>
> My CMakeLists.txt looks like this:
> **************************************************************
> cmake_minimum_required(VERSION 3.11)
> project(Foo)
>
> include(FetchContent)
>
> FetchContent_Declare(jsoncpp
>   URL "c:/project/jsoncpp-src"
>     CMAKE_ARGS "-DJSONCPP_WITH_CMAKE_PACKAGE=ON;-DJSONCPP_WITH_PKGCONFIG_
> SUPPORT=OFF"
> )
>
> FetchContent_Populate(jsoncpp)
>
> add_executable(Foo main.cpp)
> **************************************************************
>

The configure, build, test and install steps of ExternalProject do not
apply to FetchContent, that's why CMAKE_ARGS has no effect.





>
>
> FetchContent downloads and configures the jsoncpp as an ExternalProject.
>

No, it only downloads, not configures.



> That part looks like this:
> *********************************************
> ExternalProject_Add(jsoncpp-populate
>                      "UPDATE_DISCONNECTED" "False" "URL"
> "c:/project/jsoncpp-src" "CMAKE_ARGS" "-DJSONCPP_WITH_CMAKE_PACKAGE=ON"
> "-DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF"
>                     SOURCE_DIR          "C:/temp/foo/build/_deps/
> jsoncpp-src"
>                     BINARY_DIR          "C:/temp/foo/build/_deps/
> jsoncpp-build"
>                     CONFIGURE_COMMAND   ""
>                     BUILD_COMMAND       ""
>                     INSTALL_COMMAND     ""
>                     TEST_COMMAND        ""
> )
> *******************************************************
>
> For the external project - the CMAKE_ARGS are no longer a list, but
> individual arguments.
>
> I have tried different things, like escaping the ; with \\; and stuff like
> that, and I can't get it to work.
> I'm thinking there is something obvious I am missing?
>

Assuming jsoncpp doesn't assume it is a top level project (I haven't
checked), the canonical pattern as explained in the docs
<https://cmake.org/cmake/help/latest/module/FetchContent.html#overview>
would be:

FetchContent_Declare(jsoncpp
   URL "c:/project/jsoncpp-src"
)

FetchContent_GetProperties(jsoncpp)

if(NOT jsoncpp_POPULATED)

  FetchContent_Populate(jsoncpp)

  add_subdirectory(${jsoncpp_SOURCE_DIR} ${jsoncpp_BINARY_DIR})

endif()


The reason why FetchContent has all but download steps disabled is the
projects should avoid doing time-consuming things during the configure
stage. A configure stage will be inherently non-parallel as well, so it
hurts you twice. Build steps should be deferred to the build stage as much
as possible. If you find yourself wanting to pull some external project's
build earlier into the configure stage, chances are you really should be
using a superbuild if you truly need a build to be complete before the
configure logic of a different project is executed.

-- 
Craig Scott
Melbourne, Australia
https://crascit.com
-- 

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

Reply via email to