From dd9640cda82bca8125289f292238ea6b447cc6e9 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Thu, 19 Feb 2009 12:48:38 +0000 Subject: [PATCH] === PREBUILD UPSTREAMS UPDATE : POTENTIAL BREAKAGE === * Applied upstreams changes to allow for auditing and debugging in our various environments. * This should, in theory, bring back 'multiple ref dirs'. * Temporarily Removed xmlns because prebuild-1.7 schema does not allow for multiple solutions per prebuild node (This will be a moot issue once the Prebuild node is moved out of prebuild.xml) * Autotools target: Various minor fixes * MonoDevelop Target : No changes. * Nant Target: Various minor fixes, support for net-3.5 and mono-2.0/3.5 targets * Sharpdevelop targets: No changes. * VS Targets: Refactored into using VSGenericTarget, and supports 2.0-3.5 * XCode Target: No changes. --- Regressions and outstanding issues --- * The Solution is assigned a random Guid - will lead to unnecessary reloads and loss of user settings. --- New features of Prebuild 2.0.4 --- * (Better) support for Web, WinForms and Database Projects and build actions * Conditional Framework Version compilation support (1.1, 2.0-3.5) * ArrayList -> List<>, ICollection -> IList (this means Prebuild can generate 1.1 solutions, but can't itself be built under 1.1 - how very meta) * Added preprocessor directive. --- Prebuild/AUTHORS | 5 +- Prebuild/ChangeLog | 87 ++ Prebuild/prebuild.xml | 2 +- Prebuild/scripts/VS2008.bat | 4 + .../src/Core/Attributes/DataNodeAttribute.cs | 11 +- .../Core/Attributes/OptionNodeAttribute.cs | 9 - .../src/Core/Attributes/TargetAttribute.cs | 9 - Prebuild/src/Core/FatalException.cs | 9 - Prebuild/src/Core/Interfaces/IDataNode.cs | 9 - Prebuild/src/Core/Interfaces/ITarget.cs | 9 - Prebuild/src/Core/Kernel.cs | 149 +-- Prebuild/src/Core/Nodes/AuthorNode.cs | 9 - Prebuild/src/Core/Nodes/ConfigurationNode.cs | 9 - Prebuild/src/Core/Nodes/DataNode.cs | 59 +- .../src/Core/Nodes/DatabaseProjectNode.cs | 94 ++ .../src/Core/Nodes/DatabaseReferenceNode.cs | 63 ++ Prebuild/src/Core/Nodes/DescriptionNode.cs | 9 - Prebuild/src/Core/Nodes/ExcludeNode.cs | 9 - Prebuild/src/Core/Nodes/FileNode.cs | 42 +- Prebuild/src/Core/Nodes/FilesNode.cs | 14 +- Prebuild/src/Core/Nodes/MatchNode.cs | 51 +- Prebuild/src/Core/Nodes/OptionsNode.cs | 11 - Prebuild/src/Core/Nodes/ProcessNode.cs | 9 - Prebuild/src/Core/Nodes/ProjectNode.cs | 169 ++-- Prebuild/src/Core/Nodes/ReferenceNode.cs | 9 - Prebuild/src/Core/Nodes/ReferencePathNode.cs | 9 - Prebuild/src/Core/Nodes/SolutionNode.cs | 118 ++- Prebuild/src/Core/Parse/IfContext.cs | 9 - Prebuild/src/Core/Parse/Preprocessor.cs | 272 +++--- Prebuild/src/Core/Targets/AutotoolsTarget.cs | 112 +-- Prebuild/src/Core/Targets/DebugTarget.cs | 2 +- .../src/Core/Targets/MonoDevelopTarget.cs | 9 - Prebuild/src/Core/Targets/NAntTarget.cs | 807 ++++++++-------- .../src/Core/Targets/SharpDevelop2Target.cs | 33 +- .../src/Core/Targets/SharpDevelopTarget.cs | 9 - Prebuild/src/Core/Targets/ToolInfo.cs | 197 ++++ Prebuild/src/Core/Targets/VS2002Target.cs | 9 - Prebuild/src/Core/Targets/VS2003Target.cs | 31 - Prebuild/src/Core/Targets/VS2005Target.cs | 843 +---------------- Prebuild/src/Core/Targets/VS2008Target.cs | 160 +++- Prebuild/src/Core/Targets/VSGenericTarget.cs | 881 ++++++++++++++++++ Prebuild/src/Core/Targets/VSVersion.cs | 50 + Prebuild/src/Core/Targets/XcodeTarget.cs | 9 - .../Core/Utilities/CommandLineCollection.cs | 9 - .../src/Core/Utilities/CurrentDirectory.cs | 9 - Prebuild/src/Core/Utilities/Helper.cs | 25 +- Prebuild/src/Core/Utilities/Log.cs | 9 - Prebuild/src/Prebuild.cs | 2 +- Prebuild/src/Properties/AssemblyInfo.cs | 11 +- Prebuild/src/data/prebuild-1.7.xsd | 120 ++- Prebuild/tests/Makefile | 24 + Prebuild/tests/README.txt | 5 + Prebuild/tests/include-001.expected | 46 + Prebuild/tests/include-001.include | 33 + Prebuild/tests/include-001.prebuild | 22 + Prebuild/tests/include-002-2.include | 8 + Prebuild/tests/include-002.expected | 26 + Prebuild/tests/include-002.include | 14 + Prebuild/tests/include-002.prebuild | 7 + bin/Prebuild.exe | Bin 212992 -> 237568 bytes prebuild.xml | 2 +- 61 files changed, 2801 insertions(+), 1991 deletions(-) create mode 100644 Prebuild/scripts/VS2008.bat create mode 100644 Prebuild/src/Core/Nodes/DatabaseProjectNode.cs create mode 100644 Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs create mode 100644 Prebuild/src/Core/Targets/ToolInfo.cs create mode 100644 Prebuild/src/Core/Targets/VSGenericTarget.cs create mode 100644 Prebuild/src/Core/Targets/VSVersion.cs create mode 100644 Prebuild/tests/Makefile create mode 100644 Prebuild/tests/README.txt create mode 100644 Prebuild/tests/include-001.expected create mode 100644 Prebuild/tests/include-001.include create mode 100644 Prebuild/tests/include-001.prebuild create mode 100644 Prebuild/tests/include-002-2.include create mode 100644 Prebuild/tests/include-002.expected create mode 100644 Prebuild/tests/include-002.include create mode 100644 Prebuild/tests/include-002.prebuild diff --git a/Prebuild/AUTHORS b/Prebuild/AUTHORS index d794c5ef22..9e86ac018f 100644 --- a/Prebuild/AUTHORS +++ b/Prebuild/AUTHORS @@ -4,4 +4,7 @@ Dan Moorehead (dan05a@gmail.com) Rob Loach (http://www.robloach.net) C.J. Adams-Collier (cjac@colliertech.org) - +Patch Contributers +lbsa71 +chi11ken +sdague diff --git a/Prebuild/ChangeLog b/Prebuild/ChangeLog index 89ddbe4ac6..bb8e7b09d8 100644 --- a/Prebuild/ChangeLog +++ b/Prebuild/ChangeLog @@ -1,3 +1,90 @@ +2008-12-09T02:15 D. Moonfire + * src/Core/Kernel.cs + - Added a /ppi target to get the results of processing but before + processing the actual results. + * src/Core/Preprocessor.cs + - Applied the patch from kanato with formatting changes. + - Uses the format. + * tests/ + - Added some lightweight tests to test the functionality of the + include patch. + +2008-06-19T09:37 John Anderson + * src/Core/Kernel.cs + - Only Loop through targets that are not abstract. + * src/Core/Targets/VSGenericTarget.cs + - Marked abstract and removed the Target attribute. + +2008-06-16T17:37 John Anderson + * src/Core/Nodes/ProjectNode.cs,data/prebuild-1.7.xsd + - Added the ability to hardcode guid's in the projects + +2008-05-21T0737 C.J. Adams-Collier + * src/Core/Targets/AutotoolsTarget.cs + - catch exception when unable to compile AssemblyInfo.cs + +2008-05-07T17:29 John Anderson + * src/Core/Targets/VSGenericTarget.cs + - Generate asp.net output in bin\ folder (asp.net requires it there) + +2008-04-30T17:29 John Anderson + * src/Core/Nodes/DatabaseReferenceNode.cs, + src/Core/Nodes/Datanode.cs, + src/Core/Nodes/FileNode.cs, + src/Core/Nodes/FileNodes.cs, + src/Core/Nodes/MatchNode.cs, + src/Core/Targets/VS2008Target.cs, + src/data/prebuild-1.7.xsd + - Refactored the project generation code to handle web projects and more + logically handle embedded resources and designer files. + +2008-04-30T17:29 Joseph Lombrozo + * src/Core/Nodes/SolutionNode.cs + - Had solutions inherit Configurations in the same way that Projects do. + +2008-04-29T06:35 Joseph Lombrozo + * src/Core/Targets/VS2008Target.cs, + src/Core/Nodes/DatabaseProjectNode.cs, + src/Core/Nodes/DatabaseReferenceNode.cs, + src/data/prebuild-1.7.xsd + - Added database references to database projects. + - Prevented nested solutions from being written to disk. + +2008-04-29T05:43 Joseph Lombrozo + * src/Core/Targets/VS2008Target.cs + - Enabled embedded solutions to contain Files. + +2008-04-29T04:13 Joseph Lombrozo + * src/Core/VSVersion.cs + - Fixed spelling mistake in enum comment. + * src/Core/Attributes/DataNodeAttribute.cs + - Allowed the DataNodeAttribute to be attached to a single class + more than once, allowing one class to be used to parse more than + one node at a time. + * src/Core/Kernel.cs + - Changed CacheNodeTypes() to allow for multiple DataNodeAttribute + instances in one class. Refactored ProcessFile(...) to return Solutions, + rather than adding them to the Kernel. + * src/Core/Nodes/SolutionNode.cs + - Added Guid (for embedded folders) + - Added DatabaseProjects, Solutions and Processes to the SolutionNode + when parsing. + * src/Core/Nodes/ProjectNode.cs + - Added FrameworkVersion property to allow for 2.0/3.0/3.5 differentiation. + * src/Core/Targets/VS2008Target.cs, src/data/prebuild-1.7.xsd + - Added ability to have embedded solutions, and externally referenced + prebuild scripts. + +2008-04-24T04:33 John M. Anderson + * src/Core/Targets/VS2003Target.cs, src/Core/Targets/VSVersion.cs + - Moved the VSVersion enum into its own file. + * src/Core/Targets/VS2008Target.cs + - added support for VS2008 + * src/Core/Nodes/ProjectNode.cs + - Added initial support for ASP.NET projects + * src/Core/Nodes/DatabaseProjectNode.cs + - Added support for Visual Studio database projects + 2008-02-19T07:08 C.J. Adams-Collier * TODO - added some tasks from Sam Hocevar diff --git a/Prebuild/prebuild.xml b/Prebuild/prebuild.xml index 8538e6945e..1f81086835 100644 --- a/Prebuild/prebuild.xml +++ b/Prebuild/prebuild.xml @@ -1,6 +1,6 @@ - + DEBUG;TRACE diff --git a/Prebuild/scripts/VS2008.bat b/Prebuild/scripts/VS2008.bat new file mode 100644 index 0000000000..b4656683ab --- /dev/null +++ b/Prebuild/scripts/VS2008.bat @@ -0,0 +1,4 @@ +@rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) +@rem for Microsoft Visual Studio .NET 2008 +cd .. +Prebuild.exe /target vs2008 /file prebuild.xml /pause diff --git a/Prebuild/src/Core/Attributes/DataNodeAttribute.cs b/Prebuild/src/Core/Attributes/DataNodeAttribute.cs index cdd0e0d37b..f1938a2e20 100644 --- a/Prebuild/src/Core/Attributes/DataNodeAttribute.cs +++ b/Prebuild/src/Core/Attributes/DataNodeAttribute.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Collections.Specialized; @@ -40,7 +31,7 @@ namespace Prebuild.Core.Attributes /// /// /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] public sealed class DataNodeAttribute : Attribute { #region Fields diff --git a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs index 5cefe684bf..2d6a6a7bfc 100644 --- a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs +++ b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; namespace Prebuild.Core.Attributes diff --git a/Prebuild/src/Core/Attributes/TargetAttribute.cs b/Prebuild/src/Core/Attributes/TargetAttribute.cs index b17cc5b206..5ad62ee033 100644 --- a/Prebuild/src/Core/Attributes/TargetAttribute.cs +++ b/Prebuild/src/Core/Attributes/TargetAttribute.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; namespace Prebuild.Core.Attributes diff --git a/Prebuild/src/Core/FatalException.cs b/Prebuild/src/Core/FatalException.cs index 784c35de8d..348790568f 100644 --- a/Prebuild/src/Core/FatalException.cs +++ b/Prebuild/src/Core/FatalException.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Runtime.Serialization; diff --git a/Prebuild/src/Core/Interfaces/IDataNode.cs b/Prebuild/src/Core/Interfaces/IDataNode.cs index 7583fd28cd..986dd2de8c 100644 --- a/Prebuild/src/Core/Interfaces/IDataNode.cs +++ b/Prebuild/src/Core/Interfaces/IDataNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Xml; diff --git a/Prebuild/src/Core/Interfaces/ITarget.cs b/Prebuild/src/Core/Interfaces/ITarget.cs index 77006d75e1..47115c658b 100644 --- a/Prebuild/src/Core/Interfaces/ITarget.cs +++ b/Prebuild/src/Core/Interfaces/ITarget.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; namespace Prebuild.Core.Interfaces diff --git a/Prebuild/src/Core/Kernel.cs b/Prebuild/src/Core/Kernel.cs index 1f0ad7043e..95ef04ee5c 100644 --- a/Prebuild/src/Core/Kernel.cs +++ b/Prebuild/src/Core/Kernel.cs @@ -36,16 +36,8 @@ POSSIBILITY OF SUCH DAMAGE. */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: cjcollier $ - * $Date: 2008-02-08 01:31:29 +0900 (Fri, 08 Feb 2008) $ - * $Revision: 256 $ - */ -#endregion - using System; +using System.Collections.Generic; using System.Diagnostics; using System.Collections; using System.Collections.Specialized; @@ -80,17 +72,17 @@ namespace Prebuild.Core #region Fields - private static Kernel m_Instance = new Kernel(); + private static readonly Kernel m_Instance = new Kernel(); /// /// This must match the version of the schema that is embeeded /// - private static string m_SchemaVersion = "1.7"; - private static string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; - private static string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; + private const string m_SchemaVersion = "1.7"; + private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; + private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; bool disposed; private Version m_Version; - private string m_Revision = ""; + private const string m_Revision = ""; private CommandLineCollection m_CommandLine; private Log m_Log; private CurrentDirectory m_CurrentWorkingDirectory; @@ -98,19 +90,16 @@ namespace Prebuild.Core private Hashtable m_Targets; private Hashtable m_Nodes; - - ArrayList m_Solutions; + + readonly List m_Solutions = new List(); string m_Target; string m_Clean; string[] m_RemoveDirectories; - string m_CurrentFile; - XmlDocument m_CurrentDoc; + XmlDocument m_CurrentDoc; bool m_PauseAfterFinish; string[] m_ProjectGroups; - StringCollection m_Refs; - - #endregion + #endregion #region Constructors @@ -210,7 +199,7 @@ namespace Prebuild.Core /// Gets the solutions. /// /// The solutions. - public ArrayList Solutions + public List Solutions { get { @@ -235,7 +224,7 @@ namespace Prebuild.Core #region Private Methods - private void RemoveDirectories(string rootDir, string[] dirNames) + private static void RemoveDirectories(string rootDir, string[] dirNames) { foreach(string dir in Directory.GetDirectories(rootDir)) { @@ -297,13 +286,15 @@ namespace Prebuild.Core foreach(Type t in assm.GetTypes()) { TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); - if(ta == null) - { - continue; - } + if(ta == null) + continue; + + if (t.IsAbstract) + continue; + ITarget target = (ITarget)assm.CreateInstance(t.FullName); - if(target == null) + if (target == null) { throw new MissingMethodException("Could not create ITarget instance"); } @@ -316,16 +307,13 @@ namespace Prebuild.Core { foreach(Type t in assm.GetTypes()) { - DataNodeAttribute dna = (DataNodeAttribute)Helper.CheckType(t, typeof(DataNodeAttribute), typeof(IDataNode)); - if(dna == null) - { - continue; - } - - NodeEntry ne = new NodeEntry(); - ne.Type = t; - ne.Attribute = dna; - m_Nodes[dna.Name] = ne; + foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) + { + NodeEntry ne = new NodeEntry(); + ne.Type = t; + ne.Attribute = dna; + m_Nodes[dna.Name] = ne; + } } } @@ -343,7 +331,32 @@ namespace Prebuild.Core m_Log.Write(); } - private void ProcessFile(string file) + + + private void ProcessFile(string file) + { + ProcessFile(file, this.m_Solutions); + } + + public void ProcessFile(ProcessNode node, SolutionNode parent) + { + if (node.IsValid) + { + List list = new List(); + ProcessFile(node.Path, list); + + foreach (SolutionNode solution in list) + parent.SolutionsTable[solution.Name] = solution; + } + } + + /// + /// + /// + /// + /// + /// + public void ProcessFile(string file, IList solutions) { m_CurrentWorkingDirectory.Push(); @@ -361,8 +374,7 @@ namespace Prebuild.Core return; } - m_CurrentFile = path; - Helper.SetCurrentDir(Path.GetDirectoryName(path)); + Helper.SetCurrentDir(Path.GetDirectoryName(path)); XmlTextReader reader = new XmlTextReader(path); @@ -379,6 +391,33 @@ namespace Prebuild.Core string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML + // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the + // output before the system processes it. + if (m_CommandLine.WasPassed("ppi")) + { + // Get the filename if there is one, otherwise use a default. + string ppiFile = m_CommandLine["ppi"]; + if (ppiFile == null || ppiFile.Trim().Length == 0) + { + ppiFile = "preprocessed-input.xml"; + } + + // Write out the string to the given stream. + try + { + using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) + { + ppiWriter.WriteLine(xml); + } + } + catch(IOException ex) + { + Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); + } + + // Finish processing this special tag. + return; + } m_CurrentDoc = new XmlDocument(); try @@ -443,7 +482,7 @@ namespace Prebuild.Core } else if(dataNode is SolutionNode) { - m_Solutions.Add(dataNode); + solutions.Add((SolutionNode)dataNode); } } } @@ -527,7 +566,7 @@ namespace Prebuild.Core /// public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) { - IDataNode dataNode = null; + IDataNode dataNode; try { @@ -629,9 +668,6 @@ namespace Prebuild.Core m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); LoadSchema(); - - m_Solutions = new ArrayList(); - m_Refs = new StringCollection(); } /// @@ -664,17 +700,18 @@ namespace Prebuild.Core m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); return; } - else if(m_Target == null && m_Clean == null) - { - if(perfomedOtherTask) //finished - { - return; - } - m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); - return; - } + + if(m_Target == null && m_Clean == null) + { + if(perfomedOtherTask) //finished + { + return; + } + m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); + return; + } - string file = "./prebuild.xml"; + string file = "./prebuild.xml"; if(m_CommandLine.WasPassed("file")) { file = m_CommandLine["file"]; diff --git a/Prebuild/src/Core/Nodes/AuthorNode.cs b/Prebuild/src/Core/Nodes/AuthorNode.cs index 03ea9348cf..20e72c01f1 100644 --- a/Prebuild/src/Core/Nodes/AuthorNode.cs +++ b/Prebuild/src/Core/Nodes/AuthorNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source $ - * $Author: $ - * $Date: $ - * $Revision: $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Nodes/ConfigurationNode.cs b/Prebuild/src/Core/Nodes/ConfigurationNode.cs index 828bff6195..67d78d55fd 100644 --- a/Prebuild/src/Core/Nodes/ConfigurationNode.cs +++ b/Prebuild/src/Core/Nodes/ConfigurationNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Xml; diff --git a/Prebuild/src/Core/Nodes/DataNode.cs b/Prebuild/src/Core/Nodes/DataNode.cs index 60ed122213..763e6c3831 100644 --- a/Prebuild/src/Core/Nodes/DataNode.cs +++ b/Prebuild/src/Core/Nodes/DataNode.cs @@ -23,31 +23,24 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Xml; using Prebuild.Core.Attributes; using Prebuild.Core.Interfaces; +using System.IO; namespace Prebuild.Core.Nodes { /// /// /// - public class DataNode : IDataNode + public abstract class DataNode : IDataNode { #region Fields private IDataNode parent; + string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; #endregion @@ -68,7 +61,10 @@ namespace Prebuild.Core.Nodes parent = value; } } - + public string[] WebTypes + { + get { return m_WebTypes; } + } /// /// Parses the specified node. /// @@ -76,7 +72,46 @@ namespace Prebuild.Core.Nodes public virtual void Parse(XmlNode node) { } - + public BuildAction GetBuildActionByFileName(string fileName) + { + string extension = Path.GetExtension(fileName).ToLower(); + foreach (string type in WebTypes) + { + if (extension == type) + return BuildAction.Content; + } + return BuildAction.Compile; + } + /// + /// Parses the file type to figure out what type it is + /// + /// + public SubType GetSubTypeByFileName(string fileName) + { + string extension = System.IO.Path.GetExtension(fileName).ToLower(); + string designer = String.Format(".designer{0}", extension); + string path = fileName.ToLower(); + if (extension == ".resx") + { + return SubType.Designer; + } + else if (path.EndsWith(".settings")) + { + return SubType.Settings; + } + else + { + + foreach (string type in WebTypes) + { + if (path.EndsWith(string.Format("{0}{1}", type, extension))) + { + return SubType.CodeBehind; + } + } + } + return SubType.Code; + } #endregion } } diff --git a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs new file mode 100644 index 0000000000..8696a79164 --- /dev/null +++ b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseProject")] + public class DatabaseProjectNode : DataNode + { + string name; + string path; + string fullpath; + Guid guid = Guid.NewGuid(); + readonly List authors = new List(); + readonly List references = new List(); + + public Guid Guid + { + get { return guid; } + } + + public string Name + { + get { return name; } + } + + public string Path + { + get { return path; } + } + + public string FullPath + { + get { return fullpath; } + } + + public IEnumerable References + { + get { return references; } + } + + public override void Parse(XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + path = Helper.AttributeValue(node, "path", name); + + try + { + fullpath = Helper.ResolvePath(path); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + + try + { + Helper.SetCurrentDir(fullpath); + + if (node == null) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + + if (dataNode == null) + continue; + + if (dataNode is AuthorNode) + authors.Add((AuthorNode)dataNode); + else if (dataNode is DatabaseReferenceNode) + references.Add((DatabaseReferenceNode)dataNode); + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs new file mode 100644 index 0000000000..97c3964b8e --- /dev/null +++ b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs @@ -0,0 +1,63 @@ +using System; +using Prebuild.Core.Attributes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseReference")] + public class DatabaseReferenceNode : DataNode + { + string name; + Guid providerId; + string connectionString; + + public string Name + { + get { return name; } + } + + public Guid ProviderId + { + get { return providerId; } + } + + public string ConnectionString + { + get { return connectionString; } + } + + public override void Parse(System.Xml.XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + + string providerName = Helper.AttributeValue(node, "providerName", string.Empty); + if (providerName != null) + { + switch (providerName) + { + // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* + // Not sure if these will help other operating systems, or if there's a better way. + case "Microsoft.SqlServerCe.Client.3.5": + providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; + case "System.Data.OleDb": + providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; + case "System.Data.OracleClient": + providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; + case "System.Data.SqlClient": + providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; + case "System.Data.Odbc": + providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; + + default: + throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); + } + } + else + providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); + + connectionString = Helper.AttributeValue(node, "connectionString", connectionString); + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/DescriptionNode.cs b/Prebuild/src/Core/Nodes/DescriptionNode.cs index cff7afc126..353a5aec07 100644 --- a/Prebuild/src/Core/Nodes/DescriptionNode.cs +++ b/Prebuild/src/Core/Nodes/DescriptionNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source $ - * $Author: $ - * $Date: $ - * $Revision: $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Nodes/ExcludeNode.cs b/Prebuild/src/Core/Nodes/ExcludeNode.cs index afc869d18b..7f04cba72f 100644 --- a/Prebuild/src/Core/Nodes/ExcludeNode.cs +++ b/Prebuild/src/Core/Nodes/ExcludeNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: borrillis $ - * $Date: 2007-05-25 01:03:16 +0900 (Fri, 25 May 2007) $ - * $Revision: 243 $ - */ -#endregion - using System; using System.Xml; diff --git a/Prebuild/src/Core/Nodes/FileNode.cs b/Prebuild/src/Core/Nodes/FileNode.cs index 083dba5dfd..1520fcb789 100644 --- a/Prebuild/src/Core/Nodes/FileNode.cs +++ b/Prebuild/src/Core/Nodes/FileNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: borrillis $ - * $Date: 2007-05-25 01:03:16 +0900 (Fri, 25 May 2007) $ - * $Revision: 243 $ - */ -#endregion - using System; using System.IO; using System.Xml; @@ -39,6 +30,7 @@ using System.Xml; using Prebuild.Core.Attributes; using Prebuild.Core.Interfaces; using Prebuild.Core.Utilities; +using Prebuild.Core.Targets; namespace Prebuild.Core.Nodes { @@ -93,7 +85,11 @@ namespace Prebuild.Core.Nodes /// /// /// - UserControl + UserControl, + /// + /// + /// + CodeBehind, } public enum CopyToOutput @@ -113,9 +109,9 @@ namespace Prebuild.Core.Nodes private string m_Path; private string m_ResourceName = ""; - private BuildAction m_BuildAction = BuildAction.Compile; + private BuildAction? m_BuildAction; private bool m_Valid; - private SubType m_SubType = SubType.Code; + private SubType? m_SubType; private CopyToOutput m_CopyToOutput = CopyToOutput.Never; private bool m_Link = false; private string m_LinkPath = string.Empty; @@ -155,7 +151,11 @@ namespace Prebuild.Core.Nodes { get { - return m_BuildAction; + if (m_BuildAction != null) + return m_BuildAction.Value; + else + return GetBuildActionByFileName(this.Path); + } } @@ -189,7 +189,10 @@ namespace Prebuild.Core.Nodes { get { - return m_SubType; + if (m_SubType != null) + return m_SubType.Value; + else + return GetSubTypeByFileName(this.Path); } } @@ -227,10 +230,13 @@ namespace Prebuild.Core.Nodes /// public override void Parse(XmlNode node) { - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), - Helper.AttributeValue(node, "buildAction", m_BuildAction.ToString())); - m_SubType = (SubType)Enum.Parse(typeof(SubType), - Helper.AttributeValue(node, "subType", m_SubType.ToString())); + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + string subType = Helper.AttributeValue(node, "subType", string.Empty); + if (subType != String.Empty) + m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); if ( this.m_Link == true ) diff --git a/Prebuild/src/Core/Nodes/FilesNode.cs b/Prebuild/src/Core/Nodes/FilesNode.cs index 7c1dd19741..dc306c2252 100644 --- a/Prebuild/src/Core/Nodes/FilesNode.cs +++ b/Prebuild/src/Core/Nodes/FilesNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: borrillis $ - * $Date: 2007-05-25 01:03:16 +0900 (Fri, 25 May 2007) $ - * $Revision: 243 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; @@ -39,6 +30,7 @@ using System.Xml; using Prebuild.Core.Attributes; using Prebuild.Core.Interfaces; +using System.IO; namespace Prebuild.Core.Nodes { @@ -224,8 +216,8 @@ namespace Prebuild.Core.Nodes if (!m_Files.Contains(file)) { m_Files.Add(file); - m_BuildActions[ file ] = matchNode.BuildAction; - m_SubTypes[ file ] = matchNode.SubType; + m_BuildActions[ file ] = matchNode.BuildAction == null ? GetBuildActionByFileName(file) : matchNode.BuildAction; + m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; m_ResourceNames[ file ] = matchNode.ResourceName; this.m_PreservePaths[ file ] = matchNode.PreservePath; this.m_Links[ file ] = matchNode.IsLink; diff --git a/Prebuild/src/Core/Nodes/MatchNode.cs b/Prebuild/src/Core/Nodes/MatchNode.cs index aeaf3c15ae..656d7d0718 100644 --- a/Prebuild/src/Core/Nodes/MatchNode.cs +++ b/Prebuild/src/Core/Nodes/MatchNode.cs @@ -23,16 +23,8 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: borrillis $ - * $Date: 2007-05-25 01:03:16 +0900 (Fri, 25 May 2007) $ - * $Revision: 243 $ - */ -#endregion - using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Text.RegularExpressions; @@ -53,29 +45,16 @@ namespace Prebuild.Core.Nodes { #region Fields - private StringCollection m_Files; + private readonly StringCollection m_Files = new StringCollection(); private Regex m_Regex; - private BuildAction m_BuildAction = BuildAction.Compile; - private SubType m_SubType = SubType.Code; + private BuildAction? m_BuildAction; + private SubType? m_SubType; string m_ResourceName = ""; private CopyToOutput m_CopyToOutput; private bool m_Link; private string m_LinkPath; private bool m_PreservePath; - private ArrayList m_Exclusions; - - #endregion - - #region Constructors - - /// - /// - /// - public MatchNode() - { - m_Files = new StringCollection(); - m_Exclusions = new ArrayList(); - } + private readonly List m_Exclusions = new List(); #endregion @@ -95,7 +74,7 @@ namespace Prebuild.Core.Nodes /// /// /// - public BuildAction BuildAction + public BuildAction? BuildAction { get { @@ -106,7 +85,7 @@ namespace Prebuild.Core.Nodes /// /// /// - public SubType SubType + public SubType? SubType { get { @@ -167,7 +146,7 @@ namespace Prebuild.Core.Nodes /// The pattern. /// if set to true [recurse]. /// if set to true [use regex]. - private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, ArrayList exclusions) + private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List exclusions) { Match match; Boolean excludeFile; @@ -279,10 +258,14 @@ namespace Prebuild.Core.Nodes string pattern = Helper.AttributeValue(node, "pattern", "*"); bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); - m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), - Helper.AttributeValue(node, "buildAction", m_BuildAction.ToString())); - m_SubType = (SubType)Enum.Parse(typeof(SubType), - Helper.AttributeValue(node, "subType", m_SubType.ToString())); + string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); + if (buildAction != string.Empty) + m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); + + //TODO: Figure out where the subtype node is being assigned + //string subType = Helper.AttributeValue(node, "subType", string.Empty); + //if (subType != String.Empty) + // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); @@ -329,7 +312,7 @@ namespace Prebuild.Core.Nodes if(dataNode is ExcludeNode) { ExcludeNode excludeNode = (ExcludeNode)dataNode; - m_Exclusions.Add( dataNode ); + m_Exclusions.Add( excludeNode ); } } diff --git a/Prebuild/src/Core/Nodes/OptionsNode.cs b/Prebuild/src/Core/Nodes/OptionsNode.cs index 651c33900d..b63034bfe8 100644 --- a/Prebuild/src/Core/Nodes/OptionsNode.cs +++ b/Prebuild/src/Core/Nodes/OptionsNode.cs @@ -23,17 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-01-09 01:55:40 +0900 (Tue, 09 Jan 2007) $ - * $Revision: 197 $ - */ -#endregion - - - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Nodes/ProcessNode.cs b/Prebuild/src/Core/Nodes/ProcessNode.cs index 2d2162c1cc..6bfbe16be3 100644 --- a/Prebuild/src/Core/Nodes/ProcessNode.cs +++ b/Prebuild/src/Core/Nodes/ProcessNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Nodes/ProjectNode.cs b/Prebuild/src/Core/Nodes/ProjectNode.cs index e98ab5f544..0a24abf2f9 100644 --- a/Prebuild/src/Core/Nodes/ProjectNode.cs +++ b/Prebuild/src/Core/Nodes/ProjectNode.cs @@ -23,17 +23,9 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-05-26 06:58:26 +0900 (Sat, 26 May 2007) $ - * $Revision: 244 $ - */ -#endregion - using System; using System.Collections; +using System.Collections.Generic; using System.IO; using System.Xml; @@ -59,7 +51,11 @@ namespace Prebuild.Core.Nodes /// /// The project is a library /// - Library + Library, + /// + /// The project is a website + /// + Web, } /// @@ -76,7 +72,25 @@ namespace Prebuild.Core.Nodes /// Mono } - + /// + /// The version of the .NET framework to use (Required for VS2008) + /// We don't need .NET 1.1 in here, it'll default when using vs2003. + /// + public enum FrameworkVersion + { + /// + /// .NET 2.0 + /// + v2_0, + /// + /// .NET 3.0 + /// + v3_0, + /// + /// .NET 3.5 + /// + v3_5, + } /// /// The Node object representing /Prebuild/Solution/Project elements /// @@ -95,35 +109,22 @@ namespace Prebuild.Core.Nodes private string m_Language = "C#"; private ProjectType m_Type = ProjectType.Exe; private ClrRuntime m_Runtime = ClrRuntime.Microsoft; + private FrameworkVersion m_Framework = FrameworkVersion.v2_0; private string m_StartupObject = ""; private string m_RootNamespace; private string m_FilterGroups = ""; private string m_Version = ""; private Guid m_Guid; + private string m_DebugStartParameters; - private Hashtable m_Configurations; - private ArrayList m_ReferencePaths; - private ArrayList m_References; - private ArrayList m_Authors; + private Hashtable m_Configurations = new Hashtable(); + private readonly List m_ReferencePaths = new List(); + private readonly List m_References = new List(); + private readonly List m_Authors = new List(); private FilesNode m_Files; #endregion - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public ProjectNode() - { - m_Configurations = new Hashtable(); - m_ReferencePaths = new ArrayList(); - m_References = new ArrayList(); - m_Authors = new ArrayList(); - } - - #endregion - #region Properties /// @@ -134,10 +135,19 @@ namespace Prebuild.Core.Nodes { get { - return m_Name; + return m_Name; + } + } + /// + /// The version of the .NET Framework to compile under + /// + public FrameworkVersion FrameworkVersion + { + get + { + return this.m_Framework; } } - /// /// Gets the path. /// @@ -210,17 +220,17 @@ namespace Prebuild.Core.Nodes } } - /// - /// Gets the app icon. - /// - /// The app icon. - public string ConfigFile - { - get - { - return m_ConfigFile; - } - } + /// + /// Gets the app icon. + /// + /// The app icon. + public string ConfigFile + { + get + { + return m_ConfigFile; + } + } /// /// @@ -269,22 +279,22 @@ namespace Prebuild.Core.Nodes } } - private bool m_GenerateAssemblyInfoFile = false; - - /// - /// - /// - public bool GenerateAssemblyInfoFile - { - get - { - return m_GenerateAssemblyInfoFile; - } - set - { - m_GenerateAssemblyInfoFile = value; - } - } + private bool m_GenerateAssemblyInfoFile = false; + + /// + /// + /// + public bool GenerateAssemblyInfoFile + { + get + { + return m_GenerateAssemblyInfoFile; + } + set + { + m_GenerateAssemblyInfoFile = value; + } + } /// /// Gets the startup object. @@ -314,7 +324,7 @@ namespace Prebuild.Core.Nodes /// Gets the configurations. /// /// The configurations. - public ICollection Configurations + public IList Configurations { get { @@ -340,11 +350,11 @@ namespace Prebuild.Core.Nodes /// Gets the reference paths. /// /// The reference paths. - public ArrayList ReferencePaths + public List ReferencePaths { get { - ArrayList tmp = new ArrayList(m_ReferencePaths); + List tmp = new List(m_ReferencePaths); tmp.Sort(); return tmp; } @@ -354,11 +364,11 @@ namespace Prebuild.Core.Nodes /// Gets the references. /// /// The references. - public ArrayList References + public List References { get { - ArrayList tmp = new ArrayList(m_References); + List tmp = new List(m_References); tmp.Sort(); return tmp; } @@ -368,7 +378,7 @@ namespace Prebuild.Core.Nodes /// Gets the Authors list. /// /// The list of the project's authors. - public ArrayList Authors + public List Authors { get { @@ -424,7 +434,15 @@ namespace Prebuild.Core.Nodes } } - #endregion + public string DebugStartParameters + { + get + { + return m_DebugStartParameters; + } + } + + #endregion #region Private Methods @@ -470,13 +488,18 @@ namespace Prebuild.Core.Nodes m_Language = Helper.AttributeValue(node, "language", m_Language); m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); + m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); - m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); - + int hash = m_Name.GetHashCode(); - m_Guid = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString()); + m_Guid = new Guid(guid); + m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); + m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty); + if(m_AssemblyName == null || m_AssemblyName.Length < 1) { m_AssemblyName = m_Name; @@ -516,15 +539,15 @@ namespace Prebuild.Core.Nodes } else if(dataNode is ReferencePathNode) { - m_ReferencePaths.Add(dataNode); + m_ReferencePaths.Add((ReferencePathNode)dataNode); } else if(dataNode is ReferenceNode) { - m_References.Add(dataNode); + m_References.Add((ReferenceNode)dataNode); } else if(dataNode is AuthorNode) { - m_Authors.Add(dataNode); + m_Authors.Add((AuthorNode)dataNode); } else if(dataNode is FilesNode) { @@ -548,6 +571,6 @@ namespace Prebuild.Core.Nodes return this.m_Name.CompareTo(that.m_Name); } - #endregion + #endregion } } diff --git a/Prebuild/src/Core/Nodes/ReferenceNode.cs b/Prebuild/src/Core/Nodes/ReferenceNode.cs index df0c2e4276..9c5d1a3491 100644 --- a/Prebuild/src/Core/Nodes/ReferenceNode.cs +++ b/Prebuild/src/Core/Nodes/ReferenceNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-07-26 01:56:49 +0900 (Wed, 26 Jul 2006) $ - * $Revision: 132 $ - */ -#endregion - using System; using System.Xml; diff --git a/Prebuild/src/Core/Nodes/ReferencePathNode.cs b/Prebuild/src/Core/Nodes/ReferencePathNode.cs index d4042ef1d5..f0543c267e 100644 --- a/Prebuild/src/Core/Nodes/ReferencePathNode.cs +++ b/Prebuild/src/Core/Nodes/ReferencePathNode.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Nodes/SolutionNode.cs b/Prebuild/src/Core/Nodes/SolutionNode.cs index 9473fe6759..2a1b8e2c55 100644 --- a/Prebuild/src/Core/Nodes/SolutionNode.cs +++ b/Prebuild/src/Core/Nodes/SolutionNode.cs @@ -23,17 +23,9 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-03-01 01:15:42 +0900 (Wed, 01 Mar 2006) $ - * $Revision: 92 $ - */ -#endregion - using System; using System.Collections; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Xml; @@ -48,40 +40,62 @@ namespace Prebuild.Core.Nodes /// /// [DataNode("Solution")] + [DataNode("EmbeddedSolution")] + [DebuggerDisplay("{Name}")] public class SolutionNode : DataNode { #region Fields - + + private Guid m_Guid = Guid.NewGuid(); private string m_Name = "unknown"; private string m_Path = ""; private string m_FullPath = ""; private string m_ActiveConfig = "Debug"; private string m_Version = "1.0.0"; - + private OptionsNode m_Options; private FilesNode m_Files; - private Hashtable m_Configurations; - private Hashtable m_Projects; - private ArrayList m_ProjectsOrder; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public SolutionNode() - { - m_Configurations = new Hashtable(); - m_Projects = new Hashtable(); - m_ProjectsOrder = new ArrayList(); - } + private readonly Hashtable m_Configurations = new Hashtable(); + private readonly Hashtable m_Projects = new Hashtable(); + private readonly Hashtable m_DatabaseProjects = new Hashtable(); + private readonly List m_ProjectsOrder = new List(); + private readonly Hashtable m_Solutions = new Hashtable(); #endregion #region Properties + public override IDataNode Parent + { + get + { + return base.Parent; + } + set + { + if (value is SolutionNode) + { + SolutionNode solution = (SolutionNode)value; + foreach (ConfigurationNode conf in solution.Configurations) + { + m_Configurations[conf.Name] = conf.Clone(); + } + } + base.Parent = value; + } + } + + public Guid Guid + { + get + { + return m_Guid; + } + set + { + m_Guid = value; + } + } /// /// Gets or sets the active config. /// @@ -195,7 +209,36 @@ namespace Prebuild.Core.Nodes return m_Configurations; } } - + /// + /// Gets the database projects. + /// + public ICollection DatabaseProjects + { + get + { + return m_DatabaseProjects.Values; + } + } + /// + /// Gets the nested solutions. + /// + public ICollection Solutions + { + get + { + return m_Solutions.Values; + } + } + /// + /// Gets the nested solutions hash table. + /// + public Hashtable SolutionsTable + { + get + { + return this.m_Solutions; + } + } /// /// Gets the projects. /// @@ -226,7 +269,7 @@ namespace Prebuild.Core.Nodes /// Gets the projects table. /// /// The projects table. - public ArrayList ProjectsTableOrder + public List ProjectsTableOrder { get { @@ -287,8 +330,21 @@ namespace Prebuild.Core.Nodes else if(dataNode is ProjectNode) { m_Projects[((ProjectNode)dataNode).Name] = dataNode; - m_ProjectsOrder.Add(dataNode); + m_ProjectsOrder.Add((ProjectNode)dataNode); } + else if(dataNode is SolutionNode) + { + m_Solutions[((SolutionNode)dataNode).Name] = dataNode; + } + else if (dataNode is ProcessNode) + { + ProcessNode p = (ProcessNode)dataNode; + Kernel.Instance.ProcessFile(p, this); + } + else if (dataNode is DatabaseProjectNode) + { + m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = dataNode; + } } } finally diff --git a/Prebuild/src/Core/Parse/IfContext.cs b/Prebuild/src/Core/Parse/IfContext.cs index fc868854e4..3c79d38b06 100644 --- a/Prebuild/src/Core/Parse/IfContext.cs +++ b/Prebuild/src/Core/Parse/IfContext.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; namespace Prebuild.Core.Parse diff --git a/Prebuild/src/Core/Parse/Preprocessor.cs b/Prebuild/src/Core/Parse/Preprocessor.cs index eea5c30b6e..013f8e1e6a 100644 --- a/Prebuild/src/Core/Parse/Preprocessor.cs +++ b/Prebuild/src/Core/Parse/Preprocessor.cs @@ -23,18 +23,10 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-04-26 17:10:27 +0900 (Thu, 26 Apr 2007) $ - * $Revision: 236 $ - */ -#endregion - using System; using System.Collections; using System.IO; +using System.Text.RegularExpressions; using System.Xml; namespace Prebuild.Core.Parse @@ -79,6 +71,16 @@ namespace Prebuild.Core.Parse /// public class Preprocessor { + #region Constants + + /// + /// Includes the regex to look for file tags in the processing instruction. + /// + private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); + + #endregion + #region Fields XmlDocument m_OutDoc; @@ -138,10 +140,10 @@ namespace Prebuild.Core.Parse return "Win32"; } - if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) - { - return "MACOSX"; - } + if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) + { + return "MACOSX"; + } /* * .NET 1.x, under Mono, the UNIX code is 128. Under @@ -236,7 +238,7 @@ namespace Prebuild.Core.Parse OperatorSymbol oper = OperatorSymbol.None; bool inStr = false; char c; - + for(int i = 0; i < exp.Length; i++) { c = exp[i]; @@ -283,7 +285,7 @@ namespace Prebuild.Core.Parse { oper = OperatorSymbol.NotEqual; } - + break; case '<': @@ -295,7 +297,7 @@ namespace Prebuild.Core.Parse { oper = OperatorSymbol.LessThan; } - + break; case '>': @@ -314,7 +316,7 @@ namespace Prebuild.Core.Parse } } - + if(inStr) { throw new WarningException("Expected end of string in expression"); @@ -392,9 +394,9 @@ namespace Prebuild.Core.Parse /// For invalid use of conditional expressions or for invalid XML syntax. If a XmlValidatingReader is passed, then will also throw exceptions for non-schema-conforming xml /// /// the output xml - public string Process(XmlReader reader) + public string Process(XmlReader initialReader) { - if(reader == null) + if(initialReader == null) { throw new ArgumentException("Invalid XML reader to pre-process"); } @@ -403,119 +405,175 @@ namespace Prebuild.Core.Parse StringWriter xmlText = new StringWriter(); XmlTextWriter writer = new XmlTextWriter(xmlText); writer.Formatting = Formatting.Indented; - while(reader.Read()) + + // Create a queue of XML readers and add the initial + // reader to it. Then we process until we run out of + // readers which lets the operation add more + // readers to generate a multi-file parser and not require + // XML fragments that a recursive version would use. + Stack readerStack = new Stack(); + readerStack.Push(initialReader); + + while(readerStack.Count > 0) { - if(reader.NodeType == XmlNodeType.ProcessingInstruction) + // Pop off the next reader. + XmlReader reader = (XmlReader) readerStack.Pop(); + + // Process through this XML reader until it is + // completed (or it is replaced by the include + // operation). + while(reader.Read()) { - bool ignore = false; - switch(reader.LocalName) + // The prebuild file has a series of processing + // instructions which allow for specific + // inclusions based on operating system or to + // include additional files. + if(reader.NodeType == XmlNodeType.ProcessingInstruction) { - case "if": - m_IfStack.Push(context); - context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); - ignore = true; - break; + bool ignore = false; - case "elseif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } - else if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'elseif' outside of 'if'"); - } + switch(reader.LocalName) + { + case "include": + // use regular expressions to parse out the attributes. + MatchCollection matches = includeFileRegex.Matches(reader.Value); + + // make sure there is only one file attribute. + if(matches.Count > 1) + { + throw new WarningException("An node was found, but it specified more than one file."); + } - context.State = IfState.ElseIf; - if(!context.EverKept) - { - context.Keep = ParseExpression(reader.Value); - } - else - { - context.Keep = false; - } + if(matches.Count == 0) + { + throw new WarningException("An node was found, but it did not specify the file attribute."); + } + + // Pull the file out from the regex and make sure it is a valid file before using it. + string filename = matches[0].Groups[1].Value; + FileInfo includeFile = new FileInfo(filename); - ignore = true; - break; + if(!includeFile.Exists) + { + throw new WarningException("Cannot include file: " + includeFile.FullName); + } - case "else": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } - else if(context.State != IfState.If && context.State != IfState.ElseIf) - { - throw new WarningException("Unexpected 'else' outside of 'if'"); - } + // Create a new reader object for this file. Then put the old reader back on the stack and start + // processing using this new XML reader. + XmlReader newReader = new XmlTextReader(includeFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)); - context.State = IfState.Else; - context.Keep = !context.EverKept; - ignore = true; - break; + readerStack.Push(reader); + reader = newReader; + ignore = true; + break; - case "endif": - if(m_IfStack.Count == 0) - { - throw new WarningException("Unexpected 'endif' outside of 'if'"); - } + case "if": + m_IfStack.Push(context); + context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); + ignore = true; + break; - context = (IfContext)m_IfStack.Pop(); - ignore = true; - break; - } + case "elseif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } + else if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'elseif' outside of 'if'"); + } - if(ignore) + context.State = IfState.ElseIf; + if(!context.EverKept) + { + context.Keep = ParseExpression(reader.Value); + } + else + { + context.Keep = false; + } + + ignore = true; + break; + + case "else": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + else if(context.State != IfState.If && context.State != IfState.ElseIf) + { + throw new WarningException("Unexpected 'else' outside of 'if'"); + } + + context.State = IfState.Else; + context.Keep = !context.EverKept; + ignore = true; + break; + + case "endif": + if(m_IfStack.Count == 0) + { + throw new WarningException("Unexpected 'endif' outside of 'if'"); + } + + context = (IfContext)m_IfStack.Pop(); + ignore = true; + break; + } + + if(ignore) + { + continue; + } + }//end pre-proc instruction + + if(!context.Active || !context.Keep) { continue; } - }//end pre-proc instruction - if(!context.Active || !context.Keep) - { - continue; - } + switch(reader.NodeType) + { + case XmlNodeType.Element: + bool empty = reader.IsEmptyElement; + writer.WriteStartElement(reader.Name); - switch(reader.NodeType) - { - case XmlNodeType.Element: - bool empty = reader.IsEmptyElement; - writer.WriteStartElement(reader.Name); + while (reader.MoveToNextAttribute()) + { + writer.WriteAttributeString(reader.Name, reader.Value); + } - while (reader.MoveToNextAttribute()) - { - writer.WriteAttributeString(reader.Name, reader.Value); - } + if(empty) + { + writer.WriteEndElement(); + } + + break; - if(empty) - { + case XmlNodeType.EndElement: writer.WriteEndElement(); - } - - break; + break; - case XmlNodeType.EndElement: - writer.WriteEndElement(); - break; + case XmlNodeType.Text: + writer.WriteString(reader.Value); + break; - case XmlNodeType.Text: - writer.WriteString(reader.Value); - break; + case XmlNodeType.CDATA: + writer.WriteCData(reader.Value); + break; - case XmlNodeType.CDATA: - writer.WriteCData(reader.Value); - break; + default: + break; + } + } - default: - break; + if(m_IfStack.Count != 0) + { + throw new WarningException("Mismatched 'if', 'endif' pair"); } } - - if(m_IfStack.Count != 0) - { - throw new WarningException("Mismatched 'if', 'endif' pair"); - } - + return xmlText.ToString(); } diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs index f102038ada..5dcbb38269 100644 --- a/Prebuild/src/Core/Targets/AutotoolsTarget.cs +++ b/Prebuild/src/Core/Targets/AutotoolsTarget.cs @@ -65,18 +65,9 @@ POSSIBILITY OF SUCH DAMAGE. */ #endregion - -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-07-28 22:43:24 -0700 (Fri, 28 Jul 2006) $ - * $Revision: 136 $ - */ -#endregion - using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Reflection; @@ -182,8 +173,7 @@ namespace Prebuild.Core.Targets Hashtable assemblyPathToPackage = new Hashtable(); Hashtable assemblyFullNameToPath = new Hashtable(); Hashtable packagesHash = new Hashtable(); - ArrayList packages = new ArrayList(); - ClrVersion currentVersion; + readonly List packages = new List(); #endregion @@ -203,22 +193,6 @@ namespace Prebuild.Core.Targets di.Create(); } - private void mkStubFiles(string dirName, ArrayList fileNames) - { - for (int i = 0; i < fileNames.Count; i++) - { - string tmpFile = dirName + "/" + (string)fileNames[i]; - - FileStream tmpFileStream = - new FileStream(tmpFile, FileMode.Create); - - StreamWriter sw = new StreamWriter(tmpFileStream); - sw.WriteLine("These are not the files you are looking for."); - sw.Flush(); - tmpFileStream.Close(); - } - } - private void chkMkDir(string dirName) { System.IO.DirectoryInfo di = @@ -273,11 +247,11 @@ namespace Prebuild.Core.Targets } } - private ArrayList GetAssembliesWithLibInfo(string line, string file) + private List GetAssembliesWithLibInfo(string line, string file) { - ArrayList references = new ArrayList(); - ArrayList libdirs = new ArrayList(); - ArrayList retval = new ArrayList(); + List references = new List(); + List libdirs = new List(); + List retval = new List(); foreach (string piece in line.Split(' ')) { if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) @@ -304,9 +278,9 @@ namespace Prebuild.Core.Targets return retval; } - private ArrayList GetAssembliesWithoutLibInfo(string line, string file) + private List GetAssembliesWithoutLibInfo(string line, string file) { - ArrayList references = new ArrayList(); + List references = new List(); foreach (string reference in line.Split(' ')) { if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) @@ -356,7 +330,7 @@ namespace Prebuild.Core.Targets if (packagesHash.Contains(pname)) return; - ArrayList fullassemblies = null; + List fullassemblies = null; string version = ""; string desc = ""; @@ -404,7 +378,7 @@ namespace Prebuild.Core.Targets package.Initialize(pname, version, desc, - (string[])fullassemblies.ToArray(typeof(string)), + fullassemblies.ToArray(), ClrVersion.Default, false); packages.Add(package); @@ -414,7 +388,7 @@ namespace Prebuild.Core.Targets void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) { SystemPackage package = new SystemPackage(); - ArrayList list = new ArrayList(); + List list = new List(); string dir = Path.Combine(prefix, version); if (!Directory.Exists(dir)) @@ -431,7 +405,7 @@ namespace Prebuild.Core.Targets package.Initialize("mono", version, "The Mono runtime", - (string[])list.ToArray(typeof(string)), + list.ToArray(), ver, false); packages.Add(package); @@ -444,12 +418,10 @@ namespace Prebuild.Core.Targets if (Environment.Version.Major == 1) { versionDir = "1.0"; - currentVersion = ClrVersion.Net_1_1; } else { versionDir = "2.0"; - currentVersion = ClrVersion.Net_2_0; } //Pull up assemblies from the installed mono system. @@ -483,9 +455,9 @@ namespace Prebuild.Core.Targets } } search_dirs += Path.PathSeparator + libpath; - if (search_dirs != null && search_dirs.Length > 0) + if (!string.IsNullOrEmpty(search_dirs)) { - ArrayList scanDirs = new ArrayList(); + List scanDirs = new List(); foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) { if (!scanDirs.Contains(potentialDir)) @@ -763,20 +735,22 @@ namespace Prebuild.Core.Targets bool hasAssemblyConfig = false; chkMkDir(projectDir); - ArrayList - compiledFiles = new ArrayList(), - contentFiles = new ArrayList(), - embeddedFiles = new ArrayList(), + List + compiledFiles = new List(), + contentFiles = new List(), + embeddedFiles = new List(), - binaryLibs = new ArrayList(), - pkgLibs = new ArrayList(), - systemLibs = new ArrayList(), - runtimeLibs = new ArrayList(), + binaryLibs = new List(), + pkgLibs = new List(), + systemLibs = new List(), + runtimeLibs = new List(), - extraDistFiles = new ArrayList(), - localCopyTargets = new ArrayList(); + extraDistFiles = new List(), + localCopyTargets = new List(); + + // If there exists a .config file for this assembly, copy + // it to the project folder - // If there exists a .config file for this assembly, copy it to the project folder // TODO: Support copying .config.osx files // TODO: support processing the .config file for native library deps string projectAssemblyName = project.Name; @@ -839,11 +813,15 @@ namespace Prebuild.Core.Targets foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) Console.WriteLine("Error! '{0}'", error.ErrorText); - string projectFullName = cr.CompiledAssembly.FullName; - Regex verRegex = new Regex("Version=([\\d\\.]+)"); - Match verMatch = verRegex.Match(projectFullName); - if (verMatch.Success) + try { + string projectFullName = cr.CompiledAssembly.FullName; + Regex verRegex = new Regex("Version=([\\d\\.]+)"); + Match verMatch = verRegex.Match(projectFullName); + if (verMatch.Success) projectVersion = verMatch.Groups[1].Value; + }catch{ + Console.WriteLine("Couldn't compile AssemblyInfo.cs"); + } // Clean up the temp file try @@ -853,7 +831,7 @@ namespace Prebuild.Core.Targets } catch { - //Console.WriteLine("Error! '{0}'", e.ToString()); + Console.WriteLine("Error! '{0}'", e.ToString()); } } @@ -1013,46 +991,46 @@ namespace Prebuild.Core.Targets } } - string lineSep = " \\\n\t"; + const string lineSep = " \\\n\t"; string compiledFilesString = string.Empty; if (compiledFiles.Count > 0) compiledFilesString = - lineSep + string.Join(lineSep, (string[])compiledFiles.ToArray(typeof(string))); + lineSep + string.Join(lineSep, compiledFiles.ToArray()); string embeddedFilesString = ""; if (embeddedFiles.Count > 0) embeddedFilesString = - lineSep + string.Join(lineSep, (string[])embeddedFiles.ToArray(typeof(string))); + lineSep + string.Join(lineSep, embeddedFiles.ToArray()); string contentFilesString = ""; if (contentFiles.Count > 0) contentFilesString = - lineSep + string.Join(lineSep, (string[])contentFiles.ToArray(typeof(string))); + lineSep + string.Join(lineSep, contentFiles.ToArray()); string extraDistFilesString = ""; if (extraDistFiles.Count > 0) extraDistFilesString = - lineSep + string.Join(lineSep, (string[])extraDistFiles.ToArray(typeof(string))); + lineSep + string.Join(lineSep, extraDistFiles.ToArray()); string pkgLibsString = ""; if (pkgLibs.Count > 0) pkgLibsString = - lineSep + string.Join(lineSep, (string[])pkgLibs.ToArray(typeof(string))); + lineSep + string.Join(lineSep, pkgLibs.ToArray()); string binaryLibsString = ""; if (binaryLibs.Count > 0) binaryLibsString = - lineSep + string.Join(lineSep, (string[])binaryLibs.ToArray(typeof(string))); + lineSep + string.Join(lineSep, binaryLibs.ToArray()); string systemLibsString = ""; if (systemLibs.Count > 0) systemLibsString = - lineSep + string.Join(lineSep, (string[])systemLibs.ToArray(typeof(string))); + lineSep + string.Join(lineSep, systemLibs.ToArray()); string localCopyTargetsString = ""; if (localCopyTargets.Count > 0) localCopyTargetsString = - string.Join("\n", (string[])localCopyTargets.ToArray(typeof(string))); + string.Join("\n", localCopyTargets.ToArray()); string monoPath = ""; foreach (string runtimeLib in runtimeLibs) diff --git a/Prebuild/src/Core/Targets/DebugTarget.cs b/Prebuild/src/Core/Targets/DebugTarget.cs index db19e059a4..dc4e666ebd 100644 --- a/Prebuild/src/Core/Targets/DebugTarget.cs +++ b/Prebuild/src/Core/Targets/DebugTarget.cs @@ -27,7 +27,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O /* * $Source$ * $Author: jendave $ - * $Date: 2006-09-20 16:42:51 +0900 (Wed, 20 Sep 2006) $ + * $Date: 2006-09-20 09:42:51 +0200 (on, 20 sep 2006) $ * $Revision: 164 $ */ #endregion diff --git a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs index 5a5dc5526d..c8401fd42a 100644 --- a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs +++ b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: cjcollier $ - * $Date: 2007-04-11 07:10:35 +0900 (Wed, 11 Apr 2007) $ - * $Revision: 231 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Targets/NAntTarget.cs b/Prebuild/src/Core/Targets/NAntTarget.cs index eb5325d8fb..9a6ee17819 100644 --- a/Prebuild/src/Core/Targets/NAntTarget.cs +++ b/Prebuild/src/Core/Targets/NAntTarget.cs @@ -1,9 +1,9 @@ #region BSD License /* Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -C.J. Adams-Collier (cjac@colliertech.org), +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +C.J. Adams-Collier (cjac@colliertech.org), Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -35,15 +35,6 @@ POSSIBILITY OF SUCH DAMAGE. #endregion -#region CVS Information -/* - * $Source$ - * $Author: cjcollier $ - * $Date: 2008-02-07 10:22:36 +0900 (Thu, 07 Feb 2008) $ - * $Revision: 255 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; @@ -58,85 +49,73 @@ using Prebuild.Core.Utilities; namespace Prebuild.Core.Targets { - /// - /// - /// - [Target("nant")] - public class NAntTarget : ITarget - { - #region Fields + /// + /// + /// + [Target("nant")] + public class NAntTarget : ITarget + { + #region Fields - private Kernel m_Kernel; + private Kernel m_Kernel; - #endregion + #endregion - #region Private Methods + #region Private Methods - private static string PrependPath(string path) - { - string tmpPath = Helper.NormalizePath(path, '/'); - Regex regex = new Regex(@"(\w):/(\w+)"); - Match match = regex.Match(tmpPath); - //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') - //{ - tmpPath = Helper.NormalizePath(tmpPath); - //} - // else - // { - // tmpPath = Helper.NormalizePath("./" + tmpPath); - // } + private static string PrependPath(string path) + { + string tmpPath = Helper.NormalizePath(path, '/'); + Regex regex = new Regex(@"(\w):/(\w+)"); + Match match = regex.Match(tmpPath); + //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') + //{ + tmpPath = Helper.NormalizePath(tmpPath); + //} + // else + // { + // tmpPath = Helper.NormalizePath("./" + tmpPath); + // } - return tmpPath; - } + return tmpPath; + } private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr) { - string ret = ""; - string referencePath = ((ReferencePathNode)currentProject.ReferencePaths[0]).Path; - if (String.IsNullOrEmpty(refr.Path)) - { - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode project = (ProjectNode) solution.ProjectsTable[refr.Name]; - string finalPath = - Helper.NormalizePath(referencePath + refr.Name + GetProjectExtension(project), '/'); - return finalPath; - } - else - { - ProjectNode project = (ProjectNode) refr.Parent; - - // Do we have an explicit file reference? - string fileRef = FindFileReference(refr.Name, project); - if (fileRef != null) - { - return fileRef; - } - - // Is there an explicit path in the project ref? - if (refr.Path != null) - { - return Helper.NormalizePath(refr.Path + "/" + refr.Name + GetProjectExtension(project), '/'); - } - - // Is it a specified extension (dll or exe?) - if (ExtensionSpecified(refr.Name)) - { - return Helper.NormalizePath(referencePath + GetRefFileName(refr.Name), '/'); - } - - // No, it's an extensionless GAC ref, but nant needs the .dll extension anyway - return refr.Name + ".dll"; - } - } - else + if (!String.IsNullOrEmpty(refr.Path)) { return refr.Path; } + + if (solution.ProjectsTable.ContainsKey(refr.Name)) + { + ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name]; + string finalPath = + Helper.NormalizePath(refr.Name + GetProjectExtension(projectRef), '/'); + return finalPath; + } + + ProjectNode project = (ProjectNode) refr.Parent; + + // Do we have an explicit file reference? + string fileRef = FindFileReference(refr.Name, project); + if (fileRef != null) + { + return fileRef; + } + + // Is there an explicit path in the project ref? + if (refr.Path != null) + { + return Helper.NormalizePath(refr.Path + "/" + refr.Name + GetProjectExtension(project), '/'); + } + + // No, it's an extensionless GAC ref, but nant needs the .dll extension anyway + return refr.Name + ".dll"; } - public static string GetRefFileName(string refName) + public static string GetRefFileName(string refName) { if (ExtensionSpecified(refName)) { @@ -144,7 +123,7 @@ namespace Prebuild.Core.Targets } else { - return refName + ".dll"; + return refName + ".dll"; } } @@ -156,268 +135,235 @@ namespace Prebuild.Core.Targets private static string GetProjectExtension(ProjectNode project) { string extension = ".dll"; - if (project.Type == ProjectType.Exe) + if (project.Type == ProjectType.Exe || project.Type == ProjectType.WinExe) { extension = ".exe"; } return extension; } - //private static string BuildReferencePath(SolutionNode solution, ReferenceNode refr) - //{ - // string ret = ""; - // if (solution.ProjectsTable.ContainsKey(refr.Name)) - // { - // ProjectNode project = (ProjectNode)solution.ProjectsTable[refr.Name]; - // string finalPath = Helper.NormalizePath(((ReferencePathNode)project.ReferencePaths[0]).Path, '/'); - // return finalPath; - // } - // else - // { - // if (refr.Path == null) - // { - // ProjectNode project = (ProjectNode) refr.Parent; - // string fileRef = FindFileReference(refr.Name, project); - - // if (refr.Path != null || fileRef != null) - // { - // string finalPath = (refr.Path != null) ? Helper.NormalizePath(refr.Path, '/') : fileRef; - // ret += finalPath; - // return ret; - // } - - // try - // { - // Assembly assem = Assembly.Load(refr.Name); - // if (assem != null) - // { - // ret += ""; - // } - // else - // { - // ret += ""; - // } - // } - // catch (System.NullReferenceException e) - // { - // e.ToString(); - // ret += ""; - // } - // } - // else - // { - // ret = refr.Path; - // } - // } - // return ret; - //} - - private static string FindFileReference(string refName, ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + private static string FindFileReference(string refName, ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = Helper.MakeFilePath(refPath.Path, refName); if (File.Exists(fullPath)) { return fullPath; } + fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) + { + return fullPath; + } + fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe"); if (File.Exists(fullPath)) { return fullPath; } - } + } - return null; - } + return null; + } - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } - private void WriteProject(SolutionNode solution, ProjectNode project) - { + private void WriteProject(SolutionNode solution, ProjectNode project) + { string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); - StreamWriter ss = new StreamWriter(projFile); + StreamWriter ss = new StreamWriter(projFile); - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); - bool hasDoc = false; + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); + bool hasDoc = false; - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", project.Name); - ss.WriteLine(" ", "build"); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (refr.LocalCopy) - { - ss.WriteLine(" ", '/')); - } - } - - ss.WriteLine(" "); - ss.WriteLine(" "); - if (project.ConfigFile != null && project.ConfigFile.Length!=0) - { - ss.Write(" "); + ss.WriteLine("", project.Name); + ss.WriteLine(" ", "build"); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + if (refr.LocalCopy) + { + ss.WriteLine(" ", '/')); + } + } + + ss.WriteLine(" "); + ss.WriteLine(" "); + if (project.ConfigFile != null && project.ConfigFile.Length!=0) + { + ss.Write(" "); - } + if (project.Type == ProjectType.Library) + { + ss.Write(".dll.config\""); + } + else + { + ss.Write(".exe.config\""); + } + ss.WriteLine(" />"); + } - // Add the content files to just be copied - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); - - foreach (string file in project.Files) - { - // Ignore if we aren't content - if (project.Files.GetBuildAction(file) != BuildAction.Content) - continue; + // Add the content files to just be copied + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + + foreach (string file in project.Files) + { + // Ignore if we aren't content + if (project.Files.GetBuildAction(file) != BuildAction.Content) + continue; - // Create a include tag - ss.WriteLine(" {0}", ""); - } + // Create a include tag + ss.WriteLine(" {0}", ""); + } - ss.WriteLine(" {0}", ""); - ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); + ss.WriteLine(" {0}", ""); - ss.Write(" "); - ss.WriteLine(" ", project.RootNamespace); - foreach (string file in project.Files) - { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.EmbeddedResource: - ss.WriteLine(" {0}", ""); - break; - default: - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) - { - ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - } - break; - } - } - //if (project.Files.GetSubType(file).ToString() != "Code") - //{ - // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ss.Write(" main=\"{0}\"", project.StartupObject); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (string file in project.Files) + foreach (ConfigurationNode conf in project.Configurations) + { + if (GetXmlDocFile(project, conf) != "") + { + ss.Write(" doc=\"{0}\"", "${project::get-base-directory()}/${build.dir}/" + GetXmlDocFile(project, conf)); + hasDoc = true; + } + break; + } + ss.Write(" output=\"{0}", "${project::get-base-directory()}/${build.dir}/${project::get-name()}"); + if (project.Type == ProjectType.Library) + { + ss.Write(".dll\""); + } + else + { + ss.Write(".exe\""); + } + if (project.AppIcon != null && project.AppIcon.Length != 0) + { + ss.Write(" win32icon=\"{0}\"", Helper.NormalizePath(project.AppIcon, '/')); + } + ss.WriteLine(">"); + ss.WriteLine(" ", project.RootNamespace); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.EmbeddedResource: + ss.WriteLine(" {0}", ""); + break; + default: + if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) + { + ss.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + } + break; + } + } + //if (project.Files.GetSubType(file).ToString() != "Code") + //{ + // ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach (string file in project.Files) + { + switch (project.Files.GetBuildAction(file)) + { + case BuildAction.Compile: + ss.WriteLine(" "); + break; + default: + break; + } + } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + foreach(ReferencePathNode refPath in project.ReferencePaths) { - switch (project.Files.GetBuildAction(file)) - { - case BuildAction.Compile: - ss.WriteLine(" "); - break; - default: - break; - } + ss.WriteLine(" "); } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); + ss.WriteLine(" "); + foreach (ReferenceNode refr in project.References) + { + string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); ss.WriteLine(" "); - } - ss.WriteLine(" "); + } + ss.WriteLine(" "); - ss.WriteLine(" "); + ss.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) + foreach (ConfigurationNode conf in project.Configurations) { if (!String.IsNullOrEmpty(conf.Options.OutputPath)) { @@ -432,149 +378,160 @@ namespace Prebuild.Core.Targets ss.WriteLine(" "); ss.WriteLine(" "); ss.WriteLine(" "); + ss.WriteLine(" "); ss.WriteLine(" "); ss.WriteLine(" "); break; } } - ss.WriteLine(" "); + ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); - ss.WriteLine(" "); - if (hasDoc) - { - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.Write(" "); - } - else - { - ss.WriteLine(".exe\" />"); - } + ss.WriteLine(" "); + if (hasDoc) + { + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.Write(" "); + } + else + { + ss.WriteLine(".exe\" />"); + } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - // foreach(ReferenceNode refr in project.References) - // { - // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); - // if (path != "") - // { - // ss.WriteLine(" ", path); - // } - // } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - } - ss.WriteLine(" "); - ss.WriteLine(""); - } - m_Kernel.CurrentWorkingDirectory.Pop(); - } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + // foreach(ReferenceNode refr in project.References) + // { + // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); + // if (path != "") + // { + // ss.WriteLine(" ", path); + // } + // } + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + } + ss.WriteLine(" "); + ss.WriteLine(""); + } + m_Kernel.CurrentWorkingDirectory.Pop(); + } - private void WriteCombine(SolutionNode solution) - { - m_Kernel.Log.Write("Creating NAnt build files"); - foreach (ProjectNode project in solution.Projects) - { - if (m_Kernel.AllowProject(project.FilterGroups)) - { - m_Kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - } + private void WriteCombine(SolutionNode solution) + { + m_Kernel.Log.Write("Creating NAnt build files"); + foreach (ProjectNode project in solution.Projects) + { + if (m_Kernel.AllowProject(project.FilterGroups)) + { + m_Kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + } - m_Kernel.Log.Write(""); - string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); - StreamWriter ss = new StreamWriter(combFile); + m_Kernel.Log.Write(""); + string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); + StreamWriter ss = new StreamWriter(combFile); - m_Kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); + m_Kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); - using (ss) - { - ss.WriteLine(""); - ss.WriteLine("", solution.Name); - ss.WriteLine(" "); - ss.WriteLine(); + using (ss) + { + ss.WriteLine(""); + ss.WriteLine("", solution.Name); + ss.WriteLine(" "); + ss.WriteLine(); - //ss.WriteLine(" "); - //ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); + //ss.WriteLine(" "); + //ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); // actually use active config out of prebuild.xml ss.WriteLine(" ", solution.ActiveConfig); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine(); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Name); - ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); - ss.WriteLine(" "); - ss.WriteLine(); - } + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine(); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Name); + ss.WriteLine(" ", conf.Options["DebugInformation"].ToString().ToLower()); + ss.WriteLine(" "); + ss.WriteLine(); + } - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(" "); - ss.WriteLine(); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); + + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(" "); + ss.WriteLine(); ss.WriteLine(" "); ss.WriteLine(" "); diff --git a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs index 0d787969e9..66dd1bc6f6 100644 --- a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs +++ b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-27 16:49:58 -0800 (Fri, 27 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using Prebuild.Core.Attributes; @@ -43,17 +34,37 @@ namespace Prebuild.Core.Targets /// [Target("sharpdev2")] public class SharpDevelop2Target : VS2005Target - { - protected override string VersionName + { + #region Properties + public override string VersionName { get { return "SharpDevelop2"; } } + #endregion #region Public Methods + /// + /// Writes the specified kern. + /// + /// The kern. + public override void Write(Kernel kern) + { + base.Write(kern); + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public override void Clean(Kernel kern) + { + base.Clean(kern); + } + /// /// Gets the name. /// diff --git a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs index 6fe038b94e..cf7ce0260b 100644 --- a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs +++ b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-02-14 05:58:03 +0900 (Wed, 14 Feb 2007) $ - * $Revision: 205 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Targets/ToolInfo.cs b/Prebuild/src/Core/Targets/ToolInfo.cs new file mode 100644 index 0000000000..935c6744db --- /dev/null +++ b/Prebuild/src/Core/Targets/ToolInfo.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + public struct ToolInfo + { + string name; + string guid; + string fileExtension; + string xmlTag; + string importProject; + + /// + /// Gets or sets the name. + /// + /// The name. + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + /// + /// Gets or sets the GUID. + /// + /// The GUID. + public string Guid + { + get + { + return guid; + } + set + { + guid = value; + } + } + + /// + /// Gets or sets the file extension. + /// + /// The file extension. + public string FileExtension + { + get + { + return fileExtension; + } + set + { + fileExtension = value; + } + } + public string LanguageExtension + { + get + { + switch (this.Name) + { + case "C#": + return ".cs"; + case "VisualBasic": + return ".vb"; + case "Boo": + return ".boo"; + default: + return ".cs"; + } + } + } + /// + /// Gets or sets the XML tag. + /// + /// The XML tag. + public string XmlTag + { + get + { + return xmlTag; + } + set + { + xmlTag = value; + } + } + + /// + /// Gets or sets the import project property. + /// + /// The ImportProject tag. + public string ImportProject + { + get + { + return importProject; + } + set + { + importProject = value; + } + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The GUID. + /// The file extension. + /// The XML. + /// The import project. + public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) + { + this.name = name; + this.guid = guid; + this.fileExtension = fileExtension; + this.xmlTag = xml; + this.importProject = importProject; + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// The GUID. + /// The file extension. + /// The XML. + public ToolInfo(string name, string guid, string fileExtension, string xml) + { + this.name = name; + this.guid = guid; + this.fileExtension = fileExtension; + this.xmlTag = xml; + this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; + } + + /// + /// Equals operator + /// + /// ToolInfo to compare + /// true if toolInfos are equal + public override bool Equals(object obj) + { + if (obj == null) + { + throw new ArgumentNullException("obj"); + } + if (obj.GetType() != typeof(ToolInfo)) + return false; + + ToolInfo c = (ToolInfo)obj; + return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); + } + + /// + /// Equals operator + /// + /// ToolInfo to compare + /// ToolInfo to compare + /// True if toolInfos are equal + public static bool operator ==(ToolInfo c1, ToolInfo c2) + { + return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); + } + + /// + /// Not equals operator + /// + /// ToolInfo to compare + /// ToolInfo to compare + /// True if toolInfos are not equal + public static bool operator !=(ToolInfo c1, ToolInfo c2) + { + return !(c1 == c2); + } + + /// + /// Hash Code + /// + /// Hash code + public override int GetHashCode() + { + return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); + + } + } +} diff --git a/Prebuild/src/Core/Targets/VS2002Target.cs b/Prebuild/src/Core/Targets/VS2002Target.cs index 7067cf3961..2292624473 100644 --- a/Prebuild/src/Core/Targets/VS2002Target.cs +++ b/Prebuild/src/Core/Targets/VS2002Target.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using Prebuild.Core.Attributes; diff --git a/Prebuild/src/Core/Targets/VS2003Target.cs b/Prebuild/src/Core/Targets/VS2003Target.cs index 4bf05cb1a7..1bcb7dce0d 100644 --- a/Prebuild/src/Core/Targets/VS2003Target.cs +++ b/Prebuild/src/Core/Targets/VS2003Target.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-09-30 04:11:40 +0900 (Sat, 30 Sep 2006) $ - * $Revision: 177 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; @@ -44,28 +35,6 @@ using Prebuild.Core.Utilities; namespace Prebuild.Core.Targets { - /// - /// - /// - public enum VSVersion - { - /// - /// - /// - VS70, - /// - /// - /// - VS71, - /// - /// - /// - VS80 - } - - /// - /// - /// [Target("vs2003")] public class VS2003Target : ITarget { diff --git a/Prebuild/src/Core/Targets/VS2005Target.cs b/Prebuild/src/Core/Targets/VS2005Target.cs index 5b7ad07faf..63461c9fe5 100644 --- a/Prebuild/src/Core/Targets/VS2005Target.cs +++ b/Prebuild/src/Core/Targets/VS2005Target.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: borrillis $ - * $Date: 2007-05-25 01:03:16 +0900 (Fri, 25 May 2007) $ - * $Revision: 243 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; @@ -45,185 +36,11 @@ using Prebuild.Core.Utilities; namespace Prebuild.Core.Targets { - /// - /// - /// - public struct ToolInfo - { - string name; - string guid; - string fileExtension; - string xmlTag; - string importProject; - - /// - /// Gets or sets the name. - /// - /// The name. - public string Name - { - get - { - return name; - } - set - { - name = value; - } - } - - /// - /// Gets or sets the GUID. - /// - /// The GUID. - public string Guid - { - get - { - return guid; - } - set - { - guid = value; - } - } - - /// - /// Gets or sets the file extension. - /// - /// The file extension. - public string FileExtension - { - get - { - return fileExtension; - } - set - { - fileExtension = value; - } - } - /// - /// Gets or sets the XML tag. - /// - /// The XML tag. - public string XmlTag - { - get - { - return xmlTag; - } - set - { - xmlTag = value; - } - } - - /// - /// Gets or sets the import project property. - /// - /// The ImportProject tag. - public string ImportProject - { - get - { - return importProject; - } - set - { - importProject = value; - } - } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The GUID. - /// The file extension. - /// The XML. - /// The import project. - public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) - { - this.name = name; - this.guid = guid; - this.fileExtension = fileExtension; - this.xmlTag = xml; - this.importProject = importProject; - } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The GUID. - /// The file extension. - /// The XML. - public ToolInfo(string name, string guid, string fileExtension, string xml) - { - this.name = name; - this.guid = guid; - this.fileExtension = fileExtension; - this.xmlTag = xml; - this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; - } - - /// - /// Equals operator - /// - /// ToolInfo to compare - /// true if toolInfos are equal - public override bool Equals(object obj) - { - if (obj == null) - { - throw new ArgumentNullException("obj"); - } - if (obj.GetType() != typeof(ToolInfo)) - return false; - - ToolInfo c = (ToolInfo)obj; - return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); - } - - /// - /// Equals operator - /// - /// ToolInfo to compare - /// ToolInfo to compare - /// True if toolInfos are equal - public static bool operator ==(ToolInfo c1, ToolInfo c2) - { - return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); - } - - /// - /// Not equals operator - /// - /// ToolInfo to compare - /// ToolInfo to compare - /// True if toolInfos are not equal - public static bool operator !=(ToolInfo c1, ToolInfo c2) - { - return !(c1 == c2); - } - - /// - /// Hash Code - /// - /// Hash code - public override int GetHashCode() - { - return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); - - } - } - /// /// /// [Target("vs2005")] - public class VS2005Target : ITarget + public class VS2005Target : VSGenericTarget { #region Inner Classes @@ -231,90 +48,87 @@ namespace Prebuild.Core.Targets #region Fields + string solutionVersion = "9.00"; + string productVersion = "8.0.50727"; string schemaVersion = "2.0"; + string versionName = "Visual C# 2005"; + string name = "vs2005"; + VSVersion version = VSVersion.VS80; - Hashtable tools; - Kernel kernel; - - protected virtual string ToolsVersionXml - { - get - { - return String.Empty; - } - } - - protected virtual string SolutionTag + public override string SolutionTag { get { return "# Visual Studio 2005"; } } + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + return string.Empty; + } /// /// Gets or sets the solution version. /// /// The solution version. - protected virtual string SolutionVersion + public override string SolutionVersion { get { - return "9.00"; + return solutionVersion; } } - /// /// Gets or sets the product version. /// /// The product version. - protected virtual string ProductVersion + public override string ProductVersion { get { - return "8.0.50727"; + return productVersion; } } - /// /// Gets or sets the schema version. /// /// The schema version. - protected string SchemaVersion + public override string SchemaVersion { get { - return this.schemaVersion; - } - set - { - this.schemaVersion = value; + return schemaVersion; } } - /// /// Gets or sets the name of the version. /// /// The name of the version. - protected virtual string VersionName + public override string VersionName { get { - return "Visual C# 2005"; + return versionName; } } - /// /// Gets or sets the version. /// /// The version. - protected VSVersion Version + public override VSVersion Version { get { - return this.version; + return version; } - set + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get { - this.version = value; + return name; } } @@ -325,600 +139,9 @@ namespace Prebuild.Core.Targets /// /// Initializes a new instance of the class. /// - public VS2005Target() - { - this.tools = new Hashtable(); - - this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); - this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); - this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach (ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if (ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch (ArgumentException) - { - this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private static bool ExtensionSpecified(string refName) - { - return refName.EndsWith(".dll") || refName.EndsWith(".exe"); - } - - private static string GetProjectExtension(ProjectNode project) - { - string extension = ".dll"; - if (project.Type == ProjectType.Exe) - { - extension = ".exe"; - } - return extension; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if (!tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - #region Project File - using (ps) - { - ps.WriteLine("", ToolsVersionXml); - //ps.WriteLine(" <{0}", toolInfo.XMLTag); - ps.WriteLine(" "); - ps.WriteLine(" Local"); - ps.WriteLine(" {0}", this.ProductVersion); - ps.WriteLine(" {0}", this.SchemaVersion); - ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); - - ps.WriteLine(" Debug"); - ps.WriteLine(" AnyCPU"); - //ps.WriteLine(" "); - - //ps.WriteLine(" {0}", project.AppIcon); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", project.AssemblyName); - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ps.WriteLine(" {0}", conf.Options.KeyFile); - ps.WriteLine(" true"); - break; - } - } - ps.WriteLine(" JScript"); - ps.WriteLine(" Grid"); - ps.WriteLine(" IE50"); - ps.WriteLine(" false"); - - //if(m_Version == VSVersion.VS70) - // ps.WriteLine(" NoStandardLibraries = \"false\""); - - ps.WriteLine(" {0}", project.Type.ToString()); - ps.WriteLine(" {0}", project.DesignerFolder); - ps.WriteLine(" {0}", project.RootNamespace); - ps.WriteLine(" {0}", project.StartupObject); - //ps.WriteLine(" >"); - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" ", conf.Name); - ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); - ps.WriteLine(" {0}", conf.Options["BaseAddress"]); - ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); - ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); - ps.WriteLine(" {0}", conf.Options["DebugInformation"]); - ps.WriteLine(" {0}", conf.Options["FileAlignment"]); - // ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); - ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); - ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); - ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); - ps.WriteLine(" {0}", conf.Options["WarningLevel"]); - ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); - ps.WriteLine(" "); - } - - //ps.WriteLine(" "); - - // Assembly References - ps.WriteLine(" "); - string refPath = ((ReferencePathNode) project.ReferencePaths[0]).Path; - - foreach (ReferenceNode refr in project.References) - { - if (!solution.ProjectsTable.ContainsKey(refr.Name)) - { - ps.Write(" "); - - string path; - - if (String.IsNullOrEmpty(refr.Path)) - { - if ( ExtensionSpecified( refr.Name ) ) - { - path = Helper.NormalizePath(Path.Combine(refPath, refr.Name), '\\'); - } - else - { - path = refr.Name + ".dll"; - } - } - else - { - path = refr.Path; - } - - // TODO: Allow reference to *.exe files - ps.WriteLine(" {0}", path ); - ps.WriteLine(" {0}", refr.LocalCopy); - ps.WriteLine(" "); - } - } - ps.WriteLine(" "); - - //Project References - ps.WriteLine(" "); - foreach (ReferenceNode refr in project.References) - { - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProject = (ProjectNode)solution.ProjectsTable[refr.Name]; - // TODO: Allow reference to visual basic projects - string path = - Helper.MakePathRelativeTo(project.FullPath, - Helper.MakeFilePath(refProject.FullPath, refProject.Name, "csproj")); - ps.WriteLine(" ", path ); - // - ps.WriteLine(" {0}", refProject.Name); - // RealmForge.Utility - ps.WriteLine(" {{{0}}}", refProject.Guid.ToString().ToUpper()); - // {6880D1D3-69EE-461B-B841-5319845B20D3} - ps.WriteLine(" {0}", toolInfo.Guid.ToString().ToUpper()); - // {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - ps.WriteLine("\t\t\t{0}", refr.LocalCopy); - ps.WriteLine(" "); - // - } - else - { - } - } - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ArrayList list = new ArrayList(); - foreach (string file in project.Files) - { - // if (file == "Properties\\Bind.Designer.cs") - // { - // Console.WriteLine("Wait a minute!"); - // Console.WriteLine(project.Files.GetSubType(file).ToString()); - // } - - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings && project.Files.GetSubType(file) != SubType.Designer) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - - int slash = file.LastIndexOf('\\'); - if (slash == -1) - { - ps.WriteLine(" {0}", file); - } - else - { - ps.WriteLine(" {0}", file.Substring(slash + 1, file.Length - slash - 1)); - } - ps.WriteLine(" Designer"); - ps.WriteLine(" "); - // - } - - if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) == SubType.Designer) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ps.WriteLine(" " + project.Files.GetSubType(file) + ""); - ps.WriteLine(" ResXFileCodeGenerator"); - ps.WriteLine(" Resources.Designer.cs"); - ps.WriteLine(" "); - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - ps.WriteLine(" Resources.resx"); - ps.WriteLine(" "); - list.Add(file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"); - } - if (project.Files.GetSubType(file).ToString() == "Settings") - { - //Console.WriteLine("File: " + file); - //Console.WriteLine("Last index: " + file.LastIndexOf('.')); - //Console.WriteLine("Length: " + file.Length); - ps.Write(" <{0} ", project.Files.GetBuildAction(file)); - ps.WriteLine("Include=\"{0}\">", file); - int slash = file.LastIndexOf('\\'); - string fileName = file.Substring(slash + 1, file.Length - slash - 1); - if (project.Files.GetBuildAction(file) == BuildAction.None) - { - ps.WriteLine(" SettingsSingleFileGenerator"); - - //Console.WriteLine("FileName: " + fileName); - //Console.WriteLine("FileNameMain: " + fileName.Substring(0, fileName.LastIndexOf('.'))); - //Console.WriteLine("FileNameExt: " + fileName.Substring(fileName.LastIndexOf('.'), fileName.Length - fileName.LastIndexOf('.'))); - if (slash == -1) - { - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - else - { - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - } - else - { - ps.WriteLine(" Code"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); - string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); - ps.WriteLine(" {0}", fileNameShorter + ".settings"); - } - ps.WriteLine(" ", project.Files.GetBuildAction(file)); - } - else if (project.Files.GetSubType(file) != SubType.Designer) - { - if (!list.Contains(file)) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(file)); - - int startPos = 0; - if ( project.Files.GetPreservePath( file ) ) - { - while ( ( @"./\" ).IndexOf( file.Substring( startPos, 1 ) ) != -1 ) - startPos++; - - } - else - { - startPos = file.LastIndexOf( Path.GetFileName( file ) ); - } - ps.WriteLine("Include=\"{0}\">", Helper.NormalizePath(file)); - - - if (file.Contains("Designer.cs")) - { - string d = ".Designer.cs"; - int index = file.Contains("\\") ? file.IndexOf("\\") + 1 : 0; - ps.WriteLine(" {0}", file.Substring(index, file.Length - index - d.Length) + ".cs"); - } - - if (project.Files.GetIsLink(file)) - { - string alias = project.Files.GetLinkPath( file ); - alias += file.Substring( startPos ); - alias = Helper.NormalizePath( alias ); - ps.WriteLine( " {0}", alias ); - } - else if (project.Files.GetBuildAction(file) != BuildAction.None) - { - if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) - { - ps.WriteLine(" {0}", project.Files.GetSubType(file)); - } - } - - if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) - { - ps.WriteLine(" {0}", project.Files.GetCopyToOutput(file)); - } - - ps.WriteLine(" ", project.Files.GetBuildAction(file)); - } - } - } - // ps.WriteLine(" "); - - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - // ps.WriteLine(" ", toolInfo.XMLTag); - ps.WriteLine(""); - } - #endregion - - #region User File - - ps = new StreamWriter(projectFile + ".user"); - using (ps) - { - ps.WriteLine(""); - //ps.WriteLine( "" ); - //ps.WriteLine(" <{0}>", toolInfo.XMLTag); - //ps.WriteLine(" "); - ps.WriteLine(" "); - //ps.WriteLine(" ", MakeRefPath(project)); - - ps.WriteLine(" Debug"); - - if (projectFile.Contains( "OpenSim.csproj" )) - { - ps.WriteLine(" -loginserver -sandbox -accounts"); - } - - ps.WriteLine(" AnyCPU"); - ps.WriteLine(" {0}", MakeRefPath(project)); - ps.WriteLine(" {0}", this.ProductVersion); - ps.WriteLine(" ProjectFiles"); - ps.WriteLine(" 0"); - ps.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" "); - } - - ps.WriteLine(""); - } - #endregion - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteSolution(SolutionNode solution) - { - kernel.Log.Write("Creating {0} solution and project files", this.VersionName); - - foreach (ProjectNode project in solution.Projects) - { - kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - - kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - using (StreamWriter ss = new StreamWriter(solutionFile)) - { - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - using (ss) - { - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); - ss.WriteLine(SolutionTag); - foreach (ProjectNode project in solution.Projects) - { - if (!tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = (ToolInfo)tools[project.Language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); - ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", - toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, - toolInfo.FileExtension), project.Guid.ToString().ToUpper()); - - //ss.WriteLine(" ProjectSection(ProjectDependencies) = postProject"); - //ss.WriteLine(" EndProjectSection"); - - ss.WriteLine("EndProject"); - } - - if (solution.Files != null) - { - ss.WriteLine("Project(\"{0}\") = \"Solution Items\", \"Solution Items\", \"{1}\"", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", "{468F1D07-AD17-4CC3-ABD0-2CA268E4E1A6}"); - ss.WriteLine("\tProjectSection(SolutionItems) = preProject"); - foreach (string file in solution.Files) - ss.WriteLine("\t\t{0} = {0}", file); - ss.WriteLine("\tEndProjectSection"); - ss.WriteLine("EndProject"); - } - - ss.WriteLine("Global"); - - ss.WriteLine(" GlobalSection(SolutionConfigurationPlatforms) = preSolution"); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine(" {0}|Any CPU = {0}|Any CPU", conf.Name); - } - ss.WriteLine(" EndGlobalSection"); - - if (solution.Projects.Count > 1) - { - ss.WriteLine(" GlobalSection(ProjectDependencies) = postSolution"); - } - foreach (ProjectNode project in solution.Projects) - { - for (int i = 0; i < project.References.Count; i++) - { - ReferenceNode refr = (ReferenceNode)project.References[i]; - if (solution.ProjectsTable.ContainsKey(refr.Name)) - { - ProjectNode refProject = (ProjectNode)solution.ProjectsTable[refr.Name]; - ss.WriteLine(" ({{{0}}}).{1} = ({{{2}}})", - project.Guid.ToString().ToUpper() - , i, - refProject.Guid.ToString().ToUpper() - ); - } - } - } - if (solution.Projects.Count > 1) - { - ss.WriteLine(" EndGlobalSection"); - } - ss.WriteLine(" GlobalSection(ProjectConfigurationPlatforms) = postSolution"); - foreach (ProjectNode project in solution.Projects) - { - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine(" {{{0}}}.{1}|Any CPU.ActiveCfg = {1}|Any CPU", - project.Guid.ToString().ToUpper(), - conf.Name); - - ss.WriteLine(" {{{0}}}.{1}|Any CPU.Build.0 = {1}|Any CPU", - project.Guid.ToString().ToUpper(), - conf.Name); - } - } - ss.WriteLine(" EndGlobalSection"); - ss.WriteLine(" GlobalSection(SolutionProperties) = preSolution"); - ss.WriteLine(" HideSolutionNode = FALSE"); - ss.WriteLine(" EndGlobalSection"); - - ss.WriteLine("EndGlobal"); - } - } - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void CleanProject(ProjectNode project) - { - kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = (ToolInfo)tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - WriteSolution(sol); - } - kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - CleanSolution(sol); - } - kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public virtual string Name - { - get - { - return "vs2005"; - } + public VS2005Target() + : base() + { } #endregion diff --git a/Prebuild/src/Core/Targets/VS2008Target.cs b/Prebuild/src/Core/Targets/VS2008Target.cs index 88bb5e6a45..f30017b687 100644 --- a/Prebuild/src/Core/Targets/VS2008Target.cs +++ b/Prebuild/src/Core/Targets/VS2008Target.cs @@ -1,56 +1,132 @@ using System; -using System.Collections.Generic; +using System.Collections; +using System.Collections.Specialized; +using System.IO; using System.Text; + using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; namespace Prebuild.Core.Targets { - [Target("vs2008")] - public class VS2008Target : VS2005Target - { - protected override string SolutionTag + + /// + /// + /// + [Target("vs2008")] + public class VS2008Target : VSGenericTarget + { + #region Fields + string solutionVersion = "10.00"; + string productVersion = "9.0.21022"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2008"; + string name = "vs2008"; + VSVersion version = VSVersion.VS90; + + Hashtable tools; + Kernel kernel; + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v3_5: + return "ToolsVersion=\"3.5\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag { get { return "# Visual Studio 2008"; } } - protected override string SolutionVersion - { - get - { - return "10.00"; - } - } + #endregion - protected override string VersionName - { - get - { - return "Visual C# 2008"; - } - } + #region Constructors - protected override string ToolsVersionXml - { - get - { - return " ToolsVersion=\"3.5\""; - } - } + /// + /// Initializes a new instance of the class. + /// + public VS2008Target() + : base() + { + } - protected override string ProductVersion - { - get - { - return "9.0.21022"; - } - } - - public override string Name - { - get - { - return "vs2008"; - } - } - } + #endregion + } } diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs new file mode 100644 index 0000000000..401331dddf --- /dev/null +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs @@ -0,0 +1,881 @@ +#region BSD License +/* +Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + public abstract class VSGenericTarget : ITarget + { + #region Fields + + readonly Hashtable tools = new Hashtable(); + Kernel kernel; + #endregion + + #region Properties + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public abstract string SolutionVersion { get; } + /// + /// Gets or sets the product version. + /// + /// The product version. + public abstract string ProductVersion { get; } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public abstract string SchemaVersion { get; } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public abstract string VersionName { get; } + /// + /// Gets or sets the version. + /// + /// The version. + public abstract VSVersion Version { get; } + /// + /// Gets the name. + /// + /// The name. + public abstract string Name { get; } + + protected abstract string GetToolsVersionXml(FrameworkVersion version); + public abstract string SolutionTag { get; } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + protected VSGenericTarget() + { + this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); + this.tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); + this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); + this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); + this.tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach (ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if (ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch (ArgumentException) + { + this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) + { + SolutionNode node = solution; + + while (node.Parent is SolutionNode) + node = node.Parent as SolutionNode; + + return FindProjectInSolutionRecursively(name, node); + } + + private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) + { + if (solution.ProjectsTable.ContainsKey(name)) + return (ProjectNode)solution.ProjectsTable[name]; + + foreach (SolutionNode child in solution.Solutions) + { + ProjectNode node = FindProjectInSolutionRecursively(name, child); + if (node != null) + return node; + } + + return null; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if (!tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = (ToolInfo)tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + #region Project File + using (ps) + { + ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); + ps.WriteLine(" "); + ps.WriteLine(" Local"); + ps.WriteLine(" {0}", this.ProductVersion); + ps.WriteLine(" {0}", this.SchemaVersion); + ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); + + // Visual Studio has a hard coded guid for the project type + if (project.Type == ProjectType.Web) + ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); + ps.WriteLine(" Debug"); + ps.WriteLine(" AnyCPU"); + ps.WriteLine(" {0}", project.AppIcon); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", project.AssemblyName); + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != "") + { + ps.WriteLine(" {0}", conf.Options.KeyFile); + ps.WriteLine(" true"); + break; + } + } + ps.WriteLine(" JScript"); + ps.WriteLine(" Grid"); + ps.WriteLine(" IE50"); + ps.WriteLine(" false"); + ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); + + ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); + ps.WriteLine(" {0}", project.DesignerFolder); + ps.WriteLine(" {0}", project.RootNamespace); + ps.WriteLine(" {0}", project.StartupObject); + if (string.IsNullOrEmpty(project.DebugStartParameters)) + { + ps.WriteLine(" {0}", project.DebugStartParameters); + } + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" ", conf.Name); + ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); + ps.WriteLine(" {0}", conf.Options["BaseAddress"]); + ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); + ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); + ps.WriteLine(" {0}", conf.Options["DebugInformation"]); + ps.WriteLine(" {0}", conf.Options["FileAlignment"]); + ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); + if (project.Type != ProjectType.Web) + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); + else + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath("bin\\"))); + + ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); + ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); + ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); + ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); + ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); + ps.WriteLine(" "); + } + + //ps.WriteLine(" "); + + List projectReferences = new List(); + List otherReferences = new List(); + + foreach (ReferenceNode refr in project.References) + { + ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); + + if (projectNode == null) + otherReferences.Add(refr); + else + projectReferences.Add(projectNode); + } + // Assembly References + ps.WriteLine(" "); + + foreach (ReferenceNode refr in otherReferences) + { + ps.Write(" "); + ps.Write(" "); + ps.Write(refr.Name); + ps.WriteLine(""); + // TODO: Allow reference to *.exe files + ps.WriteLine(" {0}", refr.LocalCopy); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + //Project References + ps.WriteLine(" "); + foreach (ProjectNode projectReference in projectReferences) + { + ToolInfo tool = (ToolInfo)tools[projectReference.Language]; + if (tools == null) + throw new UnknownLanguageException(); + + string path = + Helper.MakePathRelativeTo(project.FullPath, + Helper.MakeFilePath(projectReference.FullPath, projectReference.Name, tool.FileExtension)); + ps.WriteLine(" ", path); + + // TODO: Allow reference to visual basic projects + ps.WriteLine(" {0}", projectReference.Name); + ps.WriteLine(" {0}", projectReference.Guid.ToString("B").ToUpper()); + ps.WriteLine(" {0}", tool.Guid.ToUpper()); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + // ps.WriteLine(" "); + ps.WriteLine(" "); + + // ps.WriteLine(" "); + List list = new List(); + + foreach (string path in project.Files) + { + string lower = path.ToLower(); + if (lower.EndsWith(".resx")) + { + string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); + if (!list.Contains(codebehind)) + list.Add(codebehind); + } + } + + foreach (string file in project.Files) + { + // if (file == "Properties\\Bind.Designer.cs") + // { + // Console.WriteLine("Wait a minute!"); + // Console.WriteLine(project.Files.GetSubType(file).ToString()); + // } + + SubType subType = project.Files.GetSubType(file); + + if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer + && subType != SubType.CodeBehind) + { + ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ps.WriteLine(" {0}", Path.GetFileName(file)); + ps.WriteLine(" Designer"); + ps.WriteLine(" "); + // + } + + if (subType == SubType.Designer) + { + ps.WriteLine(" ", file); + ps.WriteLine(" " + subType + ""); + ps.WriteLine(" ResXFileCodeGenerator"); + + string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; + string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs"; + + ps.WriteLine(" {0}", autogen_name); + + // Check for a parent .cs file with the same name as this designer file + if (File.Exists(dependent_name)) + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + + ps.WriteLine(" "); + if (File.Exists(autogen_name)) + { + ps.WriteLine(" ", autogen_name); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + + // If a parent .cs file exists, link this autogen file to it. Otherwise link + // to the designer file + if (File.Exists(dependent_name)) + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + else + ps.WriteLine(" {0}", Path.GetFileName(file)); + + ps.WriteLine(" "); + } + list.Add(autogen_name); + } + if (subType == SubType.Settings) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(file)); + ps.WriteLine("Include=\"{0}\">", file); + string fileName = Path.GetFileName(file); + if (project.Files.GetBuildAction(file) == BuildAction.None) + { + ps.WriteLine(" SettingsSingleFileGenerator"); + ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); + } + else + { + ps.WriteLine(" Code"); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); + string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); + ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); + } + ps.WriteLine(" ", project.Files.GetBuildAction(file)); + } + else if (subType != SubType.Designer) + { + string path = Helper.NormalizePath(file); + string path_lower = path.ToLower(); + + if (!list.Contains(file)) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(path)); + + int startPos = 0; + if (project.Files.GetPreservePath(file)) + { + while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) + startPos++; + + } + else + { + startPos = file.LastIndexOf(Path.GetFileName(path)); + } + + ps.WriteLine("Include=\"{0}\">", path); + + int last_period_index = file.LastIndexOf('.'); + string short_file_name = file.Substring(0, last_period_index); + string extension = Path.GetExtension(path); + string designer_format = string.Format(".designer{0}", extension); + + if (path_lower.EndsWith(designer_format)) + { + int designer_index = path_lower.IndexOf(designer_format); + string file_name = path.Substring(0, designer_index); + + if (File.Exists(file_name)) + ps.WriteLine(" {0}", Path.GetFileName(file_name)); + else if (File.Exists(file_name + ".resx")) + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); + } + else if (subType == SubType.CodeBehind) + { + ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); + } + if (project.Files.GetIsLink(file)) + { + string alias = project.Files.GetLinkPath(file); + alias += file.Substring(startPos); + alias = Helper.NormalizePath(alias); + ps.WriteLine(" {0}", alias); + } + else if (project.Files.GetBuildAction(file) != BuildAction.None) + { + if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) + { + ps.WriteLine(" {0}", subType); + } + } + + if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) + { + ps.WriteLine(" {0}", project.Files.GetCopyToOutput(file)); + } + + ps.WriteLine(" ", project.Files.GetBuildAction(file)); + } + } + } + + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(""); + } + #endregion + + #region User File + + ps = new StreamWriter(projectFile + ".user"); + using (ps) + { + ps.WriteLine(""); + //ps.WriteLine( "" ); + //ps.WriteLine(" <{0}>", toolInfo.XMLTag); + //ps.WriteLine(" "); + ps.WriteLine(" "); + //ps.WriteLine(" ", MakeRefPath(project)); + ps.WriteLine(" Debug"); + ps.WriteLine(" AnyCPU"); + ps.WriteLine(" {0}", MakeRefPath(project)); + ps.WriteLine(" {0}", this.ProductVersion); + ps.WriteLine(" ProjectFiles"); + ps.WriteLine(" 0"); + ps.WriteLine(" "); + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" "); + } + ps.WriteLine(""); + } + #endregion + + kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) + { + kernel.Log.Write("Creating {0} solution and project files", this.VersionName); + + foreach (SolutionNode child in solution.Solutions) + { + kernel.Log.Write("...Creating folder: {0}", child.Name); + WriteSolution(child, false); + } + + foreach (ProjectNode project in solution.Projects) + { + kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + + foreach (DatabaseProjectNode project in solution.DatabaseProjects) + { + kernel.Log.Write("...Creating database project: {0}", project.Name); + WriteDatabaseProject(solution, project); + } + + if (writeSolutionToDisk) // only write main solution + { + kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + + using (StreamWriter ss = new StreamWriter(solutionFile)) + { + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); + ss.WriteLine(SolutionTag); + + WriteProjectDeclarations(ss, solution, solution); + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0}|Any CPU = {0}|Any CPU", conf.Name); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + WriteConfigurationLines(solution.Configurations, solution, ss); + ss.WriteLine("\tEndGlobalSection"); + + if (solution.Solutions.Count > 0) + { + ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); + foreach (SolutionNode embeddedSolution in solution.Solutions) + { + WriteNestedProjectMap(ss, embeddedSolution); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("EndGlobal"); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + } + + private void WriteProjectDeclarations(StreamWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) + { + foreach (SolutionNode childSolution in embeddedSolution.Solutions) + { + WriteEmbeddedSolution(writer, childSolution); + WriteProjectDeclarations(writer, actualSolution, childSolution); + } + + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteProject(actualSolution, writer, project); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteProject(actualSolution, writer, dbProject); + } + + if (actualSolution.Guid == embeddedSolution.Guid) + { + WriteSolutionFiles(actualSolution, writer); + } + } + + private static void WriteNestedProjectMap(StreamWriter writer, SolutionNode embeddedSolution) + { + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteNestedProject(writer, embeddedSolution, project.Guid); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteNestedProject(writer, embeddedSolution, dbProject.Guid); + } + + foreach (SolutionNode child in embeddedSolution.Solutions) + { + WriteNestedProject(writer, embeddedSolution, child.Guid); + WriteNestedProjectMap(writer, child); + } + } + + private static void WriteNestedProject(StreamWriter writer, SolutionNode solution, Guid projectGuid) + { + WriteNestedFolder(writer, solution.Guid, projectGuid); + } + + private static void WriteNestedFolder(StreamWriter writer, Guid parentGuid, Guid childGuid) + { + writer.WriteLine("\t\t{0} = {1}", + childGuid.ToString("B").ToUpper(), + parentGuid.ToString("B").ToUpper()); + } + + private static void WriteConfigurationLines(ICollection configurations, SolutionNode solution, StreamWriter ss) + { + foreach (ProjectNode project in solution.Projects) + { + foreach (ConfigurationNode conf in configurations) + { + ss.WriteLine("\t\t{0}.{1}|Any CPU.ActiveCfg = {1}|Any CPU", + project.Guid.ToString("B").ToUpper(), + conf.Name); + + ss.WriteLine("\t\t{0}.{1}|Any CPU.Build.0 = {1}|Any CPU", + project.Guid.ToString("B").ToUpper(), + conf.Name); + } + } + + foreach (SolutionNode child in solution.Solutions) + { + WriteConfigurationLines(configurations, child, ss); + } + } + + private void WriteSolutionFiles(SolutionNode solution, StreamWriter ss) + { + WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); + } + + private void WriteEmbeddedSolution(StreamWriter writer, SolutionNode embeddedSolution) + { + WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); + } + + private void WriteProject(SolutionNode solution, StreamWriter ss, ProjectNode project) + { + WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); + } + + private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject) + { + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + } + + private static bool ExtensionSpecified(string refName) + { + return refName.EndsWith(".dll") || refName.EndsWith(".exe"); + } + + private static string GetProjectExtension(ProjectNode project) + { + string extension = ".dll"; + if (project.Type == ProjectType.Exe) + { + extension = ".exe"; + } + return extension; + } + + const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; + const string ProjectDeclarationEndFormat = "EndProject"; + + private void WriteProject(StreamWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = (ToolInfo)tools[language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); + + path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); + + WriteProject(ss, language, guid, name, path); + } + + private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location) + { + WriteProject(writer, language, projectGuid, name, location, null); + } + + private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = (ToolInfo)tools[language]; + + writer.WriteLine(ProjectDeclarationBeginFormat, + toolInfo.Guid, + name, + location, + projectGuid.ToString("B").ToUpper()); + + if (files != null) + { + writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); + + foreach (string file in files) + writer.WriteLine("\t\t{0} = {0}", file); + + writer.WriteLine("\tEndProjectSection"); + } + + writer.WriteLine(ProjectDeclarationEndFormat); + } + + private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) + { + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); + IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); + + kernel.CurrentWorkingDirectory.Push(); + + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using (ps) + { + ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); + ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); + ps.Indent++; + ps.WriteLine("MSDTVersion = \"80\""); + // TODO: Use the project.Files property + if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) + WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); + + ps.WriteLine("Begin DBRefFolder = \"Database References\""); + ps.Indent++; + foreach (DatabaseReferenceNode reference in project.References) + { + ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); + ps.Indent++; + ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); + ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); + //ps.WriteLine("Colorizer = 5"); + ps.Indent--; + ps.WriteLine("End"); + } + ps.Indent--; + ps.WriteLine("End"); + ps.Indent--; + ps.WriteLine("End"); + + ps.Flush(); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + + private bool ContainsSqlFiles(string folder) + { + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + return true; // if the folder contains 1 .sql file, that's good enough + } + + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + return true; // if 1 child folder contains a .sql file, still good enough + } + + return false; + } + + private void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) + { + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + { + writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); + writer.Indent++; + WriteDatabaseFoldersAndFiles(writer, child); + writer.Indent--; + writer.WriteLine("End"); + } + } + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); + } + } + + private void CleanProject(ProjectNode project) + { + kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = (ToolInfo)tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + WriteSolution(sol, true); + } + kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + CleanSolution(sol); + } + kernel = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VSVersion.cs b/Prebuild/src/Core/Targets/VSVersion.cs new file mode 100644 index 0000000000..f477086778 --- /dev/null +++ b/Prebuild/src/Core/Targets/VSVersion.cs @@ -0,0 +1,50 @@ +#region BSD License +/* +Copyright (c) 2008-2009 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com), John Anderson (sontek@gmail.com) + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#endregion + +namespace Prebuild.Core.Targets +{ + /// + /// + /// + public enum VSVersion + { + /// + /// Visual Studio 2002 + /// + VS70, + /// + /// Visual Studio 2003 + /// + VS71, + /// + /// Visual Studio 2005 + /// + VS80, + /// + /// Visual Studio 2008 + /// + VS90 + } +} diff --git a/Prebuild/src/Core/Targets/XcodeTarget.cs b/Prebuild/src/Core/Targets/XcodeTarget.cs index ee3b241c3d..d96f65b86d 100644 --- a/Prebuild/src/Core/Targets/XcodeTarget.cs +++ b/Prebuild/src/Core/Targets/XcodeTarget.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-02-13 12:58:03 -0800 (Tue, 13 Feb 2007) $ - * $Revision: 205 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Utilities/CommandLineCollection.cs b/Prebuild/src/Core/Utilities/CommandLineCollection.cs index 5733547a3a..22752aa1e1 100644 --- a/Prebuild/src/Core/Utilities/CommandLineCollection.cs +++ b/Prebuild/src/Core/Utilities/CommandLineCollection.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: robloach $ - * $Date: 2006-09-26 07:30:53 +0900 (Tue, 26 Sep 2006) $ - * $Revision: 165 $ - */ -#endregion - using System; using System.Collections; using System.Collections.Specialized; diff --git a/Prebuild/src/Core/Utilities/CurrentDirectory.cs b/Prebuild/src/Core/Utilities/CurrentDirectory.cs index abbed52861..5fabdf0943 100644 --- a/Prebuild/src/Core/Utilities/CurrentDirectory.cs +++ b/Prebuild/src/Core/Utilities/CurrentDirectory.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.Collections; diff --git a/Prebuild/src/Core/Utilities/Helper.cs b/Prebuild/src/Core/Utilities/Helper.cs index 19093ce077..9a0d131c7e 100644 --- a/Prebuild/src/Core/Utilities/Helper.cs +++ b/Prebuild/src/Core/Utilities/Helper.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2007-02-14 05:58:03 +0900 (Wed, 14 Feb 2007) $ - * $Revision: 205 $ - */ -#endregion - using System; using System.Collections; using System.Diagnostics; @@ -289,6 +280,8 @@ namespace Prebuild.Core.Utilities return true; } + static readonly char seperator = Path.DirectorySeparatorChar; + // This little gem was taken from the NeL source, thanks guys! /// /// Makes a relative path @@ -298,8 +291,8 @@ namespace Prebuild.Core.Utilities /// Path that will get from startPath to endPath public static string MakePathRelativeTo(string startPath, string endPath) { - string tmp = NormalizePath(startPath, '/'); - string src = NormalizePath(endPath, '/'); + string tmp = NormalizePath(startPath, seperator); + string src = NormalizePath(endPath, seperator); string prefix = ""; while(true) @@ -312,14 +305,14 @@ namespace Prebuild.Core.Utilities { return "./"; } - if ((src.Length > tmp.Length) && src[tmp.Length-1] != '/' && src[tmp.Length-1] != '\\') + if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) { } else { ret = prefix + endPath.Substring(size, endPath.Length - size); ret = ret.Trim(); - if(ret[0] == '/' || ret[0] == '\\') + if(ret[0] == seperator) { ret = "." + ret; } @@ -334,8 +327,8 @@ namespace Prebuild.Core.Utilities break; } - int lastPos = tmp.LastIndexOf('/', tmp.Length - 2); - int prevPos = tmp.IndexOf('/'); + int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); + int prevPos = tmp.IndexOf(seperator); if((lastPos == prevPos) || (lastPos == -1)) { @@ -343,7 +336,7 @@ namespace Prebuild.Core.Utilities } tmp = tmp.Substring(0, lastPos + 1); - prefix += "../"; + prefix += ".." + seperator.ToString(); } return endPath; diff --git a/Prebuild/src/Core/Utilities/Log.cs b/Prebuild/src/Core/Utilities/Log.cs index e8105ac034..548e987690 100644 --- a/Prebuild/src/Core/Utilities/Log.cs +++ b/Prebuild/src/Core/Utilities/Log.cs @@ -23,15 +23,6 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: jendave $ - * $Date: 2006-01-28 09:49:58 +0900 (Sat, 28 Jan 2006) $ - * $Revision: 71 $ - */ -#endregion - using System; using System.IO; diff --git a/Prebuild/src/Prebuild.cs b/Prebuild/src/Prebuild.cs index 922b4c9829..2d12b53066 100644 --- a/Prebuild/src/Prebuild.cs +++ b/Prebuild/src/Prebuild.cs @@ -27,7 +27,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O /* * $Source$ * $Author: jendave $ - * $Date: 2006-09-27 06:43:35 +0900 (Wed, 27 Sep 2006) $ + * $Date: 2006-09-26 23:43:35 +0200 (ti, 26 sep 2006) $ * $Revision: 168 $ */ #endregion diff --git a/Prebuild/src/Properties/AssemblyInfo.cs b/Prebuild/src/Properties/AssemblyInfo.cs index e49aea59ac..65c8736add 100644 --- a/Prebuild/src/Properties/AssemblyInfo.cs +++ b/Prebuild/src/Properties/AssemblyInfo.cs @@ -38,15 +38,6 @@ POSSIBILITY OF SUCH DAMAGE. */ #endregion -#region CVS Information -/* - * $Source$ - * $Author: cjcollier $ - * $Date: 2008-02-08 01:31:29 +0900 (Fri, 08 Feb 2008) $ - * $Revision: 256 $ - */ -#endregion - using System; using System.Reflection; using System.Runtime.CompilerServices; @@ -79,7 +70,7 @@ using System.Resources; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: NeutralResourcesLanguageAttribute("en-US")] -[assembly: AssemblyVersion("2.0.3.*")] +[assembly: AssemblyVersion("2.0.4.*")] // // Version information for an assembly consists of the following four values: diff --git a/Prebuild/src/data/prebuild-1.7.xsd b/Prebuild/src/data/prebuild-1.7.xsd index 3c108f3ffc..c3f8d6bb67 100644 --- a/Prebuild/src/data/prebuild-1.7.xsd +++ b/Prebuild/src/data/prebuild-1.7.xsd @@ -2,39 +2,40 @@ - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) + Copyright (c) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - BSD License: - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: + BSD License: - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - and the following disclaimer in the documentation and/or other materials provided with the - distribution. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: - THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + @@ -45,14 +46,19 @@ + + - + + - + + + @@ -60,12 +66,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -84,6 +127,7 @@ + @@ -98,6 +142,7 @@ + @@ -109,12 +154,23 @@ + + + + + + + + + + + @@ -195,6 +251,7 @@ + @@ -242,6 +299,7 @@ + diff --git a/Prebuild/tests/Makefile b/Prebuild/tests/Makefile new file mode 100644 index 0000000000..4a8ddf459d --- /dev/null +++ b/Prebuild/tests/Makefile @@ -0,0 +1,24 @@ +# +# Executable +# + +# Executables +PREBUILD = mono ../src/bin/Release/prebuild.exe /target makefile + +# Files +PREBUILDS = $(wildcard *.prebuild) +RESULTS = $(PREBUILDS:prebuild=results) +TESTS = $(PREBUILDS:prebuild=test) + +all: $(TESTS) + +clean: + rm -f *~ *.log + rm -f $(RESULTS) + +%.test: %.prebuild + $(PREBUILD) /log $*.log /file $*.prebuild /ppi $*.results >& /dev/null + if ! cmp $*.expected $*.results; then \ + echo $*.prebuild failed; \ + false; \ + fi diff --git a/Prebuild/tests/README.txt b/Prebuild/tests/README.txt new file mode 100644 index 0000000000..2c2de3bc50 --- /dev/null +++ b/Prebuild/tests/README.txt @@ -0,0 +1,5 @@ +There are some tests that are run via a Makfile in this +directory. They haven't been included in any form of unit tests, but +they are there to help test the functionality in some what. Simply +build prebuild (so there is a src/bin/Release/prebuild.exe) and type +`make` in this directory. Everything should pass without errors. diff --git a/Prebuild/tests/include-001.expected b/Prebuild/tests/include-001.expected new file mode 100644 index 0000000000..26374b5bc7 --- /dev/null +++ b/Prebuild/tests/include-001.expected @@ -0,0 +1,46 @@ + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + TRACE + bin/Release + true + false + + + + + + DEBUG;TRACE + false + bin/Debug + true + Prebuild.snk + 1595 + + + + + TRACE + bin/Release + true + false + Prebuild.snk + 1595 + + + + + + + + + diff --git a/Prebuild/tests/include-001.include b/Prebuild/tests/include-001.include new file mode 100644 index 0000000000..7f75962a7a --- /dev/null +++ b/Prebuild/tests/include-001.include @@ -0,0 +1,33 @@ + + + + DEBUG;TRACE + false + bin/Debug + true + Prebuild.snk + 1595 + + + + + TRACE + bin/Release + true + false + Prebuild.snk + 1595 + + + + + + + diff --git a/Prebuild/tests/include-001.prebuild b/Prebuild/tests/include-001.prebuild new file mode 100644 index 0000000000..8047008951 --- /dev/null +++ b/Prebuild/tests/include-001.prebuild @@ -0,0 +1,22 @@ + + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + TRACE + bin/Release + true + false + + + + + diff --git a/Prebuild/tests/include-002-2.include b/Prebuild/tests/include-002-2.include new file mode 100644 index 0000000000..661b7f3b06 --- /dev/null +++ b/Prebuild/tests/include-002-2.include @@ -0,0 +1,8 @@ + + + DEBUG;TRACE + false + bin/Debug + true + + diff --git a/Prebuild/tests/include-002.expected b/Prebuild/tests/include-002.expected new file mode 100644 index 0000000000..9849658b1e --- /dev/null +++ b/Prebuild/tests/include-002.expected @@ -0,0 +1,26 @@ + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + + DEBUG;TRACE + false + bin/Debug + true + + + + + + + + + diff --git a/Prebuild/tests/include-002.include b/Prebuild/tests/include-002.include new file mode 100644 index 0000000000..64f4058dc0 --- /dev/null +++ b/Prebuild/tests/include-002.include @@ -0,0 +1,14 @@ + + + + + + + diff --git a/Prebuild/tests/include-002.prebuild b/Prebuild/tests/include-002.prebuild new file mode 100644 index 0000000000..9e85f20f54 --- /dev/null +++ b/Prebuild/tests/include-002.prebuild @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe index 847bf1789f1e1477e71b48badbdfc6d3a83229ec..11adfa07772656d0d8aa893cc98a5f43d86b71e0 100755 GIT binary patch literal 237568 zcmeEvd7K?ZwSP_Dd;2c4_T0&xNhV|_E0?)5N!XHMKp=szCTw9}!xE6Sp(kM*27)38 z1O!}Al*Irppd!x&1QkRO#f6BV=z~05c!JJsS@cVvGRdrY2nMpw3@Av!TM?RU` zRi{o>ojP^u)TvX|)ys~&PGyu*S^T~6hEn(A$$z`b@1}p&Ai1UIffn_};`gWD->~%i z(+_^Gysg{yi`SlJt`KCAcCvwC;me|hhj;Ylm!HaC}MnW7I^ zqSVrcjOy6+=DlrgFQ}G=#)g7YD?r(N4c)jJ;a-H-klI~!xJ}ayfY8sUdKl?|FZgjr zWz?=Yi6EXlB}9Pyy94DO#t_PV?<5UN{oa;QO#pNOZ)z%GGm&1U(1Q410r9=!m{N0B ztvr7f;@Lw@yH;qr9TYZq#oTB(IuSsj4KxZ5&c@UEw<{PjH(Gf{2t?AVKr?xut{a25 zn8|Pddz%AqbKq?byv>2PIq)_I-sZsD9C(`pZ*$;n4!q5Q|Nl7f0@u~}$F-@aa_Z>^ z8r1IiDhn}4eGgNN*&OPB{E=}`?ult9p888!`{H~9SeK*+2`!L7e91QY4_j$ z?CjQCyRO`7kNo!@x%B!;H>~~0&-|}8E&O=6%V$2|ee8R$e(J)YVa02&UA)D@zkL0r z?>s*I;^U_+S07qlcxSlyLx*2^_R)VHxMI%}8ZO`K*^0Wh^|{<-eCVfN-~F{;e6f3eM*ST`g7!dllvK3^jVSq3y>KQ1s?z9(SQ+~f z($5Zm)1dsy#)jtNKuL8rR^bEj@n0h}rx6-~;8)>JNHAuPhvB&x+mD9 z*C5V{jJoTyYD>`6;Hivy`X>rZP^vuNQ`7MTJW#`vk*DP8MoW|a3tVaR^WhX0*|$l2 zX`sdLw)mO(4eEAQ#DCFeWAdU*Lrf{iLj#w@farZmFz;Ek=)fd+a}w;�cL^f?H=} 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 - +