blob: 3cfd37770c55fd976a4d5c31357dcfc0ff32d69d [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gn/swift_values.h"
#include "gn/deps_iterator.h"
#include "gn/err.h"
#include "gn/settings.h"
#include "gn/substitution_writer.h"
#include "gn/target.h"
SwiftValues::SwiftValues() = default;
SwiftValues::~SwiftValues() = default;
// static
bool SwiftValues::OnTargetResolved(Target* target, Err* err) {
if (!FillModuleOutputFile(target, err))
return false;
FillModuleDependencies(target);
return true;
}
// static
void SwiftValues::FillModuleDependencies(Target* target) {
for (const auto& pair : target->GetDeps(Target::DEPS_LINKED)) {
if (!pair.ptr->has_swift_values())
continue;
if (pair.ptr->toolchain() == target->toolchain() ||
pair.ptr->toolchain()->propagates_configs()) {
target->swift_values().modules_.Append(
pair.ptr->swift_values().public_modules().begin(),
pair.ptr->swift_values().public_modules().end());
}
}
for (const auto& pair : target->public_deps()) {
if (!pair.ptr->has_swift_values())
continue;
if (pair.ptr->toolchain() == target->toolchain() ||
pair.ptr->toolchain()->propagates_configs())
target->swift_values().public_modules_.Append(
pair.ptr->swift_values().public_modules().begin(),
pair.ptr->swift_values().public_modules().end());
}
if (target->builds_swift_module())
target->swift_values().public_modules_.push_back(target);
}
// static
bool SwiftValues::FillModuleOutputFile(Target* target, Err* err) {
if (!target->IsBinary() || !target->source_types_used().SwiftSourceUsed())
return true;
const Tool* tool =
target->toolchain()->GetToolForSourceType(SourceFile::SOURCE_SWIFT);
CHECK(tool->outputs().list().size() >= 1);
OutputFile module_output_file =
SubstitutionWriter::ApplyPatternToLinkerAsOutputFile(
target, tool, tool->outputs().list()[0]);
const SourceFile module_output_file_as_source =
module_output_file.AsSourceFile(target->settings()->build_settings());
if (!module_output_file_as_source.IsSwiftModuleType()) {
*err = Err(tool->defined_from(), "Incorrect outputs for tool",
"The first output of tool " + std::string(tool->name()) +
" must be a .swiftmodule file.");
return false;
}
SwiftValues& swift_values = target->swift_values();
swift_values.module_output_file_ = std::move(module_output_file);
swift_values.module_output_dir_ = module_output_file_as_source.GetDir();
return true;
}