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