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, std::ostream& out);
20  virtual ~NinjaActionTargetWriter();
21
22  virtual void Run() OVERRIDE;
23
24 private:
25  FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
26                           WriteOutputFilesForBuildLine);
27  FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
28                           WriteOutputFilesForBuildLineWithDepfile);
29  FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
30                           WriteArgsSubstitutions);
31
32  // Writes the Ninja rule for invoking the script.
33  //
34  // Returns the name of the custom rule generated. This will be based on the
35  // target name, and will include the string "$unique_name" if there are
36  // multiple inputs.
37  std::string WriteRuleDefinition();
38
39  // Writes the rules for compiling each source, writing all output files
40  // to the given vector.
41  //
42  // input_dep is a file expressing the depencies common to all build steps.
43  // It will be a stamp file if there is more than one.
44  void WriteSourceRules(const std::string& custom_rule_name,
45                        const OutputFile& input_dep,
46                        std::vector<OutputFile>* output_files);
47
48  // Writes the output files generated by the output template for the given
49  // source file. This will start with a space and will not include a newline.
50  // Appends the output files to the given vector.
51  void WriteOutputFilesForBuildLine(const SourceFile& source,
52                                    std::vector<OutputFile>* output_files);
53
54  void WriteDepfile(const SourceFile& source);
55
56  // Path output writer that doesn't do any escaping or quoting. It does,
57  // however, convert slashes.  Used for
58  // computing intermediate strings.
59  PathOutput path_output_no_escaping_;
60
61  DISALLOW_COPY_AND_ASSIGN(NinjaActionTargetWriter);
62};
63
64#endif  // TOOLS_GN_NINJA_ACTION_TARGET_WRITER_H_
65