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.
5 #ifndef TOOLS_GN_NINJA_ACTION_TARGET_WRITER_H_
6 #define TOOLS_GN_NINJA_ACTION_TARGET_WRITER_H_
10 #include "base/compiler_specific.h"
11 #include "base/gtest_prod_util.h"
12 #include "tools/gn/ninja_target_writer.h"
16 // Writes a .ninja file for a action target type.
17 class NinjaActionTargetWriter : public NinjaTargetWriter {
19 NinjaActionTargetWriter(const Target* target,
20 const Toolchain* toolchain,
22 virtual ~NinjaActionTargetWriter();
24 virtual void Run() OVERRIDE;
27 FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
28 WriteOutputFilesForBuildLine);
29 FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
30 WriteOutputFilesForBuildLineWithDepfile);
31 FRIEND_TEST_ALL_PREFIXES(NinjaActionTargetWriter,
32 WriteArgsSubstitutions);
34 bool has_sources() const { return !target_->sources().empty(); }
36 // Writes the Ninja rule for invoking the script.
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
41 std::string WriteRuleDefinition();
43 // Writes the rules for compiling each source, writing all output files
44 // to the given vector.
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);
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);
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);
62 void WriteDepfile(const SourceFile& source);
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_;
69 DISALLOW_COPY_AND_ASSIGN(NinjaActionTargetWriter);
72 #endif // TOOLS_GN_NINJA_ACTION_TARGET_WRITER_H_