2009-02-13 Jonathan Chambers <joncham@gmail.com>
[mono.git] / mcs / tools / xbuild / Main.cs
1 //
2 // Main.cs: Main program file of command line utility.
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 //
7 // (C) 2005 Marek Sieradzki
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 #if NET_2_0
29
30 using System;
31 using System.Collections;
32 using System.IO;
33 using System.Reflection;
34 using Microsoft.Build.BuildEngine;
35 using Microsoft.Build.Framework;
36 using Microsoft.Build.Utilities;
37 using Mono.XBuild.Framework;
38
39 namespace Mono.XBuild.CommandLine {
40         public class MainClass {
41                 
42                 Parameters      parameters;
43                 string[]        args;
44                 string          binPath;
45                 string          defaultSchema;
46                 
47                 Engine          engine;
48                 Project         project;
49                 
50                 public static void Main (string[] args)
51                 {
52                         MainClass mc = new MainClass ();
53                         mc.args = args;
54                         mc.Execute ();
55                 }
56                 
57                 public MainClass ()
58                 {
59                         binPath = ToolLocationHelper.GetPathToDotNetFramework (TargetDotNetFrameworkVersion.Version20);
60                         defaultSchema = Path.Combine (binPath, "Microsoft.Build.xsd");
61                         parameters = new Parameters (binPath);
62                 }
63                 
64                 public void Execute ()
65                 {
66                         bool result = false;
67                         
68                         try {
69                                 parameters.ParseArguments (args);
70                                 
71                                 if (parameters.DisplayVersion)
72                                         ErrorUtilities.ShowVersion (false);
73                                 
74                                 engine  = new Engine (binPath);
75                                 
76                                 engine.GlobalProperties = this.parameters.Properties;
77                                 
78                                 if (!parameters.NoConsoleLogger) {
79                                         ConsoleLogger cl = new ConsoleLogger ();
80                                         cl.Parameters = parameters.ConsoleLoggerParameters;
81                                         cl.Verbosity = parameters.LoggerVerbosity; 
82                                         engine.RegisterLogger (cl);
83                                 }
84                                 
85                                 foreach (LoggerInfo li in parameters.Loggers) {
86                                         Assembly assembly;
87                                         if (li.InfoType == LoadInfoType.AssemblyFilename)
88                                                 assembly = Assembly.LoadFrom (li.Filename);
89                                         else
90                                                 assembly = Assembly.Load (li.AssemblyName);
91                                         ILogger logger = (ILogger)Activator.CreateInstance (assembly.GetType (li.ClassName));
92                                         logger.Parameters = li.Parameters;
93                                         engine.RegisterLogger (logger); 
94                                 }
95                                 
96                                 project = engine.CreateNewProject ();
97                                 
98                                 if (parameters.Validate) {
99                                         if (parameters.ValidationSchema == null)
100                                                 project.SchemaFile = defaultSchema;
101                                         else
102                                                 project.SchemaFile = parameters.ValidationSchema;
103                                 }
104
105                                 string projectFile = parameters.ProjectFile;
106                                 if (projectFile.EndsWith (".sln"))
107                                         projectFile = GenerateSolutionProject (projectFile);
108
109                                 project.Load (projectFile);
110                                 
111                                 result = engine.BuildProject (project, parameters.Targets, null);
112                         }
113                         
114                         catch (InvalidProjectFileException ipfe) {
115                                 ErrorUtilities.ReportError (0, ipfe.Message);
116                         }
117
118                         catch (InternalLoggerException ile) {
119                                 ErrorUtilities.ReportError (0, ile.Message);
120                         }
121
122                         catch (Exception) {
123                                 throw;
124                         }
125                         
126                         finally {
127                                 if (engine != null)
128                                         engine.UnregisterAllLoggers ();
129
130                                 Environment.Exit (result ? 0 : 1);
131                         }
132
133                 }
134
135                 string GenerateSolutionProject (string solutionFile)
136                 {
137                         SolutionParser s = new SolutionParser ();
138                         Project p = engine.CreateNewProject ();
139                         s.ParseSolution (solutionFile, p);
140                         string projectFile = solutionFile + ".proj";
141                         p.Save (projectFile);
142
143                         return projectFile;
144                 }
145         }
146 }
147
148 #endif