Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef TOOLS_GN_TOOLCHAIN_H_ | 5 #ifndef TOOLS_GN_TOOLCHAIN_H_ |
| 6 #define TOOLS_GN_TOOLCHAIN_H_ | 6 #define TOOLS_GN_TOOLCHAIN_H_ |
| 7 | 7 |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/logging.h" | |
| 10 #include "base/memory/scoped_ptr.h" | |
| 9 #include "base/strings/string_piece.h" | 11 #include "base/strings/string_piece.h" |
| 10 #include "tools/gn/item.h" | 12 #include "tools/gn/item.h" |
| 11 #include "tools/gn/label_ptr.h" | 13 #include "tools/gn/label_ptr.h" |
| 12 #include "tools/gn/scope.h" | 14 #include "tools/gn/scope.h" |
| 15 #include "tools/gn/source_file_type.h" | |
| 16 #include "tools/gn/substitution_type.h" | |
| 17 #include "tools/gn/tool.h" | |
| 13 #include "tools/gn/value.h" | 18 #include "tools/gn/value.h" |
| 14 | 19 |
| 15 // Holds information on a specific toolchain. This data is filled in when we | 20 // Holds information on a specific toolchain. This data is filled in when we |
| 16 // encounter a toolchain definition. | 21 // encounter a toolchain definition. |
| 17 // | 22 // |
| 18 // This class is an Item so it can participate in dependency management. In | 23 // This class is an Item so it can participate in dependency management. In |
| 19 // particular, when a target uses a toolchain, it should have a dependency on | 24 // particular, when a target uses a toolchain, it should have a dependency on |
| 20 // that toolchain's object so that we can be sure we loaded the toolchain | 25 // that toolchain's object so that we can be sure we loaded the toolchain |
| 21 // before generating the build for that target. | 26 // before generating the build for that target. |
| 22 // | 27 // |
| 23 // Note on threadsafety: The label of the toolchain never changes so can | 28 // Note on threadsafety: The label of the toolchain never changes so can |
| 24 // safetly be accessed from any thread at any time (we do this when asking for | 29 // safetly be accessed from any thread at any time (we do this when asking for |
|
jamesr
2014/08/19 19:30:42
typo 'safetly' -> 'safely'
| |
| 25 // the toolchain name). But the values in the toolchain do, so these can't | 30 // the toolchain name). But the values in the toolchain do, so these can't |
| 26 // be accessed until this Item is resolved. | 31 // be accessed until this Item is resolved. |
| 27 class Toolchain : public Item { | 32 class Toolchain : public Item { |
| 28 public: | 33 public: |
| 29 enum ToolType { | 34 enum ToolType { |
| 30 TYPE_NONE = 0, | 35 TYPE_NONE = 0, |
| 31 TYPE_CC, | 36 TYPE_CC, |
| 32 TYPE_CXX, | 37 TYPE_CXX, |
| 33 TYPE_OBJC, | 38 TYPE_OBJC, |
| 34 TYPE_OBJCXX, | 39 TYPE_OBJCXX, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 48 static const char* kToolObjC; | 53 static const char* kToolObjC; |
| 49 static const char* kToolObjCxx; | 54 static const char* kToolObjCxx; |
| 50 static const char* kToolRc; | 55 static const char* kToolRc; |
| 51 static const char* kToolAsm; | 56 static const char* kToolAsm; |
| 52 static const char* kToolAlink; | 57 static const char* kToolAlink; |
| 53 static const char* kToolSolink; | 58 static const char* kToolSolink; |
| 54 static const char* kToolLink; | 59 static const char* kToolLink; |
| 55 static const char* kToolStamp; | 60 static const char* kToolStamp; |
| 56 static const char* kToolCopy; | 61 static const char* kToolCopy; |
| 57 | 62 |
| 58 struct Tool { | |
| 59 Tool(); | |
| 60 ~Tool(); | |
| 61 | |
| 62 std::string command; | |
| 63 std::string depfile; | |
| 64 std::string depsformat; | |
| 65 std::string description; | |
| 66 std::string lib_dir_prefix; | |
| 67 std::string lib_prefix; | |
| 68 std::string pool; | |
| 69 std::string restat; | |
| 70 std::string rspfile; | |
| 71 std::string rspfile_content; | |
| 72 }; | |
| 73 | |
| 74 Toolchain(const Settings* settings, const Label& label); | 63 Toolchain(const Settings* settings, const Label& label); |
| 75 virtual ~Toolchain(); | 64 virtual ~Toolchain(); |
| 76 | 65 |
| 77 // Item overrides. | 66 // Item overrides. |
| 78 virtual Toolchain* AsToolchain() OVERRIDE; | 67 virtual Toolchain* AsToolchain() OVERRIDE; |
| 79 virtual const Toolchain* AsToolchain() const OVERRIDE; | 68 virtual const Toolchain* AsToolchain() const OVERRIDE; |
| 80 | 69 |
| 81 // Returns TYPE_NONE on failure. | 70 // Returns TYPE_NONE on failure. |
| 82 static ToolType ToolNameToType(const base::StringPiece& str); | 71 static ToolType ToolNameToType(const base::StringPiece& str); |
| 83 static std::string ToolTypeToName(ToolType type); | 72 static std::string ToolTypeToName(ToolType type); |
| 84 | 73 |
| 85 const Tool& GetTool(ToolType type) const; | 74 // Returns null if the tool hasn't been defined. |
| 86 void SetTool(ToolType type, const Tool& t); | 75 const Tool* GetTool(ToolType type) const; |
| 76 | |
| 77 // Set a tool. When all tools are configured, you should call | |
| 78 // ToolchainSetupComplete(). | |
| 79 void SetTool(ToolType type, scoped_ptr<Tool> t); | |
| 80 | |
| 81 // Does final setup on the toolchain once all tools are known. | |
| 82 void ToolchainSetupComplete(); | |
| 87 | 83 |
| 88 // Targets that must be resolved before compiling any targets. | 84 // Targets that must be resolved before compiling any targets. |
| 89 const LabelTargetVector& deps() const { return deps_; } | 85 const LabelTargetVector& deps() const { return deps_; } |
| 90 LabelTargetVector& deps() { return deps_; } | 86 LabelTargetVector& deps() { return deps_; } |
| 91 | 87 |
| 92 // Specifies build argument overrides that will be set on the base scope. It | 88 // 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 | 89 // 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 | 90 // allows a toolchain to override the OS type of the default toolchain or |
| 95 // pass in other settings. | 91 // pass in other settings. |
| 96 Scope::KeyValueMap& args() { return args_; } | 92 Scope::KeyValueMap& args() { return args_; } |
| 97 const Scope::KeyValueMap& args() const { return args_; } | 93 const Scope::KeyValueMap& args() const { return args_; } |
| 98 | 94 |
| 95 // Returns the tool for compiling the given source file type. | |
| 96 static ToolType GetToolTypeForSourceType(SourceFileType type); | |
| 97 const Tool* GetToolForSourceType(SourceFileType type); | |
| 98 | |
| 99 // Returns the tool that produces the final output for the given target type. | |
| 100 // This isn't necessarily the tool you would expect. For copy target, this | |
| 101 // will return the stamp tool ionstead since the final output of a copy | |
| 102 // target is to stamp the set of copies done so there is one output. | |
| 103 static ToolType GetToolTypeForTargetFinalOutput(const Target* target); | |
| 104 const Tool* GetToolForTargetFinalOutput(const Target* target) const; | |
| 105 | |
| 106 const SubstitutionBits& substitution_bits() const { | |
| 107 DCHECK(setup_complete_); | |
| 108 return substitution_bits_; | |
| 109 } | |
| 110 | |
| 99 private: | 111 private: |
| 100 Tool tools_[TYPE_NUMTYPES]; | 112 scoped_ptr<Tool> tools_[TYPE_NUMTYPES]; |
| 113 | |
| 114 bool setup_complete_; | |
| 115 | |
| 116 // Substitutions used by the tools in this toolchain. | |
| 117 SubstitutionBits substitution_bits_; | |
| 101 | 118 |
| 102 LabelTargetVector deps_; | 119 LabelTargetVector deps_; |
| 103 Scope::KeyValueMap args_; | 120 Scope::KeyValueMap args_; |
| 104 }; | 121 }; |
| 105 | 122 |
| 106 #endif // TOOLS_GN_TOOLCHAIN_H_ | 123 #endif // TOOLS_GN_TOOLCHAIN_H_ |
| OLD | NEW |