// 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" #include "tools/gn/scope.h" #include "tools/gn/value.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_OBJC, TYPE_OBJCXX, TYPE_RC, TYPE_ASM, TYPE_ALINK, TYPE_SOLINK, TYPE_LINK, TYPE_STAMP, TYPE_COPY, TYPE_NUMTYPES // Must be last. }; static const char* kToolCc; static const char* kToolCxx; static const char* kToolObjC; static const char* kToolObjCxx; static const char* kToolRc; static const char* kToolAsm; static const char* kToolAlink; static const char* kToolSolink; static const char* kToolLink; static const char* kToolStamp; static const char* kToolCopy; struct Tool { Tool(); ~Tool(); std::string command; std::string depfile; std::string deps; std::string description; std::string lib_dir_prefix; std::string lib_prefix; std::string pool; std::string restat; std::string rspfile; std::string rspfile_content; }; Toolchain(const Settings* settings, 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); // This extra stuff is specified by the build and will be added to the top // of a generated GYP file (right after the opening "{"). std::string gyp_header() const { return gyp_header_; } void set_gyp_header(const std::string& gh) { gyp_header_ = gh; } // Specifies build argument overrides that will be set on the base scope. It // will be as if these arguments were passed in on the command line. This // allows a toolchain to override the OS type of the default toolchain or // pass in other settings. Scope::KeyValueMap& args() { return args_; } const Scope::KeyValueMap& args() const { return args_; } private: Tool tools_[TYPE_NUMTYPES]; Scope::KeyValueMap args_; std::string gyp_header_; }; #endif // TOOLS_GN_TOOLCHAIN_H_