| // Copyright (c) 2024 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/invoke_python.h" | |
| #include "base/command_line.h" | |
| #include "base/files/file_path.h" | |
| #include "base/strings/string_number_conversions.h" | |
| #include "gn/build_settings.h" | |
| #include "gn/err.h" | |
| #include "gn/exec_process.h" | |
| #include "gn/filesystem_utils.h" | |
| namespace internal { | |
| bool InvokePython(const BuildSettings* build_settings, | |
| const base::FilePath& python_script_path, | |
| const std::string& python_script_extra_args, | |
| const base::FilePath& output_path, | |
| bool quiet, | |
| Err* err) { | |
| const base::FilePath& python_path = build_settings->python_path(); | |
| base::CommandLine cmdline(python_path); | |
| cmdline.AppendArg("--"); | |
| cmdline.AppendArgPath(python_script_path); | |
| cmdline.AppendArgPath(output_path); | |
| if (!python_script_extra_args.empty()) { | |
| cmdline.AppendArg(python_script_extra_args); | |
| } | |
| base::FilePath startup_dir = | |
| build_settings->GetFullPath(build_settings->build_dir()); | |
| std::string output; | |
| 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 python.", | |
| "I was trying to execute \"" + FilePathToUTF8(python_path) + "\"."); | |
| return false; | |
| } | |
| if (!quiet) { | |
| printf("%s", output.c_str()); | |
| fprintf(stderr, "%s", stderr_output.c_str()); | |
| } | |
| if (exit_code != 0) { | |
| *err = Err(Location(), "Python has quit with exit code " + | |
| base::IntToString(exit_code) + "."); | |
| return false; | |
| } | |
| return true; | |
| } | |
| } // namespace internal |