• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)15 Toolchain::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()22 Toolchain* Toolchain::AsToolchain() {
23   return this;
24 }
25 
AsToolchain() const26 const Toolchain* Toolchain::AsToolchain() const {
27   return this;
28 }
29 
GetTool(const char * name)30 Tool* 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) const39 const 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)48 GeneralTool* 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) const55 const 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)62 CTool* 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) const69 const 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)76 RustTool* 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) const83 const 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)90 void 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()97 void 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) const105 const Tool* Toolchain::GetToolForSourceType(SourceFile::Type type) const {
106   return GetTool(Tool::GetToolTypeForSourceType(type));
107 }
108 
GetToolForSourceTypeAsC(SourceFile::Type type) const109 const CTool* Toolchain::GetToolForSourceTypeAsC(SourceFile::Type type) const {
110   return GetToolAsC(Tool::GetToolTypeForSourceType(type));
111 }
112 
GetToolForSourceTypeAsGeneral(SourceFile::Type type) const113 const GeneralTool* Toolchain::GetToolForSourceTypeAsGeneral(
114     SourceFile::Type type) const {
115   return GetToolAsGeneral(Tool::GetToolTypeForSourceType(type));
116 }
117 
GetToolForSourceTypeAsRust(SourceFile::Type type) const118 const RustTool* Toolchain::GetToolForSourceTypeAsRust(
119     SourceFile::Type type) const {
120   return GetToolAsRust(Tool::GetToolTypeForSourceType(type));
121 }
122 
GetToolForTargetFinalOutput(const Target * target) const123 const Tool* Toolchain::GetToolForTargetFinalOutput(const Target* target) const {
124   return GetTool(Tool::GetToolTypeForTargetFinalOutput(target));
125 }
126 
GetToolForTargetFinalOutputAsC(const Target * target) const127 const CTool* Toolchain::GetToolForTargetFinalOutputAsC(
128     const Target* target) const {
129   return GetToolAsC(Tool::GetToolTypeForTargetFinalOutput(target));
130 }
131 
GetToolForTargetFinalOutputAsGeneral(const Target * target) const132 const GeneralTool* Toolchain::GetToolForTargetFinalOutputAsGeneral(
133     const Target* target) const {
134   return GetToolAsGeneral(Tool::GetToolTypeForTargetFinalOutput(target));
135 }
136 
GetToolForTargetFinalOutputAsRust(const Target * target) const137 const RustTool* Toolchain::GetToolForTargetFinalOutputAsRust(
138     const Target* target) const {
139   return GetToolAsRust(Tool::GetToolTypeForTargetFinalOutput(target));
140 }
141