Переглянути джерело

Improve find_dependency argument handling

Remove highly specialized and totally positional argument handling in
find_dependency macro, and instead just pass arguments through to
find_package. This gives users access to the full suite of arguments
that find_package knows, and is backward compatible with the old
arguments.

Also, rewrite the unit tests for this, since the old tests are
exclusively focused on testing the old argument handling and are no
longer applicable, and add some success tests (the old tests did not
even set up the CMake state in a way that CMake had any hope of ever
finding the test package).
Matthew Woehlke 8 роки тому
батько
коміт
ab358d6a85
29 змінених файлів з 80 додано та 79 видалено
  1. 9 29
      Modules/CMakeFindDependencyMacro.cmake
  2. 0 1
      Tests/RunCMake/find_dependency/CMakeLists.txt
  3. 0 6
      Tests/RunCMake/find_dependency/EXACT-no-version-stderr.txt
  4. 0 4
      Tests/RunCMake/find_dependency/EXACT-no-version.cmake
  5. 8 5
      Tests/RunCMake/find_dependency/RunCMakeTest.cmake
  6. 0 0
      Tests/RunCMake/find_dependency/bad-version-exact-result.txt
  7. 11 0
      Tests/RunCMake/find_dependency/bad-version-exact-stderr.txt
  8. 5 0
      Tests/RunCMake/find_dependency/bad-version-exact.cmake
  9. 0 0
      Tests/RunCMake/find_dependency/bad-version-fuzzy-result.txt
  10. 11 0
      Tests/RunCMake/find_dependency/bad-version-fuzzy-stderr.txt
  11. 5 0
      Tests/RunCMake/find_dependency/bad-version-fuzzy.cmake
  12. 5 0
      Tests/RunCMake/find_dependency/basic.cmake
  13. 0 5
      Tests/RunCMake/find_dependency/empty-arg-3-stderr.txt
  14. 0 4
      Tests/RunCMake/find_dependency/empty-arg-3.cmake
  15. 0 5
      Tests/RunCMake/find_dependency/empty-version-stderr.txt
  16. 0 4
      Tests/RunCMake/find_dependency/empty-version.cmake
  17. 0 1
      Tests/RunCMake/find_dependency/extra-args-result.txt
  18. 0 5
      Tests/RunCMake/find_dependency/extra-args-stderr.txt
  19. 0 4
      Tests/RunCMake/find_dependency/extra-args.cmake
  20. 0 1
      Tests/RunCMake/find_dependency/invalid-arg-3-result.txt
  21. 0 5
      Tests/RunCMake/find_dependency/invalid-arg-3-stderr.txt
  22. 0 0
      Tests/RunCMake/find_dependency/invalid-arg-result.txt
  23. 5 0
      Tests/RunCMake/find_dependency/invalid-arg-stderr.txt
  24. 1 0
      Tests/RunCMake/find_dependency/invalid-arg.cmake
  25. 3 0
      Tests/RunCMake/find_dependency/realistic.cmake
  26. 0 0
      Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1Config.cmake
  27. 0 0
      Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1ConfigVersion.cmake
  28. 6 0
      Tests/RunCMake/find_dependency/share/cmake/Pack2/Pack2Config.cmake
  29. 11 0
      Tests/RunCMake/find_dependency/share/cmake/Pack2/Pack2ConfigVersion.cmake

+ 9 - 29
Modules/CMakeFindDependencyMacro.cmake

@@ -7,38 +7,20 @@
 #
 # ::
 #
-#     find_dependency(<dep> [<version> [EXACT]])
+#     find_dependency(<dep> [...])
 #
 #
 # ``find_dependency()`` wraps a :command:`find_package` call for a package
 # dependency. It is designed to be used in a <package>Config.cmake file, and it
-# forwards the correct parameters for EXACT, QUIET and REQUIRED which were
-# passed to the original :command:`find_package` call.  It also sets an
-# informative diagnostic message if the dependency could not be found.
+# forwards the correct parameters for QUIET and REQUIRED which were passed to
+# the original :command:`find_package` call.  It also sets an informative
+# diagnostic message if the dependency could not be found.
+#
+# Any additional arguments specified are forwarded to :command:`find_package`.
 #
 
 macro(find_dependency dep)
   if (NOT ${dep}_FOUND)
-    set(cmake_fd_version)
-    if (${ARGC} GREATER 1)
-      if ("${ARGV1}" STREQUAL "")
-        message(FATAL_ERROR "Invalid arguments to find_dependency. VERSION is empty")
-      endif()
-      if ("${ARGV1}" STREQUAL EXACT)
-        message(FATAL_ERROR "Invalid arguments to find_dependency. EXACT may only be specified if a VERSION is specified")
-      endif()
-      set(cmake_fd_version ${ARGV1})
-    endif()
-    set(cmake_fd_exact_arg)
-    if(${ARGC} GREATER 2)
-      if (NOT "${ARGV2}" STREQUAL EXACT)
-        message(FATAL_ERROR "Invalid arguments to find_dependency")
-      endif()
-      set(cmake_fd_exact_arg EXACT)
-    endif()
-    if(${ARGC} GREATER 3)
-      message(FATAL_ERROR "Invalid arguments to find_dependency")
-    endif()
     set(cmake_fd_quiet_arg)
     if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
       set(cmake_fd_quiet_arg QUIET)
