diff --git a/Source/cmExportCMakeConfigGenerator.cxx b/Source/cmExportCMakeConfigGenerator.cxx index 4d26d358a1..27eb31b571 100644 --- a/Source/cmExportCMakeConfigGenerator.cxx +++ b/Source/cmExportCMakeConfigGenerator.cxx @@ -451,16 +451,27 @@ void cmExportCMakeConfigGenerator::GenerateFindDependencyCalls( return lhs.second.FindPackageIndex < rhs.second.FindPackageIndex; }); + // Unwinding is only valid in a find_package() context + os << "if(DEFINED CMAKE_FIND_PACKAGE_NAME)\n" + << " set(_cmake_unwind_arg UNWIND_INCLUDE)\n" + << "endif()\n\n"; + for (auto const& it : packageDependenciesSorted) { if (it.second.Enabled == cmExportSet::PackageDependencyExportEnabled::On) { - os << "find_dependency(" << it.first; + os << "__find_dependency_no_return(" << it.first; for (auto const& arg : it.second.ExtraArguments) { os << ' ' << cmOutputConverter::EscapeForCMake(arg); } - os << ")\n"; + os << " ${_cmake_unwind_arg})\n"; + os << "if(NOT " << it.first << "_FOUND)\n" + << " unset(_cmake_unwind_arg)\n" + << " cmake_policy(POP)\n" + << " return()\n" + << "endif()\n\n"; } } - os << "\n\n"; + + os << "unset(_cmake_unwind_arg)\n\n\n"; } void cmExportCMakeConfigGenerator::GenerateMissingTargetsCheckCode( diff --git a/Tests/RunCMake/export/FindDependencyExport-check.cmake b/Tests/RunCMake/export/FindDependencyExport-check.cmake index 6917c26438..17662a76a2 100644 --- a/Tests/RunCMake/export/FindDependencyExport-check.cmake +++ b/Tests/RunCMake/export/FindDependencyExport-check.cmake @@ -1,35 +1,35 @@ file(READ "${RunCMake_TEST_BINARY_DIR}/mytargets.cmake" mytargets) -if("${mytargets}" MATCHES "find_dependency\\(P1") +if("${mytargets}" MATCHES "__find_dependency_no_return\\(P1") string(APPEND RunCMake_TEST_FAILED "P1 dependency should not be exported but it is\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P2 \"VERSION\" \"1\\.0\"\\)") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P2") string(APPEND RunCMake_TEST_FAILED "P2 dependency should be exported but it is not\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P3\\)") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P3") string(APPEND RunCMake_TEST_FAILED "P3 dependency should be exported but it is not\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P4\\)") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P4") string(APPEND RunCMake_TEST_FAILED "P4 dependency should be exported but it is not\n") endif() -if("${mytargets}" MATCHES "find_dependency\\(P5") +if("${mytargets}" MATCHES "__find_dependency_no_return\\(P5") string(APPEND RunCMake_TEST_FAILED "P5 dependency should not be exported but it is\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P6\\)") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P6") string(APPEND RunCMake_TEST_FAILED "P6 dependency should be exported but it is not\n") endif() -if("${mytargets}" MATCHES "find_dependency\\(P7") +if("${mytargets}" MATCHES "__find_dependency_no_return\\(P7") string(APPEND RunCMake_TEST_FAILED "P7 dependency should not be exported but it is\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P3[^ -]*\\) -find_dependency\\(P2[^ -]*\\) -find_dependency\\(P8[^ -]*\\) -find_dependency\\(P6[^ -]*\\) -find_dependency\\(P9[^ -]*\\) -find_dependency\\(P4") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P3[^ +]*\\)(.*) +__find_dependency_no_return\\(P2[^ +]*\\)(.*) +__find_dependency_no_return\\(P8[^ +]*\\)(.*) +__find_dependency_no_return\\(P6[^ +]*\\)(.*) +__find_dependency_no_return\\(P9[^ +]*\\)(.*) +__find_dependency_no_return\\(P4") string(APPEND RunCMake_TEST_FAILED "Dependencies are not in the correct order\n") endif() diff --git a/Tests/RunCMake/export/FindDependencyExportStatic-check.cmake b/Tests/RunCMake/export/FindDependencyExportStatic-check.cmake index b78bccb2bd..b09cc1b44c 100644 --- a/Tests/RunCMake/export/FindDependencyExportStatic-check.cmake +++ b/Tests/RunCMake/export/FindDependencyExportStatic-check.cmake @@ -1,13 +1,13 @@ file(READ "${RunCMake_TEST_BINARY_DIR}/mytargets.cmake" mytargets) -if(NOT "${mytargets}" MATCHES "find_dependency\\(P1") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P1") string(APPEND RunCMake_TEST_FAILED "P1 dependency should be exported but it is not\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P2") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P2") string(APPEND RunCMake_TEST_FAILED "P2 dependency should be exported but it is not\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P3") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P3") string(APPEND RunCMake_TEST_FAILED "P3 dependency should be exported but it is not\n") endif() -if(NOT "${mytargets}" MATCHES "find_dependency\\(P4") +if(NOT "${mytargets}" MATCHES "__find_dependency_no_return\\(P4") string(APPEND RunCMake_TEST_FAILED "P4 dependency should be exported but it is not\n") endif() diff --git a/Tests/RunCMake/install/EXPORT-FindDependencyExport-all-check.cmake b/Tests/RunCMake/install/EXPORT-FindDependencyExport-all-check.cmake index 9b41436f68..de33244d39 100644 --- a/Tests/RunCMake/install/EXPORT-FindDependencyExport-all-check.cmake +++ b/Tests/RunCMake/install/EXPORT-FindDependencyExport-all-check.cmake @@ -1,4 +1,15 @@ file(READ "${RunCMake_TEST_BINARY_DIR}/root-all/lib/cmake/mylib/mylib-targets.cmake" contents) -if(NOT contents MATCHES "include\\(CMakeFindDependencyMacro\\)\nfind_dependency\\(P2\\)\nfind_dependency\\(P1\\)\n") - set(RunCMake_TEST_FAILED "Dependencies were not properly exported") + +if(NOT contents MATCHES "__find_dependency_no_return\\(P2") + string(APPEND RunCMake_TEST_FAILED "P2 dependency should be exported but it is not\n") +endif() + +if(NOT contents MATCHES "__find_dependency_no_return\\(P1") + string(APPEND RunCMake_TEST_FAILED "P1 dependency should be exported but it is not\n") +endif() + +if(NOT contents MATCHES "__find_dependency_no_return\\(P2[^ +]*\\)(.*) +__find_dependency_no_return\\(P1") + string(APPEND RunCMake_TEST_FAILED "Dependencies are not in the correct order\n") endif() diff --git a/Tests/RunCMake/install/EXPORT-Unwind-all-check.cmake b/Tests/RunCMake/install/EXPORT-Unwind-all-check.cmake new file mode 100644 index 0000000000..d8c872716e --- /dev/null +++ b/Tests/RunCMake/install/EXPORT-Unwind-all-check.cmake @@ -0,0 +1,8 @@ +cmake_policy(SET CMP0074 NEW) +set(Unwind_ROOT "${RunCMake_TEST_BINARY_DIR}/root-all") + +find_package(Unwind CONFIG QUIET) + +if(Unwind_FOUND) + set(RunCMake_TEST_FAILED "Unwinding failed, package was reported as found") +endif() diff --git a/Tests/RunCMake/install/EXPORT-Unwind-stderr.txt b/Tests/RunCMake/install/EXPORT-Unwind-stderr.txt new file mode 100644 index 0000000000..30efcecfeb --- /dev/null +++ b/Tests/RunCMake/install/EXPORT-Unwind-stderr.txt @@ -0,0 +1,6 @@ +^CMake Warning \(dev\) at EXPORT-Unwind\.cmake:[0-9]+ \(install\): + CMake's EXPORT_PACKAGE_DEPENDENCIES support is experimental\. It is meant + only for experimentation and feedback to CMake developers\. +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\) +This warning is for project developers\. Use -Wno-dev to suppress it\.$ diff --git a/Tests/RunCMake/install/EXPORT-Unwind.cmake b/Tests/RunCMake/install/EXPORT-Unwind.cmake new file mode 100644 index 0000000000..435682f9e9 --- /dev/null +++ b/Tests/RunCMake/install/EXPORT-Unwind.cmake @@ -0,0 +1,12 @@ +set(CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES "1942b4fa-b2c5-4546-9385-83f254070067") +enable_language(C) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +find_package(P1 REQUIRED) + +add_library(Unwind INTERFACE) +target_link_libraries(Unwind INTERFACE lib1) +install(TARGETS Unwind EXPORT UnwindTargets) +install(EXPORT UnwindTargets EXPORT_PACKAGE_DEPENDENCIES DESTINATION lib/cmake/Unwind) +install(FILES cmake/UnwindConfig.cmake DESTINATION lib/cmake/Unwind) diff --git a/Tests/RunCMake/install/RunCMakeTest.cmake b/Tests/RunCMake/install/RunCMakeTest.cmake index 85a3e07b7a..62c891afd7 100644 --- a/Tests/RunCMake/install/RunCMakeTest.cmake +++ b/Tests/RunCMake/install/RunCMakeTest.cmake @@ -189,6 +189,7 @@ run_install_test(FILES-PERMISSIONS) run_install_test(TARGETS-RPATH) run_install_test(InstallRequiredSystemLibraries) run_install_test(EXPORT-FindDependencyExport) +run_install_test(EXPORT-Unwind) set(RunCMake_TEST_OPTIONS "-DCMAKE_POLICY_DEFAULT_CMP0087:STRING=NEW") run_install_test(SCRIPT) diff --git a/Tests/RunCMake/install/cmake/UnwindConfig.cmake b/Tests/RunCMake/install/cmake/UnwindConfig.cmake new file mode 100644 index 0000000000..a41457cc31 --- /dev/null +++ b/Tests/RunCMake/install/cmake/UnwindConfig.cmake @@ -0,0 +1,2 @@ +include(${CMAKE_CURRENT_LIST_DIR}/UnwindTargets.cmake) +set(Unwind_FOUND true)