blob: 22b8151bb001b33de192da57daa7629a10dcf7b9 [file] [log] [blame]
// 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.
#ifndef TOOLS_GN_TOOLCHAIN_H_
#define TOOLS_GN_TOOLCHAIN_H_
#include "base/compiler_specific.h"
#include "base/strings/string_piece.h"
#include "tools/gn/item.h"
// Holds information on a specific toolchain. This data is filled in when we
// encounter a toolchain definition.
//
// This class is an Item so it can participate in dependency management. In
// particular, when a target uses a toolchain, it should have a dependency on
// that toolchain's object so that we can be sure we loaded the toolchain
// before generating the build for that target.
//
// Note on threadsafety: The label of the toolchain never changes so can
// safetly be accessed from any thread at any time (we do this when asking for
// the toolchain name). But the values in the toolchain do, so these can't
// be accessed until this Item is resolved.
class Toolchain : public Item {
public:
enum ToolType {
TYPE_NONE = 0,
TYPE_CC,
TYPE_CXX,
TYPE_ASM,
TYPE_ALINK,
TYPE_SOLINK,
TYPE_SOLINK_MODULE,
TYPE_LINK,
TYPE_STAMP,
TYPE_COPY,
TYPE_NUMTYPES // Must be last.
};
static const char* kToolCc;
static const char* kToolCxx;
static const char* kToolAsm;
static const char* kToolAlink;
static const char* kToolSolink;
static const char* kToolSolinkModule;
static const char* kToolLink;
static const char* kToolStamp;
static const char* kToolCopy;
struct Tool {
Tool();
~Tool();
bool empty() const {
return command.empty() && depfile.empty() && deps.empty() &&
description.empty() && pool.empty() && restat.empty() &&
rspfile.empty() && rspfile_content.empty();
}
std::string command;
std::string depfile;
std::string deps;
std::string description;
std::string pool;
std::string restat;
std::string rspfile;
std::string rspfile_content;
};
Toolchain(const Label& label);
virtual ~Toolchain();
// Item overrides.
virtual Toolchain* AsToolchain() OVERRIDE;
virtual const Toolchain* AsToolchain() const OVERRIDE;
// Returns TYPE_NONE on failure.
static ToolType ToolNameToType(const base::StringPiece& str);
static std::string ToolTypeToName(ToolType type);
const Tool& GetTool(ToolType type) const;
void SetTool(ToolType type, const Tool& t);
const std::string& environment() const { return environment_; }
void set_environment(const std::string& env) { environment_ = env; }
private:
Tool tools_[TYPE_NUMTYPES];
std::string environment_;
};
#endif // TOOLS_GN_TOOLCHAIN_H_