Merge topic 'fetchcontent-global-targets'

f19b48e0b8 FetchContent: Honor CMAKE_FIND_PACKAGE_TARGETS_GLOBAL
1305bade56 Help: Add missing version directive for find_package() GLOBAL keyword

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !7347
This commit is contained in:
Brad King 2022-06-11 10:13:51 +00:00 committed by Kitware Robot
commit 9f16821ea5
10 changed files with 121 additions and 6 deletions

View File

@ -146,10 +146,11 @@ available components.
ignored on all other ones. Formally, it is up to the target package how to
interpret the registry view information given to it.
Specifying the ``GLOBAL`` keyword will promote all imported targets to
a global scope in the importing project. Alternatively this functionality
can be enabled by setting the variable
:variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL`
.. versionadded:: 3.24
Specifying the ``GLOBAL`` keyword will promote all imported targets to
a global scope in the importing project. Alternatively, this functionality
can be enabled by setting the :variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL`
variable.
.. _FIND_PACKAGE_VERSION_FORMAT:

View File

@ -195,7 +195,14 @@ Commands
Everything after the ``FIND_PACKAGE_ARGS`` keyword is appended to the
:command:`find_package` call, so all other ``<contentOptions>`` must
come before the ``FIND_PACKAGE_ARGS`` keyword.
come before the ``FIND_PACKAGE_ARGS`` keyword. If the
:variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL` variable is set to true
at the time ``FetchContent_Declare()`` is called, a ``GLOBAL`` keyword
will be appended to the :command:`find_package` arguments if it was
not already specified. It will also be appended if
``FIND_PACKAGE_ARGS`` was not given, but
:variable:`FETCHCONTENT_TRY_FIND_PACKAGE_MODE` was set to ``ALWAYS``.
``OVERRIDE_FIND_PACKAGE`` cannot be used when ``FIND_PACKAGE_ARGS`` is
given.
@ -260,6 +267,11 @@ Commands
The value of the :variable:`FETCHCONTENT_TRY_FIND_PACKAGE_MODE` variable
at the time :command:`FetchContent_Declare` was called determines whether
``FetchContent_MakeAvailable()`` can call :command:`find_package`.
If the :variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL` variable is set to
true when ``FetchContent_MakeAvailable()`` is called, it still affects
any imported targets created when that in turn calls
:command:`find_package`, even if that variable was false when the
corresponding details were declared.
If the dependency was not satisfied by a provider or a
:command:`find_package` call, ``FetchContent_MakeAvailable()`` then uses
@ -1078,10 +1090,17 @@ function(__FetchContent_declareDetails contentName)
set(__cmdArgs)
set(__findPackageArgs)
set(__sawQuietKeyword NO)
set(__sawGlobalKeyword NO)
foreach(__item IN LISTS ARGN)
if(DEFINED __findPackageArgs)
# All remaining args are for find_package()
string(APPEND __findPackageArgs " [==[${__item}]==]")
if(__item STREQUAL "QUIET")
set(__sawQuietKeyword YES)
elseif(__item STREQUAL "GLOBAL")
set(__sawGlobalKeyword YES)
endif()
continue()
endif()
@ -1120,9 +1139,12 @@ function(__FetchContent_declareDetails contentName)
if(__tryFindPackage AND __tryFindPackageAllowed)
set(propertyName "_FetchContent_${contentNameLower}_find_package_args")
define_property(GLOBAL PROPERTY ${propertyName})
if(NOT QUIET IN_LIST __findPackageArgs)
if(NOT __sawQuietKeyword)
list(INSERT __findPackageArgs 0 QUIET)
endif()
if(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL AND NOT __sawGlobalKeyword)
list(APPEND __findPackageArgs GLOBAL)
endif()
cmake_language(EVAL CODE
"set_property(GLOBAL PROPERTY ${propertyName} ${__findPackageArgs})"
)

View File

