Merge topic 'fetchcontent-global-targets'
f19b48e0b8
FetchContent: Honor CMAKE_FIND_PACKAGE_TARGETS_GLOBAL1305bade56
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:
commit
9f16821ea5
@ -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:
|
||||
|
||||
|
@ -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})"
|
||||
)
|
||||
|
@ -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)
|
50
Tests/RunCMake/FetchContent_find_package/GLOBAL.cmake
Normal file
50
Tests/RunCMake/FetchContent_find_package/GLOBAL.cmake
Normal 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()
|
@ -0,0 +1,6 @@
|
||||
add_executable(EventuallyGlobalExe IMPORTED)
|
||||
set_target_properties(EventuallyGlobalExe PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_COMMAND}"
|
||||
)
|
||||
|
||||
set(EventuallyGlobal_FOUND TRUE)
|
@ -0,0 +1,6 @@
|
||||
add_executable(GlobalWithArgsKeywordExe IMPORTED)
|
||||
set_target_properties(GlobalWithArgsKeywordExe PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_COMMAND}"
|
||||
)
|
||||
|
||||
set(GlobalWithArgsKeyword_FOUND TRUE)
|
@ -0,0 +1,6 @@
|
||||
add_executable(GlobalWithoutArgsKeywordExe IMPORTED)
|
||||
set_target_properties(GlobalWithoutArgsKeywordExe PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_COMMAND}"
|
||||
)
|
||||
|
||||
set(GlobalWithoutArgsKeyword_FOUND TRUE)
|
@ -0,0 +1,6 @@
|
||||
add_executable(LocalWithArgsKeywordExe IMPORTED)
|
||||
set_target_properties(LocalWithArgsKeywordExe PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_COMMAND}"
|
||||
)
|
||||
|
||||
set(LocalWithArgsKeyword_FOUND TRUE)
|
@ -0,0 +1,6 @@
|
||||
add_executable(LocalWithoutArgsKeywordExe IMPORTED)
|
||||
set_target_properties(LocalWithoutArgsKeywordExe PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_COMMAND}"
|
||||
)
|
||||
|
||||
set(LocalWithoutArgsKeyword_FOUND TRUE)
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user