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