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_BUILD_WRITER_H_
6#define TOOLS_GN_NINJA_BUILD_WRITER_H_
7
8#include <iosfwd>
9#include <vector>
10
11#include "tools/gn/path_output.h"
12
13class BuildSettings;
14class Settings;
15class Target;
16class Toolchain;
17
18// Generates the toplevel "build.ninja" file. This references the individual
19// toolchain files and lists all input .gn files as dependencies of the
20// build itself.
21class NinjaBuildWriter {
22 public:
23  static bool RunAndWriteFile(
24      const BuildSettings* settings,
25      const std::vector<const Settings*>& all_settings,
26      const Toolchain* default_toolchain,
27      const std::vector<const Target*>& default_toolchain_targets);
28
29 private:
30  NinjaBuildWriter(const BuildSettings* settings,
31                   const std::vector<const Settings*>& all_settings,
32                   const Toolchain* default_toolchain,
33                   const std::vector<const Target*>& default_toolchain_targets,
34                   std::ostream& out,
35                   std::ostream& dep_out);
36  ~NinjaBuildWriter();
37
38  void Run();
39
40  void WriteNinjaRules();
41  void WriteLinkPool();
42  void WriteSubninjas();
43  void WritePhonyAndAllRules();
44
45  void WritePhonyRule(const Target* target, const OutputFile& target_file,
46                      const std::string& phony_name);
47
48  const BuildSettings* build_settings_;
49  std::vector<const Settings*> all_settings_;
50  const Toolchain* default_toolchain_;
51  std::vector<const Target*> default_toolchain_targets_;
52  std::ostream& out_;
53  std::ostream& dep_out_;
54  PathOutput path_output_;
55
56  DISALLOW_COPY_AND_ASSIGN(NinjaBuildWriter);
57};
58
59#endif  // TOOLS_GN_NINJA_BUILD_GENERATOR_H_
60
61