diff options
Diffstat (limited to 'Prebuild/src/Core/Targets')
-rw-r--r-- | Prebuild/src/Core/Targets/VSGenericTarget.cs | 1768 |
1 files changed, 884 insertions, 884 deletions
diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs index a05f6b3..60cc803 100644 --- a/Prebuild/src/Core/Targets/VSGenericTarget.cs +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs | |||
@@ -1,884 +1,884 @@ | |||
1 | #region BSD License | 1 | #region BSD License |
2 | /* | 2 | /* |
3 | Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) | 3 | Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) |
4 | 4 | ||
5 | Redistribution and use in source and binary forms, with or without modification, are permitted | 5 | Redistribution and use in source and binary forms, with or without modification, are permitted |
6 | provided that the following conditions are met: | 6 | provided that the following conditions are met: |
7 | 7 | ||
8 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 8 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
9 | and the following disclaimer. | 9 | and the following disclaimer. |
10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
11 | and the following disclaimer in the documentation and/or other materials provided with the | 11 | and the following disclaimer in the documentation and/or other materials provided with the |
12 | distribution. | 12 | distribution. |
13 | * The name of the author may not be used to endorse or promote products derived from this software | 13 | * The name of the author may not be used to endorse or promote products derived from this software |
14 | without specific prior written permission. | 14 | without specific prior written permission. |
15 | 15 | ||
16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 | */ | 23 | */ |
24 | #endregion | 24 | #endregion |
25 | 25 | ||
26 | using System; | 26 | using System; |
27 | using System.Collections; | 27 | using System.Collections; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Collections.Specialized; | 29 | using System.Collections.Specialized; |
30 | using System.IO; | 30 | using System.IO; |
31 | using System.Text; | 31 | using System.Text; |
32 | 32 | ||
33 | using Prebuild.Core.Attributes; | 33 | using Prebuild.Core.Attributes; |
34 | using Prebuild.Core.Interfaces; | 34 | using Prebuild.Core.Interfaces; |
35 | using Prebuild.Core.Nodes; | 35 | using Prebuild.Core.Nodes; |
36 | using Prebuild.Core.Utilities; | 36 | using Prebuild.Core.Utilities; |
37 | using System.CodeDom.Compiler; | 37 | using System.CodeDom.Compiler; |
38 | 38 | ||
39 | namespace Prebuild.Core.Targets | 39 | namespace Prebuild.Core.Targets |
40 | { | 40 | { |
41 | 41 | ||
42 | /// <summary> | 42 | /// <summary> |
43 | /// | 43 | /// |
44 | /// </summary> | 44 | /// </summary> |
45 | public abstract class VSGenericTarget : ITarget | 45 | public abstract class VSGenericTarget : ITarget |
46 | { | 46 | { |
47 | #region Fields | 47 | #region Fields |
48 | 48 | ||
49 | readonly Hashtable tools = new Hashtable(); | 49 | readonly Hashtable tools = new Hashtable(); |
50 | Kernel kernel; | 50 | Kernel kernel; |
51 | #endregion | 51 | #endregion |
52 | 52 | ||
53 | #region Properties | 53 | #region Properties |
54 | /// <summary> | 54 | /// <summary> |
55 | /// Gets or sets the solution version. | 55 | /// Gets or sets the solution version. |
56 | /// </summary> | 56 | /// </summary> |
57 | /// <value>The solution version.</value> | 57 | /// <value>The solution version.</value> |
58 | public abstract string SolutionVersion { get; } | 58 | public abstract string SolutionVersion { get; } |
59 | /// <summary> | 59 | /// <summary> |
60 | /// Gets or sets the product version. | 60 | /// Gets or sets the product version. |
61 | /// </summary> | 61 | /// </summary> |
62 | /// <value>The product version.</value> | 62 | /// <value>The product version.</value> |
63 | public abstract string ProductVersion { get; } | 63 | public abstract string ProductVersion { get; } |
64 | /// <summary> | 64 | /// <summary> |
65 | /// Gets or sets the schema version. | 65 | /// Gets or sets the schema version. |
66 | /// </summary> | 66 | /// </summary> |
67 | /// <value>The schema version.</value> | 67 | /// <value>The schema version.</value> |
68 | public abstract string SchemaVersion { get; } | 68 | public abstract string SchemaVersion { get; } |
69 | /// <summary> | 69 | /// <summary> |
70 | /// Gets or sets the name of the version. | 70 | /// Gets or sets the name of the version. |
71 | /// </summary> | 71 | /// </summary> |
72 | /// <value>The name of the version.</value> | 72 | /// <value>The name of the version.</value> |
73 | public abstract string VersionName { get; } | 73 | public abstract string VersionName { get; } |
74 | /// <summary> | 74 | /// <summary> |
75 | /// Gets or sets the version. | 75 | /// Gets or sets the version. |
76 | /// </summary> | 76 | /// </summary> |
77 | /// <value>The version.</value> | 77 | /// <value>The version.</value> |
78 | public abstract VSVersion Version { get; } | 78 | public abstract VSVersion Version { get; } |
79 | /// <summary> | 79 | /// <summary> |
80 | /// Gets the name. | 80 | /// Gets the name. |
81 | /// </summary> | 81 | /// </summary> |
82 | /// <value>The name.</value> | 82 | /// <value>The name.</value> |
83 | public abstract string Name { get; } | 83 | public abstract string Name { get; } |
84 | 84 | ||
85 | protected abstract string GetToolsVersionXml(FrameworkVersion version); | 85 | protected abstract string GetToolsVersionXml(FrameworkVersion version); |
86 | public abstract string SolutionTag { get; } | 86 | public abstract string SolutionTag { get; } |
87 | 87 | ||
88 | #endregion | 88 | #endregion |
89 | 89 | ||
90 | #region Constructors | 90 | #region Constructors |
91 | 91 | ||
92 | /// <summary> | 92 | /// <summary> |
93 | /// Initializes a new instance of the <see cref="VSGenericTarget"/> class. | 93 | /// Initializes a new instance of the <see cref="VSGenericTarget"/> class. |
94 | /// </summary> | 94 | /// </summary> |
95 | protected VSGenericTarget() | 95 | protected VSGenericTarget() |
96 | { | 96 | { |
97 | this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); | 97 | this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); |
98 | this.tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); | 98 | this.tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); |
99 | this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); | 99 | this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); |
100 | this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); | 100 | this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); |
101 | this.tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); | 101 | this.tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); |
102 | } | 102 | } |
103 | 103 | ||
104 | #endregion | 104 | #endregion |
105 | 105 | ||
106 | #region Private Methods | 106 | #region Private Methods |
107 | 107 | ||
108 | private string MakeRefPath(ProjectNode project) | 108 | private string MakeRefPath(ProjectNode project) |
109 | { | 109 | { |
110 | string ret = ""; | 110 | string ret = ""; |
111 | foreach (ReferencePathNode node in project.ReferencePaths) | 111 | foreach (ReferencePathNode node in project.ReferencePaths) |
112 | { | 112 | { |
113 | try | 113 | try |
114 | { | 114 | { |
115 | string fullPath = Helper.ResolvePath(node.Path); | 115 | string fullPath = Helper.ResolvePath(node.Path); |
116 | if (ret.Length < 1) | 116 | if (ret.Length < 1) |
117 | { | 117 | { |
118 | ret = fullPath; | 118 | ret = fullPath; |
119 | } | 119 | } |
120 | else | 120 | else |
121 | { | 121 | { |
122 | ret += ";" + fullPath; | 122 | ret += ";" + fullPath; |
123 | } | 123 | } |
124 | } | 124 | } |
125 | catch (ArgumentException) | 125 | catch (ArgumentException) |
126 | { | 126 | { |
127 | this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); | 127 | this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); |
128 | } | 128 | } |
129 | } | 129 | } |
130 | 130 | ||
131 | return ret; | 131 | return ret; |
132 | } | 132 | } |
133 | 133 | ||
134 | private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) | 134 | private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) |
135 | { | 135 | { |
136 | SolutionNode node = solution; | 136 | SolutionNode node = solution; |
137 | 137 | ||
138 | while (node.Parent is SolutionNode) | 138 | while (node.Parent is SolutionNode) |
139 | node = node.Parent as SolutionNode; | 139 | node = node.Parent as SolutionNode; |
140 | 140 | ||
141 | return FindProjectInSolutionRecursively(name, node); | 141 | return FindProjectInSolutionRecursively(name, node); |
142 | } | 142 | } |
143 | 143 | ||
144 | private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) | 144 | private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) |
145 | { | 145 | { |
146 | if (solution.ProjectsTable.ContainsKey(name)) | 146 | if (solution.ProjectsTable.ContainsKey(name)) |
147 | return (ProjectNode)solution.ProjectsTable[name]; | 147 | return (ProjectNode)solution.ProjectsTable[name]; |
148 | 148 | ||
149 | foreach (SolutionNode child in solution.Solutions) | 149 | foreach (SolutionNode child in solution.Solutions) |
150 | { | 150 | { |
151 | ProjectNode node = FindProjectInSolutionRecursively(name, child); | 151 | ProjectNode node = FindProjectInSolutionRecursively(name, child); |
152 | if (node != null) | 152 | if (node != null) |
153 | return node; | 153 | return node; |
154 | } | 154 | } |
155 | 155 | ||
156 | return null; | 156 | return null; |
157 | } | 157 | } |
158 | 158 | ||
159 | private void WriteProject(SolutionNode solution, ProjectNode project) | 159 | private void WriteProject(SolutionNode solution, ProjectNode project) |
160 | { | 160 | { |
161 | if (!tools.ContainsKey(project.Language)) | 161 | if (!tools.ContainsKey(project.Language)) |
162 | { | 162 | { |
163 | throw new UnknownLanguageException("Unknown .NET language: " + project.Language); | 163 | throw new UnknownLanguageException("Unknown .NET language: " + project.Language); |
164 | } | 164 | } |
165 | 165 | ||
166 | ToolInfo toolInfo = (ToolInfo)tools[project.Language]; | 166 | ToolInfo toolInfo = (ToolInfo)tools[project.Language]; |
167 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); | 167 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); |
168 | StreamWriter ps = new StreamWriter(projectFile); | 168 | StreamWriter ps = new StreamWriter(projectFile); |
169 | 169 | ||
170 | kernel.CurrentWorkingDirectory.Push(); | 170 | kernel.CurrentWorkingDirectory.Push(); |
171 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); | 171 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); |
172 | 172 | ||
173 | #region Project File | 173 | #region Project File |
174 | using (ps) | 174 | using (ps) |
175 | { | 175 | { |
176 | ps.WriteLine("<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {0}>", GetToolsVersionXml(project.FrameworkVersion)); | 176 | ps.WriteLine("<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {0}>", GetToolsVersionXml(project.FrameworkVersion)); |
177 | ps.WriteLine(" <PropertyGroup>"); | 177 | ps.WriteLine(" <PropertyGroup>"); |
178 | ps.WriteLine(" <ProjectType>Local</ProjectType>"); | 178 | ps.WriteLine(" <ProjectType>Local</ProjectType>"); |
179 | ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", this.ProductVersion); | 179 | ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", this.ProductVersion); |
180 | ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", this.SchemaVersion); | 180 | ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", this.SchemaVersion); |
181 | ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper()); | 181 | ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper()); |
182 | 182 | ||
183 | // Visual Studio has a hard coded guid for the project type | 183 | // Visual Studio has a hard coded guid for the project type |
184 | if (project.Type == ProjectType.Web) | 184 | if (project.Type == ProjectType.Web) |
185 | ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>"); | 185 | ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>"); |
186 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); | 186 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); |
187 | ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>"); | 187 | ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>"); |
188 | ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon); | 188 | ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon); |
189 | ps.WriteLine(" <AssemblyKeyContainerName>"); | 189 | ps.WriteLine(" <AssemblyKeyContainerName>"); |
190 | ps.WriteLine(" </AssemblyKeyContainerName>"); | 190 | ps.WriteLine(" </AssemblyKeyContainerName>"); |
191 | ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName); | 191 | ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName); |
192 | foreach (ConfigurationNode conf in project.Configurations) | 192 | foreach (ConfigurationNode conf in project.Configurations) |
193 | { | 193 | { |
194 | if (conf.Options.KeyFile != "") | 194 | if (conf.Options.KeyFile != "") |
195 | { | 195 | { |
196 | ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile); | 196 | ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile); |
197 | ps.WriteLine(" <SignAssembly>true</SignAssembly>"); | 197 | ps.WriteLine(" <SignAssembly>true</SignAssembly>"); |
198 | break; | 198 | break; |
199 | } | 199 | } |
200 | } | 200 | } |
201 | ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>"); | 201 | ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>"); |
202 | ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>"); | 202 | ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>"); |
203 | ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>"); | 203 | ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>"); |
204 | ps.WriteLine(" <DelaySign>false</DelaySign>"); | 204 | ps.WriteLine(" <DelaySign>false</DelaySign>"); |
205 | ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", ".")); | 205 | ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", ".")); |
206 | 206 | ||
207 | ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); | 207 | ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); |
208 | ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder); | 208 | ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder); |
209 | ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace); | 209 | ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace); |
210 | ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject); | 210 | ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject); |
211 | if (string.IsNullOrEmpty(project.DebugStartParameters)) | 211 | if (string.IsNullOrEmpty(project.DebugStartParameters)) |
212 | { | 212 | { |
213 | ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters); | 213 | ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters); |
214 | } | 214 | } |
215 | ps.WriteLine(" <FileUpgradeFlags>"); | 215 | ps.WriteLine(" <FileUpgradeFlags>"); |
216 | ps.WriteLine(" </FileUpgradeFlags>"); | 216 | ps.WriteLine(" </FileUpgradeFlags>"); |
217 | 217 | ||
218 | ps.WriteLine(" </PropertyGroup>"); | 218 | ps.WriteLine(" </PropertyGroup>"); |
219 | 219 | ||
220 | foreach (ConfigurationNode conf in project.Configurations) | 220 | foreach (ConfigurationNode conf in project.Configurations) |
221 | { | 221 | { |
222 | ps.Write(" <PropertyGroup "); | 222 | ps.Write(" <PropertyGroup "); |
223 | ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \">", conf.Name); | 223 | ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \">", conf.Name); |
224 | ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]); | 224 | ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]); |
225 | ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]); | 225 | ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]); |
226 | ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]); | 226 | ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]); |
227 | ps.WriteLine(" <ConfigurationOverrideFile>"); | 227 | ps.WriteLine(" <ConfigurationOverrideFile>"); |
228 | ps.WriteLine(" </ConfigurationOverrideFile>"); | 228 | ps.WriteLine(" </ConfigurationOverrideFile>"); |
229 | ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]); | 229 | ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]); |
230 | ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); | 230 | ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); |
231 | ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]); | 231 | ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]); |
232 | ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]); | 232 | ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]); |
233 | ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]); | 233 | ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]); |
234 | if (project.Type != ProjectType.Web) | 234 | if (project.Type != ProjectType.Web) |
235 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", | 235 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", |
236 | Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); | 236 | Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); |
237 | else | 237 | else |
238 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", | 238 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", |
239 | Helper.EndPath(Helper.NormalizePath("bin\\"))); | 239 | Helper.EndPath(Helper.NormalizePath("bin\\"))); |
240 | 240 | ||
241 | ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]); | 241 | ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]); |
242 | ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]); | 242 | ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]); |
243 | ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]); | 243 | ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]); |
244 | ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]); | 244 | ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]); |
245 | ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]); | 245 | ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]); |
246 | ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]); | 246 | ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]); |
247 | ps.WriteLine(" </PropertyGroup>"); | 247 | ps.WriteLine(" </PropertyGroup>"); |
248 | } | 248 | } |
249 | 249 | ||
250 | //ps.WriteLine(" </Settings>"); | 250 | //ps.WriteLine(" </Settings>"); |
251 | 251 | ||
252 | List<ProjectNode> projectReferences = new List<ProjectNode>(); | 252 | List<ProjectNode> projectReferences = new List<ProjectNode>(); |
253 | List<ReferenceNode> otherReferences = new List<ReferenceNode>(); | 253 | List<ReferenceNode> otherReferences = new List<ReferenceNode>(); |
254 | 254 | ||
255 | foreach (ReferenceNode refr in project.References) | 255 | foreach (ReferenceNode refr in project.References) |
256 | { | 256 | { |
257 | ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); | 257 | ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); |
258 | 258 | ||
259 | if (projectNode == null) | 259 | if (projectNode == null) |
260 | otherReferences.Add(refr); | 260 | otherReferences.Add(refr); |
261 | else | 261 | else |
262 | projectReferences.Add(projectNode); | 262 | projectReferences.Add(projectNode); |
263 | } | 263 | } |
264 | // Assembly References | 264 | // Assembly References |
265 | ps.WriteLine(" <ItemGroup>"); | 265 | ps.WriteLine(" <ItemGroup>"); |
266 | 266 | ||
267 | foreach (ReferenceNode refr in otherReferences) | 267 | foreach (ReferenceNode refr in otherReferences) |
268 | { | 268 | { |
269 | ps.Write(" <Reference"); | 269 | ps.Write(" <Reference"); |
270 | ps.Write(" Include=\""); | 270 | ps.Write(" Include=\""); |
271 | ps.Write(refr.Name); | 271 | ps.Write(refr.Name); |
272 | ps.WriteLine("\" >"); | 272 | ps.WriteLine("\" >"); |
273 | ps.Write(" <Name>"); | 273 | ps.Write(" <Name>"); |
274 | ps.Write(refr.Name); | 274 | ps.Write(refr.Name); |
275 | ps.WriteLine("</Name>"); | 275 | ps.WriteLine("</Name>"); |
276 | // TODO: Allow reference to *.exe files | 276 | // TODO: Allow reference to *.exe files |
277 | ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy); | 277 | ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy); |
278 | ps.WriteLine(" </Reference>"); | 278 | ps.WriteLine(" </Reference>"); |
279 | } | 279 | } |
280 | ps.WriteLine(" </ItemGroup>"); | 280 | ps.WriteLine(" </ItemGroup>"); |
281 | 281 | ||
282 | //Project References | 282 | //Project References |
283 | ps.WriteLine(" <ItemGroup>"); | 283 | ps.WriteLine(" <ItemGroup>"); |
284 | foreach (ProjectNode projectReference in projectReferences) | 284 | foreach (ProjectNode projectReference in projectReferences) |
285 | { | 285 | { |
286 | ToolInfo tool = (ToolInfo)tools[projectReference.Language]; | 286 | ToolInfo tool = (ToolInfo)tools[projectReference.Language]; |
287 | if (tools == null) | 287 | if (tools == null) |
288 | throw new UnknownLanguageException(); | 288 | throw new UnknownLanguageException(); |
289 | 289 | ||
290 | string path = | 290 | string path = |
291 | Helper.MakePathRelativeTo(project.FullPath, | 291 | Helper.MakePathRelativeTo(project.FullPath, |
292 | Helper.MakeFilePath(projectReference.FullPath, projectReference.Name, tool.FileExtension)); | 292 | Helper.MakeFilePath(projectReference.FullPath, projectReference.Name, tool.FileExtension)); |
293 | ps.WriteLine(" <ProjectReference Include=\"{0}\">", path); | 293 | ps.WriteLine(" <ProjectReference Include=\"{0}\">", path); |
294 | 294 | ||
295 | // TODO: Allow reference to visual basic projects | 295 | // TODO: Allow reference to visual basic projects |
296 | ps.WriteLine(" <Name>{0}</Name>", projectReference.Name); | 296 | ps.WriteLine(" <Name>{0}</Name>", projectReference.Name); |
297 | ps.WriteLine(" <Project>{0}</Project>", projectReference.Guid.ToString("B").ToUpper()); | 297 | ps.WriteLine(" <Project>{0}</Project>", projectReference.Guid.ToString("B").ToUpper()); |
298 | ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper()); | 298 | ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper()); |
299 | 299 | ||
300 | ps.WriteLine(" <Private>False</Private>" ); | 300 | ps.WriteLine(" <Private>False</Private>" ); |
301 | 301 | ||
302 | ps.WriteLine(" </ProjectReference>"); | 302 | ps.WriteLine(" </ProjectReference>"); |
303 | } | 303 | } |
304 | ps.WriteLine(" </ItemGroup>"); | 304 | ps.WriteLine(" </ItemGroup>"); |
305 | 305 | ||
306 | // ps.WriteLine(" </Build>"); | 306 | // ps.WriteLine(" </Build>"); |
307 | ps.WriteLine(" <ItemGroup>"); | 307 | ps.WriteLine(" <ItemGroup>"); |
308 | 308 | ||
309 | // ps.WriteLine(" <Include>"); | 309 | // ps.WriteLine(" <Include>"); |
310 | List<string> list = new List<string>(); | 310 | List<string> list = new List<string>(); |
311 | 311 | ||
312 | foreach (string path in project.Files) | 312 | foreach (string path in project.Files) |
313 | { | 313 | { |
314 | string lower = path.ToLower(); | 314 | string lower = path.ToLower(); |
315 | if (lower.EndsWith(".resx")) | 315 | if (lower.EndsWith(".resx")) |
316 | { | 316 | { |
317 | string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); | 317 | string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); |
318 | if (!list.Contains(codebehind)) | 318 | if (!list.Contains(codebehind)) |
319 | list.Add(codebehind); | 319 | list.Add(codebehind); |
320 | } | 320 | } |
321 | } | 321 | } |
322 | 322 | ||
323 | foreach (string file in project.Files) | 323 | foreach (string file in project.Files) |
324 | { | 324 | { |
325 | // if (file == "Properties\\Bind.Designer.cs") | 325 | // if (file == "Properties\\Bind.Designer.cs") |
326 | // { | 326 | // { |
327 | // Console.WriteLine("Wait a minute!"); | 327 | // Console.WriteLine("Wait a minute!"); |
328 | // Console.WriteLine(project.Files.GetSubType(file).ToString()); | 328 | // Console.WriteLine(project.Files.GetSubType(file).ToString()); |
329 | // } | 329 | // } |
330 | 330 | ||
331 | SubType subType = project.Files.GetSubType(file); | 331 | SubType subType = project.Files.GetSubType(file); |
332 | 332 | ||
333 | if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer | 333 | if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer |
334 | && subType != SubType.CodeBehind) | 334 | && subType != SubType.CodeBehind) |
335 | { | 335 | { |
336 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); | 336 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); |
337 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); | 337 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); |
338 | ps.WriteLine(" <SubType>Designer</SubType>"); | 338 | ps.WriteLine(" <SubType>Designer</SubType>"); |
339 | ps.WriteLine(" </EmbeddedResource>"); | 339 | ps.WriteLine(" </EmbeddedResource>"); |
340 | // | 340 | // |
341 | } | 341 | } |
342 | 342 | ||
343 | if (subType == SubType.Designer) | 343 | if (subType == SubType.Designer) |
344 | { | 344 | { |
345 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file); | 345 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file); |
346 | ps.WriteLine(" <SubType>" + subType + "</SubType>"); | 346 | ps.WriteLine(" <SubType>" + subType + "</SubType>"); |
347 | ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>"); | 347 | ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>"); |
348 | 348 | ||
349 | string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; | 349 | string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; |
350 | string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs"; | 350 | string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs"; |
351 | 351 | ||
352 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", autogen_name); | 352 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", autogen_name); |
353 | 353 | ||
354 | // Check for a parent .cs file with the same name as this designer file | 354 | // Check for a parent .cs file with the same name as this designer file |
355 | if (File.Exists(dependent_name)) | 355 | if (File.Exists(dependent_name)) |
356 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); | 356 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); |
357 | 357 | ||
358 | ps.WriteLine(" </EmbeddedResource>"); | 358 | ps.WriteLine(" </EmbeddedResource>"); |
359 | if (File.Exists(autogen_name)) | 359 | if (File.Exists(autogen_name)) |
360 | { | 360 | { |
361 | ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name); | 361 | ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name); |
362 | ps.WriteLine(" <AutoGen>True</AutoGen>"); | 362 | ps.WriteLine(" <AutoGen>True</AutoGen>"); |
363 | ps.WriteLine(" <DesignTime>True</DesignTime>"); | 363 | ps.WriteLine(" <DesignTime>True</DesignTime>"); |
364 | 364 | ||
365 | // If a parent .cs file exists, link this autogen file to it. Otherwise link | 365 | // If a parent .cs file exists, link this autogen file to it. Otherwise link |
366 | // to the designer file | 366 | // to the designer file |
367 | if (File.Exists(dependent_name)) | 367 | if (File.Exists(dependent_name)) |
368 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); | 368 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); |
369 | else | 369 | else |
370 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); | 370 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); |
371 | 371 | ||
372 | ps.WriteLine(" </Compile>"); | 372 | ps.WriteLine(" </Compile>"); |
373 | } | 373 | } |
374 | list.Add(autogen_name); | 374 | list.Add(autogen_name); |
375 | } | 375 | } |
376 | if (subType == SubType.Settings) | 376 | if (subType == SubType.Settings) |
377 | { | 377 | { |
378 | ps.Write(" <{0} ", project.Files.GetBuildAction(file)); | 378 | ps.Write(" <{0} ", project.Files.GetBuildAction(file)); |
379 | ps.WriteLine("Include=\"{0}\">", file); | 379 | ps.WriteLine("Include=\"{0}\">", file); |
380 | string fileName = Path.GetFileName(file); | 380 | string fileName = Path.GetFileName(file); |
381 | if (project.Files.GetBuildAction(file) == BuildAction.None) | 381 | if (project.Files.GetBuildAction(file) == BuildAction.None) |
382 | { | 382 | { |
383 | ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>"); | 383 | ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>"); |
384 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); | 384 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); |
385 | } | 385 | } |
386 | else | 386 | else |
387 | { | 387 | { |
388 | ps.WriteLine(" <SubType>Code</SubType>"); | 388 | ps.WriteLine(" <SubType>Code</SubType>"); |
389 | ps.WriteLine(" <AutoGen>True</AutoGen>"); | 389 | ps.WriteLine(" <AutoGen>True</AutoGen>"); |
390 | ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); | 390 | ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); |
391 | string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); | 391 | string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); |
392 | string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); | 392 | string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); |
393 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings")); | 393 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings")); |
394 | } | 394 | } |
395 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file)); | 395 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file)); |
396 | } | 396 | } |
397 | else if (subType != SubType.Designer) | 397 | else if (subType != SubType.Designer) |
398 | { | 398 | { |
399 | string path = Helper.NormalizePath(file); | 399 | string path = Helper.NormalizePath(file); |
400 | string path_lower = path.ToLower(); | 400 | string path_lower = path.ToLower(); |
401 | 401 | ||
402 | if (!list.Contains(file)) | 402 | if (!list.Contains(file)) |
403 | { | 403 | { |
404 | ps.Write(" <{0} ", project.Files.GetBuildAction(path)); | 404 | ps.Write(" <{0} ", project.Files.GetBuildAction(path)); |
405 | 405 | ||
406 | int startPos = 0; | 406 | int startPos = 0; |
407 | if (project.Files.GetPreservePath(file)) | 407 | if (project.Files.GetPreservePath(file)) |
408 | { | 408 | { |
409 | while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) | 409 | while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) |
410 | startPos++; | 410 | startPos++; |
411 | 411 | ||
412 | } | 412 | } |
413 | else | 413 | else |
414 | { | 414 | { |
415 | startPos = file.LastIndexOf(Path.GetFileName(path)); | 415 | startPos = file.LastIndexOf(Path.GetFileName(path)); |
416 | } | 416 | } |
417 | 417 | ||
418 | ps.WriteLine("Include=\"{0}\">", path); | 418 | ps.WriteLine("Include=\"{0}\">", path); |
419 | 419 | ||
420 | int last_period_index = file.LastIndexOf('.'); | 420 | int last_period_index = file.LastIndexOf('.'); |
421 | string short_file_name = file.Substring(0, last_period_index); | 421 | string short_file_name = file.Substring(0, last_period_index); |
422 | string extension = Path.GetExtension(path); | 422 | string extension = Path.GetExtension(path); |
423 | string designer_format = string.Format(".designer{0}", extension); | 423 | string designer_format = string.Format(".designer{0}", extension); |
424 | 424 | ||
425 | if (path_lower.EndsWith(designer_format)) | 425 | if (path_lower.EndsWith(designer_format)) |
426 | { | 426 | { |
427 | int designer_index = path_lower.IndexOf(designer_format); | 427 | int designer_index = path_lower.IndexOf(designer_format); |
428 | string file_name = path.Substring(0, designer_index); | 428 | string file_name = path.Substring(0, designer_index); |
429 | 429 | ||
430 | if (File.Exists(file_name)) | 430 | if (File.Exists(file_name)) |
431 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name)); | 431 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name)); |
432 | else if (File.Exists(file_name + ".resx")) | 432 | else if (File.Exists(file_name + ".resx")) |
433 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx")); | 433 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx")); |
434 | } | 434 | } |
435 | else if (subType == SubType.CodeBehind) | 435 | else if (subType == SubType.CodeBehind) |
436 | { | 436 | { |
437 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name)); | 437 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name)); |
438 | } | 438 | } |
439 | if (project.Files.GetIsLink(file)) | 439 | if (project.Files.GetIsLink(file)) |
440 | { | 440 | { |
441 | string alias = project.Files.GetLinkPath(file); | 441 | string alias = project.Files.GetLinkPath(file); |
442 | alias += file.Substring(startPos); | 442 | alias += file.Substring(startPos); |
443 | alias = Helper.NormalizePath(alias); | 443 | alias = Helper.NormalizePath(alias); |
444 | ps.WriteLine(" <Link>{0}</Link>", alias); | 444 | ps.WriteLine(" <Link>{0}</Link>", alias); |
445 | } | 445 | } |
446 | else if (project.Files.GetBuildAction(file) != BuildAction.None) | 446 | else if (project.Files.GetBuildAction(file) != BuildAction.None) |
447 | { | 447 | { |
448 | if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) | 448 | if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) |
449 | { | 449 | { |
450 | ps.WriteLine(" <SubType>{0}</SubType>", subType); | 450 | ps.WriteLine(" <SubType>{0}</SubType>", subType); |
451 | } | 451 | } |
452 | } | 452 | } |
453 | 453 | ||
454 | if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) | 454 | if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) |
455 | { | 455 | { |
456 | ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(file)); | 456 | ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(file)); |
457 | } | 457 | } |
458 | 458 | ||
459 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file)); | 459 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file)); |
460 | } | 460 | } |
461 | } | 461 | } |
462 | } | 462 | } |
463 | 463 | ||
464 | ps.WriteLine(" </ItemGroup>"); | 464 | ps.WriteLine(" </ItemGroup>"); |
465 | ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />"); | 465 | ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />"); |
466 | ps.WriteLine(" <PropertyGroup>"); | 466 | ps.WriteLine(" <PropertyGroup>"); |
467 | ps.WriteLine(" <PreBuildEvent>"); | 467 | ps.WriteLine(" <PreBuildEvent>"); |
468 | ps.WriteLine(" </PreBuildEvent>"); | 468 | ps.WriteLine(" </PreBuildEvent>"); |
469 | ps.WriteLine(" <PostBuildEvent>"); | 469 | ps.WriteLine(" <PostBuildEvent>"); |
470 | ps.WriteLine(" </PostBuildEvent>"); | 470 | ps.WriteLine(" </PostBuildEvent>"); |
471 | ps.WriteLine(" </PropertyGroup>"); | 471 | ps.WriteLine(" </PropertyGroup>"); |
472 | ps.WriteLine("</Project>"); | 472 | ps.WriteLine("</Project>"); |
473 | } | 473 | } |
474 | #endregion | 474 | #endregion |
475 | 475 | ||
476 | #region User File | 476 | #region User File |
477 | 477 | ||
478 | ps = new StreamWriter(projectFile + ".user"); | 478 | ps = new StreamWriter(projectFile + ".user"); |
479 | using (ps) | 479 | using (ps) |
480 | { | 480 | { |
481 | ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">"); | 481 | ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">"); |
482 | //ps.WriteLine( "<VisualStudioProject>" ); | 482 | //ps.WriteLine( "<VisualStudioProject>" ); |
483 | //ps.WriteLine(" <{0}>", toolInfo.XMLTag); | 483 | //ps.WriteLine(" <{0}>", toolInfo.XMLTag); |
484 | //ps.WriteLine(" <Build>"); | 484 | //ps.WriteLine(" <Build>"); |
485 | ps.WriteLine(" <PropertyGroup>"); | 485 | ps.WriteLine(" <PropertyGroup>"); |
486 | //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); | 486 | //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); |
487 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); | 487 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); |
488 | ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>"); | 488 | ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>"); |
489 | ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project)); | 489 | ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project)); |
490 | ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", this.ProductVersion); | 490 | ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", this.ProductVersion); |
491 | ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>"); | 491 | ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>"); |
492 | ps.WriteLine(" <ProjectTrust>0</ProjectTrust>"); | 492 | ps.WriteLine(" <ProjectTrust>0</ProjectTrust>"); |
493 | ps.WriteLine(" </PropertyGroup>"); | 493 | ps.WriteLine(" </PropertyGroup>"); |
494 | foreach (ConfigurationNode conf in project.Configurations) | 494 | foreach (ConfigurationNode conf in project.Configurations) |
495 | { | 495 | { |
496 | ps.Write(" <PropertyGroup"); | 496 | ps.Write(" <PropertyGroup"); |
497 | ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \"", conf.Name); | 497 | ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \"", conf.Name); |
498 | ps.WriteLine(" />"); | 498 | ps.WriteLine(" />"); |
499 | } | 499 | } |
500 | ps.WriteLine("</Project>"); | 500 | ps.WriteLine("</Project>"); |
501 | } | 501 | } |
502 | #endregion | 502 | #endregion |
503 | 503 | ||
504 | kernel.CurrentWorkingDirectory.Pop(); | 504 | kernel.CurrentWorkingDirectory.Pop(); |
505 | } | 505 | } |
506 | 506 | ||
507 | private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) | 507 | private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) |
508 | { | 508 | { |
509 | kernel.Log.Write("Creating {0} solution and project files", this.VersionName); | 509 | kernel.Log.Write("Creating {0} solution and project files", this.VersionName); |
510 | 510 | ||
511 | foreach (SolutionNode child in solution.Solutions) | 511 | foreach (SolutionNode child in solution.Solutions) |
512 | { | 512 | { |
513 | kernel.Log.Write("...Creating folder: {0}", child.Name); | 513 | kernel.Log.Write("...Creating folder: {0}", child.Name); |
514 | WriteSolution(child, false); | 514 | WriteSolution(child, false); |
515 | } | 515 | } |
516 | 516 | ||
517 | foreach (ProjectNode project in solution.Projects) | 517 | foreach (ProjectNode project in solution.Projects) |
518 | { | 518 | { |
519 | kernel.Log.Write("...Creating project: {0}", project.Name); | 519 | kernel.Log.Write("...Creating project: {0}", project.Name); |
520 | WriteProject(solution, project); | 520 | WriteProject(solution, project); |
521 | } | 521 | } |
522 | 522 | ||
523 | foreach (DatabaseProjectNode project in solution.DatabaseProjects) | 523 | foreach (DatabaseProjectNode project in solution.DatabaseProjects) |
524 | { | 524 | { |
525 | kernel.Log.Write("...Creating database project: {0}", project.Name); | 525 | kernel.Log.Write("...Creating database project: {0}", project.Name); |
526 | WriteDatabaseProject(solution, project); | 526 | WriteDatabaseProject(solution, project); |
527 | } | 527 | } |
528 | 528 | ||
529 | if (writeSolutionToDisk) // only write main solution | 529 | if (writeSolutionToDisk) // only write main solution |
530 | { | 530 | { |
531 | kernel.Log.Write(""); | 531 | kernel.Log.Write(""); |
532 | string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); | 532 | string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); |
533 | 533 | ||
534 | using (StreamWriter ss = new StreamWriter(solutionFile)) | 534 | using (StreamWriter ss = new StreamWriter(solutionFile)) |
535 | { | 535 | { |
536 | kernel.CurrentWorkingDirectory.Push(); | 536 | kernel.CurrentWorkingDirectory.Push(); |
537 | Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); | 537 | Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); |
538 | 538 | ||
539 | ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); | 539 | ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); |
540 | ss.WriteLine(SolutionTag); | 540 | ss.WriteLine(SolutionTag); |
541 | 541 | ||
542 | WriteProjectDeclarations(ss, solution, solution); | 542 | WriteProjectDeclarations(ss, solution, solution); |
543 | 543 | ||
544 | ss.WriteLine("Global"); | 544 | ss.WriteLine("Global"); |
545 | 545 | ||
546 | ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); | 546 | ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); |
547 | foreach (ConfigurationNode conf in solution.Configurations) | 547 | foreach (ConfigurationNode conf in solution.Configurations) |
548 | { | 548 | { |
549 | ss.WriteLine("\t\t{0}|Any CPU = {0}|Any CPU", conf.Name); | 549 | ss.WriteLine("\t\t{0}|Any CPU = {0}|Any CPU", conf.Name); |
550 | } | 550 | } |
551 | ss.WriteLine("\tEndGlobalSection"); | 551 | ss.WriteLine("\tEndGlobalSection"); |
552 | 552 | ||
553 | ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); | 553 | ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); |
554 | WriteConfigurationLines(solution.Configurations, solution, ss); | 554 | WriteConfigurationLines(solution.Configurations, solution, ss); |
555 | ss.WriteLine("\tEndGlobalSection"); | 555 | ss.WriteLine("\tEndGlobalSection"); |
556 | 556 | ||
557 | if (solution.Solutions.Count > 0) | 557 | if (solution.Solutions.Count > 0) |
558 | { | 558 | { |
559 | ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); | 559 | ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); |
560 | foreach (SolutionNode embeddedSolution in solution.Solutions) | 560 | foreach (SolutionNode embeddedSolution in solution.Solutions) |
561 | { | 561 | { |
562 | WriteNestedProjectMap(ss, embeddedSolution); | 562 | WriteNestedProjectMap(ss, embeddedSolution); |
563 | } | 563 | } |
564 | ss.WriteLine("\tEndGlobalSection"); | 564 | ss.WriteLine("\tEndGlobalSection"); |
565 | } | 565 | } |
566 | 566 | ||
567 | ss.WriteLine("EndGlobal"); | 567 | ss.WriteLine("EndGlobal"); |
568 | } | 568 | } |
569 | 569 | ||
570 | kernel.CurrentWorkingDirectory.Pop(); | 570 | kernel.CurrentWorkingDirectory.Pop(); |
571 | } | 571 | } |
572 | } | 572 | } |
573 | 573 | ||
574 | private void WriteProjectDeclarations(StreamWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) | 574 | private void WriteProjectDeclarations(StreamWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) |
575 | { | 575 | { |
576 | foreach (SolutionNode childSolution in embeddedSolution.Solutions) | 576 | foreach (SolutionNode childSolution in embeddedSolution.Solutions) |
577 | { | 577 | { |
578 | WriteEmbeddedSolution(writer, childSolution); | 578 | WriteEmbeddedSolution(writer, childSolution); |
579 | WriteProjectDeclarations(writer, actualSolution, childSolution); | 579 | WriteProjectDeclarations(writer, actualSolution, childSolution); |
580 | } | 580 | } |
581 | 581 | ||
582 | foreach (ProjectNode project in embeddedSolution.Projects) | 582 | foreach (ProjectNode project in embeddedSolution.Projects) |
583 | { | 583 | { |
584 | WriteProject(actualSolution, writer, project); | 584 | WriteProject(actualSolution, writer, project); |
585 | } | 585 | } |
586 | 586 | ||
587 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) | 587 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) |
588 | { | 588 | { |
589 | WriteProject(actualSolution, writer, dbProject); | 589 | WriteProject(actualSolution, writer, dbProject); |
590 | } | 590 | } |
591 | 591 | ||
592 | if (actualSolution.Guid == embeddedSolution.Guid) | 592 | if (actualSolution.Guid == embeddedSolution.Guid) |
593 | { | 593 | { |
594 | WriteSolutionFiles(actualSolution, writer); | 594 | WriteSolutionFiles(actualSolution, writer); |
595 | } | 595 | } |
596 | } | 596 | } |
597 | 597 | ||
598 | private static void WriteNestedProjectMap(StreamWriter writer, SolutionNode embeddedSolution) | 598 | private static void WriteNestedProjectMap(StreamWriter writer, SolutionNode embeddedSolution) |
599 | { | 599 | { |
600 | foreach (ProjectNode project in embeddedSolution.Projects) | 600 | foreach (ProjectNode project in embeddedSolution.Projects) |
601 | { | 601 | { |
602 | WriteNestedProject(writer, embeddedSolution, project.Guid); | 602 | WriteNestedProject(writer, embeddedSolution, project.Guid); |
603 | } | 603 | } |
604 | 604 | ||
605 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) | 605 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) |
606 | { | 606 | { |
607 | WriteNestedProject(writer, embeddedSolution, dbProject.Guid); | 607 | WriteNestedProject(writer, embeddedSolution, dbProject.Guid); |
608 | } | 608 | } |
609 | 609 | ||
610 | foreach (SolutionNode child in embeddedSolution.Solutions) | 610 | foreach (SolutionNode child in embeddedSolution.Solutions) |
611 | { | 611 | { |
612 | WriteNestedProject(writer, embeddedSolution, child.Guid); | 612 | WriteNestedProject(writer, embeddedSolution, child.Guid); |
613 | WriteNestedProjectMap(writer, child); | 613 | WriteNestedProjectMap(writer, child); |
614 | } | 614 | } |
615 | } | 615 | } |
616 | 616 | ||
617 | private static void WriteNestedProject(StreamWriter writer, SolutionNode solution, Guid projectGuid) | 617 | private static void WriteNestedProject(StreamWriter writer, SolutionNode solution, Guid projectGuid) |
618 | { | 618 | { |
619 | WriteNestedFolder(writer, solution.Guid, projectGuid); | 619 | WriteNestedFolder(writer, solution.Guid, projectGuid); |
620 | } | 620 | } |
621 | 621 | ||
622 | private static void WriteNestedFolder(StreamWriter writer, Guid parentGuid, Guid childGuid) | 622 | private static void WriteNestedFolder(StreamWriter writer, Guid parentGuid, Guid childGuid) |
623 | { | 623 | { |
624 | writer.WriteLine("\t\t{0} = {1}", | 624 | writer.WriteLine("\t\t{0} = {1}", |
625 | childGuid.ToString("B").ToUpper(), | 625 | childGuid.ToString("B").ToUpper(), |
626 | parentGuid.ToString("B").ToUpper()); | 626 | parentGuid.ToString("B").ToUpper()); |
627 | } | 627 | } |
628 | 628 | ||
629 | private static void WriteConfigurationLines(ICollection configurations, SolutionNode solution, StreamWriter ss) | 629 | private static void WriteConfigurationLines(ICollection configurations, SolutionNode solution, StreamWriter ss) |
630 | { | 630 | { |
631 | foreach (ProjectNode project in solution.Projects) | 631 | foreach (ProjectNode project in solution.Projects) |
632 | { | 632 | { |
633 | foreach (ConfigurationNode conf in configurations) | 633 | foreach (ConfigurationNode conf in configurations) |
634 | { | 634 | { |
635 | ss.WriteLine("\t\t{0}.{1}|Any CPU.ActiveCfg = {1}|Any CPU", | 635 | ss.WriteLine("\t\t{0}.{1}|Any CPU.ActiveCfg = {1}|Any CPU", |
636 | project.Guid.ToString("B").ToUpper(), | 636 | project.Guid.ToString("B").ToUpper(), |
637 | conf.Name); | 637 | conf.Name); |
638 | 638 | ||
639 | ss.WriteLine("\t\t{0}.{1}|Any CPU.Build.0 = {1}|Any CPU", | 639 | ss.WriteLine("\t\t{0}.{1}|Any CPU.Build.0 = {1}|Any CPU", |
640 | project.Guid.ToString("B").ToUpper(), | 640 | project.Guid.ToString("B").ToUpper(), |
641 | conf.Name); | 641 | conf.Name); |
642 | } | 642 | } |
643 | } | 643 | } |
644 | 644 | ||
645 | foreach (SolutionNode child in solution.Solutions) | 645 | foreach (SolutionNode child in solution.Solutions) |
646 | { | 646 | { |
647 | WriteConfigurationLines(configurations, child, ss); | 647 | WriteConfigurationLines(configurations, child, ss); |
648 | } | 648 | } |
649 | } | 649 | } |
650 | 650 | ||
651 | private void WriteSolutionFiles(SolutionNode solution, StreamWriter ss) | 651 | private void WriteSolutionFiles(SolutionNode solution, StreamWriter ss) |
652 | { | 652 | { |
653 | WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); | 653 | WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); |
654 | } | 654 | } |
655 | 655 | ||
656 | private void WriteEmbeddedSolution(StreamWriter writer, SolutionNode embeddedSolution) | 656 | private void WriteEmbeddedSolution(StreamWriter writer, SolutionNode embeddedSolution) |
657 | { | 657 | { |
658 | WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); | 658 | WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); |
659 | } | 659 | } |
660 | 660 | ||
661 | private void WriteProject(SolutionNode solution, StreamWriter ss, ProjectNode project) | 661 | private void WriteProject(SolutionNode solution, StreamWriter ss, ProjectNode project) |
662 | { | 662 | { |
663 | WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); | 663 | WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); |
664 | } | 664 | } |
665 | 665 | ||
666 | private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject) | 666 | private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject) |
667 | { | 667 | { |
668 | if (solution.Files != null && solution.Files.Count > 0) | 668 | if (solution.Files != null && solution.Files.Count > 0) |
669 | WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); | 669 | WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); |
670 | } | 670 | } |
671 | 671 | ||
672 | private static bool ExtensionSpecified(string refName) | 672 | private static bool ExtensionSpecified(string refName) |
673 | { | 673 | { |
674 | return refName.EndsWith(".dll") || refName.EndsWith(".exe"); | 674 | return refName.EndsWith(".dll") || refName.EndsWith(".exe"); |
675 | } | 675 | } |
676 | 676 | ||
677 | private static string GetProjectExtension(ProjectNode project) | 677 | private static string GetProjectExtension(ProjectNode project) |
678 | { | 678 | { |
679 | string extension = ".dll"; | 679 | string extension = ".dll"; |
680 | if (project.Type == ProjectType.Exe) | 680 | if (project.Type == ProjectType.Exe) |
681 | { | 681 | { |
682 | extension = ".exe"; | 682 | extension = ".exe"; |
683 | } | 683 | } |
684 | return extension; | 684 | return extension; |
685 | } | 685 | } |
686 | 686 | ||
687 | const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; | 687 | const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; |
688 | const string ProjectDeclarationEndFormat = "EndProject"; | 688 | const string ProjectDeclarationEndFormat = "EndProject"; |
689 | 689 | ||
690 | private void WriteProject(StreamWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) | 690 | private void WriteProject(StreamWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) |
691 | { | 691 | { |
692 | if (!tools.ContainsKey(language)) | 692 | if (!tools.ContainsKey(language)) |
693 | throw new UnknownLanguageException("Unknown .NET language: " + language); | 693 | throw new UnknownLanguageException("Unknown .NET language: " + language); |
694 | 694 | ||
695 | ToolInfo toolInfo = (ToolInfo)tools[language]; | 695 | ToolInfo toolInfo = (ToolInfo)tools[language]; |
696 | 696 | ||
697 | string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); | 697 | string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); |
698 | 698 | ||
699 | path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); | 699 | path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); |
700 | 700 | ||
701 | WriteProject(ss, language, guid, name, path); | 701 | WriteProject(ss, language, guid, name, path); |
702 | } | 702 | } |
703 | 703 | ||
704 | private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location) | 704 | private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location) |
705 | { | 705 | { |
706 | WriteProject(writer, language, projectGuid, name, location, null); | 706 | WriteProject(writer, language, projectGuid, name, location, null); |
707 | } | 707 | } |
708 | 708 | ||
709 | private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) | 709 | private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) |
710 | { | 710 | { |
711 | if (!tools.ContainsKey(language)) | 711 | if (!tools.ContainsKey(language)) |
712 | throw new UnknownLanguageException("Unknown .NET language: " + language); | 712 | throw new UnknownLanguageException("Unknown .NET language: " + language); |
713 | 713 | ||
714 | ToolInfo toolInfo = (ToolInfo)tools[language]; | 714 | ToolInfo toolInfo = (ToolInfo)tools[language]; |
715 | 715 | ||
716 | writer.WriteLine(ProjectDeclarationBeginFormat, | 716 | writer.WriteLine(ProjectDeclarationBeginFormat, |
717 | toolInfo.Guid, | 717 | toolInfo.Guid, |
718 | name, | 718 | name, |
719 | location, | 719 | location, |
720 | projectGuid.ToString("B").ToUpper()); | 720 | projectGuid.ToString("B").ToUpper()); |
721 | 721 | ||
722 | if (files != null) | 722 | if (files != null) |
723 | { | 723 | { |
724 | writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); | 724 | writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); |
725 | 725 | ||
726 | foreach (string file in files) | 726 | foreach (string file in files) |
727 | writer.WriteLine("\t\t{0} = {0}", file); | 727 | writer.WriteLine("\t\t{0} = {0}", file); |
728 | 728 | ||
729 | writer.WriteLine("\tEndProjectSection"); | 729 | writer.WriteLine("\tEndProjectSection"); |
730 | } | 730 | } |
731 | 731 | ||
732 | writer.WriteLine(ProjectDeclarationEndFormat); | 732 | writer.WriteLine(ProjectDeclarationEndFormat); |
733 | } | 733 | } |
734 | 734 | ||
735 | private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) | 735 | private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) |
736 | { | 736 | { |
737 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); | 737 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); |
738 | IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); | 738 | IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); |
739 | 739 | ||
740 | kernel.CurrentWorkingDirectory.Push(); | 740 | kernel.CurrentWorkingDirectory.Push(); |
741 | 741 | ||
742 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); | 742 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); |
743 | 743 | ||
744 | using (ps) | 744 | using (ps) |
745 | { | 745 | { |
746 | ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); | 746 | ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); |
747 | ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); | 747 | ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); |
748 | ps.Indent++; | 748 | ps.Indent++; |
749 | ps.WriteLine("MSDTVersion = \"80\""); | 749 | ps.WriteLine("MSDTVersion = \"80\""); |
750 | // TODO: Use the project.Files property | 750 | // TODO: Use the project.Files property |
751 | if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) | 751 | if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) |
752 | WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); | 752 | WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); |
753 | 753 | ||
754 | ps.WriteLine("Begin DBRefFolder = \"Database References\""); | 754 | ps.WriteLine("Begin DBRefFolder = \"Database References\""); |
755 | ps.Indent++; | 755 | ps.Indent++; |
756 | foreach (DatabaseReferenceNode reference in project.References) | 756 | foreach (DatabaseReferenceNode reference in project.References) |
757 | { | 757 | { |
758 | ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); | 758 | ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); |
759 | ps.Indent++; | 759 | ps.Indent++; |
760 | ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); | 760 | ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); |
761 | ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); | 761 | ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); |
762 | //ps.WriteLine("Colorizer = 5"); | 762 | //ps.WriteLine("Colorizer = 5"); |
763 | ps.Indent--; | 763 | ps.Indent--; |
764 | ps.WriteLine("End"); | 764 | ps.WriteLine("End"); |
765 | } | 765 | } |
766 | ps.Indent--; | 766 | ps.Indent--; |
767 | ps.WriteLine("End"); | 767 | ps.WriteLine("End"); |
768 | ps.Indent--; | 768 | ps.Indent--; |
769 | ps.WriteLine("End"); | 769 | ps.WriteLine("End"); |
770 | 770 | ||
771 | ps.Flush(); | 771 | ps.Flush(); |
772 | } | 772 | } |
773 | 773 | ||
774 | kernel.CurrentWorkingDirectory.Pop(); | 774 | kernel.CurrentWorkingDirectory.Pop(); |
775 | } | 775 | } |
776 | 776 | ||
777 | private bool ContainsSqlFiles(string folder) | 777 | private bool ContainsSqlFiles(string folder) |
778 | { | 778 | { |
779 | foreach (string file in Directory.GetFiles(folder, "*.sql")) | 779 | foreach (string file in Directory.GetFiles(folder, "*.sql")) |
780 | { | 780 | { |
781 | return true; // if the folder contains 1 .sql file, that's good enough | 781 | return true; // if the folder contains 1 .sql file, that's good enough |
782 | } | 782 | } |
783 | 783 | ||
784 | foreach (string child in Directory.GetDirectories(folder)) | 784 | foreach (string child in Directory.GetDirectories(folder)) |
785 | { | 785 | { |
786 | if (ContainsSqlFiles(child)) | 786 | if (ContainsSqlFiles(child)) |
787 | return true; // if 1 child folder contains a .sql file, still good enough | 787 | return true; // if 1 child folder contains a .sql file, still good enough |
788 | } | 788 | } |
789 | 789 | ||
790 | return false; | 790 | return false; |
791 | } | 791 | } |
792 | 792 | ||
793 | private void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) | 793 | private void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) |
794 | { | 794 | { |
795 | foreach (string child in Directory.GetDirectories(folder)) | 795 | foreach (string child in Directory.GetDirectories(folder)) |
796 | { | 796 | { |
797 | if (ContainsSqlFiles(child)) | 797 | if (ContainsSqlFiles(child)) |
798 | { | 798 | { |
799 | writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); | 799 | writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); |
800 | writer.Indent++; | 800 | writer.Indent++; |
801 | WriteDatabaseFoldersAndFiles(writer, child); | 801 | WriteDatabaseFoldersAndFiles(writer, child); |
802 | writer.Indent--; | 802 | writer.Indent--; |
803 | writer.WriteLine("End"); | 803 | writer.WriteLine("End"); |
804 | } | 804 | } |
805 | } | 805 | } |
806 | foreach (string file in Directory.GetFiles(folder, "*.sql")) | 806 | foreach (string file in Directory.GetFiles(folder, "*.sql")) |
807 | { | 807 | { |
808 | writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); | 808 | writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); |
809 | } | 809 | } |
810 | } | 810 | } |
811 | 811 | ||
812 | private void CleanProject(ProjectNode project) | 812 | private void CleanProject(ProjectNode project) |
813 | { | 813 | { |
814 | kernel.Log.Write("...Cleaning project: {0}", project.Name); | 814 | kernel.Log.Write("...Cleaning project: {0}", project.Name); |
815 | 815 | ||
816 | ToolInfo toolInfo = (ToolInfo)tools[project.Language]; | 816 | ToolInfo toolInfo = (ToolInfo)tools[project.Language]; |
817 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); | 817 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); |
818 | string userFile = projectFile + ".user"; | 818 | string userFile = projectFile + ".user"; |
819 | 819 | ||
820 | Helper.DeleteIfExists(projectFile); | 820 | Helper.DeleteIfExists(projectFile); |
821 | Helper.DeleteIfExists(userFile); | 821 | Helper.DeleteIfExists(userFile); |
822 | } | 822 | } |
823 | 823 | ||
824 | private void CleanSolution(SolutionNode solution) | 824 | private void CleanSolution(SolutionNode solution) |
825 | { | 825 | { |
826 | kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name); | 826 | kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name); |
827 | 827 | ||
828 | string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); | 828 | string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); |
829 | string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); | 829 | string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); |
830 | 830 | ||
831 | Helper.DeleteIfExists(slnFile); | 831 | Helper.DeleteIfExists(slnFile); |
832 | Helper.DeleteIfExists(suoFile); | 832 | Helper.DeleteIfExists(suoFile); |
833 | 833 | ||
834 | foreach (ProjectNode project in solution.Projects) | 834 | foreach (ProjectNode project in solution.Projects) |
835 | { | 835 | { |
836 | CleanProject(project); | 836 | CleanProject(project); |
837 | } | 837 | } |
838 | 838 | ||
839 | kernel.Log.Write(""); | 839 | kernel.Log.Write(""); |
840 | } | 840 | } |
841 | 841 | ||
842 | #endregion | 842 | #endregion |
843 | 843 | ||
844 | #region ITarget Members | 844 | #region ITarget Members |
845 | 845 | ||
846 | /// <summary> | 846 | /// <summary> |
847 | /// Writes the specified kern. | 847 | /// Writes the specified kern. |
848 | /// </summary> | 848 | /// </summary> |
849 | /// <param name="kern">The kern.</param> | 849 | /// <param name="kern">The kern.</param> |
850 | public virtual void Write(Kernel kern) | 850 | public virtual void Write(Kernel kern) |
851 | { | 851 | { |
852 | if (kern == null) | 852 | if (kern == null) |
853 | { | 853 | { |
854 | throw new ArgumentNullException("kern"); | 854 | throw new ArgumentNullException("kern"); |
855 | } | 855 | } |
856 | kernel = kern; | 856 | kernel = kern; |
857 | foreach (SolutionNode sol in kernel.Solutions) | 857 | foreach (SolutionNode sol in kernel.Solutions) |
858 | { | 858 | { |
859 | WriteSolution(sol, true); | 859 | WriteSolution(sol, true); |
860 | } | 860 | } |
861 | kernel = null; | 861 | kernel = null; |
862 | } | 862 | } |
863 | 863 | ||
864 | /// <summary> | 864 | /// <summary> |
865 | /// Cleans the specified kern. | 865 | /// Cleans the specified kern. |
866 | /// </summary> | 866 | /// </summary> |
867 | /// <param name="kern">The kern.</param> | 867 | /// <param name="kern">The kern.</param> |
868 | public virtual void Clean(Kernel kern) | 868 | public virtual void Clean(Kernel kern) |
869 | { | 869 | { |
870 | if (kern == null) | 870 | if (kern == null) |
871 | { | 871 | { |
872 | throw new ArgumentNullException("kern"); | 872 | throw new ArgumentNullException("kern"); |
873 | } | 873 | } |
874 | kernel = kern; | 874 | kernel = kern; |
875 | foreach (SolutionNode sol in kernel.Solutions) | 875 | foreach (SolutionNode sol in kernel.Solutions) |
876 | { | 876 | { |
877 | CleanSolution(sol); | 877 | CleanSolution(sol); |
878 | } | 878 | } |
879 | kernel = null; | 879 | kernel = null; |
880 | } | 880 | } |
881 | 881 | ||
882 | #endregion | 882 | #endregion |
883 | } | 883 | } |
884 | } | 884 | } |