Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@84 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
3 changed files with 234 additions and 101 deletions
@ -0,0 +1,220 @@
@@ -0,0 +1,220 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.CodeDom.Compiler; |
||||
using System.IO; |
||||
using System.Text; |
||||
using System.Threading; |
||||
using System.Windows.Forms; |
||||
using ICSharpCode.Core; |
||||
using ICSharpCode.SharpDevelop.Gui; |
||||
using Microsoft.Build.Framework; |
||||
using Microsoft.Build.BuildEngine; |
||||
|
||||
namespace ICSharpCode.SharpDevelop.Project |
||||
{ |
||||
/// <summary>
|
||||
/// Class responsible for building a project using MSBuild.
|
||||
/// Is called by MSBuildProject.
|
||||
/// </summary>
|
||||
public class MSBuildEngine |
||||
{ |
||||
MessageViewCategory messageView; |
||||
|
||||
/// <summary>
|
||||
/// The <see cref="MessageViewCategory"/> the output is written to.
|
||||
/// </summary>
|
||||
public MessageViewCategory MessageView { |
||||
get { |
||||
return messageView; |
||||
} |
||||
set { |
||||
messageView = value; |
||||
} |
||||
} |
||||
|
||||
public CompilerResults Run(string buildFile) |
||||
{ |
||||
return Run(buildFile, null); |
||||
} |
||||
|
||||
public CompilerResults Run(string buildFile, string[] targets) |
||||
{ |
||||
CompilerResults results = new CompilerResults(null); |
||||
Engine engine = new Engine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()); |
||||
SharpDevelopLogger logger = new SharpDevelopLogger(this, results); |
||||
engine.RegisterLogger(logger); |
||||
engine.BuildProjectFile(buildFile, targets, null, null); |
||||
logger.FlushText(); |
||||
return results; |
||||
} |
||||
|
||||
class SharpDevelopLogger : ILogger |
||||
{ |
||||
MSBuildEngine engine; |
||||
CompilerResults results; |
||||
Thread mainThread; |
||||
|
||||
public SharpDevelopLogger(MSBuildEngine engine, CompilerResults results) |
||||
{ |
||||
mainThread = Thread.CurrentThread; |
||||
this.engine = engine; |
||||
this.results = results; |
||||
} |
||||
|
||||
StringBuilder textToWrite = new StringBuilder(); |
||||
|
||||
void AppendText(string text) |
||||
{ |
||||
lock (textToWrite) { |
||||
textToWrite.AppendLine(text); |
||||
if (Thread.CurrentThread == mainThread) { |
||||
FlushText(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void FlushText() |
||||
{ |
||||
if (engine.MessageView != null) |
||||
engine.MessageView.AppendText(textToWrite.ToString()); |
||||
textToWrite.Length = 0; |
||||
} |
||||
|
||||
void OnBuildStarted(object sender, BuildStartedEventArgs e) |
||||
{ |
||||
AppendText("Build started."); |
||||
} |
||||
|
||||
void OnBuildFinished(object sender, BuildFinishedEventArgs e) |
||||
{ |
||||
if (e.Succeeded) { |
||||
AppendText("Build finished successfully."); |
||||
StatusBarService.SetMessage("Build finished successfully."); |
||||
} else { |
||||
AppendText("Build failed."); |
||||
StatusBarService.SetMessage("Build failed."); |
||||
} |
||||
} |
||||
|
||||
Stack<string> projectFiles = new Stack<string>(); |
||||
|
||||
void OnProjectStarted(object sender, ProjectStartedEventArgs e) |
||||
{ |
||||
projectFiles.Push(e.ProjectFile); |
||||
StatusBarService.SetMessage("Building " + Path.GetFileNameWithoutExtension(e.ProjectFile) + "..."); |
||||
Application.DoEvents(); |
||||
} |
||||
|
||||
void OnProjectFinished(object sender, ProjectFinishedEventArgs e) |
||||
{ |
||||
projectFiles.Pop(); |
||||
if (projectFiles.Count > 0) { |
||||
StatusBarService.SetMessage("Building " + Path.GetFileNameWithoutExtension(projectFiles.Peek()) + "..."); |
||||
Application.DoEvents(); |
||||
} |
||||
} |
||||
|
||||
void OnTargetStarted(object sender, TargetStartedEventArgs e) |
||||
{ |
||||
// do not display
|
||||
} |
||||
|
||||
void OnTargetFinished(object sender, TargetFinishedEventArgs e) |
||||
{ |
||||
// do not display
|
||||
} |
||||
|
||||
void OnTaskStarted(object sender, TaskStartedEventArgs e) |
||||
{ |
||||
// TODO: Give addins ability to extend the logger
|
||||
switch (e.TaskName.ToLower()) { |
||||
case "csc": |
||||
case "vbc": |
||||
AppendText("Compiling " + Path.GetFileNameWithoutExtension(e.ProjectFile)); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void OnTaskFinished(object sender, TaskFinishedEventArgs e) |
||||
{ |
||||
// do not display
|
||||
} |
||||
|
||||
void OnError(object sender, BuildErrorEventArgs e) |
||||
{ |
||||
AppendError(e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, false); |
||||
} |
||||
|
||||
void OnWarning(object sender, BuildWarningEventArgs e) |
||||
{ |
||||
AppendError(e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, true); |
||||
} |
||||
|
||||
void AppendError(string file, int lineNumber, int columnNumber, string code, string message, bool isWarning) |
||||
{ |
||||
CompilerError error = new CompilerError(file, lineNumber, columnNumber, code, message); |
||||
error.IsWarning = isWarning; |
||||
AppendText(error.ToString()); |
||||
if (projectFiles.Count > 0) |
||||
error.FileName = Path.Combine(Path.GetDirectoryName(projectFiles.Peek()), file); |
||||
results.Errors.Add(error); |
||||
} |
||||
|
||||
void OnMessage(object sender, BuildMessageEventArgs e) |
||||
{ |
||||
//AppendText(e.Message);
|
||||
} |
||||
|
||||
void OnCustomEvent(object sender, CustomBuildEventArgs e) |
||||
{ |
||||
//AppendText(e.Message);
|
||||
} |
||||
|
||||
#region ILogger interface implementation
|
||||
LoggerVerbosity verbosity = LoggerVerbosity.Minimal; |
||||
|
||||
public LoggerVerbosity Verbosity { |
||||
get { |
||||
return verbosity; |
||||
} |
||||
set { |
||||
verbosity = value; |
||||
} |
||||
} |
||||
|
||||
string parameters; |
||||
|
||||
public string Parameters { |
||||
get { |
||||
return parameters; |
||||
} |
||||
set { |
||||
parameters = value; |
||||
} |
||||
} |
||||
|
||||
public void Initialize(IEventSource eventSource) |
||||
{ |
||||
eventSource.BuildStarted += new BuildStartedEventHandler(OnBuildStarted); |
||||
eventSource.BuildFinished += new BuildFinishedEventHandler(OnBuildFinished); |
||||
eventSource.ProjectStarted += new ProjectStartedEventHandler(OnProjectStarted); |
||||
eventSource.ProjectFinished += new ProjectFinishedEventHandler(OnProjectFinished); |
||||
eventSource.TargetStarted += new TargetStartedEventHandler(OnTargetStarted); |
||||
eventSource.TargetFinished += new TargetFinishedEventHandler(OnTargetFinished); |
||||
eventSource.TaskStarted += new TaskStartedEventHandler(OnTaskStarted); |
||||
eventSource.TaskFinished += new TaskFinishedEventHandler(OnTaskFinished); |
||||
|
||||
eventSource.ErrorRaised += new BuildErrorEventHandler(OnError); |
||||
eventSource.WarningRaised += new BuildWarningEventHandler(OnWarning); |
||||
eventSource.MessageRaised += new BuildMessageEventHandler(OnMessage); |
||||
eventSource.CustomEventRaised += new CustomBuildEventHandler(OnCustomEvent); |
||||
} |
||||
|
||||
public void Shutdown() |
||||
{ |
||||
|
||||
} |
||||
#endregion
|
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue