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