[FetchContent] How to include header files of a third-party project whose target does not provide them

Hello, I am trying to install a third-party library cJSON with CMake’s FetchContent and I managed to do it but I find it strange that the header files are not included in the cjson target. Usually the developer would use target_include_directories on his/her exported target so consumers don’t have to worry about header files, am I right?

I am not an expert with CMake so apologies if my question is stupid.

Here’s an excerpt of my project’s CMakeLists.txt:

  GIT_REPOSITORY https://github.com/DaveGamble/cJSON
  GIT_TAG        cb8693b058ba302f4829ec6d03f609ac6f848546 # v1.7.16
set(ENABLE_CJSON_TEST OFF CACHE BOOL "cJSON: Build with unit testing" FORCE)

// The three lines below would be replaced by a single one `target_link_libraries(${PROJECT_NAME} PUBLIC cjson)`
// if the cJSON project would include the header files as part of the target cjson?
configure_file(${cJSON_SOURCE_DIR}/cJSON.h ${CMAKE_BINARY_DIR}/include/cJSON/cJSON.h)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_BINARY_DIR}/include)
target_link_libraries(${PROJECT_NAME} PUBLIC cjson)

I am wondering if there’s a way that I can compile against cjson without hacking a build-time ${CMAKE_BINARY_DIR}/include/cJSON/cJSON.h file.

Thank you!

See this answer:

Thank you! Do you have any example of a super build setup? I believe that you mean running the installation process into a temporary folder and then compiling your project against all the assets in that folder? Can it be done within CMake?

Here’s such a project: https://gitlab.kitware.com/paraview/common-superbuild/

There’s excess stuff here for other use cases, but you generally just ExternalProject_Add with the instructions for each project and make sure their DEPENDS align.

1 Like