// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tools/gn/ninja_writer.h"

#include "tools/gn/builder.h"
#include "tools/gn/loader.h"
#include "tools/gn/location.h"
#include "tools/gn/ninja_build_writer.h"
#include "tools/gn/ninja_toolchain_writer.h"
#include "tools/gn/settings.h"
#include "tools/gn/target.h"

NinjaWriter::NinjaWriter(const Builder& builder)
    : builder_(builder) {
}

NinjaWriter::~NinjaWriter() {
}

// static
bool NinjaWriter::RunAndWriteFiles(
    const BuildSettings* build_settings,
    const Builder& builder,
    const PerToolchainRules& per_toolchain_rules,
    Err* err) {
  NinjaWriter writer(builder);

  if (!writer.WriteToolchains(per_toolchain_rules, err))
    return false;
  return NinjaBuildWriter::RunAndWriteFile(build_settings, builder, err);
}

bool NinjaWriter::WriteToolchains(const PerToolchainRules& per_toolchain_rules,
                                  Err* err) {
  if (per_toolchain_rules.empty()) {
    Err(Location(), "No targets.",
        "I could not find any targets to write, so I'm doing nothing.")
        .PrintToStdout();
    return false;
  }

  for (const auto& i : per_toolchain_rules) {
    const Toolchain* toolchain = i.first;
    const Settings* settings =
        builder_.loader()->GetToolchainSettings(toolchain->label());
    if (!NinjaToolchainWriter::RunAndWriteFile(settings, toolchain, i.second)) {
      Err(Location(),
          "Couldn't open toolchain buildfile(s) for writing").PrintToStdout();
      return false;
    }
  }

  return true;
}
