diff options
author | Brad King <brad.king@kitware.com> | 2023-01-25 16:11:22 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2023-01-25 16:11:37 (GMT) |
commit | 3c8a65d3aae09ddba7caf53efdaa39c9dbf7ccd4 (patch) | |
tree | 8540388263445b1609103ffb83eb4777209ad652 /Source | |
parent | 7a989a581c8da2fe9822096ee00b288c376b6117 (diff) | |
parent | 1730d208b5c94c600f08241a47cb41f81f4db097 (diff) | |
download | CMake-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.cxx | 77 |
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"; |