- buildState = BuildState.Started;
- if (dependsOnTargets == null) {
- ;
- } else if (dependsOnTargets.Value == "") {
- ;
- } else {
- OldExpression dependencies = new OldExpression (Project);
- dependencies.ParseSource (dependsOnTargets.Value);
-
- string[] targetsToBuildFirst = (string[]) dependencies.ConvertTo (typeof (string[]));
- foreach (string target in targetsToBuildFirst) {
- string trimmed = target.Trim ();
- Target t = (Target) project.Targets [trimmed];
+ XmlElement task = project.XmlDocument.CreateElement (taskName, Project.XmlNamespace);
+ targetElement.AppendChild (task);
+ BuildTask bt = new BuildTask (task, this);
+ buildTasks.Add (bt);
+
+ return bt;
+ }
+
+ public IEnumerator GetEnumerator ()
+ {
+ foreach (BuildTask bt in buildTasks)
+ yield return bt;
+ }
+
+ // FIXME: shouldn't we remove it from XML?
+ public void RemoveTask (BuildTask buildTask)
+ {
+ if (buildTask == null)
+ throw new ArgumentNullException ("buildTask");
+ buildTasks.Remove (buildTask);
+ }
+
+ bool Build ()
+ {
+ return Build (null);
+ }
+
+ internal bool Build (string built_targets_key)
+ {
+ bool executeOnErrors;
+ return Build (built_targets_key, out executeOnErrors);
+ }
+
+ bool Build (string built_targets_key, out bool executeOnErrors)
+ {
+ project.PushThisFileProperty (TargetFile);
+ try {
+ return BuildActual (built_targets_key, out executeOnErrors);
+ } finally {
+ project.PopThisFileProperty ();
+ }
+ }
+
+ bool BuildActual (string built_targets_key, out bool executeOnErrors)
+ {
+ bool result = false;
+ executeOnErrors = false;
+
+ // built targets are keyed by the particular set of global
+ // properties. So, a different set could allow a target
+ // to run again
+ built_targets_key = project.GetKeyForTarget (Name);
+ if (project.ParentEngine.BuiltTargetsOutputByName.ContainsKey (built_targets_key)) {
+ LogTargetSkipped ();
+ return true;
+ }
+
+ // Push a null/empty batch, effectively clearing it
+ project.PushBatch (null, null);
+ if (!ConditionParser.ParseAndEvaluate (Condition, Project)) {
+ LogMessage (MessageImportance.Low,
+ "Target {0} skipped due to false condition: {1}",
+ Name, Condition);
+ project.PopBatch ();
+ return true;
+ }
+
+ try {
+ buildState = BuildState.Started;
+ result = BuildDependencies (GetDependencies (), out executeOnErrors);
+
+ if (!result && executeOnErrors)
+ ExecuteOnErrors ();
+
+ if (result)
+ // deps built fine, do main build
+ result = DoBuild (out executeOnErrors);
+
+ buildState = BuildState.Finished;
+ } catch (Exception e) {
+ LogError ("Error building target {0}: {1}", Name, e.ToString ());
+ return false;
+ } finally {
+ project.PopBatch ();
+ }
+
+ project.ParentEngine.BuiltTargetsOutputByName [built_targets_key] = (ITaskItem[]) Outputs.Clone ();
+
+ return result;
+ }
+
+ List <Target> GetDependencies ()
+ {
+ List <Target> list = new List <Target> ();
+ Target t;
+ string [] targetNames;
+ Expression deps;
+
+ if (DependsOnTargets != String.Empty) {
+ deps = new Expression ();
+ deps.Parse (DependsOnTargets, ParseOptions.AllowItemsNoMetadataAndSplit);
+ targetNames = (string []) deps.ConvertTo (Project, typeof (string []));
+ foreach (string dep_name in targetNames) {
+ t = project.Targets [dep_name.Trim ()];