1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "gn/toolchain.h" 6 7 #include <stddef.h> 8 #include <string.h> 9 #include <utility> 10 11 #include "base/logging.h" 12 #include "gn/target.h" 13 #include "gn/value.h" 14 Toolchain(const Settings * settings,const Label & label,const SourceFileSet & build_dependency_files)15Toolchain::Toolchain(const Settings* settings, 16 const Label& label, 17 const SourceFileSet& build_dependency_files) 18 : Item(settings, label, build_dependency_files) {} 19 20 Toolchain::~Toolchain() = default; 21 AsToolchain()22Toolchain* Toolchain::AsToolchain() { 23 return this; 24 } 25 AsToolchain() const26const Toolchain* Toolchain::AsToolchain() const { 27 return this; 28 } 29 GetTool(const char * name)30Tool* Toolchain::GetTool(const char* name) { 31 DCHECK(name != Tool::kToolNone); 32 auto pair = tools_.find(name); 33 if (pair != tools_.end()) { 34 return pair->second.get(); 35 } 36 return nullptr; 37 } 38 GetTool(const char * name) const39const Tool* Toolchain::GetTool(const char* name) const { 40 DCHECK(name != Tool::kToolNone); 41 auto pair = tools_.find(name); 42 if (pair != tools_.end()) { 43 return pair->second.get(); 44 } 45 return nullptr; 46 } 47 GetToolAsGeneral(const char * name)48GeneralTool* Toolchain::GetToolAsGeneral(const char* name) { 49 if (Tool* tool = GetTool(name)) { 50 return tool->AsGeneral(); 51 } 52 return nullptr; 53 } 54 GetToolAsGeneral(const char * name) const55const GeneralTool* Toolchain::GetToolAsGeneral(const char* name) const { 56 if (const Tool* tool = GetTool(name)) { 57 return tool->AsGeneral(); 58 } 59 return nullptr; 60 } 61 GetToolAsC(const char * name)62CTool* Toolchain::GetToolAsC(const char* name) { 63 if (Tool* tool = GetTool(name)) { 64 return tool->AsC(); 65 } 66 return nullptr; 67 } 68 GetToolAsC(const char * name) const69const CTool* Toolchain::GetToolAsC(const char* name) const { 70 if (const Tool* tool = GetTool(name)) { 71 return tool->AsC(); 72 } 73 return nullptr; 74 } 75 GetToolAsRust(const char * name)76RustTool* Toolchain::GetToolAsRust(const char* name) { 77 if (Tool* tool = GetTool(name)) { 78 return tool->AsRust(); 79 } 80 return nullptr; 81 } 82 GetToolAsRust(const char * name) const83const RustTool* Toolchain::GetToolAsRust(const char* name) const { 84 if (const Tool* tool = GetTool(name)) { 85 return tool->AsRust(); 86 } 87 return nullptr; 88 } 89 SetTool(std::unique_ptr<Tool> t)90void Toolchain::SetTool(std::unique_ptr<Tool> t) { 91 DCHECK(t->name() != Tool::kToolNone); 92 DCHECK(tools_.find(t->name()) == tools_.end()); 93 t->SetComplete(); 94 tools_[t->name()] = std::move(t); 95 } 96 ToolchainSetupComplete()97void Toolchain::ToolchainSetupComplete() { 98 // Collect required bits from all tools. 99 for (const auto& tool : tools_) { 100 substitution_bits_.MergeFrom(tool.second->substitution_bits()); 101 } 102 setup_complete_ = true; 103 } 104 GetToolForSourceType(SourceFile::Type type) const105const Tool* Toolchain::GetToolForSourceType(SourceFile::Type type) const { 106 return GetTool(Tool::GetToolTypeForSourceType(type)); 107 } 108 GetToolForSourceTypeAsC(SourceFile::Type type) const109const CTool* Toolchain::GetToolForSourceTypeAsC(SourceFile::Type type) const { 110 return GetToolAsC(Tool::GetToolTypeForSourceType(type)); 111 } 112 GetToolForSourceTypeAsGeneral(SourceFile::Type type) const113const GeneralTool* Toolchain::GetToolForSourceTypeAsGeneral( 114 SourceFile::Type type) const { 115 return GetToolAsGeneral(Tool::GetToolTypeForSourceType(type)); 116 } 117 GetToolForSourceTypeAsRust(SourceFile::Type type) const118const RustTool* Toolchain::GetToolForSourceTypeAsRust( 119 SourceFile::Type type) const { 120 return GetToolAsRust(Tool::GetToolTypeForSourceType(type)); 121 } 122 GetToolForTargetFinalOutput(const Target * target) const123const Tool* Toolchain::GetToolForTargetFinalOutput(const Target* target) const { 124 return GetTool(Tool::GetToolTypeForTargetFinalOutput(target)); 125 } 126 GetToolForTargetFinalOutputAsC(const Target * target) const127const CTool* Toolchain::GetToolForTargetFinalOutputAsC( 128 const Target* target) const { 129 return GetToolAsC(Tool::GetToolTypeForTargetFinalOutput(target)); 130 } 131 GetToolForTargetFinalOutputAsGeneral(const Target * target) const132const GeneralTool* Toolchain::GetToolForTargetFinalOutputAsGeneral( 133 const Target* target) const { 134 return GetToolAsGeneral(Tool::GetToolTypeForTargetFinalOutput(target)); 135 } 136 GetToolForTargetFinalOutputAsRust(const Target * target) const137const RustTool* Toolchain::GetToolForTargetFinalOutputAsRust( 138 const Target* target) const { 139 return GetToolAsRust(Tool::GetToolTypeForTargetFinalOutput(target)); 140 } 141