summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-01-25 16:11:22 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-01-25 16:11:37 (GMT)
commit3c8a65d3aae09ddba7caf53efdaa39c9dbf7ccd4 (patch)
tree8540388263445b1609103ffb83eb4777209ad652 /Source
parent7a989a581c8da2fe9822096ee00b288c376b6117 (diff)
parent1730d208b5c94c600f08241a47cb41f81f4db097 (diff)
downloadCMake-3c8a65d3aae09ddba7caf53efdaa39c9dbf7ccd4.zip
CMake-3c8a65d3aae09ddba7caf53efdaa39c9dbf7ccd4.tar.gz
CMake-3c8a65d3aae09ddba7caf53efdaa39c9dbf7ccd4.tar.bz2
Merge topic 'swiftmodule-dependency-tracking'
1730d208b5 Add incremental Swift static lib build test bf3a8ef6d5 Ninja: Swift: Add dependency edge to swiftmodule file d0b469b7e0 Ninja: NFC: refactor swift module name computations Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !8084
Diffstat (limited to 'Source')
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx77
1 files changed, 52 insertions, 25 deletions
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index d481b64..a1633ca 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -940,6 +940,37 @@ void cmNinjaNormalTargetGenerator::WriteNvidiaDeviceLinkStatement(
this->WriteNvidiaDeviceLinkRule(usedResponseFile, config);
}
+/// Get the target property if it exists, or return a default
+static std::string GetTargetPropertyOrDefault(cmGeneratorTarget const* target,
+ std::string const& property,
+ std::string defaultValue)
+{
+ if (cmValue name = target->GetProperty(property)) {
+ return *name;
+ }
+ return defaultValue;
+}
+
+/// Compute the swift module name for target
+static std::string GetSwiftModuleName(cmGeneratorTarget const* target)
+{
+ return GetTargetPropertyOrDefault(target, "Swift_MODULE_NAME",
+ target->GetName());
+}
+
+/// Compute the swift module path for the target
+/// The returned path will need to be converted to the generator path
+static std::string GetSwiftModulePath(cmGeneratorTarget const* target)
+{
+ std::string moduleName = GetSwiftModuleName(target);
+ std::string moduleDirectory = GetTargetPropertyOrDefault(
+ target, "Swift_MODULE_DIRECTORY",
+ target->LocalGenerator->GetCurrentBinaryDirectory());
+ std::string moduleFileName = GetTargetPropertyOrDefault(
+ target, "Swift_MODULE", moduleName + ".swiftmodule");
+ return moduleDirectory + "/" + moduleFileName;
+}
+
void cmNinjaNormalTargetGenerator::WriteLinkStatement(
const std::string& config, const std::string& fileConfig,
bool firstForConfig)
@@ -1038,31 +1069,10 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
return targetNames.Base;
}();
- vars["SWIFT_MODULE_NAME"] = [gt]() -> std::string {
- if (cmValue name = gt->GetProperty("Swift_MODULE_NAME")) {
- return *name;
- }
- return gt->GetName();
- }();
-
- vars["SWIFT_MODULE"] = [this](const std::string& module) -> std::string {
- std::string directory =
- this->GetLocalGenerator()->GetCurrentBinaryDirectory();
- if (cmValue prop = this->GetGeneratorTarget()->GetProperty(
- "Swift_MODULE_DIRECTORY")) {
- directory = *prop;
- }
-
- std::string name = module + ".swiftmodule";
- if (cmValue prop =
- this->GetGeneratorTarget()->GetProperty("Swift_MODULE")) {
- name = *prop;
- }
-
- return this->GetLocalGenerator()->ConvertToOutputFormat(
- this->ConvertToNinjaPath(directory + "/" + name),
- cmOutputConverter::SHELL);
- }(vars["SWIFT_MODULE_NAME"]);
+ vars["SWIFT_MODULE_NAME"] = GetSwiftModuleName(gt);
+ vars["SWIFT_MODULE"] = this->GetLocalGenerator()->ConvertToOutputFormat(
+ this->ConvertToNinjaPath(GetSwiftModulePath(gt)),
+ cmOutputConverter::SHELL);
vars["SWIFT_SOURCES"] = [this, config]() -> std::string {
std::vector<cmSourceFile const*> sources;
@@ -1386,6 +1396,23 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
}
}
+ // Add dependencies on swiftmodule files when using the swift linker
+ if (this->TargetLinkLanguage(config) == "Swift") {
+ if (cmComputeLinkInformation* cli =
+ this->GeneratorTarget->GetLinkInformation(config)) {
+ for (auto const& dependency : cli->GetItems()) {
+ // Both the current target and the linked target must be swift targets
+ // in order for there to be a swiftmodule to depend on
+ if (dependency.Target &&
+ dependency.Target->GetLinkerLanguage(config) == "Swift") {
+ std::string swiftmodule =
+ this->ConvertToNinjaPath(GetSwiftModulePath(dependency.Target));
+ linkBuild.ImplicitDeps.emplace_back(swiftmodule);
+ }
+ }
+ }
+ }
+
// Ninja should restat after linking if and only if there are byproducts.
vars["RESTAT"] = byproducts.ExplicitOuts.empty() ? "" : "1";