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