13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <vector>
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/gtest_prod_util.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/ninja_target_writer.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class FileTemplate;
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class OutputFile;
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Writes a .ninja file for a custom script target type.
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class NinjaScriptTargetWriter : public NinjaTargetWriter {
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  NinjaScriptTargetWriter(const Target* target,
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                          const Toolchain* toolchain,
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                          std::ostream& out);
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~NinjaScriptTargetWriter();
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Run() OVERRIDE;
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(NinjaScriptTargetWriter,
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           WriteOutputFilesForBuildLine);
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(NinjaScriptTargetWriter,
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           WriteOutputFilesForBuildLineWithDepfile);
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(NinjaScriptTargetWriter,
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           WriteArgsSubstitutions);
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool has_sources() const { return !target_->sources().empty(); }
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Writes the Ninja rule for invoking the script.
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns the name of the custom rule generated. This will be based on the
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // target name, and will include the string "$unique_name" if there are
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // multiple inputs.
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::string WriteRuleDefinition(const FileTemplate& args_template);
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Writes the rules for compiling each source, writing all output files
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // to the given vector.
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  //
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // implicit_deps is a precomputed string of all ninja files that are common
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // to each build step, it starts with a "|" if it's nonempty.
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void WriteSourceRules(const std::string& custom_rule_name,
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::string& implicit_deps,
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        const FileTemplate& args_template,
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        std::vector<OutputFile>* output_files);
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Writes the Ninja variables that expand the substitutions required by the
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // arguments for the given source file.
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void WriteArgsSubstitutions(const SourceFile& source,
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                              const FileTemplate& args_template);
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Writes the .stamp rule that names this target and collects all invocations
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // of the script into one thing that other targets can depend on.
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void WriteStamp(const std::vector<OutputFile>& output_files);
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Writes the output files generated by the output template for the given
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // source file. This will start with a space and will not include a newline.
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Appends the output files to the given vector.
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void WriteOutputFilesForBuildLine(const FileTemplate& output_template,
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                    const SourceFile& source,
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                    std::vector<OutputFile>* output_files);
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void WriteDepfile(const SourceFile& source);
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the FileTemplate for the depfile variable.
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FileTemplate GetDepfileTemplate() const;
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Path output writer that doesn't do any escaping or quoting. It does,
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // however, convert slashes.  Used for
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // computing intermediate strings.
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  PathOutput path_output_no_escaping_;
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NinjaScriptTargetWriter);
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_
84