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_TARGET_WRITER_H_
6#define TOOLS_GN_NINJA_TARGET_WRITER_H_
7
8#include <iosfwd>
9
10#include "base/basictypes.h"
11#include "tools/gn/path_output.h"
12#include "tools/gn/substitution_type.h"
13
14class FileTemplate;
15class OutputFile;
16class Settings;
17class Target;
18
19// Generates one target's ".ninja" file. The toplevel "build.ninja" file is
20// generated by the NinjaBuildWriter.
21class NinjaTargetWriter {
22 public:
23  NinjaTargetWriter(const Target* target, std::ostream& out);
24  virtual ~NinjaTargetWriter();
25
26  static void RunAndWriteFile(const Target* target);
27
28  virtual void Run() = 0;
29
30 protected:
31  // Writes out the substitution values that are shared between the different
32  // types of tools (target gen dir, target label, etc.). Only the substitutions
33  // identified by the given bits will be written.
34  void WriteSharedVars(const SubstitutionBits& bits);
35
36  // Writes to the output stream a stamp rule for input dependencies, and
37  // returns the file to be appended to source rules that encodes the
38  // order-only dependencies for the current target. The returned OutputFile
39  // will be empty if there are no implicit dependencies and no extra target
40  // dependencies passed in.
41  OutputFile WriteInputDepsStampAndGetDep(
42      const std::vector<const Target*>& extra_hard_deps) const;
43
44  // Writes to the output file a final stamp rule for the target that stamps
45  // the given list of files. This function assumes the stamp is for the target
46  // as a whole so the stamp file is set as the target's dependency output.
47  void WriteStampForTarget(const std::vector<OutputFile>& deps,
48                           const std::vector<OutputFile>& order_only_deps);
49
50  const Settings* settings_;  // Non-owning.
51  const Target* target_;  // Non-owning.
52  std::ostream& out_;
53  PathOutput path_output_;
54
55 private:
56  void WriteCopyRules();
57
58  DISALLOW_COPY_AND_ASSIGN(NinjaTargetWriter);
59};
60
61#endif  // TOOLS_GN_NINJA_TARGET_WRITER_H_
62