blob: 2eaf31cca367597a0629bbbb8e00f48417dc4deb [file] [log] [blame]
// Copyright 2020 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 "gn/ninja_tools.h"
#include <vector>
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/strings/string_number_conversions.h"
#include "gn/err.h"
#include "gn/exec_process.h"
#include "gn/filesystem_utils.h"
namespace {
base::CommandLine CreateNinjaToolCommandLine(const base::FilePath& ninja_executable,
const std::string& tool) {
base::CommandLine cmdline(ninja_executable);
cmdline.SetParseSwitches(false);
cmdline.AppendArg("-t");
cmdline.AppendArg(tool);
return cmdline;
}
bool RunNinja(const base::CommandLine& cmdline,
const base::FilePath& startup_dir,
std::string* output,
Err* err) {
std::string stderr_output;
int exit_code = 0;
if (!internal::ExecProcess(cmdline, startup_dir, output, &stderr_output,
&exit_code)) {
*err = Err(Location(), "Could not execute Ninja.",
"I was trying to execute \"" +
FilePathToUTF8(cmdline.GetProgram()) + "\".");
return false;
}
if (exit_code != 0) {
*err = Err(Location(), "Ninja has quit with exit code " +
base::IntToString(exit_code) + ".");
return false;
}
return true;
}
} // namespace
bool InvokeNinjaRestatTool(const base::FilePath& ninja_executable,
const base::FilePath& build_dir,
const std::vector<base::FilePath>& files_to_restat,
Err* err) {
base::CommandLine cmdline =
CreateNinjaToolCommandLine(ninja_executable, "restat");
for (const base::FilePath& file : files_to_restat) {
cmdline.AppendArgPath(file);
}
std::string output;
return RunNinja(cmdline, build_dir, &output, err);
}
bool InvokeNinjaCleanDeadTool(const base::FilePath& ninja_executable,
const base::FilePath& build_dir,
Err* err) {
base::CommandLine cmdline =
CreateNinjaToolCommandLine(ninja_executable, "cleandead");
std::string output;
return RunNinja(cmdline, build_dir, &output, err);
}
bool InvokeNinjaRecompactTool(const base::FilePath& ninja_executable,
const base::FilePath& build_dir,
Err* err) {
base::CommandLine cmdline =
CreateNinjaToolCommandLine(ninja_executable, "recompact");
std::string output;
return RunNinja(cmdline, build_dir, &output, err);
}