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/ninja_helper.h"
12#include "tools/gn/path_output.h"
13
14class FileTemplate;
15class Settings;
16class Target;
17
18// Generates one target's ".ninja" file. The toplevel "build.ninja" file is
19// generated by the NinjaBuildWriter.
20class NinjaTargetWriter {
21 public:
22  NinjaTargetWriter(const Target* target,
23                    const Toolchain* toolchain,
24                    std::ostream& out);
25  virtual ~NinjaTargetWriter();
26
27  static void RunAndWriteFile(const Target* target, const Toolchain* toolchain);
28
29  virtual void Run() = 0;
30
31 protected:
32  // Returns the string to be appended to source rules that encodes the
33  // order-only dependencies for the current target. This will include the
34  // "|" character so can just be appended to the source rules. If there are no
35  // implicit dependencies, returns the empty string.
36  std::string GetSourcesImplicitDeps() const;
37
38  // Returns the FileTemplate constructed from the outputs variable. This is
39  // like FileTemplate::GetForTargetOutputs except this additionally trims the
40  // build directory from the front so we can just write the names without
41  // further processing.
42  FileTemplate GetOutputTemplate() const;
43
44  const Settings* settings_;  // Non-owning.
45  const Target* target_;  // Non-owning.
46  const Toolchain* toolchain_;  // Non-owning.
47  std::ostream& out_;
48  PathOutput path_output_;
49
50  NinjaHelper helper_;
51
52 private:
53  void WriteCopyRules();
54
55  DISALLOW_COPY_AND_ASSIGN(NinjaTargetWriter);
56};
57
58#endif  // TOOLS_GN_NINJA_TARGET_WRITER_H_
59