Преглед изворни кода

CUDA: Filter out host link flags during device linking

Since commit v3.12.0-rc1~278^2 (CUDA: Pass more link libraries to device
linking, 2018-03-27) we consider every link item during device linking.
However, items that start in `-` may be host-specific link flags that
nvcc will not understand during device linking.  Filter such items using
a white list.

In particular, this allows `-pthread` to be used for host linking while
not polluting the device link line.

Issue: #18008
Robert Maynard пре 7 година
родитељ
комит
e768d96c74
1 измењених фајлова са 18 додато и 1 уклоњено
  1. 18 1
      Source/cmLinkLineDeviceComputer.cxx

+ 18 - 1
Source/cmLinkLineDeviceComputer.cxx

@@ -23,6 +23,23 @@ cmLinkLineDeviceComputer::~cmLinkLineDeviceComputer()
 {
 }
 
+static bool cmLinkItemValidForDevice(std::string const& item)
+{
+  // Valid items are:
+  // * Non-flags (does not start in '-')
+  // * Specific flags --library, --library-path, -l, -L
+  // For example:
+  // * 'cublas_device' => pass-along
+  // * '--library pthread' => pass-along
+  // * '-lpthread' => pass-along
+  // * '-pthread' => drop
+  // * '-a' => drop
+  return (!cmHasLiteralPrefix(item, "-") || //
+          cmHasLiteralPrefix(item, "-l") || //
+          cmHasLiteralPrefix(item, "-L") || //
+          cmHasLiteralPrefix(item, "--library"));
+}
+
 std::string cmLinkLineDeviceComputer::ComputeLinkLibraries(
   cmComputeLinkInformation& cli, std::string const& stdLibString)
 {
@@ -60,7 +77,7 @@ std::string cmLinkLineDeviceComputer::ComputeLinkLibraries(
       }
       fout << this->ConvertToOutputFormat(
         this->ConvertToLinkReference(item.Value));
-    } else {
+    } else if (cmLinkItemValidForDevice(item.Value)) {
       fout << item.Value;
     }
     fout << " ";