@ -0,0 +1,11 @@
FetchContent_MakeAvailable(
GlobalWithArgsKeyword
GlobalWithoutArgsKeyword
LocalWithArgsKeyword
LocalWithoutArgsKeyword
)
# This one was declared without GLOBAL, but should still become global when
# this variable is true at the time FetchContent_MakeAvailable() is called
set(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL TRUE)
FetchContent_MakeAvailable(EventuallyGlobal)

View File

@ -0,0 +1,50 @@
include(FetchContent)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/PackageFindModules)
set(FETCHCONTENT_TRY_FIND_PACKAGE_MODE ALWAYS)
set(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL TRUE)
FetchContent_Declare(
GlobalWithArgsKeyword
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/FatalIfAdded
FIND_PACKAGE_ARGS
)
FetchContent_Declare(
GlobalWithoutArgsKeyword
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/FatalIfAdded
)
set(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL FALSE)
FetchContent_Declare(
LocalWithArgsKeyword
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/FatalIfAdded
FIND_PACKAGE_ARGS
)
FetchContent_Declare(
LocalWithoutArgsKeyword
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/FatalIfAdded
)
FetchContent_Declare(
EventuallyGlobal
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/FatalIfAdded
)
add_subdirectory(ChildScope)
if(NOT TARGET GlobalWithArgsKeywordExe)
message(SEND_ERROR "GlobalWithArgsKeywordExe is not a global target")
endif()
if(NOT TARGET GlobalWithoutArgsKeywordExe)
message(SEND_ERROR "GlobalWithoutArgsKeywordExe is not a global target")
endif()
if(TARGET LocalWithArgsKeywordExe)
message(SEND_ERROR "LocalWithArgsKeywordExe is unexpectedly a global target")
endif()
if(TARGET LocalWithoutArgsKeywordExe)
message(SEND_ERROR "LocalWithoutArgsKeywordExe is unexpectedly a global target")
endif()
if(NOT TARGET EventuallyGlobalExe)
message(SEND_ERROR "EventuallyGlobalExe is not a global target")
endif()

View File

@ -0,0 +1,6 @@
add_executable(EventuallyGlobalExe IMPORTED)
set_target_properties(EventuallyGlobalExe PROPERTIES
IMPORTED_LOCATION "${CMAKE_COMMAND}"
)
set(EventuallyGlobal_FOUND TRUE)

View File

@ -0,0 +1,6 @@
add_executable(GlobalWithArgsKeywordExe IMPORTED)
set_target_properties(GlobalWithArgsKeywordExe PROPERTIES
IMPORTED_LOCATION "${CMAKE_COMMAND}"
)
set(GlobalWithArgsKeyword_FOUND TRUE)

View File

@ -0,0 +1,6 @@
add_executable(GlobalWithoutArgsKeywordExe IMPORTED)
set_target_properties(GlobalWithoutArgsKeywordExe PROPERTIES
IMPORTED_LOCATION "${CMAKE_COMMAND}"
)
set(GlobalWithoutArgsKeyword_FOUND TRUE)

View File

@ -0,0 +1,6 @@
add_executable(LocalWithArgsKeywordExe IMPORTED)
set_target_properties(LocalWithArgsKeywordExe PROPERTIES
IMPORTED_LOCATION "${CMAKE_COMMAND}"
)
set(LocalWithArgsKeyword_FOUND TRUE)

View File

@ -0,0 +1,6 @@
add_executable(LocalWithoutArgsKeywordExe IMPORTED)
set_target_properties(LocalWithoutArgsKeywordExe PROPERTIES
IMPORTED_LOCATION "${CMAKE_COMMAND}"
)
set(LocalWithoutArgsKeyword_FOUND TRUE)

View File

@ -20,3 +20,4 @@ run_cmake(Try_find_package-NEVER)
run_cmake(Try_find_package-OPT_IN)
run_cmake(Try_find_package-BOGUS)
run_cmake(Redirect_find_package_MODULE)
run_cmake(GLOBAL)