103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#ifndef TOOLS_GN_TOOL_H_ 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define TOOLS_GN_TOOL_H_ 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <string> 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/basictypes.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/logging.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/substitution_list.h" 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/substitution_pattern.h" 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class Tool { 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) enum DepsFormat { 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DEPS_GCC = 0, 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DEPS_MSVC = 1 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Tool(); 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ~Tool(); 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Getters/setters ---------------------------------------------------------- 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // After the tool has had its attributes set, the caller must call 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // SetComplete(), at which point no other changes can be made. 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Command to run. 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& command() const { 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return command_; 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_command(const SubstitutionPattern& cmd) { 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) command_ = cmd; 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Should include a leading "." if nonempty. 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& default_output_extension() const { 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return default_output_extension_; 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_default_output_extension(const std::string& ext) { 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(ext.empty() || ext[0] == '.'); 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) default_output_extension_ = ext; 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Dependency file (if supported). 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& depfile() const { 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return depfile_; 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_depfile(const SubstitutionPattern& df) { 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) depfile_ = df; 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DepsFormat depsformat() const { 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return depsformat_; 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_depsformat(DepsFormat f) { 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) depsformat_ = f; 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& description() const { 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return description_; 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_description(const SubstitutionPattern& desc) { 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) description_ = desc; 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& lib_switch() const { 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return lib_switch_; 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_lib_switch(const std::string& s) { 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) lib_switch_ = s; 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& lib_dir_switch() const { 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return lib_dir_switch_; 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_lib_dir_switch(const std::string& s) { 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) lib_dir_switch_ = s; 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionList& outputs() const { 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return outputs_; 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_outputs(const SubstitutionList& out) { 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) outputs_ = out; 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Should match files in the outputs() if nonempty. 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& link_output() const { 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return link_output_; 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_link_output(const SubstitutionPattern& link_out) { 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) link_output_ = link_out; 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& depend_output() const { 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return depend_output_; 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_depend_output(const SubstitutionPattern& dep_out) { 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) depend_output_ = dep_out; 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& output_prefix() const { 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return output_prefix_; 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_output_prefix(const std::string& s) { 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) output_prefix_ = s; 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool restat() const { 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return restat_; 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_restat(bool r) { 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) restat_ = r; 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& rspfile() const { 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return rspfile_; 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_rspfile(const SubstitutionPattern& rsp) { 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) rspfile_ = rsp; 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionPattern& rspfile_content() const { 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return rspfile_content_; 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void set_rspfile_content(const SubstitutionPattern& content) { 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!complete_); 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) rspfile_content_ = content; 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Other functions ---------------------------------------------------------- 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Called when the toolchain is saving this tool, after everything is filled 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // in. 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void SetComplete(); 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Returns true if this tool has separate outputs for dependency tracking 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // and linking. 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool has_separate_solink_files() const { 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return !link_output_.empty() || !depend_output_.empty(); 15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Substitutions required by this tool. 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SubstitutionBits& substitution_bits() const { 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(complete_); 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return substitution_bits_; 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern command_; 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string default_output_extension_; 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern depfile_; 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DepsFormat depsformat_; 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern description_; 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string lib_switch_; 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string lib_dir_switch_; 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionList outputs_; 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern link_output_; 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern depend_output_; 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string output_prefix_; 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool restat_; 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern rspfile_; 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern rspfile_content_; 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool complete_; 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionBits substitution_bits_; 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Tool); 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif // TOOLS_GN_TOOL_H_ 189