Ensure that InitialTargets and DefaultTargets from imported projects
authorAnkit Jain <radical@corewars.org>
Fri, 25 Sep 2009 19:50:41 +0000 (19:50 -0000)
committerAnkit Jain <radical@corewars.org>
Fri, 25 Sep 2009 19:50:41 +0000 (19:50 -0000)
are honored.

In class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine:

* Project.cs: Get InitialTargets from the imported projects also.
The combined list of targets are executed, in the order they were
found.
DefaultTargets are also read in from imported projects, and the first
non-empty DefaultTargets found is used.

In class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine:

* ProjectTest.cs (TestInitialTargetsWithImports):
(TestDefaultTargets):
(TestDefaultTargetsWithImports):
(TestNoDefaultTargetsWithImports):
(TestNoDefaultTargets): New tests.

In tools/xbuild:

* xbuild/Microsoft.Common.targets: Remove _ValidateEssentialProperties
from BuildDependsOn, which was a hack. It will get invoked from the
InitialTargets now.

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

mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/ChangeLog
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/ProjectTest.cs
mcs/tools/xbuild/ChangeLog
mcs/tools/xbuild/xbuild/Microsoft.Common.targets

index c6e94be17d4680b47d9912dfc04f8afeefd7c707..96705435b1e8eff4a0510f5b1563fd8b392e3fd3 100644 (file)
@@ -1,3 +1,11 @@
+2009-09-26  Ankit Jain  <jankit@novell.com>
+
+       * Project.cs: Get InitialTargets from the imported projects also.
+       The combined list of targets are executed, in the order they were
+       found.
+       DefaultTargets are also read in from imported projects, and the first
+       non-empty DefaultTargets found is used.
+
 2009-09-25  Ankit Jain  <jankit@novell.com>
 
        * Project.cs (BuildTarget): Handle skipped targets.
