Browse Source

Merge topic 'swift-sources-in-resp-file'

b767917ebb Swift/Ninja: Include sources in response file

Acked-by: Kitware Robot <[email protected]>
Tested-by: buildbot <[email protected]>
Merge-request: !9143
Brad King 1 year ago
parent
commit
e315d7cb19

+ 8 - 2
Source/cmNinjaTargetGenerator.cxx

@@ -848,6 +848,14 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
     flags = cmStrCat(responseFlag, rule.RspFile);
     vars.Defines = "";
     vars.Includes = "";
+
+    // Swift consumes all source files in a module at once, which reaches
+    // command line length limits pretty quickly. Inject source files into the
+    // response file in this case as well.
+    if (lang == "Swift") {
+      rule.RspContent = cmStrCat(rule.RspContent, ' ', vars.Source);
+      vars.Source = "";
+    }
   }
 
   // Tell ninja dependency format so all deps can be loaded into a database
@@ -1925,8 +1933,6 @@ void cmNinjaTargetGenerator::WriteSwiftObjectBuildStatement(
   //  For that, we need the "NEW" behavior for CMP0157. Otherwise, we have to
   //  fall back on the old "linker" build. Otherwise, this should be
   //  indistinguishable from the old behavior.
-  //
-  //  FIXME(#25490): Add response file support to Swift object build step
 
   if (sources.empty()) {
     return;

+ 4 - 0
Source/cmPlaceholderExpander.cxx

@@ -48,6 +48,10 @@ std::string& cmPlaceholderExpander::ExpandVariables(std::string& s)
   }
   // add the rest of the input
   expandedInput += s.substr(pos, s.size() - pos);
+  // remove trailing whitespace
+  if (!expandedInput.empty() && expandedInput.back() == ' ') {
+    expandedInput.pop_back();
+  }
   s = expandedInput;
 
   return s;

+ 2 - 4
Tests/RunCMake/Swift/ForceResponseFile-check-stdout.txt

@@ -1,4 +1,2 @@
-swiftc [^
-]* -c @CMakeFiles/L.dir/L.o.swift.rsp [^
-]*
-.*swiftc -emit-library -static -o libL.a @CMakeFiles/L.rsp.*
+swiftc -j [0-9]+ -num-threads [0-9]+ -c @CMakeFiles/L.dir/L.o.swift.rsp
+.*swiftc -emit-library -static -o libL.a @CMakeFiles/L.rsp