@@ -52,10 +34,9 @@ macro(find_dependency dep)
       _CMAKE_${dep}_TRANSITIVE_DEPENDENCY
     )
 
-    find_package(${dep} ${cmake_fd_version}
-        ${cmake_fd_exact_arg}
-        ${cmake_fd_quiet_arg}
-        ${cmake_fd_required_arg}
+    find_package(${dep} ${ARGN}
+      ${cmake_fd_quiet_arg}
+      ${cmake_fd_required_arg}
     )
 
     if(NOT DEFINED cmake_fd_alreadyTransitive OR cmake_fd_alreadyTransitive)
@@ -67,7 +48,6 @@ macro(find_dependency dep)
       set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False)
       return()
     endif()
-    set(cmake_fd_version)
     set(cmake_fd_required_arg)
     set(cmake_fd_quiet_arg)
     set(cmake_fd_exact_arg)

+ 0 - 1
Tests/RunCMake/find_dependency/CMakeLists.txt

@@ -1,4 +1,3 @@
 cmake_minimum_required(VERSION 2.8.4)
 project(${RunCMake_TEST} NONE)
-set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
 include(${RunCMake_TEST}.cmake)

+ 0 - 6
Tests/RunCMake/find_dependency/EXACT-no-version-stderr.txt

@@ -1,6 +0,0 @@
-CMake Error at .*Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(message\):
-  Invalid arguments to find_dependency.  EXACT may only be specified if a
-  VERSION is specified
-Call Stack \(most recent call first\):
-  EXACT-no-version.cmake:4 \(find_dependency\)
-  CMakeLists.txt:4 \(include\)

+ 0 - 4
Tests/RunCMake/find_dependency/EXACT-no-version.cmake

@@ -1,4 +0,0 @@
-
-include(CMakeFindDependencyMacro)
-
-find_dependency(Pack1 EXACT)

+ 8 - 5
Tests/RunCMake/find_dependency/RunCMakeTest.cmake

@@ -1,7 +1,10 @@
 include(RunCMake)
 
-run_cmake(EXACT-no-version)
-run_cmake(empty-version)
-run_cmake(empty-arg-3)
-run_cmake(invalid-arg-3)
-run_cmake(extra-args)
+# Success tests
+run_cmake(realistic)
+run_cmake(basic)
+
+# Failure tests
+run_cmake(invalid-arg)
+run_cmake(bad-version-fuzzy)
+run_cmake(bad-version-exact)

+ 0 - 0
Tests/RunCMake/find_dependency/EXACT-no-version-result.txt → Tests/RunCMake/find_dependency/bad-version-exact-result.txt


+ 11 - 0
Tests/RunCMake/find_dependency/bad-version-exact-stderr.txt

@@ -0,0 +1,11 @@
+CMake Error at .*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(find_package\):
+  Could not find a configuration file for package "Pack1" that exactly
+  matches requested version "1.1".
+
+  The following configuration files were considered but not accepted:
+
+    .*/Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1Config.cmake, version: 1.3
+
+Call Stack \(most recent call first\):
+  bad-version-exact.cmake:5 \(find_dependency\)
+  CMakeLists.txt:3 \(include\)

+ 5 - 0
Tests/RunCMake/find_dependency/bad-version-exact.cmake

@@ -0,0 +1,5 @@
+set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
+
+include(CMakeFindDependencyMacro)
+
+find_dependency(Pack1 1.1 EXACT REQUIRED)

+ 0 - 0
Tests/RunCMake/find_dependency/empty-arg-3-result.txt → Tests/RunCMake/find_dependency/bad-version-fuzzy-result.txt


+ 11 - 0
Tests/RunCMake/find_dependency/bad-version-fuzzy-stderr.txt

@@ -0,0 +1,11 @@
+CMake Error at .*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(find_package\):
+  Could not find a configuration file for package "Pack1" that is compatible
+  with requested version "1.4".
+
+  The following configuration files were considered but not accepted:
+
+    .*/Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1Config.cmake, version: 1.3
+
+Call Stack \(most recent call first\):
+  bad-version-fuzzy.cmake:5 \(find_dependency\)
+  CMakeLists.txt:3 \(include\)

+ 5 - 0
Tests/RunCMake/find_dependency/bad-version-fuzzy.cmake

@@ -0,0 +1,5 @@
+set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
+
+include(CMakeFindDependencyMacro)
+
+find_dependency(Pack1 1.4 REQUIRED)

+ 5 - 0
Tests/RunCMake/find_dependency/basic.cmake

@@ -0,0 +1,5 @@
+set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
+
+include(CMakeFindDependencyMacro)
+
+find_dependency(Pack1 1.1)

