ninja_action_target_writer.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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_NINJA_ACTION_TARGET_WRITER_H_
6#define TOOLS_GN_NINJA_ACTION_TARGET_WRITER_H_
7
8#include <vector>
9
10#include "base/compiler_specific.h"
11#include "base/gtest_prod_util.h"
12#include "tools/gn/ninja_target_writer.h"
13
14class OutputFile;
15
16// Writes a .ninja file for a action target type.
17class NinjaActionTargetWriter : public NinjaTargetWriter {
18 public:
19  NinjaActionTargetWriter(const Target* target,
20                          const Toolchain* toolchain,
21                          std::ostream& out);
22  virtual ~NinjaActionTargetWriter();
23
24  virtual void Run() OVERRIDE;
25
26 private:
27  FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
28                           WriteOutputFilesForBuildLine);
29  FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
30                           WriteOutputFilesForBuildLineWithDepfile);
31  FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
32                           WriteArgsSubstitutions);
33
34  bool has_sources() const { return !target_->sources().empty(); }
35
36  // Writes the Ninja rule for invoking the script.
37  //
38  // Returns the name of the custom rule generated. This will be based on the
39  // target name, and will include the string "$unique_name" if there are
40  // multiple inputs.
41  std::string WriteRuleDefinition();
42
43  // Writes the rules for compiling each source, writing all output files
44  // to the given vector.
45  //
46  // implicit_deps is a precomputed string of all ninja files that are common
47  // to each build step, it starts with a "|" if it's nonempty.
48  void WriteSourceRules(const std::string& custom_rule_name,
49                        const std::string& implicit_deps,
50                        std::vector<OutputFile>* output_files);
51
52  // Writes the .stamp rule that names this target and collects all invocations
53  // of the script into one thing that other targets can depend on.
54  void WriteStamp(const std::vector<OutputFile>& output_files);
55
56  // Writes the output files generated by the output template for the given
57  // source file. This will start with a space and will not include a newline.
58  // Appends the output files to the given vector.
59  void WriteOutputFilesForBuildLine(const SourceFile& source,
60                                    std::vector<OutputFile>* output_files);
61
62  void WriteDepfile(const SourceFile& source);
63
64  // Path output writer that doesn't do any escaping or quoting. It does,
65  // however, convert slashes.  Used for
66  // computing intermediate strings.
67  PathOutput path_output_no_escaping_;
68
69  DISALLOW_COPY_AND_ASSIGN(NinjaActionTargetWriter);
70};
71
72#endif  // TOOLS_GN_NINJA_ACTION_TARGET_WRITER_H_
73