In class/Microsoft.Build.Engine:
authorAnkit Jain <radical@corewars.org>
Tue, 6 Jan 2009 14:37:16 +0000 (14:37 -0000)
committerAnkit Jain <radical@corewars.org>
Tue, 6 Jan 2009 14:37:16 +0000 (14:37 -0000)
* Microsoft.Build.Engine_test.dll.sources: Add TestMessageLogger from
Ms.Build.Tasks tests.

In class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine:
* Project.cs (Build): Honor InitialTargets list.

In class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine:
* ProjectTest.cs (TestInitialTargets): New.

svn path=/trunk/mcs/; revision=122545

mcs/class/Microsoft.Build.Engine/ChangeLog
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.Engine_test.dll.sources
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/ChangeLog
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/ProjectTest.cs

index 82f2fecdf72c5c504859a5dbbfbc73376e569f89..26ffb215f8bd54d01749797925a0102705eb7673 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-06  Ankit Jain  <jankit@novell.com>
+
+       * Microsoft.Build.Engine_test.dll.sources: Add TestMessageLogger from
+       Ms.Build.Tasks tests.
+
 2009-01-01  Ankit Jain  <jankit@novell.com>
 
        * Microsoft.Build.Engine.dll.sources: Add IReference.cs
index 62fab52b35f4dec82a1feb8d3a3baf715c913b9d..11258aeb8d5e1e25ca9693bb3c896f5e153a7c94 100644 (file)
@@ -1,3 +1,7 @@
+2009-01-06  Ankit Jain  <jankit@novell.com>
+
+       * Project.cs (Build): Honor InitialTargets list.
+
 2009-01-06  Ankit Jain  <jankit@novell.com>
 
        * BuildEngine.cs (BuildProjectFile): Use AddProperty method to specify