+ 0 - 5
Tests/RunCMake/find_dependency/empty-arg-3-stderr.txt

@@ -1,5 +0,0 @@
-CMake Error at .*Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(message\):
-  Invalid arguments to find_dependency
-Call Stack \(most recent call first\):
-  empty-arg-3.cmake:4 \(find_dependency\)
-  CMakeLists.txt:4 \(include\)

+ 0 - 4
Tests/RunCMake/find_dependency/empty-arg-3.cmake

@@ -1,4 +0,0 @@
-
-include(CMakeFindDependencyMacro)
-
-find_dependency(Pack1 1.2 "")

+ 0 - 5
Tests/RunCMake/find_dependency/empty-version-stderr.txt

@@ -1,5 +0,0 @@
-CMake Error at .*/Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(message\):
-  Invalid arguments to find_dependency.  VERSION is empty
-Call Stack \(most recent call first\):
-  empty-version.cmake:4 \(find_dependency\)
-  CMakeLists.txt:4 \(include\)

+ 0 - 4
Tests/RunCMake/find_dependency/empty-version.cmake

@@ -1,4 +0,0 @@
-
-include(CMakeFindDependencyMacro)
-
-find_dependency(Pack1 "")

+ 0 - 1
Tests/RunCMake/find_dependency/extra-args-result.txt

@@ -1 +0,0 @@
-1

+ 0 - 5
Tests/RunCMake/find_dependency/extra-args-stderr.txt

@@ -1,5 +0,0 @@
-CMake Error at .*Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(message\):
-  Invalid arguments to find_dependency
-Call Stack \(most recent call first\):
-  extra-args.cmake:4 \(find_dependency\)
-  CMakeLists.txt:4 \(include\)

+ 0 - 4
Tests/RunCMake/find_dependency/extra-args.cmake

@@ -1,4 +0,0 @@
-
-include(CMakeFindDependencyMacro)
-
-find_dependency(Pack1 1.2 EXACT PATHS "${CMAKE_BINARY_DIR}")

+ 0 - 1
Tests/RunCMake/find_dependency/invalid-arg-3-result.txt

@@ -1 +0,0 @@
-1

+ 0 - 5
Tests/RunCMake/find_dependency/invalid-arg-3-stderr.txt

@@ -1,5 +0,0 @@
-CMake Error at .*Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(message\):
-  Invalid arguments to find_dependency
-Call Stack \(most recent call first\):
-  invalid-arg-3.cmake:4 \(find_dependency\)
-  CMakeLists.txt:4 \(include\)

+ 0 - 0
Tests/RunCMake/find_dependency/empty-version-result.txt → Tests/RunCMake/find_dependency/invalid-arg-result.txt


+ 5 - 0
Tests/RunCMake/find_dependency/invalid-arg-stderr.txt

@@ -0,0 +1,5 @@
+CMake Error at .*Modules/CMakeFindDependencyMacro.cmake:[0-9]+ \(find_package\):
+  find_package called with invalid argument "EXACTYPO"
+Call Stack \(most recent call first\):
+  invalid-arg.cmake:5 \(find_dependency\)
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/find_dependency/invalid-arg-3.cmake → Tests/RunCMake/find_dependency/invalid-arg.cmake

@@ -1,3 +1,4 @@
+set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
 
 include(CMakeFindDependencyMacro)
 

+ 3 - 0
Tests/RunCMake/find_dependency/realistic.cmake

@@ -0,0 +1,3 @@
+set(Pack2_DIR "${CMAKE_CURRENT_SOURCE_DIR}/share/cmake/Pack2")
+
+find_package(Pack2 1.2 REQUIRED)

+ 0 - 0
Tests/RunCMake/find_dependency/Pack1/Pack1Config.cmake → Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1Config.cmake


+ 0 - 0
Tests/RunCMake/find_dependency/Pack1/Pack1ConfigVersion.cmake → Tests/RunCMake/find_dependency/share/cmake/Pack1/Pack1ConfigVersion.cmake


+ 6 - 0
Tests/RunCMake/find_dependency/share/cmake/Pack2/Pack2Config.cmake

@@ -0,0 +1,6 @@
+include(CMakeFindDependencyMacro)
+
+find_dependency(Pack1 PATHS ${CMAKE_CURRENT_LIST_DIR}/..)
+
+add_library(Pack2::Lib INTERFACE IMPORTED)
+set_target_properties(Pack2::Lib PROPERTIES INTERFACE_LINK_LIBRARIES Pack1::Lib)

+ 11 - 0
Tests/RunCMake/find_dependency/share/cmake/Pack2/Pack2ConfigVersion.cmake

@@ -0,0 +1,11 @@
+
+set(PACKAGE_VERSION "1.3")
+
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" )
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  set(PACKAGE_VERSION_COMPATIBLE TRUE)
+  if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}")
+    set(PACKAGE_VERSION_EXACT TRUE)
+  endif()
+endif()