// 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