index e6bfc5be1ea22ff9246c9633727276c243bca95c..29e65224e8cf4ab5434c26587577380ecaf4b1f4 100644 (file)
@@ -58,7 +58,7 @@ namespace Microsoft.Build.BuildEngine {
                bool                            isValidated;
                BuildItemGroupCollection        itemGroups;
                ImportCollection                imports;
-               string                          initialTargets;
+               string[]                        initialTargets;
                Dictionary <string, BuildItemGroup> last_item_group_containing;
                bool                            needToReevaluate;
                Engine                          parentEngine;
@@ -70,6 +70,7 @@ namespace Microsoft.Build.BuildEngine {
                UsingTaskCollection             usingTasks;
                XmlDocument                     xmlDocument;
                bool                            unloaded;
+               bool                            initialTargetsBuilt;
 
                static XmlNamespaceManager      manager;
                static string ns = "http://schemas.microsoft.com/developer/msbuild/2003";
@@ -264,24 +265,38 @@ namespace Microsoft.Build.BuildEngine {
                                        return false;
                        }
 
-                       if (targetNames == null || targetNames.Length == 0)
-                               return false;
-                       
-                       foreach (string target in targetNames) {
-                               if (target == null)
-                                       throw new ArgumentException ("targetNames cannot contain null strings");
+                       if (!initialTargetsBuilt && initialTargets != null && initialTargets.Length > 0) {
+                               foreach (string target in initialTargets) {
+                                       if (!BuildTarget (target.Trim (), targetOutputs))
+                                               return false;
+                               }
+                               initialTargetsBuilt = true;
+                       }
 
-                               if (!targets.Exists (target))
-                                       // FIXME: test if it's logged
+                       foreach (string target in targetNames)
+                               if (!BuildTarget (target.Trim (), targetOutputs))
                                        return false;
                                
-                               if (!targets [target].Build ())
-                                       return false;
+                       return true;
+               }
 
-                               if (targetOutputs != null)
-                                       targetOutputs.Add (target, targets [target].Outputs);
+               bool BuildTarget (string target, IDictionary targetOutputs)
+               {
+                       if (target == null)
+                               throw new ArgumentException ("targetNames cannot contain null strings");
+
+                       if (!targets.Exists (target)) {
+                               //FIXME: Log this!
+                               Console.WriteLine ("Target named '{0}' not found in the project.", target);
+                               return false;
                        }
-                               
+
+                       if (!targets [target].Build ())
+                               return false;
+
+                       if (targetOutputs != null)
+                               targetOutputs.Add (target, targets [target].Outputs);
+
                        return true;
                }
 
@@ -678,12 +693,29 @@ namespace Microsoft.Build.BuildEngine {
                        else
                                defaultTargets = new string [0];
                        
+                       ProcessProjectAttributes (xmlDocument.DocumentElement.Attributes);
                        ProcessElements (xmlDocument.DocumentElement, null);
                        
                        isDirty = false;
                        Evaluate ();
                }
-               
+
+               void ProcessProjectAttributes (XmlAttributeCollection attributes)
+               {
+                       foreach (XmlAttribute attr in attributes) {
+                               switch (attr.Name) {
+                               case "InitialTargets":
+                                       initialTargets = attr.Value.Split (new char [] {';'},
+                                                       StringSplitOptions.RemoveEmptyEntries);
+                                       break;
+                               case "DefaultTargets":
+                                       defaultTargets = attr.Value.Split (new char [] {';'},
+                                                       StringSplitOptions.RemoveEmptyEntries);
+                                       break;
+                               }
+                       }
+               }
+
                internal void ProcessElements (XmlElement rootElement, ImportedProject ip)
                {
                        foreach (XmlNode xn in rootElement.ChildNodes) {
@@ -842,7 +874,7 @@ namespace Microsoft.Build.BuildEngine {
                        }
                        set {
                                xmlDocument.DocumentElement.SetAttribute ("DefaultTargets", value);
-                               defaultTargets = value.Split (';');
+                               defaultTargets = value.Split (new char [] {';'}, StringSplitOptions.RemoveEmptyEntries);
                        }
                }
 
@@ -1010,8 +1042,13 @@ namespace Microsoft.Build.BuildEngine {
                }
                
                public string InitialTargets {
-                       get { return initialTargets; }
-                       set { initialTargets = value; }
+                       get {
+                               return xmlDocument.DocumentElement.GetAttribute ("InitialTargets");
+                       }
+                       set {
+                               xmlDocument.DocumentElement.SetAttribute ("InitialTargets", value);
+                               initialTargets = value.Split (new char [] {';'}, StringSplitOptions.RemoveEmptyEntries);
+                       }
                }
 
                public Engine ParentEngine {
index 9805ad82d8d04f335025ef877f5c2b41569128f9..25d6f326f5b5e02243b8feb273294d2eb469d318 100644 (file)
@@ -26,3 +26,4 @@ various/EvaluationOrder.cs
 various/Items.cs
 various/ProjectElement.cs
 various/Properties.cs
+../../Microsoft.Build.Tasks/Test/Microsoft.Build.Tasks/TestMessageLogger.cs
index bfbd557c3a022ed6e5521b06daba1af654d60f67..17a9102079e1fd34c454b153920de8b0a54cde83 100644 (file)
@@ -1,3 +1,7 @@
+2009-01-06  Ankit Jain  <jankit@novell.com>
+
+       * ProjectTest.cs (TestInitialTargets): New.
+
 2009-01-06  Ankit Jain  <jankit@novell.com>
 
        * EngineTest.cs: Update tests for null targetNames argument to
index 7b299ef7e5d533009289c65b4ca2759dbcf6b503..28bd430b8a7d328289b4fb2e780fef30301bb05c 100644 (file)
@@ -1444,6 +1444,37 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                        Assert.AreEqual (0, include.Count, "A2");
                }
 
+               [Test]
+               public void TestInitialTargets ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       project.LoadXml (@"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" InitialTargets=""pre  "">
+                               <Target Name=""boo"">
+                                       <Message Text=""Executing boo target""/>
+                               </Target>
+                               <Target Name=""pre"">
+                                       <Message Text=""Executing pre target""/>
+                               </Target>
+                       </Project>");
+
+                       MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
+                               new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+                       engine.RegisterLogger (logger);
+
+                       try {
+                               Assert.IsTrue (project.Build (), "Build failed");
+
+                               Assert.AreEqual (0, logger.CheckHead ("Executing pre target", MessageImportance.Normal), "A1");
+                               Assert.AreEqual (0, logger.CheckHead ("Executing boo target", MessageImportance.Normal), "A2");
+                               Assert.AreEqual (0, logger.Count, "A3");
+                       } catch {
+                               logger.DumpMessages ();
+                               throw;
+                       }
+               }
+
                static void CheckBuildItem (BuildItem item, string name, string [,] metadata, string finalItemSpec, string prefix)
                {
                        Assert.AreEqual (name, item.Name, prefix + "#1");