Home | History | Annotate | Download | only in gn
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef TOOLS_GN_TOOLCHAIN_H_
      6 #define TOOLS_GN_TOOLCHAIN_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/strings/string_piece.h"
     10 #include "tools/gn/item.h"
     11 #include "tools/gn/scope.h"
     12 #include "tools/gn/value.h"
     13 
     14 // Holds information on a specific toolchain. This data is filled in when we
     15 // encounter a toolchain definition.
     16 //
     17 // This class is an Item so it can participate in dependency management. In
     18 // particular, when a target uses a toolchain, it should have a dependency on
     19 // that toolchain's object so that we can be sure we loaded the toolchain
     20 // before generating the build for that target.
     21 //
     22 // Note on threadsafety: The label of the toolchain never changes so can
     23 // safetly be accessed from any thread at any time (we do this when asking for
     24 // the toolchain name). But the values in the toolchain do, so these can't
     25 // be accessed until this Item is resolved.
     26 class Toolchain : public Item {
     27  public:
     28   enum ToolType {
     29     TYPE_NONE = 0,
     30     TYPE_CC,
     31     TYPE_CXX,
     32     TYPE_OBJC,
     33     TYPE_OBJCXX,
     34     TYPE_RC,
     35     TYPE_ASM,
     36     TYPE_ALINK,
     37     TYPE_SOLINK,
     38     TYPE_LINK,
     39     TYPE_STAMP,
     40     TYPE_COPY,
     41 
     42     TYPE_NUMTYPES  // Must be last.
     43   };
     44 
     45   static const char* kToolCc;
     46   static const char* kToolCxx;
     47   static const char* kToolObjC;
     48   static const char* kToolObjCxx;
     49   static const char* kToolRc;
     50   static const char* kToolAsm;
     51   static const char* kToolAlink;
     52   static const char* kToolSolink;
     53   static const char* kToolLink;
     54   static const char* kToolStamp;
     55   static const char* kToolCopy;
     56 
     57   struct Tool {
     58     Tool();
     59     ~Tool();
     60 
     61     std::string command;
     62     std::string depfile;
     63     std::string deps;
     64     std::string description;
     65     std::string lib_dir_prefix;
     66     std::string lib_prefix;
     67     std::string pool;
     68     std::string restat;
     69     std::string rspfile;
     70     std::string rspfile_content;
     71   };
     72 
     73   Toolchain(const Settings* settings, const Label& label);
     74   virtual ~Toolchain();
     75 
     76   // Item overrides.
     77   virtual Toolchain* AsToolchain() OVERRIDE;
     78   virtual const Toolchain* AsToolchain() const OVERRIDE;
     79 
     80   // Returns TYPE_NONE on failure.
     81   static ToolType ToolNameToType(const base::StringPiece& str);
     82   static std::string ToolTypeToName(ToolType type);
     83 
     84   const Tool& GetTool(ToolType type) const;
     85   void SetTool(ToolType type, const Tool& t);
     86 
     87   // This extra stuff is specified by the build and will be added to the top
     88   // of a generated GYP file (right after the opening "{").
     89   std::string gyp_header() const { return gyp_header_; }
     90   void set_gyp_header(const std::string& gh) { gyp_header_ = gh; }
     91 
     92   // Specifies build argument overrides that will be set on the base scope. It
     93   // will be as if these arguments were passed in on the command line. This
     94   // allows a toolchain to override the OS type of the default toolchain or
     95   // pass in other settings.
     96   Scope::KeyValueMap& args() { return args_; }
     97   const Scope::KeyValueMap& args() const { return args_; }
     98 
     99  private:
    100   Tool tools_[TYPE_NUMTYPES];
    101 
    102   Scope::KeyValueMap args_;
    103 
    104   std::string gyp_header_;
    105 };
    106 
    107 #endif  // TOOLS_GN_TOOLCHAIN_H_
    108