Browse Source

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 <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !7347
Brad King 3 years ago
parent
commit
9f16821ea5

+ 5 - 4
Help/command/find_package.rst

@@ -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:
 

+ 24 - 2
Modules/FetchContent.cmake

@@ -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})"
     )

+ 11 - 0
Tests/RunCMake/FetchContent_find_package/ChildScope/CMakeLists.txt

@@ -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 - 0
Tests/RunCMake/FetchContent_find_package/GLOBAL.cmake

@@ -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()

+ 6 - 0
Tests/RunCMake/FetchContent_find_package/PackageFindModules/FindEventuallyGlobal.cmake

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

+ 6 - 0
Tests/RunCMake/FetchContent_find_package/PackageFindModules/FindGlobalWithArgsKeyword.cmake

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

+ 6 - 0
Tests/RunCMake/FetchContent_find_package/PackageFindModules/FindGlobalWithoutArgsKeyword.cmake

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

+ 6 - 0
Tests/RunCMake/FetchContent_find_package/PackageFindModules/FindLocalWithArgsKeyword.cmake

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

+ 6 - 0
Tests/RunCMake/FetchContent_find_package/PackageFindModules/FindLocalWithoutArgsKeyword.cmake

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

+ 1 - 0
Tests/RunCMake/FetchContent_find_package/RunCMakeTest.cmake

@@ -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)