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