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

Ninja: add new placeholder `SWIFT_AUXILIARY_SOURCES`

The swift compilation model requires all sources for the module to be
listed for the compiler to type check across them.  Provide a
placeholder to allow enumerating the remainder of the swift sources in a
target for the language compile rule.

Issue: #18800
Saleem Abdulrasool пре 6 година
родитељ
комит
b90e6134a7

+ 18 - 0
Source/cmNinjaTargetGenerator.cxx

@@ -19,6 +19,7 @@
 #include "cmGeneratorExpression.h"
 #include "cmGeneratorTarget.h"
 #include "cmGlobalNinjaGenerator.h"
+#include "cmListFileCache.h" // for BT
 #include "cmLocalGenerator.h"
 #include "cmLocalNinjaGenerator.h"
 #include "cmMakefile.h"
@@ -430,6 +431,9 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang)
   vars.TargetCompilePDB = "$TARGET_COMPILE_PDB";
   vars.ObjectDir = "$OBJECT_DIR";
   vars.ObjectFileDir = "$OBJECT_FILE_DIR";
+  if (lang == "Swift") {
+    vars.SwiftAuxiliarySources = "$SWIFT_AUXILIARY_SOURCES";
+  }
 
   // For some cases we do an explicit preprocessor invocation.
   bool const explicitPP = this->NeedExplicitPreprocessing(lang);
@@ -900,6 +904,20 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
   vars["FLAGS"] = this->ComputeFlagsForObject(source, language);
   vars["DEFINES"] = this->ComputeDefines(source, language);
   vars["INCLUDES"] = this->ComputeIncludes(source, language);
+  // The swift compiler needs all the sources besides the one being compiled in
+  // order to do the type checking.  List all these "auxiliary" sources.
+  if (language == "Swift") {
+    std::string aux_sources;
+    cmGeneratorTarget::KindedSources const& sources =
+      this->GeneratorTarget->GetKindedSources(this->GetConfigName());
+    for (cmGeneratorTarget::SourceAndKind const& src : sources.Sources) {
+      if (src.Source.Value == source) {
+        continue;
+      }
+      aux_sources += " " + this->GetSourceFilePath(src.Source.Value);
+    }
+    vars["SWIFT_AUXILIARY_SOURCES"] = aux_sources;
+  }
 
   if (!this->NeedDepTypeMSVC(language)) {
     bool replaceExt(false);

+ 5 - 0
Source/cmRulePlaceholderExpander.cxx

@@ -162,6 +162,11 @@ std::string cmRulePlaceholderExpander::ExpandRuleVariable(
       }
     }
   }
+  if (replaceValues.SwiftAuxiliarySources) {
+    if (variable == "SWIFT_AUXILIARY_SOURCES") {
+      return replaceValues.SwiftAuxiliarySources;
+    }
+  }
   if (variable == "TARGET_SONAME" || variable == "SONAME_FLAG" ||
       variable == "TARGET_INSTALLNAME_DIR") {
     // All these variables depend on TargetSOName

+ 1 - 0
Source/cmRulePlaceholderExpander.h

@@ -58,6 +58,7 @@ public:
     const char* Includes;
     const char* DependencyFile;
     const char* FilterPrefix;
+    const char* SwiftAuxiliarySources;
   };
 
   // Expand rule variables in CMake of the type found in language rules