2 // MSBuild.cs: Task that can run .*proj files
5 // Marek Sieradzki (marek.sieradzki@gmail.com)
7 // (C) 2005 Marek Sieradzki
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
31 using System.Collections;
32 using System.Collections.Generic;
34 using Microsoft.Build.Framework;
35 using Microsoft.Build.Utilities;
37 namespace Microsoft.Build.Tasks {
40 public class MSBuild : TaskExtension {
42 ITaskItem [] projects;
45 bool runEachTargetSeparately;
46 bool stopOnFirstFailure;
47 ITaskItem [] targetOutputs;
54 public override bool Execute ()
58 stopOnFirstFailure = false;
59 List <ITaskItem > outputItems = new List <ITaskItem> ();
60 string currentDirectory = Environment.CurrentDirectory;
63 foreach (ITaskItem project in projects) {
64 filename = project.GetMetadata ("FullPath");
66 Directory.SetCurrentDirectory (Path.GetDirectoryName (filename));
67 outputs = new Hashtable ();
69 Dictionary<string, string> global_properties = SplitPropertiesToDictionary ();
70 result = BuildEngine.BuildProjectFile (filename, targets, global_properties, outputs);
73 foreach (DictionaryEntry de in outputs) {
74 ITaskItem [] array = (ITaskItem []) de.Value;
75 foreach (ITaskItem item in array) {
76 outputItems.Add (item);
77 //FIXME: Correctly rebase output paths to be relative to the
80 // File.Copy (item.ItemSpec, Path.Combine (currentDirectory, item.ItemSpec), true);
84 Log.LogError ("Error while building {0}", filename);
85 if (stopOnFirstFailure)
91 targetOutputs = outputItems.ToArray ();
93 Directory.SetCurrentDirectory (currentDirectory);
98 public ITaskItem [] Projects {
99 get { return projects; }
100 set { projects = value; }
104 public string [] Properties {
105 get { return properties; }
106 set { properties = value; }
109 public bool RebaseOutputs {
110 get { return rebaseOutputs; }
111 set { rebaseOutputs = value; }
115 public bool RunEachTargetSeparately {
116 get { return runEachTargetSeparately; }
117 set { runEachTargetSeparately = value; }
120 public bool StopOnFirstFailure {
121 get { return stopOnFirstFailure; }
122 set { stopOnFirstFailure = value; }
126 public ITaskItem [] TargetOutputs {
127 get { return targetOutputs; }
130 public string [] Targets {
131 get { return targets; }
132 set { targets = value; }
135 Dictionary<string, string> SplitPropertiesToDictionary ()
137 if (properties == null)
140 Dictionary<string, string> global_properties = new Dictionary<string, string> ();
141 foreach (string kvpair in properties) {
142 if (String.IsNullOrEmpty (kvpair))
145 string [] parts = kvpair.Trim ().Split ('=');
146 if (parts.Length != 2) {
147 //FIXME: Log the error and .. ?
148 Console.WriteLine ("Invalid key/value pairs in Properties, ignoring.");
152 global_properties.Add (parts [0], parts [1]);
155 return global_properties;