blob: a65618466cde53ae7ed5b8292612a5d7150a733a [file] [log] [blame]
// Copyright (c) 2013 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/toolchain.h"
#include <stddef.h>
#include <string.h>
#include <utility>
#include "base/logging.h"
#include "gn/builtin_tool.h"
#include "gn/settings.h"
#include "gn/target.h"
#include "gn/value.h"
Toolchain::Toolchain(const Settings* settings,
const Label& label,
const SourceFileSet& build_dependency_files)
: Item(settings, label, build_dependency_files) {
// Ensure "phony" tool is part of all toolchains by default.
const char* phony_name = BuiltinTool::kBuiltinToolPhony;
tools_.emplace(phony_name, std::make_unique<BuiltinTool>(phony_name));
}
Toolchain::~Toolchain() = default;
Toolchain* Toolchain::AsToolchain() {
return this;
}
const Toolchain* Toolchain::AsToolchain() const {
return this;
}
Tool* Toolchain::GetTool(const char* name) {
DCHECK(name != Tool::kToolNone);
auto pair = tools_.find(name);
if (pair != tools_.end()) {
return pair->second.get();
}
return nullptr;
}
const Tool* Toolchain::GetTool(const char* name) const {
DCHECK(name != Tool::kToolNone);
auto pair = tools_.find(name);
if (pair != tools_.end()) {
return pair->second.get();
}
return nullptr;
}
GeneralTool* Toolchain::GetToolAsGeneral(const char* name) {
if (Tool* tool = GetTool(name)) {
return tool->AsGeneral();
}
return nullptr;
}
const GeneralTool* Toolchain::GetToolAsGeneral(const char* name) const {
if (const Tool* tool = GetTool(name)) {
return tool->AsGeneral();
}
return nullptr;
}
CTool* Toolchain::GetToolAsC(const char* name) {
if (Tool* tool = GetTool(name)) {
return tool->AsC();
}
return nullptr;
}
const CTool* Toolchain::GetToolAsC(const char* name) const {
if (const Tool* tool = GetTool(name)) {
return tool->AsC();
}
return nullptr;
}
RustTool* Toolchain::GetToolAsRust(const char* name) {
if (Tool* tool = GetTool(name)) {
return tool->AsRust();
}
return nullptr;
}
const RustTool* Toolchain::GetToolAsRust(const char* name) const {
if (const Tool* tool = GetTool(name)) {
return tool->AsRust();
}
return nullptr;
}
BuiltinTool* Toolchain::GetToolAsBuiltin(const char* name) {
if (Tool* tool = GetTool(name)) {
return tool->AsBuiltin();
}
return nullptr;
}
const BuiltinTool* Toolchain::GetToolAsBuiltin(const char* name) const {
if (const Tool* tool = GetTool(name)) {
return tool->AsBuiltin();
}
return nullptr;
}
void Toolchain::SetTool(std::unique_ptr<Tool> t) {
DCHECK(t->name() != Tool::kToolNone);
DCHECK(tools_.find(t->name()) == tools_.end());
t->SetComplete();
tools_[t->name()] = std::move(t);
}
void Toolchain::ToolchainSetupComplete() {
// Collect required bits from all tools.
for (const auto& tool : tools_) {
substitution_bits_.MergeFrom(tool.second->substitution_bits());
}
setup_complete_ = true;
}
const Tool* Toolchain::GetToolForSourceType(SourceFile::Type type) const {
return GetTool(Tool::GetToolTypeForSourceType(type));
}
const CTool* Toolchain::GetToolForSourceTypeAsC(SourceFile::Type type) const {
return GetToolAsC(Tool::GetToolTypeForSourceType(type));
}
const GeneralTool* Toolchain::GetToolForSourceTypeAsGeneral(
SourceFile::Type type) const {
return GetToolAsGeneral(Tool::GetToolTypeForSourceType(type));
}
const RustTool* Toolchain::GetToolForSourceTypeAsRust(
SourceFile::Type type) const {
return GetToolAsRust(Tool::GetToolTypeForSourceType(type));
}
const BuiltinTool* Toolchain::GetToolForSourceTypeAsBuiltin(
SourceFile::Type type) const {
return GetToolAsBuiltin(Tool::GetToolTypeForSourceType(type));
}
const Tool* Toolchain::GetToolForTargetFinalOutput(const Target* target) const {
return GetTool(Tool::GetToolTypeForTargetFinalOutput(target));
}
const CTool* Toolchain::GetToolForTargetFinalOutputAsC(
const Target* target) const {
return GetToolAsC(Tool::GetToolTypeForTargetFinalOutput(target));
}
const GeneralTool* Toolchain::GetToolForTargetFinalOutputAsGeneral(
const Target* target) const {
return GetToolAsGeneral(Tool::GetToolTypeForTargetFinalOutput(target));
}
const RustTool* Toolchain::GetToolForTargetFinalOutputAsRust(
const Target* target) const {
return GetToolAsRust(Tool::GetToolTypeForTargetFinalOutput(target));
}
const BuiltinTool* Toolchain::GetToolForTargetFinalOutputAsBuiltin(
const Target* target) const {
return GetToolAsBuiltin(Tool::GetToolTypeForTargetFinalOutput(target));
}