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