|
|
@@ -108,9 +108,13 @@ Declaring Content Details
|
|
|
The ``<contentOptions>`` can be any of the download or update/patch options
|
|
|
that the :command:`ExternalProject_Add` command understands. The configure,
|
|
|
build, install and test steps are explicitly disabled and therefore options
|
|
|
- related to them will be ignored. In most cases, ``<contentOptions>`` will
|
|
|
- just be a couple of options defining the download method and method-specific
|
|
|
- details like a commit tag or archive hash. For example:
|
|
|
+ related to them will be ignored. The ``SOURCE_SUBDIR`` option is an
|
|
|
+ exception, see :command:`FetchContent_MakeAvailable` for details on how that
|
|
|
+ affects behavior.
|
|
|
+
|
|
|
+ In most cases, ``<contentOptions>`` will just be a couple of options defining
|
|
|
+ the download method and method-specific details like a commit tag or archive
|
|
|
+ hash. For example:
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
@@ -164,8 +168,9 @@ approach. The former generally follows this canonical pattern:
|
|
|
The above is such a common pattern that, where no custom steps are needed
|
|
|
between the calls to :command:`FetchContent_Populate` and
|
|
|
:command:`add_subdirectory`, equivalent logic can be obtained by calling
|
|
|
-:command:`FetchContent_MakeAvailable` instead (and should be preferred where
|
|
|
-it meets the needs of the project).
|
|
|
+:command:`FetchContent_MakeAvailable` instead. Where it meets the needs of
|
|
|
+the project, :command:`FetchContent_MakeAvailable` should be preferred, as it
|
|
|
+is simpler and provides additional features over the pattern above.
|
|
|
|
|
|
.. command:: FetchContent_Populate
|
|
|
|
|
|
@@ -335,6 +340,8 @@ it meets the needs of the project).
|
|
|
``${CMAKE_CURRENT_BINARY_DIR}/<lcName>-subbuild`` and it would be unusual
|
|
|
to need to override this default. If a relative path is specified, it will
|
|
|
be interpreted as relative to :variable:`CMAKE_CURRENT_BINARY_DIR`.
|
|
|
+ This option should not be confused with the ``SOURCE_SUBDIR`` option which
|
|
|
+ only affects the :command:`FetchContent_MakeAvailable` command.
|
|
|
|
|
|
``SOURCE_DIR``, ``BINARY_DIR``
|
|
|
The ``SOURCE_DIR`` and ``BINARY_DIR`` arguments are supported by
|
|
|
@@ -409,15 +416,22 @@ it meets the needs of the project).
|
|
|
|
|
|
This command implements the common pattern typically needed for most
|
|
|
dependencies. It iterates over each of the named dependencies in turn
|
|
|
- and for each one it loosely follows the same
|
|
|
+ and for each one it loosely follows the
|
|
|
:ref:`canonical pattern <fetch-content-canonical-pattern>` as
|
|
|
- presented at the beginning of this section. One small difference to
|
|
|
- that pattern is that it will only call :command:`add_subdirectory` on the
|
|
|
+ presented at the beginning of this section. An important difference is
|
|
|
+ that :command:`add_subdirectory` will only be called on the
|
|
|
populated content if there is a ``CMakeLists.txt`` file in its top level
|
|
|
source directory. This allows the command to be used for dependencies
|
|
|
that make downloaded content available at a known location but which do
|
|
|
not need or support being added directly to the build.
|
|
|
|
|
|
+ The ``SOURCE_SUBDIR`` option can be given in the declared details to
|
|
|
+ instruct ``FetchContent_MakeAvailable()`` to look for a ``CMakeLists.txt``
|
|
|
+ file in a subdirectory below the top level (i.e. the same way that
|
|
|
+ ``SOURCE_SUBDIR`` is used by the :command:`ExternalProject_Add` command).
|
|
|
+ ``SOURCE_SUBDIR`` must always be a relative path. See the next section
|
|
|
+ for an example of this option.
|
|
|
+
|
|
|
|
|
|
.. _`fetch-content-examples`:
|
|
|
|
|
|
@@ -445,6 +459,23 @@ frameworks are available to the main build:
|
|
|
# Catch2 will be defined and available to the rest of the build
|
|
|
FetchContent_MakeAvailable(googletest Catch2)
|
|
|
|
|
|
+If the sub-project's ``CMakeLists.txt`` file is not at the top level of its
|
|
|
+source tree, the ``SOURCE_SUBDIR`` option can be used to tell ``FetchContent``
|
|
|
+where to find it. The following example shows how to use that option and
|
|
|
+it also sets a variable which is meaningful to the subproject before pulling
|
|
|
+it into the main build:
|
|
|
+
|
|
|
+.. code-block:: cmake
|
|
|
+
|
|
|
+ include(FetchContent)
|
|
|
+ FetchContent_Declare(
|
|
|
+ protobuf
|
|
|
+ GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git
|
|
|
+ GIT_TAG v3.12.0
|
|
|
+ SOURCE_SUBDIR cmake
|
|
|
+ )
|
|
|
+ set(protobuf_BUILD_TESTS OFF)
|
|
|
+ FetchContent_MakeAvailable(protobuf)
|
|
|
|
|
|
In more complex project hierarchies, the dependency relationships can be more
|
|
|
complicated. Consider a hierarchy where ``projA`` is the top level project and
|
|
|
@@ -1072,11 +1103,26 @@ macro(FetchContent_MakeAvailable)
|
|
|
# can be treated that way. Protecting the call with the check
|
|
|
# allows this function to be used for projects that just want
|
|
|
# to ensure the content exists, such as to provide content at
|
|
|
- # a known location.
|
|
|
- if(EXISTS ${${contentNameLower}_SOURCE_DIR}/CMakeLists.txt)
|
|
|
- add_subdirectory(${${contentNameLower}_SOURCE_DIR}
|
|
|
- ${${contentNameLower}_BINARY_DIR})
|
|
|
+ # a known location. We check the saved details for an optional
|
|
|
+ # SOURCE_SUBDIR which can be used in the same way as its meaning
|
|
|
+ # for ExternalProject. It won't matter if it was passed through
|
|
|
+ # to the ExternalProject sub-build, since it would have been
|
|
|
+ # ignored there.
|
|
|
+ set(__fc_srcdir "${${contentNameLower}_SOURCE_DIR}")
|
|
|
+ __FetchContent_getSavedDetails(${contentName} contentDetails)
|
|
|
+ if("${contentDetails}" STREQUAL "")
|
|
|
+ message(FATAL_ERROR "No details have been set for content: ${contentName}")
|
|
|
+ endif()
|
|
|
+ cmake_parse_arguments(__fc_arg "" "SOURCE_SUBDIR" "" ${contentDetails})
|
|
|
+ if(NOT "${__fc_arg_SOURCE_SUBDIR}" STREQUAL "")
|
|
|
+ string(APPEND __fc_srcdir "/${__fc_arg_SOURCE_SUBDIR}")
|
|
|
endif()
|
|
|
+
|
|
|
+ if(EXISTS ${__fc_srcdir}/CMakeLists.txt)
|
|
|
+ add_subdirectory(${__fc_srcdir} ${${contentNameLower}_BINARY_DIR})
|
|
|
+ endif()
|
|
|
+
|
|
|
+ unset(__fc_srcdir)
|
|
|
endif()
|
|
|
endforeach()
|
|
|
|