From 06ece33bee0f046ea5f4b8590cfd9b13dd2e4a38 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Thu, 19 Feb 2009 18:01:33 +0000 Subject: [PATCH] * Okay, so finally got my head around this. Problem is that upstream Prebuild copied dlls promiscuously, and this led to the references being all mixed up (/bin dlls overwritten by different versions on every csc) * Something that thus needs fixing is the fact that ProjectReferences has to be marked False but that is not configurable in the upstream Xml Schema. I've hardcoded it in our repo for now. --- 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 | 884 ++++++++++++++++++ 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 | 276 +++--- 61 files changed, 2941 insertions(+), 2128 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..a05f6b3107 --- /dev/null +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs @@ -0,0 +1,884 @@ +#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(" False" ); + + 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..b5d5999deb73b5522804194d36ac6ffce716e46b 100755 GIT binary patch literal 237568 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 - + @@ -47,8 +47,8 @@ ../../../bin/ - - + + @@ -68,7 +68,7 @@ ../../../bin/ - + @@ -141,7 +141,7 @@ ../../bin/ - + @@ -223,7 +223,7 @@ ../../../../bin/ - + @@ -336,11 +336,11 @@ ../../../../bin/ - - + + - - + + @@ -364,11 +364,11 @@ ../../../../bin/ - - + + - + @@ -387,11 +387,11 @@ ../../../../bin/ - - + + - + @@ -410,12 +410,12 @@ ../../../../bin/ - - + + - + - + @@ -434,13 +434,13 @@ ../../../../bin/ - - + + - - + + @@ -462,14 +462,14 @@ ../../../../bin/ - - + + - - - - + + + + @@ -490,14 +490,14 @@ ../../../../bin/ - + - - + + - + @@ -557,7 +557,7 @@ ../../../bin/ - + @@ -696,9 +696,9 @@ ../../../bin/ - - - + + + @@ -729,9 +729,9 @@ ../../../bin/ - - - + + + @@ -874,10 +874,10 @@ ../../../bin/ - - - - + + + + @@ -909,9 +909,9 @@ ../../../bin/ - - - + + + @@ -939,9 +939,9 @@ ../../../bin/ - - - + + + @@ -970,7 +970,7 @@ ../../../bin/ - + @@ -1017,7 +1017,7 @@ ../../../../../../bin/ - + @@ -1040,7 +1040,7 @@ ../../../bin/ - + @@ -1124,7 +1124,7 @@ ../../../bin/ - + @@ -1160,7 +1160,7 @@ ../../../../bin/ - + @@ -1199,7 +1199,7 @@ ../../../bin/ - + @@ -1226,7 +1226,7 @@ ../../../bin/ - + @@ -1453,7 +1453,7 @@ ../../../bin/ - + @@ -1487,7 +1487,7 @@ - + @@ -1511,7 +1511,7 @@ ../../../bin/ - + @@ -1547,7 +1547,7 @@ ../../../bin/ - + @@ -1580,7 +1580,7 @@ ../../../bin/ - + @@ -1617,7 +1617,7 @@ ../../../bin/ - + @@ -1657,7 +1657,7 @@ ../../bin/ - + @@ -1679,10 +1679,10 @@ ../../../../bin/ - - - - + + + + @@ -1716,10 +1716,10 @@ ../../../../../../bin/ - - - - + + + + @@ -1751,10 +1751,10 @@ ../../../../../../../bin/ - - - - + + + + @@ -1785,10 +1785,10 @@ ../../../../../../bin/ - - - - + + + + @@ -1823,7 +1823,7 @@ ../../../../../bin/ - + @@ -1856,10 +1856,10 @@ ../../../../../bin/ - - - - + + + + @@ -1872,7 +1872,7 @@ - + @@ -1895,10 +1895,10 @@ ../../../../bin/ - - - - + + + + @@ -1938,10 +1938,10 @@ ../../../../bin/ ../../../../bin/ - - - - + + + + @@ -1976,7 +1976,7 @@ ../../../bin/ - + @@ -1998,10 +1998,10 @@ ../../../bin/ - - - - + + + + @@ -2036,10 +2036,10 @@ ../../../bin/ - - - - + + + + @@ -2077,10 +2077,10 @@ ../../../../../bin/ - - - - + + + + @@ -2116,10 +2116,10 @@ ../../../../../bin/ - - - - + + + + @@ -2156,10 +2156,10 @@ ../../../../../bin/ ../../../../../bin/ScriptEngines/ - - - - + + + + @@ -2197,10 +2197,10 @@ ../../../../../bin/ - - - - + + + + @@ -2238,10 +2238,10 @@ ../../../../../bin/ ../../../../../bin/ScriptEngines/ - - - - + + + + @@ -2278,10 +2278,10 @@ ../../../../bin/ ../../../../bin/ScriptEngines/ - - - - + + + + @@ -2321,7 +2321,7 @@ ../../../bin/ - + @@ -2371,7 +2371,7 @@ ../../../bin/ - + @@ -2398,7 +2398,7 @@ ../../bin/ - + @@ -2461,7 +2461,7 @@ ../../../bin/ - + @@ -2492,7 +2492,7 @@ ../../../../bin/ - + @@ -2527,7 +2527,7 @@ ../../../../bin/ - + @@ -2565,7 +2565,7 @@ ../../../../bin/ - + @@ -2687,7 +2687,7 @@ ../../../bin/ - + @@ -2746,7 +2746,7 @@ ../../../bin/ - + @@ -2835,7 +2835,7 @@ ../../../bin/ - +