f18a2b1a1aa730f58c0da0742e6f367b77db6181
[platform/framework/web/crosswalk.git] / src / tools / gn / ninja_action_target_writer.h
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
14 class OutputFile;
15
16 // Writes a .ninja file for a action target type.
17 class 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_