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 ignored on all other ones. Formally, it is up to the target package how to
interpret the registry view information given to it. interpret the registry view information given to it.
Specifying the ``GLOBAL`` keyword will promote all imported targets to .. versionadded:: 3.24
a global scope in the importing project. Alternatively this functionality Specifying the ``GLOBAL`` keyword will promote all imported targets to
can be enabled by setting the variable a global scope in the importing project. Alternatively, this functionality
:variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL` can be enabled by setting the :variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL`
variable.
.. _FIND_PACKAGE_VERSION_FORMAT: .. _FIND_PACKAGE_VERSION_FORMAT:

View File

@ -195,7 +195,14 @@ Commands
Everything after the ``FIND_PACKAGE_ARGS`` keyword is appended to the Everything after the ``FIND_PACKAGE_ARGS`` keyword is appended to the
:command:`find_package` call, so all other ``<contentOptions>`` must :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 ``OVERRIDE_FIND_PACKAGE`` cannot be used when ``FIND_PACKAGE_ARGS`` is
given. given.
@ -260,6 +267,11 @@ Commands
The value of the :variable:`FETCHCONTENT_TRY_FIND_PACKAGE_MODE` variable The value of the :variable:`FETCHCONTENT_TRY_FIND_PACKAGE_MODE` variable
at the time :command:`FetchContent_Declare` was called determines whether at the time :command:`FetchContent_Declare` was called determines whether
``FetchContent_MakeAvailable()`` can call :command:`find_package`. ``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 If the dependency was not satisfied by a provider or a
:command:`find_package` call, ``FetchContent_MakeAvailable()`` then uses :command:`find_package` call, ``FetchContent_MakeAvailable()`` then uses
@ -1078,10 +1090,17 @@ function(__FetchContent_declareDetails contentName)
set(__cmdArgs) set(__cmdArgs)
set(__findPackageArgs) set(__findPackageArgs)
set(__sawQuietKeyword NO)
set(__sawGlobalKeyword NO)
foreach(__item IN LISTS ARGN) foreach(__item IN LISTS ARGN)
if(DEFINED __findPackageArgs) if(DEFINED __findPackageArgs)
# All remaining args are for find_package() # All remaining args are for find_package()
string(APPEND __findPackageArgs " [==[${__item}]==]") string(APPEND __findPackageArgs " [==[${__item}]==]")
if(__item STREQUAL "QUIET")
set(__sawQuietKeyword YES)
elseif(__item STREQUAL "GLOBAL")
set(__sawGlobalKeyword YES)
endif()
continue() continue()
endif() endif()
@ -1120,9 +1139,12 @@ function(__FetchContent_declareDetails contentName)
if(__tryFindPackage AND __tryFindPackageAllowed) if(__tryFindPackage AND __tryFindPackageAllowed)
set(propertyName "_FetchContent_${contentNameLower}_find_package_args") set(propertyName "_FetchContent_${contentNameLower}_find_package_args")
define_property(GLOBAL PROPERTY ${propertyName}) define_property(GLOBAL PROPERTY ${propertyName})
if(NOT QUIET IN_LIST __findPackageArgs) if(NOT __sawQuietKeyword)
list(INSERT __findPackageArgs 0 QUIET) list(INSERT __findPackageArgs 0 QUIET)
endif() endif()
if(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL AND NOT __sawGlobalKeyword)
list(APPEND __findPackageArgs GLOBAL)
endif()
cmake_language(EVAL CODE cmake_language(EVAL CODE
"set_property(GLOBAL PROPERTY ${propertyName} ${__findPackageArgs})" "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-OPT_IN)
run_cmake(Try_find_package-BOGUS) run_cmake(Try_find_package-BOGUS)
run_cmake(Redirect_find_package_MODULE) run_cmake(Redirect_find_package_MODULE)
run_cmake(GLOBAL)