2007-02-03 Marek Sieradzki <marek.sieradzki@gmail.com>
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / Engine.cs
index 87c7d185531a528360925d2e7483e6dc51168680..9f6befa5da82440cf5f0c08f740b53fe3a1ef62f 100644 (file)
@@ -47,7 +47,7 @@ namespace Microsoft.Build.BuildEngine {
                BuildPropertyGroup      globalProperties;
                //IDictionary           importedProjects;
                List <ILogger>          loggers;
-               bool                    onlyLogCriticalEvents;
+               //bool                  onlyLogCriticalEvents;
                Dictionary <string, Project>    projects;
 
                static Engine           globalEngine;
@@ -87,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]
@@ -111,6 +111,8 @@ namespace Microsoft.Build.BuildEngine {
                                          BuildSettings buildFlags)
                {
                        bool result;
+
+                       StartBuild ();
                        
                        LogProjectStarted (project, targetNames);
                                
@@ -146,7 +148,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]
@@ -167,21 +169,26 @@ namespace Microsoft.Build.BuildEngine {
                {
                        bool result;
                        Project project;
+
+                       StartBuild ();
                        
                        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);
                        
                        return result;
                }
 
-               private void CheckBinPath ()
+               void CheckBinPath ()
                {
                        if (BinPath == null) {
                                throw new InvalidOperationException ("Before a project can be instantiated, " +
@@ -192,10 +199,8 @@ namespace Microsoft.Build.BuildEngine {
 
                public Project CreateNewProject ()
                {
-                       if (defaultTasksRegistered == true)
+                       if (defaultTasksRegistered)
                                CheckBinPath ();
-                       // FIXME: I don't really know if it should be here
-                       LogBuildStarted ();
                        return new Project (this);
                }
 
@@ -204,7 +209,8 @@ namespace Microsoft.Build.BuildEngine {
                        if (projectFullFileName == null)
                                throw new ArgumentNullException ("projectFullFileName");
                        
-                       return (Project) projects [projectFullFileName];
+                       // FIXME: test it
+                       return projects [projectFullFileName];
                }
 
                internal void RemoveLoadedProject (Project p)
@@ -221,8 +227,11 @@ namespace Microsoft.Build.BuildEngine {
        
                public void UnloadProject (Project project)
                {
+                       if (project == null)
+                               throw new ArgumentNullException ("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 ();
                        
@@ -235,7 +244,7 @@ namespace Microsoft.Build.BuildEngine {
                public void UnloadAllProjects ()
                {
                        foreach (KeyValuePair <string, Project> e in projects)
-                               UnloadProject ((Project) e.Value);
+                               UnloadProject (e.Value);
                }
 
                [MonoTODO]
@@ -252,14 +261,23 @@ namespace Microsoft.Build.BuildEngine {
                public void UnregisterAllLoggers ()
                {
                        // FIXME: check if build succeeded
+                       // FIXME: it shouldn't be here
                        LogBuildFinished (true);
                        foreach (ILogger i in loggers) {
                                i.Shutdown ();
                        }
                        loggers.Clear ();
                }
+
+               internal void StartBuild ()
+               {
+                       if (!buildStarted) {
+                               LogBuildStarted ();
+                               buildStarted = true;
+                       }
+               }
                
-               private void LogProjectStarted (Project project, string[] targetNames)
+               void LogProjectStarted (Project project, string [] targetNames)
                {
                        ProjectStartedEventArgs psea;
                        if (targetNames.Length == 0) {
@@ -274,43 +292,41 @@ namespace Microsoft.Build.BuildEngine {
                        eventSource.FireProjectStarted (this, psea);
                }
                
-               private void LogProjectFinished (Project project, bool succeeded)
+               void LogProjectFinished (Project project, bool succeeded)
                {
                        ProjectFinishedEventArgs pfea;
                        pfea = new ProjectFinishedEventArgs ("Project started.", null, project.FullFileName, succeeded);
                        eventSource.FireProjectFinished (this, pfea);
                }
                
-               private void LogBuildStarted ()
+               void LogBuildStarted ()
                {
                        BuildStartedEventArgs bsea;
                        bsea = new BuildStartedEventArgs ("Build started.", null);
                        eventSource.FireBuildStarted (this, bsea);
                }
                
-               private void LogBuildFinished (bool succeeded)
+               void LogBuildFinished (bool succeeded)
                {
                        BuildFinishedEventArgs bfea;
                        bfea = new BuildFinishedEventArgs ("Build finished.", null, succeeded);
                        eventSource.FireBuildFinished (this, bfea);
                }
                
-               private void RegisterDefaultTasks ()
+               void RegisterDefaultTasks ()
                {
                        this.defaultTasksRegistered = false;
                        
                        Project defaultTasksProject = CreateNewProject ();
                        
                        if (binPath != null) {
-                               if (File.Exists (Path.Combine (binPath, defaultTasksProjectName)) == true) {
+                               if (File.Exists (Path.Combine (binPath, defaultTasksProjectName))) {
                                        defaultTasksProject.Load (Path.Combine (binPath, defaultTasksProjectName));
                                        defaultTasks = defaultTasksProject.TaskDatabase;
-                               } else {
+                               } else
                                        defaultTasks = new TaskDatabase ();
-                               }
-                       } else {
+                       } else
                                defaultTasks = new TaskDatabase ();
-                       }
                        
                        this.defaultTasksRegistered = true;
                }