[xbuild] Log build errors and raise events even if a build fails.
authorAnkit Jain <radical@corewars.org>
Thu, 3 Mar 2011 14:27:21 +0000 (19:57 +0530)
committerAnkit Jain <radical@corewars.org>
Thu, 3 Mar 2011 19:20:29 +0000 (00:50 +0530)
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Engine.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/LogExtensions.cs

index 6799dc85daeaee0f330aa897e252ce87d073a2b1..5674cbaed389b987e995f3a36f728710844ed049 100644 (file)
@@ -229,6 +229,31 @@ namespace Microsoft.Build.BuildEngine {
                                              IDictionary targetOutputs,
                                              BuildSettings buildFlags, string toolsVersion)
                {
+                       bool result = false;
+                       try {
+                               StartEngineBuild ();
+                               result = BuildProjectFileInternal (projectFile, targetNames, globalProperties, targetOutputs, buildFlags, toolsVersion);
+                               return result;
+                       } catch (InvalidProjectFileException ie) {
+                               this.LogError (projectFile, ie.Message);
+                               this.LogMessage (MessageImportance.Low, String.Format ("{0}: {1}", projectFile, ie.ToString ()));
+                               return false;
+                       } catch (Exception e) {
+                               this.LogError (projectFile, e.Message);
+                               this.LogMessage (MessageImportance.Low, String.Format ("{0}: {1}", projectFile, e.ToString ()));
+                               return false;
+                       } finally {
+                               EndEngineBuild (result);
+                       }
+               }
+
+               bool BuildProjectFileInternal (string projectFile,
+                                             string[] targetNames,
+                                             BuildPropertyGroup globalProperties,
+                                             IDictionary targetOutputs,
+                                             BuildSettings buildFlags, string toolsVersion)
+               {
+
                        if ((buildFlags & BuildSettings.DoNotResetPreviouslyBuiltTargets) != BuildSettings.DoNotResetPreviouslyBuiltTargets)
                                builtTargetsOutputByName.Clear ();
 
@@ -366,12 +391,25 @@ namespace Microsoft.Build.BuildEngine {
                        loggers.Clear ();
                }
 
-               internal void StartProjectBuild (Project project, string [] target_names)
+               void StartEngineBuild ()
                {
                        if (!buildStarted) {
                                LogBuildStarted ();
                                buildStarted = true;
                        }
+               }
+
+               void EndEngineBuild (bool succeeded)
+               {
+                       if (buildStarted && currentlyBuildingProjectsStack.Count == 0) {
+                               LogBuildFinished (succeeded);
+                               buildStarted = false;
+                       }
+               }
+
+               internal void StartProjectBuild (Project project, string [] target_names)
+               {
+                       StartEngineBuild ();
 
                        if (currentlyBuildingProjectsStack.Count == 0 ||
                                String.Compare (currentlyBuildingProjectsStack.Peek ().FullFileName, project.FullFileName) != 0)
@@ -397,10 +435,7 @@ namespace Microsoft.Build.BuildEngine {
                                String.Compare (top_project.FullFileName, currentlyBuildingProjectsStack.Peek ().FullFileName) != 0)
                                LogProjectFinished (top_project, succeeded);
 
-                       if (currentlyBuildingProjectsStack.Count == 0) {
-                               LogBuildFinished (succeeded);
-                               buildStarted = false;
-                       }
+                       EndEngineBuild (succeeded);
                }
 
                internal void ClearBuiltTargetsForProject (Project project)
index 030ea8aa86a9607fda0eb7996a426013048a0574..e83e82c880cc87d81d07f2f5dcd6141752bfdaa1 100644 (file)
@@ -47,15 +47,21 @@ namespace Microsoft.Build.BuildEngine
                        else
                                return String.Format (unformatted, args);
                }
-               
+
                public static void LogError (this Engine engine, string message,
                                     params object[] messageArgs)
+               {
+                       engine.LogError (null, message, messageArgs);
+               }
+
+               public static void LogError (this Engine engine, string filename, string message,
+                                    params object[] messageArgs)
                {
                        if (message == null)
                                throw new ArgumentNullException ("message");
                                
                        BuildErrorEventArgs beea = new BuildErrorEventArgs (
-                               null, null, null, 0, 0, 0, 0, FormatString (message, messageArgs),
+                               null, null, filename, 0, 0, 0, 0, FormatString (message, messageArgs),
                                null, null);
                        engine.EventSource.FireErrorRaised (engine, beea);
                }