Browse Source

Evaluation of TRANSITIVE_LINK_PROPERTIES isn't considered a usage

Fixes #26108
Robert Maynard 1 năm trước cách đây
mục cha
commit
2fc9e482a9

+ 1 - 0
Source/cmGeneratorTarget.h

@@ -264,6 +264,7 @@ public:
   {
     Compile, // Usage requirements for compiling.  Excludes $<LINK_ONLY>.
     Link,    // Usage requirements for linking.  Includes $<LINK_ONLY>.
+    LinkInterfaceEval,
   };
 
   cmLinkInterfaceLibraries const* GetLinkInterfaceLibraries(

+ 4 - 1
Source/cmGeneratorTarget_Link.cxx

@@ -392,7 +392,7 @@ void cmGeneratorTarget::CheckLinkLibraries() const
   // should be a subset of LinkInterfaceMap (with LINK_ONLY left out).
   for (auto const& hmp : this->LinkInterfaceMap) {
     for (auto const& hmi : hmp.second) {
-      if (!hmi.second.LibrariesDone) {
+      if (!hmi.second.LibrariesDone || hmi.second.LinkOnlyEval) {
         continue;
       }
       for (cmLinkItem const& item : hmi.second.Libraries) {
@@ -642,6 +642,7 @@ cmLinkInterface const* cmGeneratorTarget::GetLinkInterface(
   if (secondPass) {
     iface = cmOptionalLinkInterface();
   }
+  iface.LinkOnlyEval = false;
   if (!iface.LibrariesDone) {
     iface.LibrariesDone = true;
     this->ComputeLinkInterfaceLibraries(config, iface, head, UseTo::Link);
@@ -765,6 +766,7 @@ const cmLinkInterfaceLibraries* cmGeneratorTarget::GetLinkInterfaceLibraries(
   }
 
   cmOptionalLinkInterface& iface = hm[head];
+  iface.LinkOnlyEval = (usage == UseTo::LinkInterfaceEval);
   if (!iface.LibrariesDone) {
     iface.LibrariesDone = true;
     this->ComputeLinkInterfaceLibraries(config, iface, head, usage);
@@ -1034,6 +1036,7 @@ const cmLinkInterface* cmGeneratorTarget::GetImportLinkInterface(
   if (secondPass) {
     iface = cmOptionalLinkInterface();
   }
+  iface.LinkOnlyEval = (usage == UseTo::LinkInterfaceEval);
   if (!iface.AllDone) {
     iface.AllDone = true;
     iface.LibrariesDone = true;

+ 2 - 1
Source/cmGeneratorTarget_TransitiveProperty.cxx

@@ -286,7 +286,8 @@ cmGeneratorTarget::GetCustomTransitiveProperties(std::string const& config,
         }
       }
     };
-    addTransitiveProperties("TRANSITIVE_LINK_PROPERTIES", UseTo::Link);
+    addTransitiveProperties("TRANSITIVE_LINK_PROPERTIES",
+                            UseTo::LinkInterfaceEval);
     addTransitiveProperties("TRANSITIVE_COMPILE_PROPERTIES", UseTo::Compile);
     i = ctpm.emplace(config, std::move(ctp)).first;
   }

+ 1 - 0
Source/cmLinkItem.h

@@ -120,6 +120,7 @@ struct cmLinkInterface : public cmLinkInterfaceLibraries
 
 struct cmOptionalLinkInterface : public cmLinkInterface
 {
+  bool LinkOnlyEval = false;
   bool LibrariesDone = false;
   bool AllDone = false;
   bool Exists = false;

+ 5 - 1
Tests/ExportImport/Export/CMakeLists.txt

@@ -29,6 +29,9 @@ add_library(compileOnly INTERFACE)
 target_compile_definitions(compileOnly INTERFACE FROM_compileOnly)
 target_link_options(compileOnly INTERFACE -fthis-flag-does-not-exist)
 
+add_library(noUses INTERFACE)
+target_link_libraries(noUses INTERFACE this::target_does_not_exist)
+
 add_library(testLib1 STATIC testLib1.c)
 add_library(testLib2 STATIC testLib2.c)
 target_link_libraries(testLib2 testLib1)
@@ -601,6 +604,7 @@ install(FILES
 install(
   TARGETS
   compileOnly
+  noUses
   testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3 testExe4
   testExe2lib testLib4lib testLib4libdbg testLib4libopt
   testLib6 testLib7 testLib8
@@ -676,7 +680,7 @@ export(TARGETS testExe1 testLib1 testLib2 testLib3
   testSharedLibDepends renamed_on_export
   cmp0022NEW cmp0022OLD
   TopDirLib SubDirLinkA
-  systemlib
+  systemlib noUses
   testInterfaceIncludeUser
   testInterfaceIncludeUser2
   NAMESPACE bld_

+ 4 - 0
Tests/RunCMake/install/EXPORT-InterfaceLinkNoexist.cmake

@@ -0,0 +1,4 @@
+add_library(foo INTERFACE)
+target_link_libraries(foo INTERFACE nonexistent::bar)
+install(TARGETS foo DESTINATION lib EXPORT foo-targets)
+install(EXPORT foo-targets FILE foo-targets.cmake DESTINATION lib)

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

@@ -85,6 +85,7 @@ run_cmake(EXPORT-UnknownExport)
 run_cmake(EXPORT-NamelinkOnly)
 run_cmake(EXPORT-SeparateNamelink)
 run_cmake(EXPORT-TargetTwice)
+run_cmake(EXPORT-InterfaceLinkNoexist)
 run_cmake(CMP0062-OLD)
 run_cmake(CMP0062-NEW)
 run_cmake(CMP0062-WARN)