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 #include "gn/ninja_writer.h"
6
7 #include "gn/builder.h"
8 #include "gn/loader.h"
9 #include "gn/location.h"
10 #include "gn/ninja_build_writer.h"
11 #include "gn/ninja_toolchain_writer.h"
12 #include "gn/settings.h"
13 #include "gn/target.h"
14
NinjaWriter(const Builder & builder)15 NinjaWriter::NinjaWriter(const Builder& builder) : builder_(builder) {}
16
17 NinjaWriter::~NinjaWriter() = default;
18
19 // static
RunAndWriteFiles(const BuildSettings * build_settings,const Builder & builder,const PerToolchainRules & per_toolchain_rules,Err * err)20 bool NinjaWriter::RunAndWriteFiles(const BuildSettings* build_settings,
21 const Builder& builder,
22 const PerToolchainRules& per_toolchain_rules,
23 Err* err) {
24 NinjaWriter writer(builder);
25
26 if (!writer.WriteToolchains(per_toolchain_rules, err))
27 return false;
28 return NinjaBuildWriter::RunAndWriteFile(build_settings, builder, err);
29 }
30
WriteToolchains(const PerToolchainRules & per_toolchain_rules,Err * err)31 bool NinjaWriter::WriteToolchains(const PerToolchainRules& per_toolchain_rules,
32 Err* err) {
33 if (per_toolchain_rules.empty()) {
34 *err = Err(Location(), "No targets.",
35 "I could not find any targets to write, so I'm doing nothing.");
36 return false;
37 }
38
39 for (const auto& i : per_toolchain_rules) {
40 const Toolchain* toolchain = i.first;
41 const Settings* settings =
42 builder_.loader()->GetToolchainSettings(toolchain->label());
43 if (!NinjaToolchainWriter::RunAndWriteFile(settings, toolchain, i.second)) {
44 *err =
45 Err(Location(), "Couldn't open toolchain buildfile(s) for writing");
46 return false;
47 }
48 }
49
50 return true;
51 }
52