Browse Source

Merge topic 'swift-partials'

001446126e Ninja: add final placeholders to merge Swift partials

Acked-by: Kitware Robot <[email protected]>
Merge-request: !2998
Brad King 6 years ago
parent
commit
ac419931ee

+ 33 - 0
Source/cmNinjaNormalTargetGenerator.cxx

@@ -283,6 +283,11 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile)
       cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType());
 
     vars.Language = this->TargetLinkLanguage.c_str();
+    if (this->TargetLinkLanguage == "Swift") {
+      vars.SwiftPartialModules = "$SWIFT_PARTIAL_MODULES";
+      vars.TargetSwiftModule = "$TARGET_SWIFT_MODULE";
+      vars.TargetSwiftDoc = "$TARGET_SWIFT_DOC";
+    }
 
     std::string responseFlag;
     if (!useResponseFile) {
@@ -787,6 +792,34 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
   cmNinjaDeps outputs;
   outputs.push_back(targetOutputReal);
 
+  if (this->TargetLinkLanguage == "Swift") {
+    if (const char* name = gt.GetProperty("SWIFT_MODULE_NAME")) {
+      vars["TARGET_SWIFT_DOC"] = std::string(name) + ".swiftdoc";
+      vars["TARGET_SWIFT_MODULE"] = std::string(name) + ".swiftmodule";
+    } else {
+      vars["TARGET_SWIFT_DOC"] = gt.GetName() + ".swiftdoc";
+      vars["TARGET_SWIFT_MODULE"] = gt.GetName() + ".swiftmodule";
+    }
+    outputs.push_back(vars["TARGET_SWIFT_DOC"]);
+    outputs.push_back(vars["TARGET_SWIFT_MODULE"]);
+
+    cmLocalNinjaGenerator& localGen = *this->GetLocalGenerator();
+
+    std::string partials;
+    std::vector<cmSourceFile const*> sources;
+    gt.GetObjectSources(sources, this->GetConfigName());
+    for (cmSourceFile const* source : sources) {
+      partials += " ";
+      if (const char* partial = source->GetProperty("SWIFT_PARTIAL_MODULE")) {
+        partials += partial;
+      } else {
+        partials += localGen.GetTargetDirectory(&gt) + "/" +
+          gt.GetObjectName(source) + ".swiftmodule";
+      }
+    }
+    vars["SWIFT_PARTIAL_MODULES"] = partials;
+  }
+
   // Compute specific libraries to link with.
   cmNinjaDeps explicitDeps = this->GetObjects();
   cmNinjaDeps implicitDeps = this->ComputeLinkDeps(this->TargetLinkLanguage);

+ 15 - 0
Source/cmRulePlaceholderExpander.cxx

@@ -187,6 +187,21 @@ std::string cmRulePlaceholderExpander::ExpandRuleVariable(
       return replaceValues.SwiftPartialModule;
     }
   }
+  if (replaceValues.SwiftPartialModules) {
+    if (variable == "SWIFT_PARTIAL_MODULES") {
+      return replaceValues.SwiftPartialModules;
+    }
+  }
+  if (replaceValues.TargetSwiftDoc) {
+    if (variable == "TARGET_SWIFT_DOC") {
+      return replaceValues.TargetSwiftDoc;
+    }
+  }
+  if (replaceValues.TargetSwiftModule) {
+    if (variable == "TARGET_SWIFT_MODULE") {
+      return replaceValues.TargetSwiftModule;
+    }
+  }
   if (variable == "TARGET_SONAME" || variable == "SONAME_FLAG" ||
       variable == "TARGET_INSTALLNAME_DIR") {
     // All these variables depend on TargetSOName

+ 3 - 0
Source/cmRulePlaceholderExpander.h

@@ -63,6 +63,9 @@ public:
     const char* SwiftLibraryName;
     const char* SwiftPartialModule;
     const char* SwiftPartialDoc;
+    const char* TargetSwiftModule;
+    const char* TargetSwiftDoc;
+    const char* SwiftPartialModules;
   };
 
   // Expand rule variables in CMake of the type found in language rules