1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file. 4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#ifndef TOOLS_GN_TOOLCHAIN_H_ 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#define TOOLS_GN_TOOLCHAIN_H_ 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/compiler_specific.h" 9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/strings/string_piece.h" 10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/item.h" 11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Holds information on a specific toolchain. This data is filled in when we 13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// encounter a toolchain definition. 14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// 15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// This class is an Item so it can participate in dependency management. In 16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// particular, when a target uses a toolchain, it should have a dependency on 17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// that toolchain's object so that we can be sure we loaded the toolchain 18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// before generating the build for that target. 19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// 20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Note on threadsafety: The label of the toolchain never changes so can 21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// safetly be accessed from any thread at any time (we do this when asking for 22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// the toolchain name). But the values in the toolchain do, so these can't 23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// be accessed until this Item is resolved. 24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Toolchain : public Item { 25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch enum ToolType { 27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_NONE = 0, 28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_CC, 29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_CXX, 302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch TYPE_OBJC, 312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch TYPE_OBJCXX, 32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_ASM, 33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_ALINK, 34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_SOLINK, 35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_LINK, 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_STAMP, 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_COPY, 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch TYPE_NUMTYPES // Must be last. 40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolCc; 43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolCxx; 442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch static const char* kToolObjC; 452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch static const char* kToolObjCxx; 46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolAsm; 47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolAlink; 48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolSolink; 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolLink; 50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolStamp; 51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static const char* kToolCopy; 52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch struct Tool { 54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Tool(); 55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ~Tool(); 56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool empty() const { 58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return command.empty() && depfile.empty() && deps.empty() && 59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch description.empty() && pool.empty() && restat.empty() && 60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch rspfile.empty() && rspfile_content.empty(); 61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string command; 64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string depfile; 65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string deps; 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string description; 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string pool; 68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string restat; 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string rspfile; 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string rspfile_content; 71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Toolchain(const Label& label); 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~Toolchain(); 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Item overrides. 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Toolchain* AsToolchain() OVERRIDE; 78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const Toolchain* AsToolchain() const OVERRIDE; 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Returns TYPE_NONE on failure. 81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static ToolType ToolNameToType(const base::StringPiece& str); 82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch static std::string ToolTypeToName(ToolType type); 83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Tool& GetTool(ToolType type) const; 85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void SetTool(ToolType type, const Tool& t); 86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& environment() const { return environment_; } 88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_environment(const std::string& env) { environment_ = env; } 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Tool tools_[TYPE_NUMTYPES]; 92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string environment_; 94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif // TOOLS_GN_TOOLCHAIN_H_ 97