[CMake] CMAKE_ARGS for FetchContent

Mads Andreasen temp1 at andreasen.cc
Fri Jul 6 07:49:56 EDT 2018


Hi Craig

Thanks for getting back to me.
I was hoping to be able to build the library with fetch content, so that
the FindXXX would automatically work.

If I use your proposed approach:

if(NOT jsoncpp_POPULATED)

  FetchContent_Populate(jsoncpp)

  add_subdirectory(${jsoncpp_SOURCE_DIR} ${jsoncpp_BINARY_DIR})

endif()


Should I then set the -DJSONCPP_XXX options when running the main cmake
configure?

Best regards,
Mads


On Fri, Jul 6, 2018 at 12:41 PM Craig Scott <craig.scott at crascit.com> wrote:

>
>
> On Fri, Jul 6, 2018 at 8:25 PM, Mads Andreasen <temp1 at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180706/d3f4ec29/attachment.html>


More information about the CMake mailing list