bool isValidated;
BuildItemGroupCollection itemGroups;
ImportCollection imports;
- string initialTargets;
+ string[] initialTargets;
Dictionary <string, BuildItemGroup> last_item_group_containing;
bool needToReevaluate;
Engine parentEngine;
UsingTaskCollection usingTasks;
XmlDocument xmlDocument;
bool unloaded;
+ bool initialTargetsBuilt;
static XmlNamespaceManager manager;
static string ns = "http://schemas.microsoft.com/developer/msbuild/2003";
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;
}
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) {
}
set {
xmlDocument.DocumentElement.SetAttribute ("DefaultTargets", value);
- defaultTargets = value.Split (';');
+ defaultTargets = value.Split (new char [] {';'}, StringSplitOptions.RemoveEmptyEntries);
}
}
}
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 {
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");