Forgot this in changelog
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / Engine.cs
index 30c287672b8f87284927c9b5f68149e9d44510d9..b026727a0cd1a491c92054fea59943173b6476f0 100644 (file)
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
+using System.IO;
 using Microsoft.Build.Framework;
+using Mono.XBuild.Utilities;
 
 namespace Microsoft.Build.BuildEngine {
        public class Engine {
                
                string                  binPath;
                bool                    buildEnabled;
+               TaskDatabase            defaultTasks;
+               bool                    defaultTasksRegistered;
+               const string            defaultTasksProjectName = "Microsoft.Common.tasks";
                EventSource             eventSource;
                bool                    buildStarted;
                BuildPropertyGroup      globalProperties;
-               IDictionary             importedProjects;
-               IList                   loggers;
-               bool                    onlyLogCriticalEvents;
-               IDictionary             projects;
+               //IDictionary           importedProjects;
+               List <ILogger>          loggers;
+               //bool                  onlyLogCriticalEvents;
+               Dictionary <string, Project>    projects;
 
                static Engine           globalEngine;
                static Version          version;
@@ -63,11 +69,13 @@ namespace Microsoft.Build.BuildEngine {
                {
                        this.binPath = binPath;
                        this.buildEnabled = true;
-                       this.projects = new Hashtable ();
+                       this.projects = new Dictionary <string, Project> ();
                        this.eventSource = new EventSource ();
-                       this.loggers = new ArrayList ();
+                       this.loggers = new List <ILogger> ();
                        this.buildStarted = false;
                        this.globalProperties = new BuildPropertyGroup ();
+                       
+                       RegisterDefaultTasks ();
                }
                
                [MonoTODO]
@@ -79,13 +87,13 @@ namespace Microsoft.Build.BuildEngine {
                [MonoTODO]
                public bool BuildProject (Project project, string targetName)
                {
-                       return BuildProject (project, new string[] { targetName}, new Hashtable (), BuildSettings.None);
+                       return BuildProject (project, new string[] { targetName}, null, BuildSettings.None);
                }
                
                [MonoTODO]
                public bool BuildProject (Project project, string[] targetNames)
                {
-                       return BuildProject (project, targetNames, new Hashtable (), BuildSettings.None);
+                       return BuildProject (project, targetNames, null, BuildSettings.None);
                }
 
                [MonoTODO]
@@ -138,7 +146,7 @@ namespace Microsoft.Build.BuildEngine {
                                              string[] targetNames,
                                              BuildPropertyGroup globalProperties)
                {
-                       return BuildProjectFile (projectFile, targetNames, globalProperties, new Hashtable (), BuildSettings.None);
+                       return BuildProjectFile (projectFile, targetNames, globalProperties, null, BuildSettings.None);
                }
                
                [MonoTODO]
@@ -160,13 +168,16 @@ namespace Microsoft.Build.BuildEngine {
                        bool result;
                        Project project;
                        
-                       if (projects.Contains (projectFile)) {
+                       if (projects.ContainsKey (projectFile)) {
                                project = (Project) projects [projectFile];
                                LogProjectStarted (project, targetNames);
                                result = project.Build (targetNames, targetOutputs);
+                       } else {
+                               project = CreateNewProject ();
+                               project.Load (projectFile);
+                               LogProjectStarted (project, targetNames);
+                               result = project.Build (targetNames, targetOutputs);
                        }
-                       else
-                               return false;
                        
                        LogProjectFinished (project, result);
                        
@@ -184,7 +195,8 @@ namespace Microsoft.Build.BuildEngine {
 
                public Project CreateNewProject ()
                {
-                       CheckBinPath ();
+                       if (defaultTasksRegistered)
+                               CheckBinPath ();
                        // FIXME: I don't really know if it should be here
                        LogBuildStarted ();
                        return new Project (this);
@@ -195,7 +207,7 @@ namespace Microsoft.Build.BuildEngine {
                        if (projectFullFileName == null)
                                throw new ArgumentNullException ("projectFullFileName");
                        
-                       return (Project) projects [projectFullFileName];
+                       return projects [projectFullFileName];
                }
 
                internal void RemoveLoadedProject (Project p)
@@ -213,7 +225,7 @@ namespace Microsoft.Build.BuildEngine {
                public void UnloadProject (Project project)
                {
                        if (project.ParentEngine != this)
-                               throw new InvalidOperationException ("This project is not loaded in this engine");
+                               throw new InvalidOperationException ("The \"Project\" object specified does not belong to the correct \"Engine\" object.");
                        
                        project.CheckUnloaded ();
                        
@@ -225,8 +237,8 @@ namespace Microsoft.Build.BuildEngine {
 
                public void UnloadAllProjects ()
                {
-                       foreach (DictionaryEntry e in projects)
-                               UnloadProject ((Project) e.Value);
+                       foreach (KeyValuePair <string, Project> e in projects)
+                               UnloadProject (e.Value);
                }
 
                [MonoTODO]
@@ -285,6 +297,26 @@ namespace Microsoft.Build.BuildEngine {
                        bfea = new BuildFinishedEventArgs ("Build finished.", null, succeeded);
                        eventSource.FireBuildFinished (this, bfea);
                }
+               
+               private void RegisterDefaultTasks ()
+               {
+                       this.defaultTasksRegistered = false;
+                       
+                       Project defaultTasksProject = CreateNewProject ();
+                       
+                       if (binPath != null) {
+                               if (File.Exists (Path.Combine (binPath, defaultTasksProjectName))) {
+                                       defaultTasksProject.Load (Path.Combine (binPath, defaultTasksProjectName));
+                                       defaultTasks = defaultTasksProject.TaskDatabase;
+                               } else {
+                                       defaultTasks = new TaskDatabase ();
+                               }
+                       } else {
+                               defaultTasks = new TaskDatabase ();
+                       }
+                       
+                       this.defaultTasksRegistered = true;
+               }
 
                public string BinPath {
                        get { return binPath; }
@@ -321,6 +353,14 @@ namespace Microsoft.Build.BuildEngine {
                internal EventSource EventSource {
                        get { return eventSource; }
                }
+               
+               internal bool DefaultTasksRegistered {
+                       get { return defaultTasksRegistered; }
+               }
+               
+               internal TaskDatabase DefaultTasks {
+                       get { return defaultTasks; }
+               }
        }
 }