/// <summary> /// Executes a file and reports events related to the execution to the 'monitor' passed in the parameters. /// </summary> public static int ExecuteCommand( string command, string args, string baseDirectory, IProgressMonitor monitor, out string errorOutput, out string programOutput) { errorOutput = string.Empty; int exitCode = -1; var swError = new StringWriter(); var swOutput = new StringWriter(); var chainedError = new LogTextWriter(); chainedError.ChainWriter(monitor.Log); chainedError.ChainWriter(swError); var chainedOutput = new LogTextWriter(); chainedOutput.ChainWriter(monitor.Log); chainedOutput.ChainWriter(swOutput); monitor.Log.WriteLine("{0} {1}", command, args); var operationMonitor = new AggregatedOperationMonitor(monitor); var p = Runtime.ProcessService.StartProcess(command, args, baseDirectory, chainedOutput, chainedError, null); operationMonitor.AddOperation(p); //handles cancellation p.WaitForOutput(); errorOutput = swError.ToString(); programOutput = swOutput.ToString(); exitCode = p.ExitCode; p.Dispose(); if (monitor.IsCancelRequested) { monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled")); monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null); if (exitCode == 0) { exitCode = -1; } } { chainedError.Close(); swError.Close(); operationMonitor.Dispose(); } return(exitCode); }
//copied from MoonlightBuildExtension public static int ExecuteCommand(IProgressMonitor monitor, System.Diagnostics.ProcessStartInfo startInfo, out string errorOutput) { startInfo.UseShellExecute = false; startInfo.RedirectStandardError = true; startInfo.RedirectStandardOutput = true; errorOutput = string.Empty; int exitCode = -1; var swError = new StringWriter(); var chainedError = new LogTextWriter(); chainedError.ChainWriter(monitor.Log); chainedError.ChainWriter(swError); var operationMonitor = new AggregatedOperationMonitor(monitor); try { var p = Runtime.ProcessService.StartProcess(startInfo, monitor.Log, chainedError, null); operationMonitor.AddOperation(p); //handles cancellation p.WaitForOutput(); errorOutput = swError.ToString(); exitCode = p.ExitCode; p.Dispose(); if (monitor.IsCancelRequested) { monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled")); monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null); if (exitCode == 0) { exitCode = -1; } } } finally { chainedError.Close(); swError.Close(); operationMonitor.Dispose(); } return(exitCode); }
//FIXME: Check whether autogen.sh is required or not protected override BuildResult Build(IProgressMonitor monitor, SolutionEntityItem entry, ConfigurationSelector configuration) { Project project = entry as Project; if (project == null) { return(base.Build(monitor, entry, configuration)); } MakefileData data = project.ExtendedProperties ["MonoDevelop.Autotools.MakefileInfo"] as MakefileData; if (data == null || !data.SupportsIntegration || String.IsNullOrEmpty(data.BuildTargetName)) { return(base.Build(monitor, entry, configuration)); } //FIXME: Gen autofoo ? autoreconf? string output = String.Empty; int exitCode = 0; monitor.BeginTask(GettextCatalog.GetString("Building {0}", project.Name), 1); try { string baseDir = project.BaseDirectory; string args = string.Format("-j {0} {1}", data.ParallelProcesses, data.BuildTargetName); StringWriter swOutput = new StringWriter(); LogTextWriter chainedOutput = new LogTextWriter(); chainedOutput.ChainWriter(monitor.Log); chainedOutput.ChainWriter(swOutput); ProcessWrapper process = Runtime.ProcessService.StartProcess("make", args, baseDir, chainedOutput, chainedOutput, null); process.WaitForOutput(); exitCode = process.ExitCode; output = swOutput.ToString(); chainedOutput.Close(); swOutput.Close(); monitor.Step(1); } catch (Exception e) { monitor.ReportError(GettextCatalog.GetString("Project could not be built: "), e); return(null); } finally { monitor.EndTask(); } TempFileCollection tf = new TempFileCollection(); Regex regexError = data.GetErrorRegex(false); Regex regexWarning = data.GetWarningRegex(false); BuildResult cr = ParseOutput(tf, output, project.BaseDirectory, regexError, regexWarning); if (exitCode != 0 && cr.FailedBuildCount == 0) { cr.AddError(GettextCatalog.GetString("Build failed. See Build Output panel.")); } return(cr); }
/// <summary> /// Executes a file and reports events related to the execution to the 'monitor' passed in the parameters. /// </summary> public static int ExecuteCommand( string command, string args, string baseDirectory, IProgressMonitor monitor, out string errorOutput, out string programOutput) { bool useMonitor = monitor != null; errorOutput = string.Empty; int exitCode = -1; var swError = new StringWriter(); var swOutput = new StringWriter(); var chainedError = new LogTextWriter(); chainedError.ChainWriter(swError); var chainedOutput = new LogTextWriter(); chainedOutput.ChainWriter(swOutput); if (useMonitor) { chainedError.ChainWriter(monitor.Log); chainedOutput.ChainWriter(monitor.Log); monitor.Log.WriteLine("{0} {1}", command, args); } // Workaround for not handling %PATH% env var expansion properly if (!command.Contains(Path.DirectorySeparatorChar)) { command = TryExpandPathEnvVariable(command, baseDirectory); } TryHandleSheBang(ref command, ref args); var operationMonitor = useMonitor ? new AggregatedOperationMonitor(monitor) : null; var p = Runtime.ProcessService.StartProcess(command, args, baseDirectory, chainedOutput, chainedError, null); if (useMonitor) { operationMonitor.AddOperation(p); //handles cancellation } p.WaitForOutput(); swError.Flush(); swOutput.Flush(); errorOutput = swError.ToString(); programOutput = swOutput.ToString(); exitCode = p.ExitCode; p.Dispose(); if (useMonitor) { if (monitor.IsCancelRequested) { monitor.Log.WriteLine(GettextCatalog.GetString("Build cancelled")); monitor.ReportError(GettextCatalog.GetString("Build cancelled"), null); if (exitCode == 0) { exitCode = -1; } } operationMonitor.Dispose(); } chainedError.Close(); swOutput.Close(); swError.Close(); return(exitCode); }