| Index: tools/gn/toolchain.cc
|
| diff --git a/tools/gn/toolchain.cc b/tools/gn/toolchain.cc
|
| index eee458a974cebf077fb3bc5589d65b7489a194bc..1171c593b6978a805b748c938741b6ba92459b91 100644
|
| --- a/tools/gn/toolchain.cc
|
| +++ b/tools/gn/toolchain.cc
|
| @@ -4,7 +4,10 @@
|
|
|
| #include "tools/gn/toolchain.h"
|
|
|
| +#include <string.h>
|
| +
|
| #include "base/logging.h"
|
| +#include "tools/gn/target.h"
|
| #include "tools/gn/value.h"
|
|
|
| const char* Toolchain::kToolCc = "cc";
|
| @@ -19,14 +22,9 @@ const char* Toolchain::kToolLink = "link";
|
| const char* Toolchain::kToolStamp = "stamp";
|
| const char* Toolchain::kToolCopy = "copy";
|
|
|
| -Toolchain::Tool::Tool() {
|
| -}
|
| -
|
| -Toolchain::Tool::~Tool() {
|
| -}
|
| -
|
| Toolchain::Toolchain(const Settings* settings, const Label& label)
|
| - : Item(settings, label) {
|
| + : Item(settings, label),
|
| + setup_complete_(false) {
|
| }
|
|
|
| Toolchain::~Toolchain() {
|
| @@ -76,12 +74,84 @@ std::string Toolchain::ToolTypeToName(ToolType type) {
|
| }
|
| }
|
|
|
| -const Toolchain::Tool& Toolchain::GetTool(ToolType type) const {
|
| +const Tool* Toolchain::GetTool(ToolType type) const {
|
| DCHECK(type != TYPE_NONE);
|
| - return tools_[static_cast<size_t>(type)];
|
| + return tools_[static_cast<size_t>(type)].get();
|
| }
|
|
|
| -void Toolchain::SetTool(ToolType type, const Tool& t) {
|
| +void Toolchain::SetTool(ToolType type, scoped_ptr<Tool> t) {
|
| DCHECK(type != TYPE_NONE);
|
| - tools_[static_cast<size_t>(type)] = t;
|
| + DCHECK(!tools_[type].get());
|
| + t->SetComplete();
|
| + tools_[type] = t.Pass();
|
| +}
|
| +
|
| +void Toolchain::ToolchainSetupComplete() {
|
| + // Collect required bits from all tools.
|
| + for (size_t i = 0; i < TYPE_NUMTYPES; i++) {
|
| + if (tools_[i])
|
| + substitution_bits_.MergeFrom(tools_[i]->substitution_bits());
|
| + }
|
| +
|
| + setup_complete_ = true;
|
| +}
|
| +
|
| +// static
|
| +Toolchain::ToolType Toolchain::GetToolTypeForSourceType(SourceFileType type) {
|
| + switch (type) {
|
| + case SOURCE_C:
|
| + return TYPE_CC;
|
| + case SOURCE_CC:
|
| + 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:
|
| + 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::STATIC_LIBRARY:
|
| + return Toolchain::TYPE_ALINK;
|
| + case Target::SOURCE_SET:
|
| + return TYPE_STAMP;
|
| + case Target::COPY_FILES:
|
| + case Target::ACTION:
|
| + case Target::ACTION_FOREACH:
|
| + return TYPE_STAMP;
|
| + default:
|
| + NOTREACHED();
|
| + return Toolchain::TYPE_NONE;
|
| + }
|
| +}
|
| +
|
| +const Tool* Toolchain::GetToolForTargetFinalOutput(const Target* target) const {
|
| + return tools_[GetToolTypeForTargetFinalOutput(target)].get();
|
| }
|
|
|