| // 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)); | |
| } |