| // 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); | |
| } |