|  | // 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 "tools/gn/toolchain.h" | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <string.h> | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "tools/gn/target.h" | 
|  | #include "tools/gn/value.h" | 
|  |  | 
|  | const char* Toolchain::kToolCc = "cc"; | 
|  | const char* Toolchain::kToolCxx = "cxx"; | 
|  | const char* Toolchain::kToolObjC = "objc"; | 
|  | const char* Toolchain::kToolObjCxx = "objcxx"; | 
|  | const char* Toolchain::kToolRc = "rc"; | 
|  | const char* Toolchain::kToolAsm = "asm"; | 
|  | const char* Toolchain::kToolAlink = "alink"; | 
|  | const char* Toolchain::kToolSolink = "solink"; | 
|  | const char* Toolchain::kToolSolinkModule = "solink_module"; | 
|  | const char* Toolchain::kToolLink = "link"; | 
|  | const char* Toolchain::kToolStamp = "stamp"; | 
|  | const char* Toolchain::kToolCopy = "copy"; | 
|  | const char* Toolchain::kToolCopyBundleData = "copy_bundle_data"; | 
|  | const char* Toolchain::kToolCompileXCAssets = "compile_xcassets"; | 
|  | const char* Toolchain::kToolAction = "action"; | 
|  |  | 
|  | Toolchain::Toolchain(const Settings* settings, | 
|  | const Label& label, | 
|  | const std::set<SourceFile>& build_dependency_files) | 
|  | : Item(settings, label, build_dependency_files), setup_complete_(false) {} | 
|  |  | 
|  | Toolchain::~Toolchain() = default; | 
|  |  | 
|  | Toolchain* Toolchain::AsToolchain() { | 
|  | return this; | 
|  | } | 
|  |  | 
|  | const Toolchain* Toolchain::AsToolchain() const { | 
|  | return this; | 
|  | } | 
|  |  | 
|  | // static | 
|  | Toolchain::ToolType Toolchain::ToolNameToType(const base::StringPiece& str) { | 
|  | if (str == kToolCc) return TYPE_CC; | 
|  | if (str == kToolCxx) return TYPE_CXX; | 
|  | if (str == kToolObjC) return TYPE_OBJC; | 
|  | if (str == kToolObjCxx) return TYPE_OBJCXX; | 
|  | if (str == kToolRc) return TYPE_RC; | 
|  | if (str == kToolAsm) return TYPE_ASM; | 
|  | if (str == kToolAlink) return TYPE_ALINK; | 
|  | if (str == kToolSolink) return TYPE_SOLINK; | 
|  | if (str == kToolSolinkModule) return TYPE_SOLINK_MODULE; | 
|  | if (str == kToolLink) return TYPE_LINK; | 
|  | if (str == kToolStamp) return TYPE_STAMP; | 
|  | if (str == kToolCopy) return TYPE_COPY; | 
|  | if (str == kToolCopyBundleData) return TYPE_COPY_BUNDLE_DATA; | 
|  | if (str == kToolCompileXCAssets) return TYPE_COMPILE_XCASSETS; | 
|  | if (str == kToolAction) return TYPE_ACTION; | 
|  | return TYPE_NONE; | 
|  | } | 
|  |  | 
|  | // static | 
|  | std::string Toolchain::ToolTypeToName(ToolType type) { | 
|  | switch (type) { | 
|  | case TYPE_CC: return kToolCc; | 
|  | case TYPE_CXX: return kToolCxx; | 
|  | case TYPE_OBJC: return kToolObjC; | 
|  | case TYPE_OBJCXX: return kToolObjCxx; | 
|  | case TYPE_RC: return kToolRc; | 
|  | case TYPE_ASM: return kToolAsm; | 
|  | case TYPE_ALINK: return kToolAlink; | 
|  | case TYPE_SOLINK: return kToolSolink; | 
|  | case TYPE_SOLINK_MODULE: return kToolSolinkModule; | 
|  | case TYPE_LINK: return kToolLink; | 
|  | case TYPE_STAMP: return kToolStamp; | 
|  | case TYPE_COPY: return kToolCopy; | 
|  | case TYPE_COPY_BUNDLE_DATA: return kToolCopyBundleData; | 
|  | case TYPE_COMPILE_XCASSETS: return kToolCompileXCAssets; | 
|  | case TYPE_ACTION: return kToolAction; | 
|  | default: | 
|  | NOTREACHED(); | 
|  | return std::string(); | 
|  | } | 
|  | } | 
|  |  | 
|  | Tool* Toolchain::GetTool(ToolType type) { | 
|  | DCHECK(type != TYPE_NONE); | 
|  | return tools_[static_cast<size_t>(type)].get(); | 
|  | } | 
|  |  | 
|  | const Tool* Toolchain::GetTool(ToolType type) const { | 
|  | DCHECK(type != TYPE_NONE); | 
|  | return tools_[static_cast<size_t>(type)].get(); | 
|  | } | 
|  |  | 
|  | void Toolchain::SetTool(ToolType type, std::unique_ptr<Tool> t) { | 
|  | DCHECK(type != TYPE_NONE); | 
|  | DCHECK(!tools_[type].get()); | 
|  | t->SetComplete(); | 
|  | tools_[type] = std::move(t); | 
|  | } | 
|  |  | 
|  | void Toolchain::ToolchainSetupComplete() { | 
|  | // Collect required bits from all tools. | 
|  | for (const auto& tool : tools_) { | 
|  | if (tool) | 
|  | substitution_bits_.MergeFrom(tool->substitution_bits()); | 
|  | } | 
|  |  | 
|  | setup_complete_ = true; | 
|  | } | 
|  |  | 
|  | // static | 
|  | Toolchain::ToolType Toolchain::GetToolTypeForSourceType(SourceFileType type) { | 
|  | switch (type) { | 
|  | case SOURCE_C: | 
|  | return TYPE_CC; | 
|  | case SOURCE_CPP: | 
|  | return TYPE_CXX; | 
|  | case SOURCE_M: | 
|  | return TYPE_OBJC; | 
|  | case SOURCE_MM: | 
|  | return TYPE_OBJCXX; | 
|  | case SOURCE_ASM: | 
|  | case SOURCE_S: | 
|  | return TYPE_ASM; | 
|  | case SOURCE_RC: | 
|  | return TYPE_RC; | 
|  | case SOURCE_UNKNOWN: | 
|  | case SOURCE_H: | 
|  | case SOURCE_O: | 
|  | case SOURCE_DEF: | 
|  | return TYPE_NONE; | 
|  | default: | 
|  | NOTREACHED(); | 
|  | return TYPE_NONE; | 
|  | } | 
|  | } | 
|  |  | 
|  | const Tool* Toolchain::GetToolForSourceType(SourceFileType type) { | 
|  | return tools_[GetToolTypeForSourceType(type)].get(); | 
|  | } | 
|  |  | 
|  | // static | 
|  | Toolchain::ToolType Toolchain::GetToolTypeForTargetFinalOutput( | 
|  | const Target* target) { | 
|  | // The contents of this list might be suprising (i.e. stamp tool for copy | 
|  | // rules). See the header for why. | 
|  | switch (target->output_type()) { | 
|  | case Target::GROUP: | 
|  | return TYPE_STAMP; | 
|  | case Target::EXECUTABLE: | 
|  | return Toolchain::TYPE_LINK; | 
|  | case Target::SHARED_LIBRARY: | 
|  | return Toolchain::TYPE_SOLINK; | 
|  | case Target::LOADABLE_MODULE: | 
|  | return Toolchain::TYPE_SOLINK_MODULE; | 
|  | case Target::STATIC_LIBRARY: | 
|  | return Toolchain::TYPE_ALINK; | 
|  | case Target::SOURCE_SET: | 
|  | return TYPE_STAMP; | 
|  | case Target::ACTION: | 
|  | case Target::ACTION_FOREACH: | 
|  | case Target::BUNDLE_DATA: | 
|  | case Target::CREATE_BUNDLE: | 
|  | case Target::COPY_FILES: | 
|  | return TYPE_STAMP; | 
|  | default: | 
|  | NOTREACHED(); | 
|  | return Toolchain::TYPE_NONE; | 
|  | } | 
|  | } | 
|  |  | 
|  | const Tool* Toolchain::GetToolForTargetFinalOutput(const Target* target) const { | 
|  | return tools_[GetToolTypeForTargetFinalOutput(target)].get(); | 
|  | } |