index effa7cc9ca047ececdbbba84f45104591cc18662..fac1fe55ce6b13308b65c408d9fd8ad83b90cde7 100644 (file)
@@ -60,7 +60,7 @@ namespace Microsoft.Build.BuildEngine {
                bool                            isValidated;
                BuildItemGroupCollection        itemGroups;
                ImportCollection                imports;
-               string[]                        initialTargets;
+               List<string>                    initialTargets;
                Dictionary <string, BuildItemGroup> last_item_group_containing;
                bool                            needToReevaluate;
                Engine                          parentEngine;
@@ -101,6 +101,8 @@ namespace Microsoft.Build.BuildEngine {
                        current_settings = BuildSettings.None;
 
                        builtTargetKeys = new List<string> ();
+                       initialTargets = new List<string> ();
+                       defaultTargets = new string [0];
 
                        globalProperties = new BuildPropertyGroup (null, this, null, false);
                        foreach (BuildProperty bp in parentEngine.GlobalProperties)
@@ -298,7 +300,7 @@ namespace Microsoft.Build.BuildEngine {
                                        return false;
                        }
 
-                       if (!initialTargetsBuilt && initialTargets != null && initialTargets.Length > 0) {
+                       if (!initialTargetsBuilt) {
                                foreach (string target in initialTargets) {
                                        if (!BuildTarget (target.Trim (), targetOutputs))
                                                return false;
@@ -766,12 +768,8 @@ namespace Microsoft.Build.BuildEngine {
                        if (ParentEngine.DefaultTasksRegistered)
                                taskDatabase.CopyTasks (ParentEngine.DefaultTasks);     
 
-                       if (xmlDocument.DocumentElement.GetAttributeNode ("DefaultTargets") != null)
-                               defaultTargets = xmlDocument.DocumentElement.GetAttribute ("DefaultTargets").Split (';');
-                       else
-                               defaultTargets = new string [0];
-                       
-                       ProcessProjectAttributes (xmlDocument.DocumentElement.Attributes);
+                       initialTargets = new List<string> ();
+                       defaultTargets = new string [0];
                        ProcessElements (xmlDocument.DocumentElement, null);
                        
                        isDirty = false;
@@ -783,11 +781,14 @@ namespace Microsoft.Build.BuildEngine {
                        foreach (XmlAttribute attr in attributes) {
                                switch (attr.Name) {
                                case "InitialTargets":
-                                       initialTargets = attr.Value.Split (new char [] {';'},
-                                                       StringSplitOptions.RemoveEmptyEntries);
+                                       initialTargets.AddRange (attr.Value.Split (
+                                                                       new char [] {';', ' '},
+                                                                       StringSplitOptions.RemoveEmptyEntries));
                                        break;
                                case "DefaultTargets":
-                                       defaultTargets = attr.Value.Split (new char [] {';'},
+                                       // first non-empty DefaultTargets found is used
+                                       if (defaultTargets == null || defaultTargets.Length == 0)
+                                               defaultTargets = attr.Value.Split (new char [] {';', ' '},
                                                        StringSplitOptions.RemoveEmptyEntries);
                                        break;
                                }
@@ -796,6 +797,7 @@ namespace Microsoft.Build.BuildEngine {
 
                internal void ProcessElements (XmlElement rootElement, ImportedProject ip)
                {
+                       ProcessProjectAttributes (rootElement.Attributes);
                        foreach (XmlNode xn in rootElement.ChildNodes) {
                                if (xn is XmlElement) {
                                        XmlElement xe = (XmlElement) xn;
@@ -978,11 +980,13 @@ namespace Microsoft.Build.BuildEngine {
 
                public string DefaultTargets {
                        get {
-                               return xmlDocument.DocumentElement.GetAttribute ("DefaultTargets");
+                               return String.Join ("; ", defaultTargets);
                        }
                        set {
                                xmlDocument.DocumentElement.SetAttribute ("DefaultTargets", value);
-                               defaultTargets = value.Split (new char [] {';'}, StringSplitOptions.RemoveEmptyEntries);
+                               if (value != null)
+                                       defaultTargets = value.Split (new char [] {';', ' '},
+                                                       StringSplitOptions.RemoveEmptyEntries);
                        }
                }
 
@@ -1177,11 +1181,14 @@ namespace Microsoft.Build.BuildEngine {
                
                public string InitialTargets {
                        get {
-                               return xmlDocument.DocumentElement.GetAttribute ("InitialTargets");
+                               return String.Join ("; ", initialTargets.ToArray ());
                        }
                        set {
+                               initialTargets.Clear ();
                                xmlDocument.DocumentElement.SetAttribute ("InitialTargets", value);
-                               initialTargets = value.Split (new char [] {';'}, StringSplitOptions.RemoveEmptyEntries);
+                               if (value != null)
+                                       initialTargets.AddRange (value.Split (
+                                                               new char [] {';', ' '}, StringSplitOptions.RemoveEmptyEntries));
                        }
                }
 
index 7a7fe9f92f00150e43879552fce91e881d449f91..2707b46a7dc5ddb564a7957b9cc0cd3dcd0c164d 100644 (file)
@@ -1,3 +1,11 @@
+2009-09-26  Ankit Jain  <jankit@novell.com>
+
+       * ProjectTest.cs (TestInitialTargetsWithImports):
+       (TestDefaultTargets):
+       (TestDefaultTargetsWithImports):
+       (TestNoDefaultTargetsWithImports):
+       (TestNoDefaultTargets): New tests.
+
 2009-08-29  Ankit Jain  <jankit@novell.com>
 
        * BuildItemTest.cs (TestSetMetadata5a): New.
index d287de88b6912d2d090fb2ae19fafb4b55b27bf3..d1592eb31c24360bb5b7e26b45a70fad4105d360 100644 (file)
@@ -1514,9 +1514,218 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                        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");
+                               logger.CheckLoggedMessageHead ("Executing pre target", "A1");
+                               logger.CheckLoggedMessageHead ("Executing boo target", "A2");
+
+                               Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
+                       } catch {
+                               logger.DumpMessages ();
+                               throw;
+                       }
+               }
+
+               [Test]
+               public void TestInitialTargetsWithImports () {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       string second = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" InitialTargets=""One  "">
+                               <Target Name=""One"">
+                                       <Message Text='Executing Second::One target'/>
+                               </Target>
+                               <Import Project='third.proj'/>
+                       </Project>
+";
+                       using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
+                               sw.Write (second);
+                       }
+
+                       string third = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" InitialTargets=""Two"">
+                               <Target Name=""Two"">
+                                       <Message Text='Executing Third::Two target'/>
+                               </Target>
+                       </Project>
+";
+                       using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "third.proj")))) {
+                               sw.Write (third);
+                       }
+
+
+                       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>
+                               <Import Project='Test/resources/second.proj'/>
+                       </Project>");
+
+                       MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
+                               new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+                       engine.RegisterLogger (logger);
+
+                       try {
+                               Assert.IsTrue (project.Build (), "Build failed");
+
+                               logger.CheckLoggedMessageHead ("Executing pre target", "A1");
+                               logger.CheckLoggedMessageHead ("Executing Second::One target", "A2");
+                               logger.CheckLoggedMessageHead ("Executing Third::Two target", "A3");
+                               logger.CheckLoggedMessageHead ("Executing boo target", "A4");
+                               Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
+
+                               Assert.AreEqual ("pre; One; Two", project.InitialTargets, "List of initial targets");
+                       } catch {
+                               logger.DumpMessages ();
+                               throw;
+                       }
+               }
+
+               [Test]
+               public void TestDefaultTargets () {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       project.LoadXml (@"<Project DefaultTargets='pre' xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" >
+                               <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");
+
+                               logger.CheckLoggedMessageHead ("Executing pre target", "A1");
+                               Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
+
+                               Assert.AreEqual ("pre", project.DefaultTargets, "Default targets");
+                       } catch {
+                               logger.DumpMessages ();
+                               throw;
+                       }
+               }
+
+
+               [Test]
+               public void TestDefaultTargetsWithImports () {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       string second = @"<Project DefaultTargets='One' xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                               <Target Name=""One"">
+                                       <Message Text='Executing Second::One target'/>
+                               </Target>
+                       </Project>";
+                       using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
+                               sw.Write (second);
+                       }
+
+                       project.LoadXml (@"<Project DefaultTargets='pre' xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" >
+                               <Target Name=""boo"">
+                                       <Message Text=""Executing boo target""/>
+                               </Target>
+                               <Target Name=""pre"">
+                                       <Message Text=""Executing pre target""/>
+                               </Target>
+                               <Import Project='Test/resources/second.proj'/>
+                       </Project>");
+
+                       MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
+                               new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+                       engine.RegisterLogger (logger);
+
+                       try {
+                               Assert.IsTrue (project.Build (), "Build failed");
+
+                               logger.CheckLoggedMessageHead ("Executing pre target", "A1");
+                               Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
+
+                               Assert.AreEqual ("pre", project.DefaultTargets, "Default targets");
+                       } catch {
+                               logger.DumpMessages ();
+                               throw;
+                       }
+               }
+
+               [Test]
+               public void TestNoDefaultTargetsWithImports () {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+
+                       string second = @"<Project DefaultTargets='; One  ; Two' xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                               <Target Name=""One"">
+                                       <Message Text='Executing Second::One target'/>
+                               </Target>
+                               <Target Name=""Two"">
+                                       <Message Text='Executing Second::Two target'/>
+                               </Target>
+
+                       </Project>";
+                       using (StreamWriter sw = new StreamWriter (Path.Combine ("Test", Path.Combine ("resources", "second.proj")))) {
+                               sw.Write (second);
+                       }
+
+                       project.LoadXml (@"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" >
+                               <Target Name=""boo"">
+                                       <Message Text=""Executing boo target""/>
+                               </Target>
+                               <Target Name=""pre"">
+                                       <Message Text=""Executing pre target""/>
+                               </Target>
+                               <Import Project='Test/resources/second.proj'/>
+                       </Project>");
+
+                       MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
+                               new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+                       engine.RegisterLogger (logger);
+
+                       try {
+                               Assert.IsTrue (project.Build (), "Build failed");
+
+                               logger.CheckLoggedMessageHead ("Executing Second::One target", "A1");
+                               logger.CheckLoggedMessageHead ("Executing Second::Two target", "A2");
+                               Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
+
+                               Assert.AreEqual ("One; Two", project.DefaultTargets, "Default targets");
+                       } catch {
+                               logger.DumpMessages ();
+                               throw;
+                       }
+               }
+
+               [Test]
+               public void TestNoDefaultTargets () {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project project = engine.CreateNewProject ();
+
+                       project.LoadXml (@"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" >
+                               <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");
+
+                               logger.CheckLoggedMessageHead ("Executing boo target", "A1");
+                               Assert.AreEqual (0, logger.NormalMessageCount, "Unexpected extra messages found");
+
+                               Assert.AreEqual ("", project.DefaultTargets, "Default targets");
                        } catch {
                                logger.DumpMessages ();
                                throw;
index 2937953d4c5276e87d688aa8c18b92ff6e87a442..8b13573273d69cb39b5c84320e9ef59498a2590d 100644 (file)
@@ -1,3 +1,9 @@
+2009-09-26  Ankit Jain  <jankit@novell.com>
+
+       * xbuild/Microsoft.Common.targets: Remove _ValidateEssentialProperties
+       from BuildDependsOn, which was a hack. It will get invoked from the
+       InitialTargets now.
+
 2009-09-25  Ankit Jain  <jankit@novell.com>
 
        * Makefile(EXTRA_DISTFILES): Add Microsoft.WebApplication.targets
index e182babfa6013dca76b1f5c728a523d88a4d7ad6..b256b4854f9204466c58dc4fec48487f8440bb4f 100644 (file)
 
        <PropertyGroup>
                <BuildDependsOn>
-                       _ValidateEssentialProperties;
                        BeforeBuild;
                        CoreBuild;
                        AfterBuild