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