aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Prebuild
diff options
context:
space:
mode:
Diffstat (limited to 'Prebuild')
-rw-r--r--Prebuild/src/Core/Attributes/DataNodeAttribute.cs84
-rw-r--r--Prebuild/src/Core/Attributes/OptionNodeAttribute.cs84
-rw-r--r--Prebuild/src/Core/Attributes/TargetAttribute.cs84
-rw-r--r--Prebuild/src/Core/FatalException.cs114
-rw-r--r--Prebuild/src/Core/Interfaces/IDataNode.cs52
-rw-r--r--Prebuild/src/Core/Interfaces/ITarget.cs62
-rw-r--r--Prebuild/src/Core/Kernel.cs1400
-rw-r--r--Prebuild/src/Core/Nodes/AuthorNode.cs124
-rw-r--r--Prebuild/src/Core/Nodes/CleanFilesNode.cs158
-rw-r--r--Prebuild/src/Core/Nodes/CleanupNode.cs168
-rw-r--r--Prebuild/src/Core/Nodes/ConfigurationNode.cs372
-rw-r--r--Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs142
-rw-r--r--Prebuild/src/Core/Nodes/DataNode.cs172
-rw-r--r--Prebuild/src/Core/Nodes/DatabaseProjectNode.cs186
-rw-r--r--Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs126
-rw-r--r--Prebuild/src/Core/Nodes/DescriptionNode.cs124
-rw-r--r--Prebuild/src/Core/Nodes/ExcludeNode.cs78
-rw-r--r--Prebuild/src/Core/Nodes/FileNode.cs456
-rw-r--r--Prebuild/src/Core/Nodes/FilesNode.cs284
-rw-r--r--Prebuild/src/Core/Nodes/MatchNode.cs458
-rw-r--r--Prebuild/src/Core/Nodes/OptionsNode.cs1178
-rw-r--r--Prebuild/src/Core/Nodes/ProcessNode.cs166
-rw-r--r--Prebuild/src/Core/Nodes/ProjectNode.cs1024
-rw-r--r--Prebuild/src/Core/Nodes/ReferenceNode.cs218
-rw-r--r--Prebuild/src/Core/Nodes/ReferencePathNode.cs124
-rw-r--r--Prebuild/src/Core/Nodes/SolutionNode.cs516
-rw-r--r--Prebuild/src/Core/Parse/IfContext.cs268
-rw-r--r--Prebuild/src/Core/Parse/Preprocessor.cs1088
-rw-r--r--Prebuild/src/Core/Targets/AutotoolsTarget.cs2140
-rw-r--r--Prebuild/src/Core/Targets/DebugTarget.cs110
-rw-r--r--Prebuild/src/Core/Targets/MakefileTarget.cs20
-rw-r--r--Prebuild/src/Core/Targets/MonoDevelopTarget.cs964
-rw-r--r--Prebuild/src/Core/Targets/NAntTarget.cs710
-rw-r--r--Prebuild/src/Core/Targets/SharpDevelop2Target.cs88
-rw-r--r--Prebuild/src/Core/Targets/SharpDevelopTarget.cs794
-rw-r--r--Prebuild/src/Core/Targets/ToolInfo.cs356
-rw-r--r--Prebuild/src/Core/Targets/VS2002Target.cs114
-rw-r--r--Prebuild/src/Core/Targets/VS2003Target.cs1132
-rw-r--r--Prebuild/src/Core/Targets/VS2005Target.cs26
-rw-r--r--Prebuild/src/Core/Targets/VS2008Target.cs180
-rw-r--r--Prebuild/src/Core/Targets/VS2010Target.cs204
-rw-r--r--Prebuild/src/Core/Targets/VSGenericTarget.cs1944
-rw-r--r--Prebuild/src/Core/Targets/VSVersion.cs70
-rw-r--r--Prebuild/src/Core/Targets/XcodeTarget.cs24
-rw-r--r--Prebuild/src/Core/UnknownLanguageException.cs76
-rw-r--r--Prebuild/src/Core/Utilities/CommandLineCollection.cs254
-rw-r--r--Prebuild/src/Core/Utilities/CurrentDirectory.cs80
-rw-r--r--Prebuild/src/Core/Utilities/Helper.cs1036
-rw-r--r--Prebuild/src/Core/Utilities/Log.cs434
-rw-r--r--Prebuild/src/Core/WarningException.cs112
-rw-r--r--Prebuild/src/Prebuild.cs236
-rw-r--r--Prebuild/src/Properties/AssemblyInfo.cs18
52 files changed, 10216 insertions, 10216 deletions
diff --git a/Prebuild/src/Core/Attributes/DataNodeAttribute.cs b/Prebuild/src/Core/Attributes/DataNodeAttribute.cs
index f1938a2..cd3cea4 100644
--- a/Prebuild/src/Core/Attributes/DataNodeAttribute.cs
+++ b/Prebuild/src/Core/Attributes/DataNodeAttribute.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -28,45 +28,45 @@ using System.Collections.Specialized;
28 28
29namespace Prebuild.Core.Attributes 29namespace Prebuild.Core.Attributes
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// 32 ///
33 /// </summary> 33 /// </summary>
34 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)] 34 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple=true)]
35 public sealed class DataNodeAttribute : Attribute 35 public sealed class DataNodeAttribute : Attribute
36 { 36 {
37 #region Fields 37 #region Fields
38 38
39 private string m_Name = "unknown"; 39 private string m_Name = "unknown";
40 40
41 #endregion 41 #endregion
42 42
43 #region Constructors 43 #region Constructors
44 44
45 /// <summary> 45 /// <summary>
46 /// Initializes a new instance of the <see cref="DataNodeAttribute"/> class. 46 /// Initializes a new instance of the <see cref="DataNodeAttribute"/> class.
47 /// </summary> 47 /// </summary>
48 /// <param name="name">The name.</param> 48 /// <param name="name">The name.</param>
49 public DataNodeAttribute(string name) 49 public DataNodeAttribute(string name)
50 { 50 {
51 m_Name = name; 51 m_Name = name;
52 } 52 }
53 53
54 #endregion 54 #endregion
55 55
56 #region Properties 56 #region Properties
57 57
58 /// <summary> 58 /// <summary>
59 /// Gets the name. 59 /// Gets the name.
60 /// </summary> 60 /// </summary>
61 /// <value>The name.</value> 61 /// <value>The name.</value>
62 public string Name 62 public string Name
63 { 63 {
64 get 64 get
65 { 65 {
66 return m_Name; 66 return m_Name;
67 } 67 }
68 } 68 }
69 69
70 #endregion 70 #endregion
71 } 71 }
72} 72}
diff --git a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs
index 2d6a6a7..8ef97a1 100644
--- a/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs
+++ b/Prebuild/src/Core/Attributes/OptionNodeAttribute.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -27,45 +27,45 @@ using System;
27 27
28namespace Prebuild.Core.Attributes 28namespace Prebuild.Core.Attributes
29{ 29{
30 /// <summary> 30 /// <summary>
31 /// 31 ///
32 /// </summary> 32 /// </summary>
33 [AttributeUsage(AttributeTargets.Field)] 33 [AttributeUsage(AttributeTargets.Field)]
34 public sealed class OptionNodeAttribute : Attribute 34 public sealed class OptionNodeAttribute : Attribute
35 { 35 {
36 #region Fields 36 #region Fields
37 37
38 private string m_NodeName; 38 private string m_NodeName;
39 39
40 #endregion 40 #endregion
41 41
42 #region Constructors 42 #region Constructors
43 43
44 /// <summary> 44 /// <summary>
45 /// Initializes a new instance of the <see cref="OptionNodeAttribute"/> class. 45 /// Initializes a new instance of the <see cref="OptionNodeAttribute"/> class.
46 /// </summary> 46 /// </summary>
47 /// <param name="nodeName">Name of the node.</param> 47 /// <param name="nodeName">Name of the node.</param>
48 public OptionNodeAttribute(string nodeName) 48 public OptionNodeAttribute(string nodeName)
49 { 49 {
50 m_NodeName = nodeName; 50 m_NodeName = nodeName;
51 } 51 }
52 52
53 #endregion 53 #endregion
54 54
55 #region Properties 55 #region Properties
56 56
57 /// <summary> 57 /// <summary>
58 /// Gets the name of the node. 58 /// Gets the name of the node.
59 /// </summary> 59 /// </summary>
60 /// <value>The name of the node.</value> 60 /// <value>The name of the node.</value>
61 public string NodeName 61 public string NodeName
62 { 62 {
63 get 63 get
64 { 64 {
65 return m_NodeName; 65 return m_NodeName;
66 } 66 }
67 } 67 }
68 68
69 #endregion 69 #endregion
70 } 70 }
71} 71}
diff --git a/Prebuild/src/Core/Attributes/TargetAttribute.cs b/Prebuild/src/Core/Attributes/TargetAttribute.cs
index 5ad62ee..fb30914 100644
--- a/Prebuild/src/Core/Attributes/TargetAttribute.cs
+++ b/Prebuild/src/Core/Attributes/TargetAttribute.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -27,45 +27,45 @@ using System;
27 27
28namespace Prebuild.Core.Attributes 28namespace Prebuild.Core.Attributes
29{ 29{
30 /// <summary> 30 /// <summary>
31 /// 31 ///
32 /// </summary> 32 /// </summary>
33 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] 33 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
34 public sealed class TargetAttribute : Attribute 34 public sealed class TargetAttribute : Attribute
35 { 35 {
36 #region Fields 36 #region Fields
37 37
38 private string m_Name; 38 private string m_Name;
39 39
40 #endregion 40 #endregion
41 41
42 #region Constructors 42 #region Constructors
43 43
44 /// <summary> 44 /// <summary>
45 /// Initializes a new instance of the <see cref="TargetAttribute"/> class. 45 /// Initializes a new instance of the <see cref="TargetAttribute"/> class.
46 /// </summary> 46 /// </summary>
47 /// <param name="name">The name.</param> 47 /// <param name="name">The name.</param>
48 public TargetAttribute(string name) 48 public TargetAttribute(string name)
49 { 49 {
50 m_Name = name; 50 m_Name = name;
51 } 51 }
52 52
53 #endregion 53 #endregion
54 54
55 #region Properties 55 #region Properties
56 56
57 /// <summary> 57 /// <summary>
58 /// Gets the name. 58 /// Gets the name.
59 /// </summary> 59 /// </summary>
60 /// <value>The name.</value> 60 /// <value>The name.</value>
61 public string Name 61 public string Name
62 { 62 {
63 get 63 get
64 { 64 {
65 return m_Name; 65 return m_Name;
66 } 66 }
67 } 67 }
68 68
69 #endregion 69 #endregion
70 } 70 }
71} 71}
diff --git a/Prebuild/src/Core/FatalException.cs b/Prebuild/src/Core/FatalException.cs
index 3487905..751297a 100644
--- a/Prebuild/src/Core/FatalException.cs
+++ b/Prebuild/src/Core/FatalException.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -28,58 +28,58 @@ using System.Runtime.Serialization;
28 28
29namespace Prebuild.Core 29namespace Prebuild.Core
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// 32 ///
33 /// </summary> 33 /// </summary>
34 [Serializable()] 34 [Serializable()]
35 public class FatalException : Exception 35 public class FatalException : Exception
36 { 36 {
37 #region Constructors 37 #region Constructors
38 38
39
40 /// <summary>
41 /// Initializes a new instance of the <see cref="FatalException"/> class.
42 /// </summary>
43 public FatalException()
44 {
45 }
46 39
47 /// <summary> 40 /// <summary>
48 /// Initializes a new instance of the <see cref="FatalException"/> class. 41 /// Initializes a new instance of the <see cref="FatalException"/> class.
49 /// </summary> 42 /// </summary>
50 /// <param name="format">The format.</param> 43 public FatalException()
51 /// <param name="args">The args.</param> 44 {
52 public FatalException(string format, params object[] args) 45 }
53 : base(String.Format(format, args))
54 {
55 }
56 46
57 /// <summary> 47 /// <summary>
58 /// Exception with specified string 48 /// Initializes a new instance of the <see cref="FatalException"/> class.
59 /// </summary> 49 /// </summary>
60 /// <param name="message">Exception message</param> 50 /// <param name="format">The format.</param>
61 public FatalException(string message): base(message) 51 /// <param name="args">The args.</param>
62 { 52 public FatalException(string format, params object[] args)
63 } 53 : base(String.Format(format, args))
54 {
55 }
64 56
65 /// <summary> 57 /// <summary>
66 /// 58 /// Exception with specified string
67 /// </summary> 59 /// </summary>
68 /// <param name="message"></param> 60 /// <param name="message">Exception message</param>
69 /// <param name="exception"></param> 61 public FatalException(string message): base(message)
70 public FatalException(string message, Exception exception) : base(message, exception) 62 {
71 { 63 }
72 }
73 64
74 /// <summary> 65 /// <summary>
75 /// 66 ///
76 /// </summary> 67 /// </summary>
77 /// <param name="info"></param> 68 /// <param name="message"></param>
78 /// <param name="context"></param> 69 /// <param name="exception"></param>
79 protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context ) 70 public FatalException(string message, Exception exception) : base(message, exception)
80 { 71 {
81 } 72 }
82 73
83 #endregion 74 /// <summary>
84 } 75 ///
76 /// </summary>
77 /// <param name="info"></param>
78 /// <param name="context"></param>
79 protected FatalException(SerializationInfo info, StreamingContext context) : base( info, context )
80 {
81 }
82
83 #endregion
84 }
85} 85}
diff --git a/Prebuild/src/Core/Interfaces/IDataNode.cs b/Prebuild/src/Core/Interfaces/IDataNode.cs
index 986dd2d..4917b18 100644
--- a/Prebuild/src/Core/Interfaces/IDataNode.cs
+++ b/Prebuild/src/Core/Interfaces/IDataNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -26,22 +26,22 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
26using System; 26using System;
27using System.Xml; 27using System.Xml;
28 28
29namespace Prebuild.Core.Interfaces 29namespace Prebuild.Core.Interfaces
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// 32 ///
33 /// </summary> 33 /// </summary>
34 public interface IDataNode 34 public interface IDataNode
35 { 35 {
36 /// <summary> 36 /// <summary>
37 /// Gets or sets the parent. 37 /// Gets or sets the parent.
38 /// </summary> 38 /// </summary>
39 /// <value>The parent.</value> 39 /// <value>The parent.</value>
40 IDataNode Parent { get; set; } 40 IDataNode Parent { get; set; }
41 /// <summary> 41 /// <summary>
42 /// Parses the specified node. 42 /// Parses the specified node.
43 /// </summary> 43 /// </summary>
44 /// <param name="node">The node.</param> 44 /// <param name="node">The node.</param>
45 void Parse(XmlNode node); 45 void Parse(XmlNode node);
46 } 46 }
47} 47}
diff --git a/Prebuild/src/Core/Interfaces/ITarget.cs b/Prebuild/src/Core/Interfaces/ITarget.cs
index 47115c6..e4c3ea4 100644
--- a/Prebuild/src/Core/Interfaces/ITarget.cs
+++ b/Prebuild/src/Core/Interfaces/ITarget.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -25,27 +25,27 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
25 25
26using System; 26using System;
27 27
28namespace Prebuild.Core.Interfaces 28namespace Prebuild.Core.Interfaces
29{ 29{
30 /// <summary> 30 /// <summary>
31 /// 31 ///
32 /// </summary> 32 /// </summary>
33 public interface ITarget 33 public interface ITarget
34 { 34 {
35 /// <summary> 35 /// <summary>
36 /// Writes the specified kern. 36 /// Writes the specified kern.
37 /// </summary> 37 /// </summary>
38 /// <param name="kern">The kern.</param> 38 /// <param name="kern">The kern.</param>
39 void Write(Kernel kern); 39 void Write(Kernel kern);
40 /// <summary> 40 /// <summary>
41 /// Cleans the specified kern. 41 /// Cleans the specified kern.
42 /// </summary> 42 /// </summary>
43 /// <param name="kern">The kern.</param> 43 /// <param name="kern">The kern.</param>
44 void Clean(Kernel kern); 44 void Clean(Kernel kern);
45 /// <summary> 45 /// <summary>
46 /// Gets the name. 46 /// Gets the name.
47 /// </summary> 47 /// </summary>
48 /// <value>The name.</value> 48 /// <value>The name.</value>
49 string Name { get; } 49 string Name { get; }
50 } 50 }
51} \ No newline at end of file 51} \ No newline at end of file
diff --git a/Prebuild/src/Core/Kernel.cs b/Prebuild/src/Core/Kernel.cs
index 761962e..454ff8b 100644
--- a/Prebuild/src/Core/Kernel.cs
+++ b/Prebuild/src/Core/Kernel.cs
@@ -49,202 +49,202 @@ using Prebuild.Core.Interfaces;
49using Prebuild.Core.Nodes; 49using Prebuild.Core.Nodes;
50using Prebuild.Core.Utilities; 50using Prebuild.Core.Utilities;
51 51
52namespace Prebuild.Core 52namespace Prebuild.Core
53{ 53{
54 /// <summary> 54 /// <summary>
55 /// 55 ///
56 /// </summary> 56 /// </summary>
57 public class Kernel : IDisposable 57 public class Kernel : IDisposable
58 { 58 {
59 #region Inner Classes 59 #region Inner Classes
60 60
61 private struct NodeEntry 61 private struct NodeEntry
62 { 62 {
63 public Type Type; 63 public Type Type;
64 public DataNodeAttribute Attribute; 64 public DataNodeAttribute Attribute;
65 } 65 }
66 66
67 #endregion 67 #endregion
68 68
69 #region Fields 69 #region Fields
70 70
71 private static readonly Kernel m_Instance = new Kernel(); 71 private static readonly Kernel m_Instance = new Kernel();
72 72
73 /// <summary> 73 /// <summary>
74 /// This must match the version of the schema that is embeeded 74 /// This must match the version of the schema that is embeeded
75 /// </summary> 75 /// </summary>
76 private const string m_SchemaVersion = "1.10"; 76 private const string m_SchemaVersion = "1.10";
77 private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd"; 77 private const string m_Schema = "prebuild-" + m_SchemaVersion + ".xsd";
78 private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema; 78 private const string m_SchemaURI = "http://dnpb.sourceforge.net/schemas/" + m_Schema;
79 bool disposed; 79 bool disposed;
80 private Version m_Version; 80 private Version m_Version;
81 private const string m_Revision = ""; 81 private const string m_Revision = "";
82 private CommandLineCollection m_CommandLine; 82 private CommandLineCollection m_CommandLine;
83 private Log m_Log; 83 private Log m_Log;
84 private CurrentDirectory m_CurrentWorkingDirectory; 84 private CurrentDirectory m_CurrentWorkingDirectory;
85 private XmlSchemaCollection m_Schemas; 85 private XmlSchemaCollection m_Schemas;
86 86
87 private readonly Dictionary<string, ITarget> m_Targets = new Dictionary<string, ITarget>(); 87 private readonly Dictionary<string, ITarget> m_Targets = new Dictionary<string, ITarget>();
88 private readonly Dictionary<string, NodeEntry> m_Nodes = new Dictionary<string, NodeEntry>(); 88 private readonly Dictionary<string, NodeEntry> m_Nodes = new Dictionary<string, NodeEntry>();
89 89
90 readonly List<SolutionNode> m_Solutions = new List<SolutionNode>(); 90 readonly List<SolutionNode> m_Solutions = new List<SolutionNode>();
91 string m_Target; 91 string m_Target;
92 string m_Clean; 92 string m_Clean;
93 string[] m_RemoveDirectories; 93 string[] m_RemoveDirectories;
94 XmlDocument m_CurrentDoc; 94 XmlDocument m_CurrentDoc;
95 bool m_PauseAfterFinish; 95 bool m_PauseAfterFinish;
96 string[] m_ProjectGroups; 96 string[] m_ProjectGroups;
97 97
98 #endregion 98 #endregion
99 99
100 #region Constructors 100 #region Constructors
101 101
102 private Kernel() 102 private Kernel()
103 { 103 {
104 } 104 }
105 105
106 #endregion 106 #endregion
107 107
108 #region Properties 108 #region Properties
109 109
110 /// <summary> 110 /// <summary>
111 /// Gets a value indicating whether [pause after finish]. 111 /// Gets a value indicating whether [pause after finish].
112 /// </summary> 112 /// </summary>
113 /// <value><c>true</c> if [pause after finish]; otherwise, <c>false</c>.</value> 113 /// <value><c>true</c> if [pause after finish]; otherwise, <c>false</c>.</value>
114 public bool PauseAfterFinish 114 public bool PauseAfterFinish
115 { 115 {
116 get 116 get
117 { 117 {
118 return m_PauseAfterFinish; 118 return m_PauseAfterFinish;
119 } 119 }
120 } 120 }
121 121
122 /// <summary> 122 /// <summary>
123 /// Gets the instance. 123 /// Gets the instance.
124 /// </summary> 124 /// </summary>
125 /// <value>The instance.</value> 125 /// <value>The instance.</value>
126 public static Kernel Instance 126 public static Kernel Instance
127 { 127 {
128 get 128 get
129 { 129 {
130 return m_Instance; 130 return m_Instance;
131 } 131 }
132 } 132 }
133 133
134 /// <summary> 134 /// <summary>
135 /// Gets the version. 135 /// Gets the version.
136 /// </summary> 136 /// </summary>
137 /// <value>The version.</value> 137 /// <value>The version.</value>
138 public string Version 138 public string Version
139 { 139 {
140 get 140 get
141 { 141 {
142 return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision); 142 return String.Format("{0}.{1}.{2}{3}", m_Version.Major, m_Version.Minor, m_Version.Build, m_Revision);
143 } 143 }
144 } 144 }
145 145
146 /// <summary> 146 /// <summary>
147 /// Gets the command line. 147 /// Gets the command line.
148 /// </summary> 148 /// </summary>
149 /// <value>The command line.</value> 149 /// <value>The command line.</value>
150 public CommandLineCollection CommandLine 150 public CommandLineCollection CommandLine
151 { 151 {
152 get 152 get
153 { 153 {
154 return m_CommandLine; 154 return m_CommandLine;
155 } 155 }
156 } 156 }
157 157
158 /// <summary> 158 /// <summary>
159 /// Gets the targets. 159 /// Gets the targets.
160 /// </summary> 160 /// </summary>
161 /// <value>The targets.</value> 161 /// <value>The targets.</value>
162 public Dictionary<string, ITarget> Targets 162 public Dictionary<string, ITarget> Targets
163 { 163 {
164 get 164 get
165 { 165 {
166 return m_Targets; 166 return m_Targets;
167 } 167 }
168 } 168 }
169 169
170 /// <summary> 170 /// <summary>
171 /// Gets the log. 171 /// Gets the log.
172 /// </summary> 172 /// </summary>
173 /// <value>The log.</value> 173 /// <value>The log.</value>
174 public Log Log 174 public Log Log
175 { 175 {
176 get 176 get
177 { 177 {
178 return m_Log; 178 return m_Log;
179 } 179 }
180 } 180 }
181 181
182 /// <summary> 182 /// <summary>
183 /// Gets the current working directory. 183 /// Gets the current working directory.
184 /// </summary> 184 /// </summary>
185 /// <value>The current working directory.</value> 185 /// <value>The current working directory.</value>
186 public CurrentDirectory CurrentWorkingDirectory 186 public CurrentDirectory CurrentWorkingDirectory
187 { 187 {
188 get 188 get
189 { 189 {
190 return m_CurrentWorkingDirectory; 190 return m_CurrentWorkingDirectory;
191 } 191 }
192 } 192 }
193 193
194 /// <summary> 194 /// <summary>
195 /// Gets the solutions. 195 /// Gets the solutions.
196 /// </summary> 196 /// </summary>
197 /// <value>The solutions.</value> 197 /// <value>The solutions.</value>
198 public List<SolutionNode> Solutions 198 public List<SolutionNode> Solutions
199 { 199 {
200 get 200 get
201 { 201 {
202 return m_Solutions; 202 return m_Solutions;
203 } 203 }
204 } 204 }
205 205
206 /// <summary> 206 /// <summary>
207 /// Gets the XmlDocument object representing the prebuild.xml 207 /// Gets the XmlDocument object representing the prebuild.xml
208 /// being processed 208 /// being processed
209 /// </summary> 209 /// </summary>
210 /// <value>The XmlDocument object</value> 210 /// <value>The XmlDocument object</value>
211 public XmlDocument CurrentDoc 211 public XmlDocument CurrentDoc
212 { 212 {
213 get 213 get
214 { 214 {
215 return m_CurrentDoc; 215 return m_CurrentDoc;
216 } 216 }
217 } 217 }
218 218
219 #endregion 219 #endregion
220 220
221 #region Private Methods 221 #region Private Methods
222 222
223 private static void RemoveDirectories(string rootDir, string[] dirNames) 223 private static void RemoveDirectories(string rootDir, string[] dirNames)
224 { 224 {
225 foreach(string dir in Directory.GetDirectories(rootDir)) 225 foreach(string dir in Directory.GetDirectories(rootDir))
226 { 226 {
227 string simpleName = Path.GetFileName(dir); 227 string simpleName = Path.GetFileName(dir);
228 228
229 if(Array.IndexOf(dirNames, simpleName) != -1) 229 if(Array.IndexOf(dirNames, simpleName) != -1)
230 { 230 {
231 //delete if the name matches one of the directory names to delete 231 //delete if the name matches one of the directory names to delete
232 string fullDirPath = Path.GetFullPath(dir); 232 string fullDirPath = Path.GetFullPath(dir);
233 Directory.Delete(fullDirPath,true); 233 Directory.Delete(fullDirPath,true);
234 } 234 }
235 else//not a match, so check children 235 else//not a match, so check children
236 { 236 {
237 RemoveDirectories(dir,dirNames); 237 RemoveDirectories(dir,dirNames);
238 //recurse, checking children for them 238 //recurse, checking children for them
239 } 239 }
240 } 240 }
241 } 241 }
242 242
243// private void RemoveDirectoryMatches(string rootDir, string dirPattern) 243// private void RemoveDirectoryMatches(string rootDir, string dirPattern)
244// { 244// {
245// foreach(string dir in Directory.GetDirectories(rootDir)) 245// foreach(string dir in Directory.GetDirectories(rootDir))
246// { 246// {
247// foreach(string match in Directory.GetDirectories(dir)) 247// foreach(string match in Directory.GetDirectories(dir))
248// {//delete all child directories that match 248// {//delete all child directories that match
249// Directory.Delete(Path.GetFullPath(match),true); 249// Directory.Delete(Path.GetFullPath(match),true);
250// } 250// }
@@ -253,56 +253,56 @@ namespace Prebuild.Core
253// } 253// }
254// } 254// }
255 255
256 private void LoadSchema() 256 private void LoadSchema()
257 { 257 {
258 Assembly assembly = GetType().Assembly; 258 Assembly assembly = GetType().Assembly;
259 Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema); 259 Stream stream = assembly.GetManifestResourceStream("Prebuild.data." + m_Schema);
260 if(stream == null) 260 if(stream == null)
261 { 261 {
262 //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET 262 //try without the default namespace prepending to it in case was compiled with SharpDevelop or MonoDevelop instead of Visual Studio .NET
263 stream = assembly.GetManifestResourceStream(m_Schema); 263 stream = assembly.GetManifestResourceStream(m_Schema);
264 if(stream == null) 264 if(stream == null)
265 { 265 {
266 throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema)); 266 throw new System.Reflection.TargetException(string.Format("Could not find the scheme embedded resource file '{0}'.", m_Schema));
267 } 267 }
268 } 268 }
269 XmlReader schema = new XmlTextReader(stream); 269 XmlReader schema = new XmlTextReader(stream);
270 270
271 m_Schemas = new XmlSchemaCollection(); 271 m_Schemas = new XmlSchemaCollection();
272 m_Schemas.Add(m_SchemaURI, schema); 272 m_Schemas.Add(m_SchemaURI, schema);
273 } 273 }
274 274
275 private void CacheVersion() 275 private void CacheVersion()
276 { 276 {
277 m_Version = Assembly.GetEntryAssembly().GetName().Version; 277 m_Version = Assembly.GetEntryAssembly().GetName().Version;
278 } 278 }
279 279
280 private void CacheTargets(Assembly assm) 280 private void CacheTargets(Assembly assm)
281 { 281 {
282 foreach(Type t in assm.GetTypes()) 282 foreach(Type t in assm.GetTypes())
283 { 283 {
284 TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget)); 284 TargetAttribute ta = (TargetAttribute)Helper.CheckType(t, typeof(TargetAttribute), typeof(ITarget));
285 285
286 if(ta == null) 286 if(ta == null)
287 continue; 287 continue;
288 288
289 if (t.IsAbstract) 289 if (t.IsAbstract)
290 continue; 290 continue;
291 291
292 ITarget target = (ITarget)assm.CreateInstance(t.FullName); 292 ITarget target = (ITarget)assm.CreateInstance(t.FullName);
293 if (target == null) 293 if (target == null)
294 { 294 {
295 throw new MissingMethodException("Could not create ITarget instance"); 295 throw new MissingMethodException("Could not create ITarget instance");
296 } 296 }
297 297
298 m_Targets[ta.Name] = target; 298 m_Targets[ta.Name] = target;
299 } 299 }
300 } 300 }
301 301
302 private void CacheNodeTypes(Assembly assm) 302 private void CacheNodeTypes(Assembly assm)
303 { 303 {
304 foreach(Type t in assm.GetTypes()) 304 foreach(Type t in assm.GetTypes())
305 { 305 {
306 foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true)) 306 foreach (DataNodeAttribute dna in t.GetCustomAttributes(typeof(DataNodeAttribute), true))
307 { 307 {
308 NodeEntry ne = new NodeEntry(); 308 NodeEntry ne = new NodeEntry();
@@ -310,11 +310,11 @@ namespace Prebuild.Core
310 ne.Attribute = dna; 310 ne.Attribute = dna;
311 m_Nodes[dna.Name] = ne; 311 m_Nodes[dna.Name] = ne;
312 } 312 }
313 } 313 }
314 } 314 }
315 315
316 private void LogBanner() 316 private void LogBanner()
317 { 317 {
318 m_Log.Write("Prebuild v" + Version); 318 m_Log.Write("Prebuild v" + Version);
319 m_Log.Write("Copyright (c) 2004-2010"); 319 m_Log.Write("Copyright (c) 2004-2010");
320 m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),"); 320 m_Log.Write("Matthew Holmes (matthew@wildfiregames.com),");
@@ -326,7 +326,7 @@ namespace Prebuild.Core
326 326
327 m_Log.Write("See 'prebuild /usage' for help"); 327 m_Log.Write("See 'prebuild /usage' for help");
328 m_Log.Write(); 328 m_Log.Write();
329 } 329 }
330 330
331 331
332 332
@@ -348,37 +348,37 @@ namespace Prebuild.Core
348 } 348 }
349 349
350 /// <summary> 350 /// <summary>
351 /// 351 ///
352 /// </summary> 352 /// </summary>
353 /// <param name="file"></param> 353 /// <param name="file"></param>
354 /// <param name="solutions"></param> 354 /// <param name="solutions"></param>
355 /// <returns></returns> 355 /// <returns></returns>
356 public void ProcessFile(string file, IList<SolutionNode> solutions) 356 public void ProcessFile(string file, IList<SolutionNode> solutions)
357 { 357 {
358 m_CurrentWorkingDirectory.Push(); 358 m_CurrentWorkingDirectory.Push();
359 359
360 string path = file; 360 string path = file;
361 try 361 try
362 { 362 {
363 try 363 try
364 { 364 {
365 path = Helper.ResolvePath(path); 365 path = Helper.ResolvePath(path);
366 } 366 }
367 catch(ArgumentException) 367 catch(ArgumentException)
368 { 368 {
369 m_Log.Write("Could not open Prebuild file: " + path); 369 m_Log.Write("Could not open Prebuild file: " + path);
370 m_CurrentWorkingDirectory.Pop(); 370 m_CurrentWorkingDirectory.Pop();
371 return; 371 return;
372 } 372 }
373 373
374 Helper.SetCurrentDir(Path.GetDirectoryName(path)); 374 Helper.SetCurrentDir(Path.GetDirectoryName(path));
375 375
376 XmlTextReader reader = new XmlTextReader(path); 376 XmlTextReader reader = new XmlTextReader(path);
377 377
378 Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor(); 378 Core.Parse.Preprocessor pre = new Core.Parse.Preprocessor();
379 379
380 //register command line arguments as XML variables 380 //register command line arguments as XML variables
381 IEnumerator<KeyValuePair<string, string>> dict = m_CommandLine.GetEnumerator(); 381 IEnumerator<KeyValuePair<string, string>> dict = m_CommandLine.GetEnumerator();
382 while (dict.MoveNext()) 382 while (dict.MoveNext())
383 { 383 {
384 string name = dict.Current.Key.Trim(); 384 string name = dict.Current.Key.Trim();
@@ -386,447 +386,447 @@ namespace Prebuild.Core
386 pre.RegisterVariable(name, dict.Current.Value); 386 pre.RegisterVariable(name, dict.Current.Value);
387 } 387 }
388 388
389 string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML 389 string xml = pre.Process(reader);//remove script and evaulate pre-proccessing to get schema-conforming XML
390 390
391 // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the 391 // See if the user put into a pseudo target of "prebuild:preprocessed-input" to indicate they want to see the
392 // output before the system processes it. 392 // output before the system processes it.
393 if (m_CommandLine.WasPassed("ppi")) 393 if (m_CommandLine.WasPassed("ppi"))
394 { 394 {
395 // Get the filename if there is one, otherwise use a default. 395 // Get the filename if there is one, otherwise use a default.
396 string ppiFile = m_CommandLine["ppi"]; 396 string ppiFile = m_CommandLine["ppi"];
397 if (ppiFile == null || ppiFile.Trim().Length == 0) 397 if (ppiFile == null || ppiFile.Trim().Length == 0)
398 { 398 {
399 ppiFile = "preprocessed-input.xml"; 399 ppiFile = "preprocessed-input.xml";
400 } 400 }
401 401
402 // Write out the string to the given stream. 402 // Write out the string to the given stream.
403 try 403 try
404 { 404 {
405 using (StreamWriter ppiWriter = new StreamWriter(ppiFile)) 405 using (StreamWriter ppiWriter = new StreamWriter(ppiFile))
406 { 406 {
407 ppiWriter.WriteLine(xml); 407 ppiWriter.WriteLine(xml);
408 } 408 }
409 } 409 }
410 catch(IOException ex) 410 catch(IOException ex)
411 { 411 {
412 Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message); 412 Console.WriteLine("Could not write PPI file '{0}': {1}", ppiFile, ex.Message);
413 } 413 }
414 414
415 // Finish processing this special tag. 415 // Finish processing this special tag.
416 return; 416 return;
417 } 417 }
418 418
419 m_CurrentDoc = new XmlDocument(); 419 m_CurrentDoc = new XmlDocument();
420 try 420 try
421 { 421 {
422#if NO_VALIDATE 422#if NO_VALIDATE
423 XmlReader validator = XmlReader.Create(new StringReader(xml)); 423 XmlReader validator = XmlReader.Create(new StringReader(xml));
424 m_CurrentDoc.Load(validator); 424 m_CurrentDoc.Load(validator);
425#else 425#else
426 XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml))); 426 XmlValidatingReader validator = new XmlValidatingReader(new XmlTextReader(new StringReader(xml)));
427 427
428 //validate while reading from string into XmlDocument DOM structure in memory 428 //validate while reading from string into XmlDocument DOM structure in memory
429 foreach(XmlSchema schema in m_Schemas) 429 foreach(XmlSchema schema in m_Schemas)
430 { 430 {
431 validator.Schemas.Add(schema); 431 validator.Schemas.Add(schema);
432 } 432 }
433 m_CurrentDoc.Load(validator); 433 m_CurrentDoc.Load(validator);
434#endif 434#endif
435 } 435 }
436 catch(XmlException e) 436 catch(XmlException e)
437 { 437 {
438 throw new XmlException(e.ToString()); 438 throw new XmlException(e.ToString());
439 } 439 }
440 440
441 //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details 441 //is there a purpose to writing it? An syntax/schema problem would have been found during pre.Process() and reported with details
442 if(m_CommandLine.WasPassed("ppo")) 442 if(m_CommandLine.WasPassed("ppo"))
443 { 443 {
444 string ppoFile = m_CommandLine["ppo"]; 444 string ppoFile = m_CommandLine["ppo"];
445 if(ppoFile == null || ppoFile.Trim().Length < 1) 445 if(ppoFile == null || ppoFile.Trim().Length < 1)
446 { 446 {
447 ppoFile = "preprocessed.xml"; 447 ppoFile = "preprocessed.xml";
448 } 448 }
449 449
450 StreamWriter writer = null; 450 StreamWriter writer = null;
451 try 451 try
452 { 452 {
453 writer = new StreamWriter(ppoFile); 453 writer = new StreamWriter(ppoFile);
454 writer.Write(xml); 454 writer.Write(xml);
455 } 455 }
456 catch(IOException ex) 456 catch(IOException ex)
457 { 457 {
458 Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message); 458 Console.WriteLine("Could not write PPO file '{0}': {1}", ppoFile, ex.Message);
459 } 459 }
460 finally 460 finally
461 { 461 {
462 if(writer != null) 462 if(writer != null)
463 { 463 {
464 writer.Close(); 464 writer.Close();
465 } 465 }
466 } 466 }
467 return; 467 return;
468 } 468 }
469 //start reading the xml config file 469 //start reading the xml config file
470 XmlElement rootNode = m_CurrentDoc.DocumentElement; 470 XmlElement rootNode = m_CurrentDoc.DocumentElement;
471 //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0"); 471 //string suggestedVersion = Helper.AttributeValue(rootNode,"version","1.0");
472 Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false); 472 Helper.CheckForOSVariables = Helper.ParseBoolean(rootNode,"checkOsVars",false);
473 473
474 foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions 474 foreach(XmlNode node in rootNode.ChildNodes)//solutions or if pre-proc instructions
475 { 475 {
476 IDataNode dataNode = ParseNode(node, null); 476 IDataNode dataNode = ParseNode(node, null);
477 if(dataNode is ProcessNode) 477 if(dataNode is ProcessNode)
478 { 478 {
479 ProcessNode proc = (ProcessNode)dataNode; 479 ProcessNode proc = (ProcessNode)dataNode;
480 if(proc.IsValid) 480 if(proc.IsValid)
481 { 481 {
482 ProcessFile(proc.Path); 482 ProcessFile(proc.Path);
483 } 483 }
484 } 484 }
485 else if(dataNode is SolutionNode) 485 else if(dataNode is SolutionNode)
486 { 486 {
487 solutions.Add((SolutionNode)dataNode); 487 solutions.Add((SolutionNode)dataNode);
488 } 488 }
489 } 489 }
490 } 490 }
491 catch(XmlSchemaException xse) 491 catch(XmlSchemaException xse)
492 { 492 {
493 m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}", 493 m_Log.Write("XML validation error at line {0} in {1}:\n\n{2}",
494 xse.LineNumber, path, xse.Message); 494 xse.LineNumber, path, xse.Message);
495 } 495 }
496 finally 496 finally
497 { 497 {
498 m_CurrentWorkingDirectory.Pop(); 498 m_CurrentWorkingDirectory.Pop();
499 } 499 }
500 } 500 }
501 501
502 #endregion 502 #endregion
503 503
504 #region Public Methods 504 #region Public Methods
505 505
506 /// <summary> 506 /// <summary>
507 /// Allows the project. 507 /// Allows the project.
508 /// </summary> 508 /// </summary>
509 /// <param name="projectGroupsFlags">The project groups flags.</param> 509 /// <param name="projectGroupsFlags">The project groups flags.</param>
510 /// <returns></returns> 510 /// <returns></returns>
511 public bool AllowProject(string projectGroupsFlags) 511 public bool AllowProject(string projectGroupsFlags)
512 { 512 {
513 if(m_ProjectGroups != null && m_ProjectGroups.Length > 0) 513 if(m_ProjectGroups != null && m_ProjectGroups.Length > 0)
514 { 514 {
515 if(projectGroupsFlags != null && projectGroupsFlags.Length == 0) 515 if(projectGroupsFlags != null && projectGroupsFlags.Length == 0)
516 { 516 {
517 foreach(string group in projectGroupsFlags.Split('|')) 517 foreach(string group in projectGroupsFlags.Split('|'))
518 { 518 {
519 if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list 519 if(Array.IndexOf(m_ProjectGroups, group) != -1) //if included in the filter list
520 { 520 {
521 return true; 521 return true;
522 } 522 }
523 } 523 }
524 } 524 }
525 return false;//not included in the list or no groups specified for the project 525 return false;//not included in the list or no groups specified for the project
526 } 526 }
527 return true;//no filter specified in the command line args 527 return true;//no filter specified in the command line args
528 } 528 }
529 529
530 /// <summary> 530 /// <summary>
531 /// Gets the type of the node. 531 /// Gets the type of the node.
532 /// </summary> 532 /// </summary>
533 /// <param name="node">The node.</param> 533 /// <param name="node">The node.</param>
534 /// <returns></returns> 534 /// <returns></returns>
535 public Type GetNodeType(XmlNode node) 535 public Type GetNodeType(XmlNode node)
536 { 536 {
537 if( node == null ) 537 if( node == null )
538 { 538 {
539 throw new ArgumentNullException("node"); 539 throw new ArgumentNullException("node");
540 } 540 }
541 if(!m_Nodes.ContainsKey(node.Name)) 541 if(!m_Nodes.ContainsKey(node.Name))
542 { 542 {
543 return null; 543 return null;
544 } 544 }
545 545
546 NodeEntry ne = m_Nodes[node.Name]; 546 NodeEntry ne = m_Nodes[node.Name];
547 return ne.Type; 547 return ne.Type;
548 } 548 }
549 549
550 /// <summary> 550 /// <summary>
551 /// 551 ///
552 /// </summary> 552 /// </summary>
553 /// <param name="node"></param> 553 /// <param name="node"></param>
554 /// <param name="parent"></param> 554 /// <param name="parent"></param>
555 /// <returns></returns> 555 /// <returns></returns>
556 public IDataNode ParseNode(XmlNode node, IDataNode parent) 556 public IDataNode ParseNode(XmlNode node, IDataNode parent)
557 { 557 {
558 return ParseNode(node, parent, null); 558 return ParseNode(node, parent, null);
559 } 559 }
560 560
561 //Create an instance of the data node type that is mapped to the name of the xml DOM node 561 //Create an instance of the data node type that is mapped to the name of the xml DOM node
562 /// <summary> 562 /// <summary>
563 /// Parses the node. 563 /// Parses the node.
564 /// </summary> 564 /// </summary>
565 /// <param name="node">The node.</param> 565 /// <param name="node">The node.</param>
566 /// <param name="parent">The parent.</param> 566 /// <param name="parent">The parent.</param>
567 /// <param name="preNode">The pre node.</param> 567 /// <param name="preNode">The pre node.</param>
568 /// <returns></returns> 568 /// <returns></returns>
569 public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode) 569 public IDataNode ParseNode(XmlNode node, IDataNode parent, IDataNode preNode)
570 { 570 {
571 IDataNode dataNode; 571 IDataNode dataNode;
572 572
573 try 573 try
574 { 574 {
575 if( node == null ) 575 if( node == null )
576 { 576 {
577 throw new ArgumentNullException("node"); 577 throw new ArgumentNullException("node");
578 } 578 }
579 if(preNode == null) 579 if(preNode == null)
580 { 580 {
581 if(!m_Nodes.ContainsKey(node.Name)) 581 if(!m_Nodes.ContainsKey(node.Name))
582 { 582 {
583 Console.WriteLine("WARNING: Unknown XML node: " + node.Name); 583 Console.WriteLine("WARNING: Unknown XML node: " + node.Name);
584 return null; 584 return null;
585 } 585 }
586 586
587 NodeEntry ne = m_Nodes[node.Name]; 587 NodeEntry ne = m_Nodes[node.Name];
588 Type type = ne.Type; 588 Type type = ne.Type;
589 //DataNodeAttribute dna = ne.Attribute; 589 //DataNodeAttribute dna = ne.Attribute;
590 590
591 dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName); 591 dataNode = (IDataNode)type.Assembly.CreateInstance(type.FullName);
592 if(dataNode == null) 592 if(dataNode == null)
593 { 593 {
594 throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName); 594 throw new System.Reflection.TargetException("Could not create new parser instance: " + type.FullName);
595 } 595 }
596 } 596 }
597 else 597 else
598 dataNode = preNode; 598 dataNode = preNode;
599 599
600 dataNode.Parent = parent; 600 dataNode.Parent = parent;
601 dataNode.Parse(node); 601 dataNode.Parse(node);
602 } 602 }
603 catch(WarningException wex) 603 catch(WarningException wex)
604 { 604 {
605 m_Log.Write(LogType.Warning, wex.Message); 605 m_Log.Write(LogType.Warning, wex.Message);
606 return null; 606 return null;
607 } 607 }
608 catch(FatalException fex) 608 catch(FatalException fex)
609 { 609 {
610 m_Log.WriteException(LogType.Error, fex); 610 m_Log.WriteException(LogType.Error, fex);
611 throw; 611 throw;
612 } 612 }
613 catch(Exception ex) 613 catch(Exception ex)
614 { 614 {
615 m_Log.WriteException(LogType.Error, ex); 615 m_Log.WriteException(LogType.Error, ex);
616 throw; 616 throw;
617 } 617 }
618 618
619 return dataNode; 619 return dataNode;
620 } 620 }
621 621
622 /// <summary> 622 /// <summary>
623 /// Initializes the specified target. 623 /// Initializes the specified target.
624 /// </summary> 624 /// </summary>
625 /// <param name="target">The target.</param> 625 /// <param name="target">The target.</param>
626 /// <param name="args">The args.</param> 626 /// <param name="args">The args.</param>
627 public void Initialize(LogTargets target, string[] args) 627 public void Initialize(LogTargets target, string[] args)
628 { 628 {
629 CacheTargets(GetType().Assembly); 629 CacheTargets(GetType().Assembly);
630 CacheNodeTypes(GetType().Assembly); 630 CacheNodeTypes(GetType().Assembly);
631 CacheVersion(); 631 CacheVersion();
632 632
633 m_CommandLine = new CommandLineCollection(args); 633 m_CommandLine = new CommandLineCollection(args);
634 634
635 string logFile = null; 635 string logFile = null;
636 if(m_CommandLine.WasPassed("log")) 636 if(m_CommandLine.WasPassed("log"))
637 { 637 {
638 logFile = m_CommandLine["log"]; 638 logFile = m_CommandLine["log"];
639 639
640 if(logFile != null && logFile.Length == 0) 640 if(logFile != null && logFile.Length == 0)
641 { 641 {
642 logFile = "Prebuild.log"; 642 logFile = "Prebuild.log";
643 } 643 }
644 } 644 }
645 else 645 else
646 { 646 {
647 target = target & ~LogTargets.File; //dont output to a file 647 target = target & ~LogTargets.File; //dont output to a file
648 } 648 }
649 649
650 m_Log = new Log(target, logFile); 650 m_Log = new Log(target, logFile);
651 LogBanner(); 651 LogBanner();
652 652
653 m_CurrentWorkingDirectory = new CurrentDirectory(); 653 m_CurrentWorkingDirectory = new CurrentDirectory();
654 654
655 m_Target = m_CommandLine["target"]; 655 m_Target = m_CommandLine["target"];
656 m_Clean = m_CommandLine["clean"]; 656 m_Clean = m_CommandLine["clean"];
657 string removeDirs = m_CommandLine["removedir"]; 657 string removeDirs = m_CommandLine["removedir"];
658 if(removeDirs != null && removeDirs.Length == 0) 658 if(removeDirs != null && removeDirs.Length == 0)
659 { 659 {
660 m_RemoveDirectories = removeDirs.Split('|'); 660 m_RemoveDirectories = removeDirs.Split('|');
661 } 661 }
662 662
663 string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include 663 string flags = m_CommandLine["allowedgroups"];//allows filtering by specifying a pipe-delimited list of groups to include
664 if(flags != null && flags.Length == 0) 664 if(flags != null && flags.Length == 0)
665 { 665 {
666 m_ProjectGroups = flags.Split('|'); 666 m_ProjectGroups = flags.Split('|');
667 } 667 }
668 m_PauseAfterFinish = m_CommandLine.WasPassed("pause"); 668 m_PauseAfterFinish = m_CommandLine.WasPassed("pause");
669 669
670 LoadSchema(); 670 LoadSchema();
671 } 671 }
672 672
673 /// <summary> 673 /// <summary>
674 /// Processes this instance. 674 /// Processes this instance.
675 /// </summary> 675 /// </summary>
676 public void Process() 676 public void Process()
677 { 677 {
678 bool perfomedOtherTask = false; 678 bool perfomedOtherTask = false;
679 if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0) 679 if(m_RemoveDirectories != null && m_RemoveDirectories.Length > 0)
680 { 680 {
681 try 681 try
682 { 682 {
683 RemoveDirectories(".",m_RemoveDirectories); 683 RemoveDirectories(".",m_RemoveDirectories);
684 } 684 }
685 catch(IOException e) 685 catch(IOException e)
686 { 686 {
687 m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); 687 m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories);
688 m_Log.WriteException(LogType.Error,e); 688 m_Log.WriteException(LogType.Error,e);
689 } 689 }
690 catch(UnauthorizedAccessException e) 690 catch(UnauthorizedAccessException e)
691 { 691 {
692 m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories); 692 m_Log.Write("Failed to remove directories named {0}",m_RemoveDirectories);
693 m_Log.WriteException(LogType.Error,e); 693 m_Log.WriteException(LogType.Error,e);
694 } 694 }
695 perfomedOtherTask = true; 695 perfomedOtherTask = true;
696 } 696 }
697 697
698 if(m_Target != null && m_Clean != null) 698 if(m_Target != null && m_Clean != null)
699 { 699 {
700 m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together"); 700 m_Log.Write(LogType.Error, "The options /target and /clean cannot be passed together");
701 return; 701 return;
702 } 702 }
703 703
704 if(m_Target == null && m_Clean == null) 704 if(m_Target == null && m_Clean == null)
705 { 705 {
706 if(perfomedOtherTask) //finished 706 if(perfomedOtherTask) //finished
707 { 707 {
708 return; 708 return;
709 } 709 }
710 m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file"); 710 m_Log.Write(LogType.Error, "Must pass either /target or /clean to process a Prebuild file");
711 return; 711 return;
712 } 712 }
713 713
714 string file = "./prebuild.xml"; 714 string file = "./prebuild.xml";
715 if(m_CommandLine.WasPassed("file")) 715 if(m_CommandLine.WasPassed("file"))
716 { 716 {
717 file = m_CommandLine["file"]; 717 file = m_CommandLine["file"];
718 } 718 }
719 719
720 ProcessFile(file); 720 ProcessFile(file);
721 721
722 string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower()); 722 string target = (m_Target != null ? m_Target.ToLower() : m_Clean.ToLower());
723 bool clean = (m_Target == null); 723 bool clean = (m_Target == null);
724 if(clean && target != null && target.Length == 0) 724 if(clean && target != null && target.Length == 0)
725 { 725 {
726 target = "all"; 726 target = "all";
727 } 727 }
728 if(clean && target == "all")//default to all if no target was specified for clean 728 if(clean && target == "all")//default to all if no target was specified for clean
729 { 729 {
730 //check if they passed yes 730 //check if they passed yes
731 if (!m_CommandLine.WasPassed("yes")) 731 if (!m_CommandLine.WasPassed("yes"))
732 { 732 {
733 Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):"); 733 Console.WriteLine("WARNING: This operation will clean ALL project files for all targets, are you sure? (y/n):");
734 string ret = Console.ReadLine(); 734 string ret = Console.ReadLine();
735 if(ret == null) 735 if(ret == null)
736 { 736 {
737 return; 737 return;
738 }
739 ret = ret.Trim().ToLower();
740 if((ret.ToLower() != "y" && ret.ToLower() != "yes"))
741 {
742 return;
743 } 738 }
739 ret = ret.Trim().ToLower();
740 if((ret.ToLower() != "y" && ret.ToLower() != "yes"))
741 {
742 return;
743 }
744 }
745 //clean all targets (just cleaning vs2002 target didn't clean nant)
746 foreach(ITarget targ in m_Targets.Values)
747 {
748 targ.Clean(this);
744 } 749 }
745 //clean all targets (just cleaning vs2002 target didn't clean nant) 750 }
746 foreach(ITarget targ in m_Targets.Values) 751 else
747 { 752 {
748 targ.Clean(this); 753 if (!m_Targets.ContainsKey(target)) {
749 } 754 m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target);
750 } 755 return;
751 else 756 }
752 { 757 ITarget targ = m_Targets[target];
753 if (!m_Targets.ContainsKey(target)) { 758
754 m_Log.Write(LogType.Error, "Unknown Target \"{0}\"", target); 759 if(clean)
755 return; 760 {
756 } 761 targ.Clean(this);
757 ITarget targ = m_Targets[target]; 762 }
758 763 else
759 if(clean) 764 {
760 { 765 targ.Write(this);
761 targ.Clean(this); 766 }
762 } 767 }
763 else 768
764 { 769 m_Log.Flush();
765 targ.Write(this); 770 }
766 } 771
767 } 772 #endregion
768 773
769 m_Log.Flush(); 774 #region IDisposable Members
770 } 775
771 776 /// <summary>
772 #endregion 777 ///
773 778 /// </summary>
774 #region IDisposable Members 779 public void Dispose()
775 780 {
776 /// <summary> 781 Dispose(true);
777 /// 782 GC.SuppressFinalize(this);
778 /// </summary> 783 }
779 public void Dispose() 784
780 { 785 /// <summary>
781 Dispose(true); 786 /// Dispose objects
782 GC.SuppressFinalize(this); 787 /// </summary>
783 } 788 /// <param name="disposing">
784 789 /// If true, it will dispose close the handle
785 /// <summary> 790 /// </param>
786 /// Dispose objects 791 /// <remarks>
787 /// </summary> 792 /// Will dispose managed and unmanaged resources.
788 /// <param name="disposing"> 793 /// </remarks>
789 /// If true, it will dispose close the handle 794 protected virtual void Dispose(bool disposing)
790 /// </param> 795 {
791 /// <remarks> 796 if (!disposed)
792 /// Will dispose managed and unmanaged resources. 797 {
793 /// </remarks> 798 if (disposing)
794 protected virtual void Dispose(bool disposing) 799 {
795 {
796 if (!disposed)
797 {
798 if (disposing)
799 {
800 GC.SuppressFinalize(this); 800 GC.SuppressFinalize(this);
801 if (m_Log != null) 801 if (m_Log != null)
802 { 802 {
803 m_Log.Close(); 803 m_Log.Close();
804 m_Log = null; 804 m_Log = null;
805 } 805 }
806 } 806 }
807 } 807 }
808 disposed = true; 808 disposed = true;
809 } 809 }
810 810
811 /// <summary> 811 /// <summary>
812 /// 812 ///
813 /// </summary> 813 /// </summary>
814 ~Kernel() 814 ~Kernel()
815 { 815 {
816 Dispose(false); 816 Dispose(false);
817 } 817 }
818 818
819 /// <summary> 819 /// <summary>
820 /// Closes and destroys this object 820 /// Closes and destroys this object
821 /// </summary> 821 /// </summary>
822 /// <remarks> 822 /// <remarks>
823 /// Same as Dispose(true) 823 /// Same as Dispose(true)
824 /// </remarks> 824 /// </remarks>
825 public void Close() 825 public void Close()
826 { 826 {
827 Dispose(); 827 Dispose();
828 } 828 }
829 829
830 #endregion 830 #endregion
831 } 831 }
832} 832}
diff --git a/Prebuild/src/Core/Nodes/AuthorNode.cs b/Prebuild/src/Core/Nodes/AuthorNode.cs
index 4c415bb..e4b024f 100644
--- a/Prebuild/src/Core/Nodes/AuthorNode.cs
+++ b/Prebuild/src/Core/Nodes/AuthorNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org)
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,56 +32,56 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 [DataNode("Author")] 38 [DataNode("Author")]
39 public class AuthorNode : DataNode 39 public class AuthorNode : DataNode
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Signature; 43 private string m_Signature;
44 44
45 #endregion 45 #endregion
46 46
47 #region Properties 47 #region Properties
48 48
49 /// <summary> 49 /// <summary>
50 /// Gets the signature. 50 /// Gets the signature.
51 /// </summary> 51 /// </summary>
52 /// <value>The signature.</value> 52 /// <value>The signature.</value>
53 public string Signature 53 public string Signature
54 { 54 {
55 get 55 get
56 { 56 {
57 return m_Signature; 57 return m_Signature;
58 } 58 }
59 } 59 }
60 60
61 #endregion 61 #endregion
62 62
63 #region Public Methods 63 #region Public Methods
64 64
65 /// <summary> 65 /// <summary>
66 /// Parses the specified node. 66 /// Parses the specified node.
67 /// </summary> 67 /// </summary>
68 /// <param name="node">The node.</param> 68 /// <param name="node">The node.</param>
69 public override void Parse(XmlNode node) 69 public override void Parse(XmlNode node)
70 { 70 {
71 if( node == null ) 71 if( node == null )
72 { 72 {
73 throw new ArgumentNullException("node"); 73 throw new ArgumentNullException("node");
74 } 74 }
75 75
76 m_Signature = Helper.InterpolateForEnvironmentVariables(node.InnerText); 76 m_Signature = Helper.InterpolateForEnvironmentVariables(node.InnerText);
77 if(m_Signature == null) 77 if(m_Signature == null)
78 { 78 {
79 m_Signature = ""; 79 m_Signature = "";
80 } 80 }
81 81
82 m_Signature = m_Signature.Trim(); 82 m_Signature = m_Signature.Trim();
83 } 83 }
84 84
85 #endregion 85 #endregion
86 } 86 }
87} 87}
diff --git a/Prebuild/src/Core/Nodes/CleanFilesNode.cs b/Prebuild/src/Core/Nodes/CleanFilesNode.cs
index dc2da9a..bd564d5 100644
--- a/Prebuild/src/Core/Nodes/CleanFilesNode.cs
+++ b/Prebuild/src/Core/Nodes/CleanFilesNode.cs
@@ -1,80 +1,80 @@
1#region BSD License 1#region BSD License
2/* 2/*
3Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) 3Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org)
4 4
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23*/ 23*/
24#endregion 24#endregion
25 25
26using System; 26using System;
27using System.Collections.Generic; 27using System.Collections.Generic;
28using System.Xml; 28using System.Xml;
29 29
30using Prebuild.Core.Attributes; 30using Prebuild.Core.Attributes;
31using Prebuild.Core.Interfaces; 31using Prebuild.Core.Interfaces;
32using Prebuild.Core.Utilities; 32using Prebuild.Core.Utilities;
33 33
34namespace Prebuild.Core.Nodes 34namespace Prebuild.Core.Nodes
35{ 35{
36 [DataNode("CleanFiles")] 36 [DataNode("CleanFiles")]
37 public class CleanFilesNode : DataNode 37 public class CleanFilesNode : DataNode
38 { 38 {
39 #region Fields 39 #region Fields
40 40
41 private string m_Pattern; 41 private string m_Pattern;
42 42
43 #endregion 43 #endregion
44 44
45 #region Properties 45 #region Properties
46 46
47 /// <summary> 47 /// <summary>
48 /// Gets the signature. 48 /// Gets the signature.
49 /// </summary> 49 /// </summary>
50 /// <value>The signature.</value> 50 /// <value>The signature.</value>
51 public string Pattern 51 public string Pattern
52 { 52 {
53 get 53 get
54 { 54 {
55 return m_Pattern; 55 return m_Pattern;
56 } 56 }
57 } 57 }
58 58
59 #endregion 59 #endregion
60 60
61 #region Public Methods 61 #region Public Methods
62 62
63 /// <summary> 63 /// <summary>
64 /// Parses the specified node. 64 /// Parses the specified node.
65 /// </summary> 65 /// </summary>
66 /// <param name="node">The node.</param> 66 /// <param name="node">The node.</param>
67 public override void Parse(XmlNode node) 67 public override void Parse(XmlNode node)
68 { 68 {
69 if (node == null) 69 if (node == null)
70 { 70 {
71 throw new ArgumentNullException("node"); 71 throw new ArgumentNullException("node");
72 } 72 }
73 73
74 m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; 74 m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ;
75 m_Pattern = m_Pattern.Trim(); 75 m_Pattern = m_Pattern.Trim();
76 } 76 }
77 77
78 #endregion 78 #endregion
79 } 79 }
80} \ No newline at end of file 80} \ No newline at end of file
diff --git a/Prebuild/src/Core/Nodes/CleanupNode.cs b/Prebuild/src/Core/Nodes/CleanupNode.cs
index a9b77eb..f334ea3 100644
--- a/Prebuild/src/Core/Nodes/CleanupNode.cs
+++ b/Prebuild/src/Core/Nodes/CleanupNode.cs
@@ -1,85 +1,85 @@
1#region BSD License 1#region BSD License
2/* 2/*
3Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) 3Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org)
4 4
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23*/ 23*/
24#endregion 24#endregion
25 25
26using System; 26using System;
27using System.Collections.Generic; 27using System.Collections.Generic;
28using System.Xml; 28using System.Xml;
29 29
30using Prebuild.Core.Attributes; 30using Prebuild.Core.Attributes;
31using Prebuild.Core.Interfaces; 31using Prebuild.Core.Interfaces;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 [DataNode("Cleanup")] 35 [DataNode("Cleanup")]
36 public class CleanupNode : DataNode 36 public class CleanupNode : DataNode
37 { 37 {
38 #region Fields 38 #region Fields
39 39
40 private List<CleanFilesNode> m_CleanFiles = new List<CleanFilesNode>(); 40 private List<CleanFilesNode> m_CleanFiles = new List<CleanFilesNode>();
41 41
42 #endregion 42 #endregion
43 43
44 #region Properties 44 #region Properties
45 45
46 /// <summary> 46 /// <summary>
47 /// Gets the signature. 47 /// Gets the signature.
48 /// </summary> 48 /// </summary>
49 /// <value>The signature.</value> 49 /// <value>The signature.</value>
50 public List<CleanFilesNode> CleanFiles 50 public List<CleanFilesNode> CleanFiles
51 { 51 {
52 get 52 get
53 { 53 {
54 return m_CleanFiles; 54 return m_CleanFiles;
55 } 55 }
56 } 56 }
57 57
58 #endregion 58 #endregion
59 59
60 #region Public Methods 60 #region Public Methods
61 61
62 /// <summary> 62 /// <summary>
63 /// Parses the specified node. 63 /// Parses the specified node.
64 /// </summary> 64 /// </summary>
65 /// <param name="node">The node.</param> 65 /// <param name="node">The node.</param>
66 public override void Parse(XmlNode node) 66 public override void Parse(XmlNode node)
67 { 67 {
68 if( node == null ) 68 if( node == null )
69 { 69 {
70 throw new ArgumentNullException("node"); 70 throw new ArgumentNullException("node");
71 } 71 }
72 72
73 foreach (XmlNode child in node.ChildNodes) 73 foreach (XmlNode child in node.ChildNodes)
74 { 74 {
75 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 75 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
76 if (dataNode is CleanFilesNode) 76 if (dataNode is CleanFilesNode)
77 { 77 {
78 m_CleanFiles.Add((CleanFilesNode)dataNode); 78 m_CleanFiles.Add((CleanFilesNode)dataNode);
79 } 79 }
80 } 80 }
81 } 81 }
82 82
83 #endregion 83 #endregion
84 } 84 }
85} \ No newline at end of file 85} \ No newline at end of file
diff --git a/Prebuild/src/Core/Nodes/ConfigurationNode.cs b/Prebuild/src/Core/Nodes/ConfigurationNode.cs
index cd2f740..a101799 100644
--- a/Prebuild/src/Core/Nodes/ConfigurationNode.cs
+++ b/Prebuild/src/Core/Nodes/ConfigurationNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,185 +32,185 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 [DataNode("Configuration")] 38 [DataNode("Configuration")]
39 public class ConfigurationNode : DataNode, ICloneable, IComparable 39 public class ConfigurationNode : DataNode, ICloneable, IComparable
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Name = "unknown"; 43 private string m_Name = "unknown";
44 private string m_Platform = "AnyCPU"; 44 private string m_Platform = "AnyCPU";
45 private OptionsNode m_Options; 45 private OptionsNode m_Options;
46 46
47 #endregion 47 #endregion
48 48
49 #region Constructors 49 #region Constructors
50 50
51 /// <summary> 51 /// <summary>
52 /// Initializes a new instance of the <see cref="ConfigurationNode"/> class. 52 /// Initializes a new instance of the <see cref="ConfigurationNode"/> class.
53 /// </summary> 53 /// </summary>
54 public ConfigurationNode() 54 public ConfigurationNode()
55 { 55 {
56 m_Options = new OptionsNode(); 56 m_Options = new OptionsNode();
57 } 57 }
58 58
59 #endregion 59 #endregion
60 60
61 #region Properties 61 #region Properties
62 62
63 /// <summary> 63 /// <summary>
64 /// Gets or sets the parent. 64 /// Gets or sets the parent.
65 /// </summary> 65 /// </summary>
66 /// <value>The parent.</value> 66 /// <value>The parent.</value>
67 public override IDataNode Parent 67 public override IDataNode Parent
68 { 68 {
69 get 69 get
70 { 70 {
71 return base.Parent; 71 return base.Parent;
72 } 72 }
73 set 73 set
74 { 74 {
75 base.Parent = value; 75 base.Parent = value;
76 if(base.Parent is SolutionNode) 76 if(base.Parent is SolutionNode)
77 { 77 {
78 SolutionNode node = (SolutionNode)base.Parent; 78 SolutionNode node = (SolutionNode)base.Parent;
79 if(node != null && node.Options != null) 79 if(node != null && node.Options != null)
80 { 80 {
81 node.Options.CopyTo(m_Options); 81 node.Options.CopyTo(m_Options);
82 } 82 }
83 } 83 }
84 } 84 }
85 } 85 }
86 86
87 /// <summary> 87 /// <summary>
88 /// Identifies the platform for this specific configuration. 88 /// Identifies the platform for this specific configuration.
89 /// </summary> 89 /// </summary>
90 public string Platform 90 public string Platform
91 { 91 {
92 get 92 get
93 { 93 {
94 return m_Platform; 94 return m_Platform;
95 } 95 }
96 set 96 set
97 { 97 {
98 switch ((value + "").ToLower()) 98 switch ((value + "").ToLower())
99 { 99 {
100 case "x86": 100 case "x86":
101 case "x64": 101 case "x64":
102 m_Platform = value; 102 m_Platform = value;
103 break; 103 break;
104 case "itanium": 104 case "itanium":
105 m_Platform = "Itanium"; 105 m_Platform = "Itanium";
106 break; 106 break;
107 default: 107 default:
108 m_Platform = "AnyCPU"; 108 m_Platform = "AnyCPU";
109 break; 109 break;
110 } 110 }
111 } 111 }
112 } 112 }
113 113
114 /// <summary> 114 /// <summary>
115 /// Gets the name. 115 /// Gets the name.
116 /// </summary> 116 /// </summary>
117 /// <value>The name.</value> 117 /// <value>The name.</value>
118 public string Name 118 public string Name
119 { 119 {
120 get 120 get
121 { 121 {
122 return m_Name; 122 return m_Name;
123 } 123 }
124 } 124 }
125 125
126 /// <summary> 126 /// <summary>
127 /// Gets the name and platform for the configuration. 127 /// Gets the name and platform for the configuration.
128 /// </summary> 128 /// </summary>
129 /// <value>The name and platform.</value> 129 /// <value>The name and platform.</value>
130 public string NameAndPlatform 130 public string NameAndPlatform
131 { 131 {
132 get 132 get
133 { 133 {
134 string platform = m_Platform; 134 string platform = m_Platform;
135 if (platform == "AnyCPU") 135 if (platform == "AnyCPU")
136 platform = "Any CPU"; 136 platform = "Any CPU";
137 137
138 return String.Format("{0}|{1}", m_Name, platform); 138 return String.Format("{0}|{1}", m_Name, platform);
139 } 139 }
140 } 140 }
141 141
142 /// <summary> 142 /// <summary>
143 /// Gets or sets the options. 143 /// Gets or sets the options.
144 /// </summary> 144 /// </summary>
145 /// <value>The options.</value> 145 /// <value>The options.</value>
146 public OptionsNode Options 146 public OptionsNode Options
147 { 147 {
148 get 148 get
149 { 149 {
150 return m_Options; 150 return m_Options;
151 } 151 }
152 set 152 set
153 { 153 {
154 m_Options = value; 154 m_Options = value;
155 } 155 }
156 } 156 }
157 157
158 #endregion 158 #endregion
159 159
160 #region Public Methods 160 #region Public Methods
161 161
162 /// <summary> 162 /// <summary>
163 /// Parses the specified node. 163 /// Parses the specified node.
164 /// </summary> 164 /// </summary>
165 /// <param name="node">The node.</param> 165 /// <param name="node">The node.</param>
166 public override void Parse(XmlNode node) 166 public override void Parse(XmlNode node)
167 { 167 {
168 m_Name = Helper.AttributeValue(node, "name", m_Name); 168 m_Name = Helper.AttributeValue(node, "name", m_Name);
169 Platform = Helper.AttributeValue(node, "platform", m_Platform); 169 Platform = Helper.AttributeValue(node, "platform", m_Platform);
170 170
171 if (node == null) 171 if (node == null)
172 { 172 {
173 throw new ArgumentNullException("node"); 173 throw new ArgumentNullException("node");
174 } 174 }
175 foreach(XmlNode child in node.ChildNodes) 175 foreach(XmlNode child in node.ChildNodes)
176 { 176 {
177 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 177 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
178 if(dataNode is OptionsNode) 178 if(dataNode is OptionsNode)
179 { 179 {
180 ((OptionsNode)dataNode).CopyTo(m_Options); 180 ((OptionsNode)dataNode).CopyTo(m_Options);
181 } 181 }
182 } 182 }
183 } 183 }
184 184
185 /// <summary> 185 /// <summary>
186 /// Copies to. 186 /// Copies to.
187 /// </summary> 187 /// </summary>
188 /// <param name="conf">The conf.</param> 188 /// <param name="conf">The conf.</param>
189 public void CopyTo(ConfigurationNode conf) 189 public void CopyTo(ConfigurationNode conf)
190 { 190 {
191 m_Options.CopyTo(conf.m_Options); 191 m_Options.CopyTo(conf.m_Options);
192 } 192 }
193 193
194 #endregion 194 #endregion
195 195
196 #region ICloneable Members 196 #region ICloneable Members
197 197
198 /// <summary> 198 /// <summary>
199 /// Creates a new object that is a copy of the current instance. 199 /// Creates a new object that is a copy of the current instance.
200 /// </summary> 200 /// </summary>
201 /// <returns> 201 /// <returns>
202 /// A new object that is a copy of this instance. 202 /// A new object that is a copy of this instance.
203 /// </returns> 203 /// </returns>
204 public object Clone() 204 public object Clone()
205 { 205 {
206 ConfigurationNode ret = new ConfigurationNode(); 206 ConfigurationNode ret = new ConfigurationNode();
207 ret.m_Name = m_Name; 207 ret.m_Name = m_Name;
208 ret.m_Platform = m_Platform; 208 ret.m_Platform = m_Platform;
209 m_Options.CopyTo(ret.m_Options); 209 m_Options.CopyTo(ret.m_Options);
210 return ret; 210 return ret;
211 } 211 }
212 212
213 #endregion 213 #endregion
214 214
215 #region IComparable Members 215 #region IComparable Members
216 216
@@ -221,5 +221,5 @@ namespace Prebuild.Core.Nodes
221 } 221 }
222 222
223 #endregion 223 #endregion
224 } 224 }
225} 225}
diff --git a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs
index 7c59ac5..eba6550 100644
--- a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs
+++ b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs
@@ -1,71 +1,71 @@
1#region BSD License 1#region BSD License
2/* 2/*
3Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) 3Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com)
4 4
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23*/ 23*/
24#endregion 24#endregion
25 25
26using System.Collections.Generic; 26using System.Collections.Generic;
27 27
28namespace Prebuild.Core.Nodes 28namespace Prebuild.Core.Nodes
29{ 29{
30 /// <summary> 30 /// <summary>
31 /// Implements a specialized list of configuration nodes which allows for lookup via 31 /// Implements a specialized list of configuration nodes which allows for lookup via
32 /// configuration name and platform. 32 /// configuration name and platform.
33 /// </summary> 33 /// </summary>
34 public class ConfigurationNodeCollection : List<ConfigurationNode> 34 public class ConfigurationNodeCollection : List<ConfigurationNode>
35 { 35 {
36 #region Properties 36 #region Properties
37 37
38 public ConfigurationNode this[string nameAndPlatform] 38 public ConfigurationNode this[string nameAndPlatform]
39 { 39 {
40 get 40 get
41 { 41 {
42 foreach (ConfigurationNode configurationNode in this) 42 foreach (ConfigurationNode configurationNode in this)
43 { 43 {
44 if (configurationNode.NameAndPlatform == nameAndPlatform) 44 if (configurationNode.NameAndPlatform == nameAndPlatform)
45 { 45 {
46 return configurationNode; 46 return configurationNode;
47 } 47 }
48 } 48 }
49 49
50 return null; 50 return null;
51 } 51 }
52 52
53 set 53 set
54 { 54 {
55 // See if the node 55 // See if the node
56 ConfigurationNode configurationNode = this[nameAndPlatform]; 56 ConfigurationNode configurationNode = this[nameAndPlatform];
57 57
58 if (configurationNode != null) 58 if (configurationNode != null)
59 { 59 {
60 this[IndexOf(configurationNode)] = value; 60 this[IndexOf(configurationNode)] = value;
61 } 61 }
62 else 62 else
63 { 63 {
64 Add(value); 64 Add(value);
65 } 65 }
66 } 66 }
67 } 67 }
68 68
69 #endregion 69 #endregion
70 } 70 }
71} 71}
diff --git a/Prebuild/src/Core/Nodes/DataNode.cs b/Prebuild/src/Core/Nodes/DataNode.cs
index 318b13c..4f20588 100644
--- a/Prebuild/src/Core/Nodes/DataNode.cs
+++ b/Prebuild/src/Core/Nodes/DataNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,86 +32,86 @@ using System.IO;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 public abstract class DataNode : IDataNode 38 public abstract class DataNode : IDataNode
39 { 39 {
40 #region Fields 40 #region Fields
41 41
42 private IDataNode parent; 42 private IDataNode parent;
43 string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" }; 43 string[] m_WebTypes = new string[] { "aspx", "ascx", "master", "ashx", "asmx" };
44 44
45 #endregion 45 #endregion
46 46
47 #region IDataNode Members 47 #region IDataNode Members
48 48
49 /// <summary> 49 /// <summary>
50 /// Gets or sets the parent. 50 /// Gets or sets the parent.
51 /// </summary> 51 /// </summary>
52 /// <value>The parent.</value> 52 /// <value>The parent.</value>
53 public virtual IDataNode Parent 53 public virtual IDataNode Parent
54 { 54 {
55 get 55 get
56 { 56 {
57 return parent; 57 return parent;
58 } 58 }
59 set 59 set
60 { 60 {
61 parent = value; 61 parent = value;
62 } 62 }
63 } 63 }
64 public string[] WebTypes 64 public string[] WebTypes
65 { 65 {
66 get { return m_WebTypes; } 66 get { return m_WebTypes; }
67 } 67 }
68 /// <summary> 68 /// <summary>
69 /// Parses the specified node. 69 /// Parses the specified node.
70 /// </summary> 70 /// </summary>
71 /// <param name="node">The node.</param> 71 /// <param name="node">The node.</param>
72 public virtual void Parse(XmlNode node) 72 public virtual void Parse(XmlNode node)
73 { 73 {
74 } 74 }
75 public BuildAction GetBuildActionByFileName(string fileName) 75 public BuildAction GetBuildActionByFileName(string fileName)
76 { 76 {
77 string extension = Path.GetExtension(fileName).ToLower(); 77 string extension = Path.GetExtension(fileName).ToLower();
78 foreach (string type in WebTypes) 78 foreach (string type in WebTypes)
79 { 79 {
80 if (extension == type) 80 if (extension == type)
81 return BuildAction.Content; 81 return BuildAction.Content;
82 } 82 }
83 return BuildAction.Compile; 83 return BuildAction.Compile;
84 } 84 }
85 /// <summary> 85 /// <summary>
86 /// Parses the file type to figure out what type it is 86 /// Parses the file type to figure out what type it is
87 /// </summary> 87 /// </summary>
88 /// <returns></returns> 88 /// <returns></returns>
89 public SubType GetSubTypeByFileName(string fileName) 89 public SubType GetSubTypeByFileName(string fileName)
90 { 90 {
91 string extension = System.IO.Path.GetExtension(fileName).ToLower(); 91 string extension = System.IO.Path.GetExtension(fileName).ToLower();
92 string designer = String.Format(".designer{0}", extension); 92 string designer = String.Format(".designer{0}", extension);
93 string path = fileName.ToLower(); 93 string path = fileName.ToLower();
94 if (extension == ".resx") 94 if (extension == ".resx")
95 { 95 {
96 return SubType.Designer; 96 return SubType.Designer;
97 } 97 }
98 else if (path.EndsWith(".settings")) 98 else if (path.EndsWith(".settings"))
99 { 99 {
100 return SubType.Settings; 100 return SubType.Settings;
101 } 101 }
102 else 102 else
103 { 103 {
104 104
105 foreach (string type in WebTypes) 105 foreach (string type in WebTypes)
106 { 106 {
107 if (path.EndsWith(type)) 107 if (path.EndsWith(type))
108 { 108 {
109 return SubType.CodeBehind; 109 return SubType.CodeBehind;
110 } 110 }
111 } 111 }
112 } 112 }
113 return SubType.Code; 113 return SubType.Code;
114 } 114 }
115 #endregion 115 #endregion
116 } 116 }
117} 117}
diff --git a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs
index 20095c3..278ecd8 100644
--- a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs
+++ b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs
@@ -1,93 +1,93 @@
1using System; 1using System;
2using System.Collections.Generic; 2using System.Collections.Generic;
3using System.Text; 3using System.Text;
4using System.Xml; 4using System.Xml;
5 5
6using Prebuild.Core.Attributes; 6using Prebuild.Core.Attributes;
7using Prebuild.Core.Interfaces; 7using Prebuild.Core.Interfaces;
8using Prebuild.Core.Utilities; 8using Prebuild.Core.Utilities;
9 9
10namespace Prebuild.Core.Nodes 10namespace Prebuild.Core.Nodes
11{ 11{
12 [DataNode("DatabaseProject")] 12 [DataNode("DatabaseProject")]
13 public class DatabaseProjectNode : DataNode 13 public class DatabaseProjectNode : DataNode
14 { 14 {
15 string name; 15 string name;
16 string path; 16 string path;
17 string fullpath; 17 string fullpath;
18 Guid guid = Guid.NewGuid(); 18 Guid guid = Guid.NewGuid();
19 readonly List<AuthorNode> authors = new List<AuthorNode>(); 19 readonly List<AuthorNode> authors = new List<AuthorNode>();
20 readonly List<DatabaseReferenceNode> references = new List<DatabaseReferenceNode>(); 20 readonly List<DatabaseReferenceNode> references = new List<DatabaseReferenceNode>();
21 21
22 public Guid Guid 22 public Guid Guid
23 { 23 {
24 get { return guid; } 24 get { return guid; }
25 } 25 }
26 26
27 public string Name 27 public string Name
28 { 28 {
29 get { return name; } 29 get { return name; }
30 } 30 }
31 31
32 public string Path 32 public string Path
33 { 33 {
34 get { return path; } 34 get { return path; }
35 } 35 }
36 36
37 public string FullPath 37 public string FullPath
38 { 38 {
39 get { return fullpath; } 39 get { return fullpath; }
40 } 40 }
41 41
42 public IEnumerable<DatabaseReferenceNode> References 42 public IEnumerable<DatabaseReferenceNode> References
43 { 43 {
44 get { return references; } 44 get { return references; }
45 } 45 }
46 46
47 public override void Parse(XmlNode node) 47 public override void Parse(XmlNode node)
48 { 48 {
49 name = Helper.AttributeValue(node, "name", name); 49 name = Helper.AttributeValue(node, "name", name);
50 path = Helper.AttributeValue(node, "path", name); 50 path = Helper.AttributeValue(node, "path", name);
51 51
52 try 52 try
53 { 53 {
54 fullpath = Helper.ResolvePath(path); 54 fullpath = Helper.ResolvePath(path);
55 } 55 }
56 catch 56 catch
57 { 57 {
58 throw new WarningException("Could not resolve Solution path: {0}", path); 58 throw new WarningException("Could not resolve Solution path: {0}", path);
59 } 59 }
60 60
61 Kernel.Instance.CurrentWorkingDirectory.Push(); 61 Kernel.Instance.CurrentWorkingDirectory.Push();
62 62
63 try 63 try
64 { 64 {
65 Helper.SetCurrentDir(fullpath); 65 Helper.SetCurrentDir(fullpath);
66 66
67 if (node == null) 67 if (node == null)
68 { 68 {
69 throw new ArgumentNullException("node"); 69 throw new ArgumentNullException("node");
70 } 70 }
71 71
72 foreach (XmlNode child in node.ChildNodes) 72 foreach (XmlNode child in node.ChildNodes)
73 { 73 {
74 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 74 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
75 75
76 if (dataNode == null) 76 if (dataNode == null)
77 continue; 77 continue;
78 78
79 if (dataNode is AuthorNode) 79 if (dataNode is AuthorNode)
80 authors.Add((AuthorNode)dataNode); 80 authors.Add((AuthorNode)dataNode);
81 else if (dataNode is DatabaseReferenceNode) 81 else if (dataNode is DatabaseReferenceNode)
82 references.Add((DatabaseReferenceNode)dataNode); 82 references.Add((DatabaseReferenceNode)dataNode);
83 } 83 }
84 } 84 }
85 finally 85 finally
86 { 86 {
87 Kernel.Instance.CurrentWorkingDirectory.Pop(); 87 Kernel.Instance.CurrentWorkingDirectory.Pop();
88 } 88 }
89 89
90 base.Parse(node); 90 base.Parse(node);
91 } 91 }
92 } 92 }
93} 93}
diff --git a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs
index 97c3964..974b74e 100644
--- a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs
+++ b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs
@@ -1,63 +1,63 @@
1using System; 1using System;
2using Prebuild.Core.Attributes; 2using Prebuild.Core.Attributes;
3using Prebuild.Core.Utilities; 3using Prebuild.Core.Utilities;
4 4
5namespace Prebuild.Core.Nodes 5namespace Prebuild.Core.Nodes
6{ 6{
7 [DataNode("DatabaseReference")] 7 [DataNode("DatabaseReference")]
8 public class DatabaseReferenceNode : DataNode 8 public class DatabaseReferenceNode : DataNode
9 { 9 {
10 string name; 10 string name;
11 Guid providerId; 11 Guid providerId;
12 string connectionString; 12 string connectionString;
13 13
14 public string Name 14 public string Name
15 { 15 {
16 get { return name; } 16 get { return name; }
17 } 17 }
18 18
19 public Guid ProviderId 19 public Guid ProviderId
20 { 20 {
21 get { return providerId; } 21 get { return providerId; }
22 } 22 }
23 23
24 public string ConnectionString 24 public string ConnectionString
25 { 25 {
26 get { return connectionString; } 26 get { return connectionString; }
27 } 27 }
28 28
29 public override void Parse(System.Xml.XmlNode node) 29 public override void Parse(System.Xml.XmlNode node)
30 { 30 {
31 name = Helper.AttributeValue(node, "name", name); 31 name = Helper.AttributeValue(node, "name", name);
32 32
33 string providerName = Helper.AttributeValue(node, "providerName", string.Empty); 33 string providerName = Helper.AttributeValue(node, "providerName", string.Empty);
34 if (providerName != null) 34 if (providerName != null)
35 { 35 {
36 switch (providerName) 36 switch (providerName)
37 { 37 {
38 // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* 38 // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\*
39 // Not sure if these will help other operating systems, or if there's a better way. 39 // Not sure if these will help other operating systems, or if there's a better way.
40 case "Microsoft.SqlServerCe.Client.3.5": 40 case "Microsoft.SqlServerCe.Client.3.5":
41 providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; 41 providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break;
42 case "System.Data.OleDb": 42 case "System.Data.OleDb":
43 providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; 43 providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break;
44 case "System.Data.OracleClient": 44 case "System.Data.OracleClient":
45 providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; 45 providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break;
46 case "System.Data.SqlClient": 46 case "System.Data.SqlClient":
47 providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; 47 providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break;
48 case "System.Data.Odbc": 48 case "System.Data.Odbc":
49 providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; 49 providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break;
50 50
51 default: 51 default:
52 throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); 52 throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id.");
53 } 53 }
54 } 54 }
55 else 55 else
56 providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); 56 providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B")));
57 57
58 connectionString = Helper.AttributeValue(node, "connectionString", connectionString); 58 connectionString = Helper.AttributeValue(node, "connectionString", connectionString);
59 59
60 base.Parse(node); 60 base.Parse(node);
61 } 61 }
62 } 62 }
63} 63}
diff --git a/Prebuild/src/Core/Nodes/DescriptionNode.cs b/Prebuild/src/Core/Nodes/DescriptionNode.cs
index d1293a0..713b47c 100644
--- a/Prebuild/src/Core/Nodes/DescriptionNode.cs
+++ b/Prebuild/src/Core/Nodes/DescriptionNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org)
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,56 +32,56 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// The object representing the /Prebuild/Solution/Project/Description element 36 /// The object representing the /Prebuild/Solution/Project/Description element
37 /// </summary> 37 /// </summary>
38 [DataNode("Description")] 38 [DataNode("Description")]
39 public class DescriptionNode : DataNode 39 public class DescriptionNode : DataNode
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Value; 43 private string m_Value;
44 44
45 #endregion 45 #endregion
46 46
47 #region Properties 47 #region Properties
48 48
49 /// <summary> 49 /// <summary>
50 /// Gets the description Value. 50 /// Gets the description Value.
51 /// </summary> 51 /// </summary>
52 /// <value>The description Value.</value> 52 /// <value>The description Value.</value>
53 public string Value 53 public string Value
54 { 54 {
55 get 55 get
56 { 56 {
57 return m_Value; 57 return m_Value;
58 } 58 }
59 } 59 }
60 60
61 #endregion 61 #endregion
62 62
63 #region Public Methods 63 #region Public Methods
64 64
65 /// <summary> 65 /// <summary>
66 /// Parses the specified node. 66 /// Parses the specified node.
67 /// </summary> 67 /// </summary>
68 /// <param name="node">The node.</param> 68 /// <param name="node">The node.</param>
69 public override void Parse(XmlNode node) 69 public override void Parse(XmlNode node)
70 { 70 {
71 if( node == null ) 71 if( node == null )
72 { 72 {
73 throw new ArgumentNullException("node"); 73 throw new ArgumentNullException("node");
74 } 74 }
75 75
76 m_Value = Helper.InterpolateForEnvironmentVariables(node.InnerText); 76 m_Value = Helper.InterpolateForEnvironmentVariables(node.InnerText);
77 if(m_Value == null) 77 if(m_Value == null)
78 { 78 {
79 m_Value = ""; 79 m_Value = "";
80 } 80 }
81 81
82 m_Value = m_Value.Trim(); 82 m_Value = m_Value.Trim();
83 } 83 }
84 84
85 #endregion 85 #endregion
86 } 86 }
87} 87}
diff --git a/Prebuild/src/Core/Nodes/ExcludeNode.cs b/Prebuild/src/Core/Nodes/ExcludeNode.cs
index 7f04cba..addbdb4 100644
--- a/Prebuild/src/Core/Nodes/ExcludeNode.cs
+++ b/Prebuild/src/Core/Nodes/ExcludeNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,31 +32,31 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 [DataNode("Exclude")] 38 [DataNode("Exclude")]
39 public class ExcludeNode : DataNode 39 public class ExcludeNode : DataNode
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Pattern = ""; 43 private string m_Pattern = "";
44 44
45 #endregion 45 #endregion
46 46
47 #region Properties 47 #region Properties
48 48
49 /// <summary> 49 /// <summary>
50 /// Gets the name. 50 /// Gets the name.
51 /// </summary> 51 /// </summary>
52 /// <value>The name.</value> 52 /// <value>The name.</value>
53 public string Name 53 public string Name
54 { 54 {
55 get 55 get
56 { 56 {
57 return m_Pattern; 57 return m_Pattern;
58 } 58 }
59 } 59 }
60 60
61 /// <summary> 61 /// <summary>
62 /// Gets the pattern. 62 /// Gets the pattern.
@@ -72,18 +72,18 @@ namespace Prebuild.Core.Nodes
72 72
73 #endregion 73 #endregion
74 74
75 #region Public Methods 75 #region Public Methods
76 76
77 /// <summary> 77 /// <summary>
78 /// Parses the specified node. 78 /// Parses the specified node.
79 /// </summary> 79 /// </summary>
80 /// <param name="node">The node.</param> 80 /// <param name="node">The node.</param>
81 public override void Parse(XmlNode node) 81 public override void Parse(XmlNode node)
82 { 82 {
83 m_Pattern = Helper.AttributeValue( node, "name", m_Pattern ); 83 m_Pattern = Helper.AttributeValue( node, "name", m_Pattern );
84 m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern ); 84 m_Pattern = Helper.AttributeValue(node, "pattern", m_Pattern );
85 } 85 }
86 86
87 #endregion 87 #endregion
88 } 88 }
89} 89}
diff --git a/Prebuild/src/Core/Nodes/FileNode.cs b/Prebuild/src/Core/Nodes/FileNode.cs
index b313ffa..c66f123 100644
--- a/Prebuild/src/Core/Nodes/FileNode.cs
+++ b/Prebuild/src/Core/Nodes/FileNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,193 +34,193 @@ using Prebuild.Core.Targets;
34 34
35namespace Prebuild.Core.Nodes 35namespace Prebuild.Core.Nodes
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// 38 ///
39 /// </summary> 39 /// </summary>
40 public enum BuildAction 40 public enum BuildAction
41 { 41 {
42 /// <summary>
43 ///
44 /// </summary>
45 None,
46 /// <summary>
47 ///
48 /// </summary>
49 Compile,
50 /// <summary>
51 ///
52 /// </summary>
53 Content,
54 /// <summary>
55 ///
56 /// </summary>
57 EmbeddedResource,
58 /// <summary>
59 ///
60 /// </summary>
61 ApplicationDefinition,
62 /// <summary>
63 ///
64 /// </summary>
65 Page,
66 /// <summary> 42 /// <summary>
67 /// 43 ///
44 /// </summary>
45 None,
46 /// <summary>
47 ///
48 /// </summary>
49 Compile,
50 /// <summary>
51 ///
52 /// </summary>
53 Content,
54 /// <summary>
55 ///
56 /// </summary>
57 EmbeddedResource,
58 /// <summary>
59 ///
60 /// </summary>
61 ApplicationDefinition,
62 /// <summary>
63 ///
64 /// </summary>
65 Page,
66 /// <summary>
67 ///
68 /// </summary> 68 /// </summary>
69 Copy 69 Copy
70 } 70 }
71 71
72 /// <summary> 72 /// <summary>
73 /// 73 ///
74 /// </summary> 74 /// </summary>
75 public enum SubType 75 public enum SubType
76 { 76 {
77 /// <summary>
78 ///
79 /// </summary>
80 Code,
81 /// <summary>
82 ///
83 /// </summary>
84 Component,
85 /// <summary> 77 /// <summary>
86 /// 78 ///
79 /// </summary>
80 Code,
81 /// <summary>
82 ///
83 /// </summary>
84 Component,
85 /// <summary>
86 ///
87 /// </summary> 87 /// </summary>
88 Designer, 88 Designer,
89 /// <summary> 89 /// <summary>
90 /// 90 ///
91 /// </summary> 91 /// </summary>
92 Form, 92 Form,
93 /// <summary> 93 /// <summary>
94 /// 94 ///
95 /// </summary> 95 /// </summary>
96 Settings, 96 Settings,
97 /// <summary> 97 /// <summary>
98 /// 98 ///
99 /// </summary> 99 /// </summary>
100 UserControl, 100 UserControl,
101 /// <summary> 101 /// <summary>
102 /// 102 ///
103 /// </summary> 103 /// </summary>
104 CodeBehind, 104 CodeBehind,
105 } 105 }
106 106
107 public enum CopyToOutput 107 public enum CopyToOutput
108 { 108 {
109 Never, 109 Never,
110 Always, 110 Always,
111 PreserveNewest 111 PreserveNewest
112 } 112 }
113 113
114 /// <summary> 114 /// <summary>
115 /// 115 ///
116 /// </summary> 116 /// </summary>
117 [DataNode("File")] 117 [DataNode("File")]
118 public class FileNode : DataNode 118 public class FileNode : DataNode
119 { 119 {
120 #region Fields 120 #region Fields
121 121
122 private string m_Path; 122 private string m_Path;
123 private string m_ResourceName = ""; 123 private string m_ResourceName = "";
124 private BuildAction? m_BuildAction; 124 private BuildAction? m_BuildAction;
125 private bool m_Valid; 125 private bool m_Valid;
126 private SubType? m_SubType; 126 private SubType? m_SubType;
127 private CopyToOutput m_CopyToOutput = CopyToOutput.Never; 127 private CopyToOutput m_CopyToOutput = CopyToOutput.Never;
128 private bool m_Link = false; 128 private bool m_Link = false;
129 private string m_LinkPath = string.Empty; 129 private string m_LinkPath = string.Empty;
130 private bool m_PreservePath = false; 130 private bool m_PreservePath = false;
131 131
132 132
133 #endregion 133 #endregion
134 134
135 #region Properties 135 #region Properties
136 136
137 /// <summary> 137 /// <summary>
138 /// 138 ///
139 /// </summary> 139 /// </summary>
140 public string Path 140 public string Path
141 { 141 {
142 get 142 get
143 { 143 {
144 return m_Path; 144 return m_Path;
145 } 145 }
146 } 146 }
147 147
148 /// <summary> 148 /// <summary>
149 /// 149 ///
150 /// </summary> 150 /// </summary>
151 public string ResourceName 151 public string ResourceName
152 { 152 {
153 get 153 get
154 { 154 {
155 return m_ResourceName; 155 return m_ResourceName;
156 } 156 }
157 } 157 }
158 158
159 /// <summary> 159 /// <summary>
160 /// 160 ///
161 /// </summary> 161 /// </summary>
162 public BuildAction BuildAction 162 public BuildAction BuildAction
163 { 163 {
164 get 164 get
165 { 165 {
166 if (m_BuildAction != null) 166 if (m_BuildAction != null)
167 return m_BuildAction.Value; 167 return m_BuildAction.Value;
168 else 168 else
169 return GetBuildActionByFileName(this.Path); 169 return GetBuildActionByFileName(this.Path);
170 170
171 } 171 }
172 } 172 }
173 173
174 public CopyToOutput CopyToOutput 174 public CopyToOutput CopyToOutput
175 { 175 {
176 get 176 get
177 { 177 {
178 return this.m_CopyToOutput; 178 return this.m_CopyToOutput;
179 } 179 }
180 } 180 }
181
182 public bool IsLink
183 {
184 get
185 {
186 return this.m_Link;
187 }
188 }
189
190 public string LinkPath
191 {
192 get
193 {
194 return this.m_LinkPath;
195 }
196 }
197 /// <summary>
198 ///
199 /// </summary>
200 public SubType SubType
201 {
202 get
203 {
204 if (m_SubType != null)
205 return m_SubType.Value;
206 else
207 return GetSubTypeByFileName(this.Path);
208 }
209 }
210
211 /// <summary>
212 ///
213 /// </summary>
214 public bool IsValid
215 {
216 get
217 {
218 return m_Valid;
219 }
220 }
221 181
182 public bool IsLink
183 {
184 get
185 {
186 return this.m_Link;
187 }
188 }
189
190 public string LinkPath
191 {
192 get
193 {
194 return this.m_LinkPath;
195 }
196 }
222 /// <summary> 197 /// <summary>
223 /// 198 ///
199 /// </summary>
200 public SubType SubType
201 {
202 get
203 {
204 if (m_SubType != null)
205 return m_SubType.Value;
206 else
207 return GetSubTypeByFileName(this.Path);
208 }
209 }
210
211 /// <summary>
212 ///
213 /// </summary>
214 public bool IsValid
215 {
216 get
217 {
218 return m_Valid;
219 }
220 }
221
222 /// <summary>
223 ///
224 /// </summary> 224 /// </summary>
225 /// <param name="file"></param> 225 /// <param name="file"></param>
226 /// <returns></returns> 226 /// <returns></returns>
@@ -232,61 +232,61 @@ namespace Prebuild.Core.Nodes
232 } 232 }
233 } 233 }
234 234
235 #endregion 235 #endregion
236 236
237 #region Public Methods 237 #region Public Methods
238 238
239 /// <summary> 239 /// <summary>
240 /// 240 ///
241 /// </summary> 241 /// </summary>
242 /// <param name="node"></param> 242 /// <param name="node"></param>
243 public override void Parse(XmlNode node) 243 public override void Parse(XmlNode node)
244 { 244 {
245 string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); 245 string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty);
246 if (buildAction != string.Empty) 246 if (buildAction != string.Empty)
247 m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); 247 m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction);
248 string subType = Helper.AttributeValue(node, "subType", string.Empty); 248 string subType = Helper.AttributeValue(node, "subType", string.Empty);
249 if (subType != String.Empty) 249 if (subType != String.Empty)
250 m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); 250 m_SubType = (SubType)Enum.Parse(typeof(SubType), subType);
251 251
252 Console.WriteLine("[FileNode]:BuildAction is {0}", buildAction); 252 Console.WriteLine("[FileNode]:BuildAction is {0}", buildAction);
253 253
254 254
255 m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); 255 m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString());
256 this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); 256 this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString));
257 if ( this.m_Link == true ) 257 if ( this.m_Link == true )
258 { 258 {
259 this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); 259 this.m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty );
260 } 260 }
261 this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString())); 261 this.m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", this.m_CopyToOutput.ToString()));
262 this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); 262 this.m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) );
263 263
264 if( node == null ) 264 if( node == null )
265 { 265 {
266 throw new ArgumentNullException("node"); 266 throw new ArgumentNullException("node");
267 } 267 }
268 268
269 m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); 269 m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText);
270 if(m_Path == null) 270 if(m_Path == null)
271 { 271 {
272 m_Path = ""; 272 m_Path = "";
273 } 273 }
274 274
275 m_Path = m_Path.Trim(); 275 m_Path = m_Path.Trim();
276 m_Valid = true; 276 m_Valid = true;
277 if(!File.Exists(m_Path)) 277 if(!File.Exists(m_Path))
278 { 278 {
279 m_Valid = false; 279 m_Valid = false;
280 Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path); 280 Kernel.Instance.Log.Write(LogType.Warning, "File does not exist: {0}", m_Path);
281 } 281 }
282 282
283 if (System.IO.Path.GetExtension(m_Path) == ".settings") 283 if (System.IO.Path.GetExtension(m_Path) == ".settings")
284 { 284 {
285 m_SubType = SubType.Settings; 285 m_SubType = SubType.Settings;
286 m_BuildAction = BuildAction.None; 286 m_BuildAction = BuildAction.None;
287 } 287 }
288 } 288 }
289 289
290 #endregion 290 #endregion
291 } 291 }
292} 292}
diff --git a/Prebuild/src/Core/Nodes/FilesNode.cs b/Prebuild/src/Core/Nodes/FilesNode.cs
index 16658f3..58b54fb 100644
--- a/Prebuild/src/Core/Nodes/FilesNode.cs
+++ b/Prebuild/src/Core/Nodes/FilesNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,36 +34,36 @@ using System.IO;
34 34
35namespace Prebuild.Core.Nodes 35namespace Prebuild.Core.Nodes
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// 38 ///
39 /// </summary> 39 /// </summary>
40 [DataNode("Files")] 40 [DataNode("Files")]
41 public class FilesNode : DataNode 41 public class FilesNode : DataNode
42 { 42 {
43 #region Fields 43 #region Fields
44 44
45 private readonly List<string> m_Files = new List<string>(); 45 private readonly List<string> m_Files = new List<string>();
46 private readonly Dictionary<string,BuildAction> m_BuildActions = new Dictionary<string, BuildAction>(); 46 private readonly Dictionary<string,BuildAction> m_BuildActions = new Dictionary<string, BuildAction>();
47 private readonly Dictionary<string, SubType> m_SubTypes = new Dictionary<string, SubType>(); 47 private readonly Dictionary<string, SubType> m_SubTypes = new Dictionary<string, SubType>();
48 private readonly Dictionary<string, string> m_ResourceNames = new Dictionary<string, string>(); 48 private readonly Dictionary<string, string> m_ResourceNames = new Dictionary<string, string>();
49 private readonly Dictionary<string, CopyToOutput> m_CopyToOutputs = new Dictionary<string, CopyToOutput>(); 49 private readonly Dictionary<string, CopyToOutput> m_CopyToOutputs = new Dictionary<string, CopyToOutput>();
50 private readonly Dictionary<string, bool> m_Links = new Dictionary<string, bool>(); 50 private readonly Dictionary<string, bool> m_Links = new Dictionary<string, bool>();
51 private readonly Dictionary<string, string> m_LinkPaths = new Dictionary<string, string>(); 51 private readonly Dictionary<string, string> m_LinkPaths = new Dictionary<string, string>();
52 private readonly Dictionary<string, bool> m_PreservePaths = new Dictionary<string, bool>(); 52 private readonly Dictionary<string, bool> m_PreservePaths = new Dictionary<string, bool>();
53 private readonly Dictionary<string, string> m_DestinationPath = new Dictionary<string, string>(); 53 private readonly Dictionary<string, string> m_DestinationPath = new Dictionary<string, string>();
54 private readonly NameValueCollection m_CopyFiles = new NameValueCollection(); 54 private readonly NameValueCollection m_CopyFiles = new NameValueCollection();
55 55
56 #endregion 56 #endregion
57 57
58 #region Properties 58 #region Properties
59 59
60 public int Count 60 public int Count
61 { 61 {
62 get 62 get
63 { 63 {
64 return m_Files.Count; 64 return m_Files.Count;
65 } 65 }
66 } 66 }
67 67
68 public string[] Destinations 68 public string[] Destinations
69 { 69 {
@@ -75,19 +75,19 @@ namespace Prebuild.Core.Nodes
75 get { return m_CopyFiles.Count; } 75 get { return m_CopyFiles.Count; }
76 } 76 }
77 77
78 #endregion 78 #endregion
79 79
80 #region Public Methods 80 #region Public Methods
81 81
82 public BuildAction GetBuildAction(string file) 82 public BuildAction GetBuildAction(string file)
83 { 83 {
84 if(!m_BuildActions.ContainsKey(file)) 84 if(!m_BuildActions.ContainsKey(file))
85 { 85 {
86 return BuildAction.Compile; 86 return BuildAction.Compile;
87 } 87 }
88 88
89 return m_BuildActions[file]; 89 return m_BuildActions[file];
90 } 90 }
91 91
92 public string GetDestinationPath(string file) 92 public string GetDestinationPath(string file)
93 { 93 {
@@ -103,57 +103,57 @@ namespace Prebuild.Core.Nodes
103 return m_CopyFiles.GetValues(dest); 103 return m_CopyFiles.GetValues(dest);
104 } 104 }
105 105
106 public CopyToOutput GetCopyToOutput(string file) 106 public CopyToOutput GetCopyToOutput(string file)
107 { 107 {
108 if (!m_CopyToOutputs.ContainsKey(file)) 108 if (!m_CopyToOutputs.ContainsKey(file))
109 { 109 {
110 return CopyToOutput.Never; 110 return CopyToOutput.Never;
111 } 111 }
112 return m_CopyToOutputs[file]; 112 return m_CopyToOutputs[file];
113 } 113 }
114 114
115 public bool GetIsLink(string file) 115 public bool GetIsLink(string file)
116 { 116 {
117 if (!m_Links.ContainsKey(file)) 117 if (!m_Links.ContainsKey(file))
118 { 118 {
119 return false; 119 return false;
120 } 120 }
121 return m_Links[file]; 121 return m_Links[file];
122 } 122 }
123 123
124 public bool Contains(string file) 124 public bool Contains(string file)
125 { 125 {
126 return m_Files.Contains(file); 126 return m_Files.Contains(file);
127 } 127 }
128 128
129 public string GetLinkPath( string file ) 129 public string GetLinkPath( string file )
130 { 130 {
131 if ( !m_LinkPaths.ContainsKey( file ) ) 131 if ( !m_LinkPaths.ContainsKey( file ) )
132 { 132 {
133 return string.Empty; 133 return string.Empty;
134 } 134 }
135 return m_LinkPaths[ file ]; 135 return m_LinkPaths[ file ];
136 } 136 }
137 137
138 public SubType GetSubType(string file) 138 public SubType GetSubType(string file)
139 { 139 {
140 if(!m_SubTypes.ContainsKey(file)) 140 if(!m_SubTypes.ContainsKey(file))
141 { 141 {
142 return SubType.Code; 142 return SubType.Code;
143 } 143 }
144 144
145 return m_SubTypes[file]; 145 return m_SubTypes[file];
146 } 146 }
147 147
148 public string GetResourceName(string file) 148 public string GetResourceName(string file)
149 { 149 {
150 if(!m_ResourceNames.ContainsKey(file)) 150 if(!m_ResourceNames.ContainsKey(file))
151 { 151 {
152 return string.Empty; 152 return string.Empty;
153 } 153 }
154 154
155 return m_ResourceNames[file]; 155 return m_ResourceNames[file];
156 } 156 }
157 157
158 public bool GetPreservePath( string file ) 158 public bool GetPreservePath( string file )
159 { 159 {
@@ -165,45 +165,45 @@ namespace Prebuild.Core.Nodes
165 return m_PreservePaths[ file ]; 165 return m_PreservePaths[ file ];
166 } 166 }
167 167
168 public override void Parse(XmlNode node) 168 public override void Parse(XmlNode node)
169 { 169 {
170 if( node == null ) 170 if( node == null )
171 { 171 {
172 throw new ArgumentNullException("node"); 172 throw new ArgumentNullException("node");
173 } 173 }
174 foreach(XmlNode child in node.ChildNodes) 174 foreach(XmlNode child in node.ChildNodes)
175 { 175 {
176 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 176 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
177 if(dataNode is FileNode) 177 if(dataNode is FileNode)
178 { 178 {
179 FileNode fileNode = (FileNode)dataNode; 179 FileNode fileNode = (FileNode)dataNode;
180 if(fileNode.IsValid) 180 if(fileNode.IsValid)
181 { 181 {
182 if (!m_Files.Contains(fileNode.Path)) 182 if (!m_Files.Contains(fileNode.Path))
183 { 183 {
184 m_Files.Add(fileNode.Path); 184 m_Files.Add(fileNode.Path);
185 m_BuildActions[fileNode.Path] = fileNode.BuildAction; 185 m_BuildActions[fileNode.Path] = fileNode.BuildAction;
186 m_SubTypes[fileNode.Path] = fileNode.SubType; 186 m_SubTypes[fileNode.Path] = fileNode.SubType;
187 m_ResourceNames[fileNode.Path] = fileNode.ResourceName; 187 m_ResourceNames[fileNode.Path] = fileNode.ResourceName;
188 m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath; 188 m_PreservePaths[ fileNode.Path ] = fileNode.PreservePath;
189 m_Links[ fileNode.Path ] = fileNode.IsLink; 189 m_Links[ fileNode.Path ] = fileNode.IsLink;
190 m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath; 190 m_LinkPaths[ fileNode.Path ] = fileNode.LinkPath;
191 m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput; 191 m_CopyToOutputs[ fileNode.Path ] = fileNode.CopyToOutput;
192 192
193 } 193 }
194 } 194 }
195 } 195 }
196 else if(dataNode is MatchNode) 196 else if(dataNode is MatchNode)
197 { 197 {
198 foreach(string file in ((MatchNode)dataNode).Files) 198 foreach(string file in ((MatchNode)dataNode).Files)
199 { 199 {
200 MatchNode matchNode = (MatchNode)dataNode; 200 MatchNode matchNode = (MatchNode)dataNode;
201 if (!m_Files.Contains(file)) 201 if (!m_Files.Contains(file))
202 { 202 {
203 m_Files.Add(file); 203 m_Files.Add(file);
204 if (matchNode.BuildAction == null) 204 if (matchNode.BuildAction == null)
205 m_BuildActions[file] = GetBuildActionByFileName(file); 205 m_BuildActions[file] = GetBuildActionByFileName(file);
206 else 206 else
207 m_BuildActions[file] = matchNode.BuildAction.Value; 207 m_BuildActions[file] = matchNode.BuildAction.Value;
208 208
209 if (matchNode.BuildAction == BuildAction.Copy) 209 if (matchNode.BuildAction == BuildAction.Copy)
@@ -212,27 +212,27 @@ namespace Prebuild.Core.Nodes
212 m_DestinationPath[file] = matchNode.DestinationPath; 212 m_DestinationPath[file] = matchNode.DestinationPath;
213 } 213 }
214 214
215 m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; 215 m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value;
216 m_ResourceNames[ file ] = matchNode.ResourceName; 216 m_ResourceNames[ file ] = matchNode.ResourceName;
217 m_PreservePaths[ file ] = matchNode.PreservePath; 217 m_PreservePaths[ file ] = matchNode.PreservePath;
218 m_Links[ file ] = matchNode.IsLink; 218 m_Links[ file ] = matchNode.IsLink;
219 m_LinkPaths[ file ] = matchNode.LinkPath; 219 m_LinkPaths[ file ] = matchNode.LinkPath;
220 m_CopyToOutputs[ file ] = matchNode.CopyToOutput; 220 m_CopyToOutputs[ file ] = matchNode.CopyToOutput;
221 221
222 } 222 }
223 } 223 }
224 } 224 }
225 } 225 }
226 } 226 }
227 227
228 // TODO: Check in to why StringCollection's enumerator doesn't implement 228 // TODO: Check in to why StringCollection's enumerator doesn't implement
229 // IEnumerator? 229 // IEnumerator?
230 public IEnumerator<string> GetEnumerator() 230 public IEnumerator<string> GetEnumerator()
231 { 231 {
232 return m_Files.GetEnumerator(); 232 return m_Files.GetEnumerator();
233 } 233 }
234 234
235 #endregion 235 #endregion
236 236
237 } 237 }
238} 238}
diff --git a/Prebuild/src/Core/Nodes/MatchNode.cs b/Prebuild/src/Core/Nodes/MatchNode.cs
index 000bde9..fe02277 100644
--- a/Prebuild/src/Core/Nodes/MatchNode.cs
+++ b/Prebuild/src/Core/Nodes/MatchNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -35,51 +35,51 @@ using Prebuild.Core.Utilities;
35 35
36namespace Prebuild.Core.Nodes 36namespace Prebuild.Core.Nodes
37{ 37{
38 /// <summary> 38 /// <summary>
39 /// 39 ///
40 /// </summary> 40 /// </summary>
41 [DataNode("Match")] 41 [DataNode("Match")]
42 public class MatchNode : DataNode 42 public class MatchNode : DataNode
43 { 43 {
44 #region Fields 44 #region Fields
45 45
46 private readonly List<string> m_Files = new List<string>(); 46 private readonly List<string> m_Files = new List<string>();
47 private Regex m_Regex; 47 private Regex m_Regex;
48 private BuildAction? m_BuildAction; 48 private BuildAction? m_BuildAction;
49 private SubType? m_SubType; 49 private SubType? m_SubType;
50 string m_ResourceName = ""; 50 string m_ResourceName = "";
51 private CopyToOutput m_CopyToOutput; 51 private CopyToOutput m_CopyToOutput;
52 private bool m_Link; 52 private bool m_Link;
53 private string m_LinkPath; 53 private string m_LinkPath;
54 private bool m_PreservePath; 54 private bool m_PreservePath;
55 private string m_Destination = ""; 55 private string m_Destination = "";
56 private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>(); 56 private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>();
57 57
58 #endregion 58 #endregion
59 59
60 #region Properties 60 #region Properties
61 61
62 /// <summary> 62 /// <summary>
63 /// 63 ///
64 /// </summary> 64 /// </summary>
65 public IEnumerable<string> Files 65 public IEnumerable<string> Files
66 { 66 {
67 get 67 get
68 { 68 {
69 return m_Files; 69 return m_Files;
70 } 70 }
71 } 71 }
72 72
73 /// <summary> 73 /// <summary>
74 /// 74 ///
75 /// </summary> 75 /// </summary>
76 public BuildAction? BuildAction 76 public BuildAction? BuildAction
77 { 77 {
78 get 78 get
79 { 79 {
80 return m_BuildAction; 80 return m_BuildAction;
81 } 81 }
82 } 82 }
83 83
84 public string DestinationPath 84 public string DestinationPath
85 { 85 {
@@ -88,50 +88,50 @@ namespace Prebuild.Core.Nodes
88 return m_Destination; 88 return m_Destination;
89 } 89 }
90 } 90 }
91 /// <summary> 91 /// <summary>
92 /// 92 ///
93 /// </summary> 93 /// </summary>
94 public SubType? SubType 94 public SubType? SubType
95 { 95 {
96 get 96 get
97 { 97 {
98 return m_SubType; 98 return m_SubType;
99 } 99 }
100 } 100 }
101 101
102 public CopyToOutput CopyToOutput 102 public CopyToOutput CopyToOutput
103 { 103 {
104 get 104 get
105 { 105 {
106 return m_CopyToOutput; 106 return m_CopyToOutput;
107 } 107 }
108 } 108 }
109 109
110 public bool IsLink 110 public bool IsLink
111 { 111 {
112 get 112 get
113 { 113 {
114 return m_Link; 114 return m_Link;
115 } 115 }
116 } 116 }
117 117
118 public string LinkPath 118 public string LinkPath
119 { 119 {
120 get 120 get
121 { 121 {
122 return m_LinkPath; 122 return m_LinkPath;
123 } 123 }
124 } 124 }
125 /// <summary> 125 /// <summary>
126 /// 126 ///
127 /// </summary> 127 /// </summary>
128 public string ResourceName 128 public string ResourceName
129 { 129 {
130 get 130 get
131 { 131 {
132 return m_ResourceName; 132 return m_ResourceName;
133 } 133 }
134 } 134 }
135 135
136 public bool PreservePath 136 public bool PreservePath
137 { 137 {
@@ -141,27 +141,27 @@ namespace Prebuild.Core.Nodes
141 } 141 }
142 } 142 }
143 143
144 #endregion 144 #endregion
145 145
146 #region Private Methods 146 #region Private Methods
147 147
148 /// <summary> 148 /// <summary>
149 /// Recurses the directories. 149 /// Recurses the directories.
150 /// </summary> 150 /// </summary>
151 /// <param name="path">The path.</param> 151 /// <param name="path">The path.</param>
152 /// <param name="pattern">The pattern.</param> 152 /// <param name="pattern">The pattern.</param>
153 /// <param name="recurse">if set to <c>true</c> [recurse].</param> 153 /// <param name="recurse">if set to <c>true</c> [recurse].</param>
154 /// <param name="useRegex">if set to <c>true</c> [use regex].</param> 154 /// <param name="useRegex">if set to <c>true</c> [use regex].</param>
155 private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List<ExcludeNode> exclusions) 155 private void RecurseDirectories(string path, string pattern, bool recurse, bool useRegex, List<ExcludeNode> exclusions)
156 { 156 {
157 Match match; 157 Match match;
158 try 158 try
159 { 159 {
160 string[] files; 160 string[] files;
161 161
162 Boolean excludeFile; 162 Boolean excludeFile;
163 if(!useRegex) 163 if(!useRegex)
164 { 164 {
165 try 165 try
166 { 166 {
167 files = Directory.GetFiles(path, pattern); 167 files = Directory.GetFiles(path, pattern);
@@ -169,7 +169,7 @@ namespace Prebuild.Core.Nodes
169 catch (IOException) 169 catch (IOException)
170 { 170 {
171 // swallow weird IOException error when running in a virtual box 171 // swallow weird IOException error when running in a virtual box
172 // guest OS on a network share when the host OS is not Windows. 172 // guest OS on a network share when the host OS is not Windows.
173 // This seems to happen on network shares 173 // This seems to happen on network shares
174 // when no files match, and may be related to this report: 174 // when no files match, and may be related to this report:
175 // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=254546 175 // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=254546
@@ -177,20 +177,20 @@ namespace Prebuild.Core.Nodes
177 files = null; 177 files = null;
178 } 178 }
179 179
180 if(files != null) 180 if(files != null)
181 { 181 {
182 foreach (string file in files) 182 foreach (string file in files)
183 { 183 {
184 excludeFile = false; 184 excludeFile = false;
185 string fileTemp; 185 string fileTemp;
186 if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\") 186 if (file.Substring(0,2) == "./" || file.Substring(0,2) == ".\\")
187 { 187 {
188 fileTemp = file.Substring(2); 188 fileTemp = file.Substring(2);
189 } 189 }
190 else 190 else
191 { 191 {
192 fileTemp = file; 192 fileTemp = file;
193 } 193 }
194 194
195 // Check all excludions and set flag if there are any hits. 195 // Check all excludions and set flag if there are any hits.
196 foreach ( ExcludeNode exclude in exclusions ) 196 foreach ( ExcludeNode exclude in exclusions )
@@ -205,18 +205,18 @@ namespace Prebuild.Core.Nodes
205 m_Files.Add( fileTemp ); 205 m_Files.Add( fileTemp );
206 } 206 }
207 207
208 } 208 }
209 } 209 }
210 210
211 // don't call return here, because we may need to recursively search directories below 211 // don't call return here, because we may need to recursively search directories below
212 // this one, even if no matches were found in this directory. 212 // this one, even if no matches were found in this directory.
213 } 213 }
214 else 214 else
215 { 215 {
216 try 216 try
217 { 217 {
218 files = Directory.GetFiles(path); 218 files = Directory.GetFiles(path);
219 } 219 }
220 catch (IOException) 220 catch (IOException)
221 { 221 {
222 // swallow weird IOException error when running in a virtual box 222 // swallow weird IOException error when running in a virtual box
@@ -248,12 +248,12 @@ namespace Prebuild.Core.Nodes
248 } 248 }
249 } 249 }
250 } 250 }
251 } 251 }
252 252
253 if(recurse) 253 if(recurse)
254 { 254 {
255 string[] dirs = Directory.GetDirectories(path); 255 string[] dirs = Directory.GetDirectories(path);
256 if(dirs != null && dirs.Length > 0) 256 if(dirs != null && dirs.Length > 0)
257 { 257 {
258 foreach (string str in dirs) 258 foreach (string str in dirs)
259 { 259 {
@@ -265,96 +265,96 @@ namespace Prebuild.Core.Nodes
265 RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions); 265 RecurseDirectories(Helper.NormalizePath(str), pattern, recurse, useRegex, exclusions);
266 } 266 }
267 } 267 }
268 } 268 }
269 } 269 }
270 catch(DirectoryNotFoundException) 270 catch(DirectoryNotFoundException)
271 { 271 {
272 return; 272 return;
273 } 273 }
274 catch(ArgumentException) 274 catch(ArgumentException)
275 { 275 {
276 return; 276 return;
277 } 277 }
278 } 278 }
279 279
280 #endregion 280 #endregion
281 281
282 #region Public Methods 282 #region Public Methods
283 283
284 /// <summary> 284 /// <summary>
285 /// 285 ///
286 /// </summary> 286 /// </summary>
287 /// <param name="node"></param> 287 /// <param name="node"></param>
288 public override void Parse(XmlNode node) 288 public override void Parse(XmlNode node)
289 { 289 {
290 if( node == null ) 290 if( node == null )
291 { 291 {
292 throw new ArgumentNullException("node"); 292 throw new ArgumentNullException("node");
293 } 293 }
294 string path = Helper.AttributeValue(node, "path", "."); 294 string path = Helper.AttributeValue(node, "path", ".");
295 string pattern = Helper.AttributeValue(node, "pattern", "*"); 295 string pattern = Helper.AttributeValue(node, "pattern", "*");
296 string destination = Helper.AttributeValue(node, "destination", string.Empty); 296 string destination = Helper.AttributeValue(node, "destination", string.Empty);
297 bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); 297 bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false"));
298 bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); 298 bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false"));
299 string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); 299 string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty);
300 if (buildAction != string.Empty) 300 if (buildAction != string.Empty)
301 m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); 301 m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction);
302 302
303 303
304 //TODO: Figure out where the subtype node is being assigned 304 //TODO: Figure out where the subtype node is being assigned
305 //string subType = Helper.AttributeValue(node, "subType", string.Empty); 305 //string subType = Helper.AttributeValue(node, "subType", string.Empty);
306 //if (subType != String.Empty) 306 //if (subType != String.Empty)
307 // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); 307 // m_SubType = (SubType)Enum.Parse(typeof(SubType), subType);
308 m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName); 308 m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName);
309 m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", m_CopyToOutput.ToString())); 309 m_CopyToOutput = (CopyToOutput) Enum.Parse(typeof(CopyToOutput), Helper.AttributeValue(node, "copyToOutput", m_CopyToOutput.ToString()));
310 m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); 310 m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString));
311 if ( m_Link ) 311 if ( m_Link )
312 { 312 {
313 m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty ); 313 m_LinkPath = Helper.AttributeValue( node, "linkPath", string.Empty );
314 } 314 }
315 m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); 315 m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) );
316 316
317 if ( buildAction == "Copy") 317 if ( buildAction == "Copy")
318 m_Destination = destination; 318 m_Destination = destination;
319 319
320 if(path != null && path.Length == 0) 320 if(path != null && path.Length == 0)
321 path = ".";//use current directory 321 path = ".";//use current directory
322 322
323 //throw new WarningException("Match must have a 'path' attribute"); 323 //throw new WarningException("Match must have a 'path' attribute");
324 324
325 if(pattern == null) 325 if(pattern == null)
326 { 326 {
327 throw new WarningException("Match must have a 'pattern' attribute"); 327 throw new WarningException("Match must have a 'pattern' attribute");
328 } 328 }
329 329
330 path = Helper.NormalizePath(path); 330 path = Helper.NormalizePath(path);
331 if(!Directory.Exists(path)) 331 if(!Directory.Exists(path))
332 { 332 {
333 throw new WarningException("Match path does not exist: {0}", path); 333 throw new WarningException("Match path does not exist: {0}", path);
334 } 334 }
335 335
336 try 336 try
337 { 337 {
338 if(useRegex) 338 if(useRegex)
339 { 339 {
340 m_Regex = new Regex(pattern); 340 m_Regex = new Regex(pattern);
341 } 341 }
342 } 342 }
343 catch(ArgumentException ex) 343 catch(ArgumentException ex)
344 { 344 {
345 throw new WarningException("Could not compile regex pattern: {0}", ex.Message); 345 throw new WarningException("Could not compile regex pattern: {0}", ex.Message);
346 } 346 }
347 347
348 348
349 foreach(XmlNode child in node.ChildNodes) 349 foreach(XmlNode child in node.ChildNodes)
350 { 350 {
351 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 351 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
352 if(dataNode is ExcludeNode) 352 if(dataNode is ExcludeNode)
353 { 353 {
354 ExcludeNode excludeNode = (ExcludeNode)dataNode; 354 ExcludeNode excludeNode = (ExcludeNode)dataNode;
355 m_Exclusions.Add( excludeNode ); 355 m_Exclusions.Add( excludeNode );
356 } 356 }
357 } 357 }
358 358
359 RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions ); 359 RecurseDirectories( path, pattern, recurse, useRegex, m_Exclusions );
360 360
@@ -371,8 +371,8 @@ namespace Prebuild.Core.Nodes
371 throw new WarningException("Match" + projectName + " returned no files: {0}{1}", Helper.EndPath(path), pattern); 371 throw new WarningException("Match" + projectName + " returned no files: {0}{1}", Helper.EndPath(path), pattern);
372 } 372 }
373 m_Regex = null; 373 m_Regex = null;
374 } 374 }
375 375
376 #endregion 376 #endregion
377 } 377 }
378} 378}
diff --git a/Prebuild/src/Core/Nodes/OptionsNode.cs b/Prebuild/src/Core/Nodes/OptionsNode.cs
index 577de71..d45bd34 100644
--- a/Prebuild/src/Core/Nodes/OptionsNode.cs
+++ b/Prebuild/src/Core/Nodes/OptionsNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,273 +34,273 @@ using Prebuild.Core.Utilities;
34 34
35namespace Prebuild.Core.Nodes 35namespace Prebuild.Core.Nodes
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// 38 ///
39 /// </summary> 39 /// </summary>
40 [DataNode("Options")] 40 [DataNode("Options")]
41 public class OptionsNode : DataNode 41 public class OptionsNode : DataNode
42 { 42 {
43 #region Fields 43 #region Fields
44 44
45 private static readonly Dictionary<string,FieldInfo> m_OptionFields = new Dictionary<string, FieldInfo>(); 45 private static readonly Dictionary<string,FieldInfo> m_OptionFields = new Dictionary<string, FieldInfo>();
46 46
47 [OptionNode("CompilerDefines")] 47 [OptionNode("CompilerDefines")]
48 private string m_CompilerDefines = ""; 48 private string m_CompilerDefines = "";
49 49
50 /// <summary> 50 /// <summary>
51 /// 51 ///
52 /// </summary> 52 /// </summary>
53 public string CompilerDefines 53 public string CompilerDefines
54 { 54 {
55 get 55 get
56 { 56 {
57 return m_CompilerDefines; 57 return m_CompilerDefines;
58 } 58 }
59 set 59 set
60 { 60 {
61 m_CompilerDefines = value; 61 m_CompilerDefines = value;
62 } 62 }
63 } 63 }
64 64
65 [OptionNode("OptimizeCode")] 65 [OptionNode("OptimizeCode")]
66 private bool m_OptimizeCode; 66 private bool m_OptimizeCode;
67 67
68 /// <summary> 68 /// <summary>
69 /// 69 ///
70 /// </summary> 70 /// </summary>
71 public bool OptimizeCode 71 public bool OptimizeCode
72 { 72 {
73 get 73 get
74 { 74 {
75 return m_OptimizeCode; 75 return m_OptimizeCode;
76 } 76 }
77 set 77 set
78 { 78 {
79 m_OptimizeCode = value; 79 m_OptimizeCode = value;
80 } 80 }
81 } 81 }
82 82
83 [OptionNode("CheckUnderflowOverflow")] 83 [OptionNode("CheckUnderflowOverflow")]
84 private bool m_CheckUnderflowOverflow; 84 private bool m_CheckUnderflowOverflow;
85 85
86 /// <summary> 86 /// <summary>
87 /// 87 ///
88 /// </summary> 88 /// </summary>
89 public bool CheckUnderflowOverflow 89 public bool CheckUnderflowOverflow
90 { 90 {
91 get 91 get
92 { 92 {
93 return m_CheckUnderflowOverflow; 93 return m_CheckUnderflowOverflow;
94 } 94 }
95 set 95 set
96 { 96 {
97 m_CheckUnderflowOverflow = value; 97 m_CheckUnderflowOverflow = value;
98 } 98 }
99 } 99 }
100 100
101 [OptionNode("AllowUnsafe")] 101 [OptionNode("AllowUnsafe")]
102 private bool m_AllowUnsafe; 102 private bool m_AllowUnsafe;
103 103
104 /// <summary> 104 /// <summary>
105 /// 105 ///
106 /// </summary> 106 /// </summary>
107 public bool AllowUnsafe 107 public bool AllowUnsafe
108 { 108 {
109 get 109 get
110 { 110 {
111 return m_AllowUnsafe; 111 return m_AllowUnsafe;
112 } 112 }
113 set 113 set
114 { 114 {
115 m_AllowUnsafe = value; 115 m_AllowUnsafe = value;
116 } 116 }
117 } 117 }
118 118
119 [OptionNode("PreBuildEvent")] 119 [OptionNode("PreBuildEvent")]
120 private string m_PreBuildEvent; 120 private string m_PreBuildEvent;
121 121
122 /// <summary> 122 /// <summary>
123 /// 123 ///
124 /// </summary> 124 /// </summary>
125 public string PreBuildEvent 125 public string PreBuildEvent
126 { 126 {
127 get 127 get
128 { 128 {
129 return m_PreBuildEvent; 129 return m_PreBuildEvent;
130 } 130 }
131 set 131 set
132 { 132 {
133 m_PreBuildEvent = value; 133 m_PreBuildEvent = value;
134 } 134 }
135 } 135 }
136 136
137 [OptionNode("PostBuildEvent")] 137 [OptionNode("PostBuildEvent")]
138 private string m_PostBuildEvent; 138 private string m_PostBuildEvent;
139 139
140 /// <summary> 140 /// <summary>
141 /// 141 ///
142 /// </summary> 142 /// </summary>
143 public string PostBuildEvent 143 public string PostBuildEvent
144 { 144 {
145 get 145 get
146 { 146 {
147 return m_PostBuildEvent; 147 return m_PostBuildEvent;
148 } 148 }
149 set 149 set
150 { 150 {
151 m_PostBuildEvent = value; 151 m_PostBuildEvent = value;
152 } 152 }
153 } 153 }
154 154
155 [OptionNode("PreBuildEventArgs")] 155 [OptionNode("PreBuildEventArgs")]
156 private string m_PreBuildEventArgs; 156 private string m_PreBuildEventArgs;
157 157
158 /// <summary> 158 /// <summary>
159 /// 159 ///
160 /// </summary> 160 /// </summary>
161 public string PreBuildEventArgs 161 public string PreBuildEventArgs
162 { 162 {
163 get 163 get
164 { 164 {
165 return m_PreBuildEventArgs; 165 return m_PreBuildEventArgs;
166 } 166 }
167 set 167 set
168 { 168 {
169 m_PreBuildEventArgs = value; 169 m_PreBuildEventArgs = value;
170 } 170 }
171 } 171 }
172 172
173 [OptionNode("PostBuildEventArgs")] 173 [OptionNode("PostBuildEventArgs")]
174 private string m_PostBuildEventArgs; 174 private string m_PostBuildEventArgs;
175 175
176 /// <summary> 176 /// <summary>
177 /// 177 ///
178 /// </summary> 178 /// </summary>
179 public string PostBuildEventArgs 179 public string PostBuildEventArgs
180 { 180 {
181 get 181 get
182 { 182 {
183 return m_PostBuildEventArgs; 183 return m_PostBuildEventArgs;
184 } 184 }
185 set 185 set
186 { 186 {
187 m_PostBuildEventArgs = value; 187 m_PostBuildEventArgs = value;
188 } 188 }
189 } 189 }
190 190
191 [OptionNode("RunPostBuildEvent")] 191 [OptionNode("RunPostBuildEvent")]
192 private string m_RunPostBuildEvent; 192 private string m_RunPostBuildEvent;
193 193
194 /// <summary> 194 /// <summary>
195 /// 195 ///
196 /// </summary> 196 /// </summary>
197 public string RunPostBuildEvent 197 public string RunPostBuildEvent
198 { 198 {
199 get 199 get
200 { 200 {
201 return m_RunPostBuildEvent; 201 return m_RunPostBuildEvent;
202 } 202 }
203 set 203 set
204 { 204 {
205 m_RunPostBuildEvent = value; 205 m_RunPostBuildEvent = value;
206 } 206 }
207 } 207 }
208 208
209 [OptionNode("RunScript")] 209 [OptionNode("RunScript")]
210 private string m_RunScript; 210 private string m_RunScript;
211 211
212 /// <summary> 212 /// <summary>
213 /// 213 ///
214 /// </summary> 214 /// </summary>
215 public string RunScript 215 public string RunScript
216 { 216 {
217 get 217 get
218 { 218 {
219 return m_RunScript; 219 return m_RunScript;
220 } 220 }
221 set 221 set
222 { 222 {
223 m_RunScript = value; 223 m_RunScript = value;
224 } 224 }
225 } 225 }
226 226
227 [OptionNode("WarningLevel")] 227 [OptionNode("WarningLevel")]
228 private int m_WarningLevel = 4; 228 private int m_WarningLevel = 4;
229 229
230 /// <summary> 230 /// <summary>
231 /// 231 ///
232 /// </summary> 232 /// </summary>
233 public int WarningLevel 233 public int WarningLevel
234 { 234 {
235 get 235 get
236 { 236 {
237 return m_WarningLevel; 237 return m_WarningLevel;
238 } 238 }
239 set 239 set
240 { 240 {
241 m_WarningLevel = value; 241 m_WarningLevel = value;
242 } 242 }
243 } 243 }
244 244
245 [OptionNode("WarningsAsErrors")] 245 [OptionNode("WarningsAsErrors")]
246 private bool m_WarningsAsErrors; 246 private bool m_WarningsAsErrors;
247 247
248 /// <summary> 248 /// <summary>
249 /// 249 ///
250 /// </summary> 250 /// </summary>
251 public bool WarningsAsErrors 251 public bool WarningsAsErrors
252 { 252 {
253 get 253 get
254 { 254 {
255 return m_WarningsAsErrors; 255 return m_WarningsAsErrors;
256 } 256 }
257 set 257 set
258 { 258 {
259 m_WarningsAsErrors = value; 259 m_WarningsAsErrors = value;
260 } 260 }
261 } 261 }
262 262
263 [OptionNode("SuppressWarnings")] 263 [OptionNode("SuppressWarnings")]
264 private string m_SuppressWarnings = ""; 264 private string m_SuppressWarnings = "";
265 265
266 /// <summary> 266 /// <summary>
267 /// 267 ///
268 /// </summary> 268 /// </summary>
269 public string SuppressWarnings 269 public string SuppressWarnings
270 { 270 {
271 get 271 get
272 { 272 {
273 return m_SuppressWarnings; 273 return m_SuppressWarnings;
274 } 274 }
275 set 275 set
276 { 276 {
277 m_SuppressWarnings = value; 277 m_SuppressWarnings = value;
278 } 278 }
279 } 279 }
280 280
281 [OptionNode("OutputPath")] 281 [OptionNode("OutputPath")]
282 private string m_OutputPath = "bin/"; 282 private string m_OutputPath = "bin/";
283 283
284 /// <summary> 284 /// <summary>
285 /// 285 ///
286 /// </summary> 286 /// </summary>
287 public string OutputPath 287 public string OutputPath
288 { 288 {
289 get 289 get
290 { 290 {
291 return m_OutputPath; 291 return m_OutputPath;
292 } 292 }
293 set 293 set
294 { 294 {
295 m_OutputPath = value; 295 m_OutputPath = value;
296 } 296 }
297 } 297 }
298 298
299 [OptionNode("GenerateDocumentation")] 299 [OptionNode("GenerateDocumentation")]
300 private bool m_GenerateDocumentation; 300 private bool m_GenerateDocumentation;
301 301
302 /// <summary> 302 /// <summary>
303 /// 303 ///
304 /// </summary> 304 /// </summary>
305 public bool GenerateDocumentation 305 public bool GenerateDocumentation
306 { 306 {
@@ -314,321 +314,321 @@ namespace Prebuild.Core.Nodes
314 } 314 }
315 } 315 }
316 316
317 [OptionNode("GenerateXmlDocFile")] 317 [OptionNode("GenerateXmlDocFile")]
318 private bool m_GenerateXmlDocFile; 318 private bool m_GenerateXmlDocFile;
319 319
320 /// <summary> 320 /// <summary>
321 /// 321 ///
322 /// </summary> 322 /// </summary>
323 public bool GenerateXmlDocFile 323 public bool GenerateXmlDocFile
324 { 324 {
325 get 325 get
326 { 326 {
327 return m_GenerateXmlDocFile; 327 return m_GenerateXmlDocFile;
328 } 328 }
329 set 329 set
330 { 330 {
331 m_GenerateXmlDocFile = value; 331 m_GenerateXmlDocFile = value;
332 } 332 }
333 } 333 }
334 334
335 [OptionNode("XmlDocFile")] 335 [OptionNode("XmlDocFile")]
336 private string m_XmlDocFile = ""; 336 private string m_XmlDocFile = "";
337 337
338 /// <summary> 338 /// <summary>
339 /// 339 ///
340 /// </summary> 340 /// </summary>
341 public string XmlDocFile 341 public string XmlDocFile
342 { 342 {
343 get 343 get
344 { 344 {
345 return m_XmlDocFile; 345 return m_XmlDocFile;
346 } 346 }
347 set 347 set
348 { 348 {
349 m_XmlDocFile = value; 349 m_XmlDocFile = value;
350 } 350 }
351 } 351 }
352 352
353 [OptionNode("KeyFile")] 353 [OptionNode("KeyFile")]
354 private string m_KeyFile = ""; 354 private string m_KeyFile = "";
355 355
356 /// <summary> 356 /// <summary>
357 /// 357 ///
358 /// </summary> 358 /// </summary>
359 public string KeyFile 359 public string KeyFile
360 { 360 {
361 get 361 get
362 { 362 {
363 return m_KeyFile; 363 return m_KeyFile;
364 } 364 }
365 set 365 set
366 { 366 {
367 m_KeyFile = value; 367 m_KeyFile = value;
368 } 368 }
369 } 369 }
370 370
371 [OptionNode("DebugInformation")] 371 [OptionNode("DebugInformation")]
372 private bool m_DebugInformation; 372 private bool m_DebugInformation;
373 373
374 /// <summary> 374 /// <summary>
375 /// 375 ///
376 /// </summary> 376 /// </summary>
377 public bool DebugInformation 377 public bool DebugInformation
378 { 378 {
379 get 379 get
380 { 380 {
381 return m_DebugInformation; 381 return m_DebugInformation;
382 } 382 }
383 set 383 set
384 { 384 {
385 m_DebugInformation = value; 385 m_DebugInformation = value;
386 } 386 }
387 } 387 }
388 388
389 [OptionNode("RegisterComInterop")] 389 [OptionNode("RegisterComInterop")]
390 private bool m_RegisterComInterop; 390 private bool m_RegisterComInterop;
391 391
392 /// <summary> 392 /// <summary>
393 /// 393 ///
394 /// </summary> 394 /// </summary>
395 public bool RegisterComInterop 395 public bool RegisterComInterop
396 { 396 {
397 get 397 get
398 { 398 {
399 return m_RegisterComInterop; 399 return m_RegisterComInterop;
400 } 400 }
401 set 401 set
402 { 402 {
403 m_RegisterComInterop = value; 403 m_RegisterComInterop = value;
404 } 404 }
405 } 405 }
406 406
407 [OptionNode("RemoveIntegerChecks")] 407 [OptionNode("RemoveIntegerChecks")]
408 private bool m_RemoveIntegerChecks; 408 private bool m_RemoveIntegerChecks;
409 409
410 /// <summary> 410 /// <summary>
411 /// 411 ///
412 /// </summary> 412 /// </summary>
413 public bool RemoveIntegerChecks 413 public bool RemoveIntegerChecks
414 { 414 {
415 get 415 get
416 { 416 {
417 return m_RemoveIntegerChecks; 417 return m_RemoveIntegerChecks;
418 } 418 }
419 set 419 set
420 { 420 {
421 m_RemoveIntegerChecks = value; 421 m_RemoveIntegerChecks = value;
422 } 422 }
423 } 423 }
424 424
425 [OptionNode("IncrementalBuild")] 425 [OptionNode("IncrementalBuild")]
426 private bool m_IncrementalBuild; 426 private bool m_IncrementalBuild;
427 427
428 /// <summary> 428 /// <summary>
429 /// 429 ///
430 /// </summary> 430 /// </summary>
431 public bool IncrementalBuild 431 public bool IncrementalBuild
432 { 432 {
433 get 433 get
434 { 434 {
435 return m_IncrementalBuild; 435 return m_IncrementalBuild;
436 } 436 }
437 set 437 set
438 { 438 {
439 m_IncrementalBuild = value; 439 m_IncrementalBuild = value;
440 } 440 }
441 } 441 }
442 442
443 [OptionNode("BaseAddress")] 443 [OptionNode("BaseAddress")]
444 private string m_BaseAddress = "285212672"; 444 private string m_BaseAddress = "285212672";
445 445
446 /// <summary> 446 /// <summary>
447 /// 447 ///
448 /// </summary> 448 /// </summary>
449 public string BaseAddress 449 public string BaseAddress
450 { 450 {
451 get 451 get
452 { 452 {
453 return m_BaseAddress; 453 return m_BaseAddress;
454 } 454 }
455 set 455 set
456 { 456 {
457 m_BaseAddress = value; 457 m_BaseAddress = value;
458 } 458 }
459 } 459 }
460 460
461 [OptionNode("FileAlignment")] 461 [OptionNode("FileAlignment")]
462 private int m_FileAlignment = 4096; 462 private int m_FileAlignment = 4096;
463 463
464 /// <summary> 464 /// <summary>
465 /// 465 ///
466 /// </summary> 466 /// </summary>
467 public int FileAlignment 467 public int FileAlignment
468 { 468 {
469 get 469 get
470 { 470 {
471 return m_FileAlignment; 471 return m_FileAlignment;
472 } 472 }
473 set 473 set
474 { 474 {
475 m_FileAlignment = value; 475 m_FileAlignment = value;
476 } 476 }
477 } 477 }
478 478
479 [OptionNode("NoStdLib")] 479 [OptionNode("NoStdLib")]
480 private bool m_NoStdLib; 480 private bool m_NoStdLib;
481 481
482 /// <summary> 482 /// <summary>
483 /// 483 ///
484 /// </summary> 484 /// </summary>
485 public bool NoStdLib 485 public bool NoStdLib
486 { 486 {
487 get 487 get
488 { 488 {
489 return m_NoStdLib; 489 return m_NoStdLib;
490 } 490 }
491 set 491 set
492 { 492 {
493 m_NoStdLib = value; 493 m_NoStdLib = value;
494 } 494 }
495 } 495 }
496 496
497 private readonly List<string> m_FieldsDefined = new List<string>(); 497 private readonly List<string> m_FieldsDefined = new List<string>();
498 498
499 #endregion 499 #endregion
500 500
501 #region Constructors 501 #region Constructors
502 502
503 /// <summary> 503 /// <summary>
504 /// Initializes the <see cref="OptionsNode"/> class. 504 /// Initializes the <see cref="OptionsNode"/> class.
505 /// </summary> 505 /// </summary>
506 static OptionsNode() 506 static OptionsNode()
507 { 507 {
508 Type t = typeof(OptionsNode); 508 Type t = typeof(OptionsNode);
509 509
510 foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) 510 foreach(FieldInfo f in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
511 { 511 {
512 object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false); 512 object[] attrs = f.GetCustomAttributes(typeof(OptionNodeAttribute), false);
513 if(attrs == null || attrs.Length < 1) 513 if(attrs == null || attrs.Length < 1)
514 { 514 {
515 continue; 515 continue;
516 } 516 }
517 517
518 OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0]; 518 OptionNodeAttribute ona = (OptionNodeAttribute)attrs[0];
519 m_OptionFields[ona.NodeName] = f; 519 m_OptionFields[ona.NodeName] = f;
520 } 520 }
521 } 521 }
522 522
523 #endregion 523 #endregion
524 524
525 #region Properties 525 #region Properties
526 526
527 /// <summary> 527 /// <summary>
528 /// Gets the <see cref="Object"/> at the specified index. 528 /// Gets the <see cref="Object"/> at the specified index.
529 /// </summary> 529 /// </summary>
530 /// <value></value> 530 /// <value></value>
531 public object this[string index] 531 public object this[string index]
532 { 532 {
533 get 533 get
534 { 534 {
535 if(!m_OptionFields.ContainsKey(index)) 535 if(!m_OptionFields.ContainsKey(index))
536 { 536 {
537 return null; 537 return null;
538 } 538 }
539 539
540 FieldInfo f = m_OptionFields[index]; 540 FieldInfo f = m_OptionFields[index];
541 return f.GetValue(this); 541 return f.GetValue(this);
542 } 542 }
543 } 543 }
544 544
545 /// <summary> 545 /// <summary>
546 /// Gets the <see cref="Object"/> at the specified index. 546 /// Gets the <see cref="Object"/> at the specified index.
547 /// </summary> 547 /// </summary>
548 /// <value></value> 548 /// <value></value>
549 public object this[string index, object defaultValue] 549 public object this[string index, object defaultValue]
550 { 550 {
551 get 551 get
552 { 552 {
553 object valueObject = this[index]; 553 object valueObject = this[index];
554 if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0) 554 if(valueObject != null && valueObject is string && ((string)valueObject).Length == 0)
555 { 555 {
556 return defaultValue; 556 return defaultValue;
557 } 557 }
558 return valueObject; 558 return valueObject;
559 } 559 }
560 } 560 }
561 561
562 562
563 #endregion 563 #endregion
564 564
565 #region Private Methods 565 #region Private Methods
566 566
567 private void FlagDefined(string name) 567 private void FlagDefined(string name)
568 { 568 {
569 if(!m_FieldsDefined.Contains(name)) 569 if(!m_FieldsDefined.Contains(name))
570 { 570 {
571 m_FieldsDefined.Add(name); 571 m_FieldsDefined.Add(name);
572 } 572 }
573 } 573 }
574 574
575 private void SetOption(string nodeName, string val) 575 private void SetOption(string nodeName, string val)
576 { 576 {
577 lock(m_OptionFields) 577 lock(m_OptionFields)
578 { 578 {
579 if(!m_OptionFields.ContainsKey(nodeName)) 579 if(!m_OptionFields.ContainsKey(nodeName))
580 { 580 {
581 return; 581 return;
582 } 582 }
583 583
584 FieldInfo f = m_OptionFields[nodeName]; 584 FieldInfo f = m_OptionFields[nodeName];
585 f.SetValue(this, Helper.TranslateValue(f.FieldType, val)); 585 f.SetValue(this, Helper.TranslateValue(f.FieldType, val));
586 FlagDefined(f.Name); 586 FlagDefined(f.Name);
587 } 587 }
588 } 588 }
589 589
590 #endregion 590 #endregion
591 591
592 #region Public Methods 592 #region Public Methods
593 593
594 /// <summary> 594 /// <summary>
595 /// Parses the specified node. 595 /// Parses the specified node.
596 /// </summary> 596 /// </summary>
597 /// <param name="node">The node.</param> 597 /// <param name="node">The node.</param>
598 public override void Parse(XmlNode node) 598 public override void Parse(XmlNode node)
599 { 599 {
600 if( node == null ) 600 if( node == null )
601 { 601 {
602 throw new ArgumentNullException("node"); 602 throw new ArgumentNullException("node");
603 } 603 }
604 604
605 foreach(XmlNode child in node.ChildNodes) 605 foreach(XmlNode child in node.ChildNodes)
606 { 606 {
607 SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText)); 607 SetOption(child.Name, Helper.InterpolateForEnvironmentVariables(child.InnerText));
608 } 608 }
609 } 609 }
610 610
611 /// <summary> 611 /// <summary>
612 /// Copies to. 612 /// Copies to.
613 /// </summary> 613 /// </summary>
614 /// <param name="opt">The opt.</param> 614 /// <param name="opt">The opt.</param>
615 public void CopyTo(OptionsNode opt) 615 public void CopyTo(OptionsNode opt)
616 { 616 {
617 if(opt == null) 617 if(opt == null)
618 { 618 {
619 return; 619 return;
620 } 620 }
621 621
622 foreach(FieldInfo f in m_OptionFields.Values) 622 foreach(FieldInfo f in m_OptionFields.Values)
623 { 623 {
624 if(m_FieldsDefined.Contains(f.Name)) 624 if(m_FieldsDefined.Contains(f.Name))
625 { 625 {
626 f.SetValue(opt, f.GetValue(this)); 626 f.SetValue(opt, f.GetValue(this));
627 opt.m_FieldsDefined.Add(f.Name); 627 opt.m_FieldsDefined.Add(f.Name);
628 } 628 }
629 } 629 }
630 } 630 }
631 631
632 #endregion 632 #endregion
633 } 633 }
634} 634}
diff --git a/Prebuild/src/Core/Nodes/ProcessNode.cs b/Prebuild/src/Core/Nodes/ProcessNode.cs
index 8ca8e49..b05ffc6 100644
--- a/Prebuild/src/Core/Nodes/ProcessNode.cs
+++ b/Prebuild/src/Core/Nodes/ProcessNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,77 +32,77 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 [DataNode("Process")] 38 [DataNode("Process")]
39 public class ProcessNode : DataNode 39 public class ProcessNode : DataNode
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Path; 43 private string m_Path;
44 private bool m_IsValid = true; 44 private bool m_IsValid = true;
45 45
46 #endregion 46 #endregion
47 47
48 #region Properties 48 #region Properties
49 49
50 /// <summary> 50 /// <summary>
51 /// Gets the path. 51 /// Gets the path.
52 /// </summary> 52 /// </summary>
53 /// <value>The path.</value> 53 /// <value>The path.</value>
54 public string Path 54 public string Path
55 { 55 {
56 get 56 get
57 { 57 {
58 return m_Path; 58 return m_Path;
59 } 59 }
60 } 60 }
61 61
62 /// <summary> 62 /// <summary>
63 /// Gets a value indicating whether this instance is valid. 63 /// Gets a value indicating whether this instance is valid.
64 /// </summary> 64 /// </summary>
65 /// <value><c>true</c> if this instance is valid; otherwise, <c>false</c>.</value> 65 /// <value><c>true</c> if this instance is valid; otherwise, <c>false</c>.</value>
66 public bool IsValid 66 public bool IsValid
67 { 67 {
68 get 68 get
69 { 69 {
70 return m_IsValid; 70 return m_IsValid;
71 } 71 }
72 } 72 }
73 73
74 #endregion 74 #endregion
75 75
76 #region Public Methods 76 #region Public Methods
77 77
78 /// <summary> 78 /// <summary>
79 /// Parses the specified node. 79 /// Parses the specified node.
80 /// </summary> 80 /// </summary>
81 /// <param name="node">The node.</param> 81 /// <param name="node">The node.</param>
82 public override void Parse(XmlNode node) 82 public override void Parse(XmlNode node)
83 { 83 {
84 if( node == null ) 84 if( node == null )
85 { 85 {
86 throw new ArgumentNullException("node"); 86 throw new ArgumentNullException("node");
87 } 87 }
88 88
89 m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); 89 m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText);
90 if(m_Path == null) 90 if(m_Path == null)
91 { 91 {
92 m_Path = ""; 92 m_Path = "";
93 } 93 }
94 94
95 try 95 try
96 { 96 {
97 m_Path = Helper.ResolvePath(m_Path); 97 m_Path = Helper.ResolvePath(m_Path);
98 } 98 }
99 catch(ArgumentException) 99 catch(ArgumentException)
100 { 100 {
101 Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path); 101 Kernel.Instance.Log.Write(LogType.Warning, "Could not find prebuild file for processing: {0}", m_Path);
102 m_IsValid = false; 102 m_IsValid = false;
103 } 103 }
104 } 104 }
105 105
106 #endregion 106 #endregion
107 } 107 }
108} 108}
diff --git a/Prebuild/src/Core/Nodes/ProjectNode.cs b/Prebuild/src/Core/Nodes/ProjectNode.cs
index a822704..e02b11b 100644
--- a/Prebuild/src/Core/Nodes/ProjectNode.cs
+++ b/Prebuild/src/Core/Nodes/ProjectNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,65 +34,65 @@ using Prebuild.Core.Utilities;
34 34
35namespace Prebuild.Core.Nodes 35namespace Prebuild.Core.Nodes
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// A set of values that the Project's type can be 38 /// A set of values that the Project's type can be
39 /// </summary> 39 /// </summary>
40 public enum ProjectType 40 public enum ProjectType
41 { 41 {
42 /// <summary> 42 /// <summary>
43 /// The project is a console executable 43 /// The project is a console executable
44 /// </summary> 44 /// </summary>
45 Exe, 45 Exe,
46 /// <summary> 46 /// <summary>
47 /// The project is a windows executable 47 /// The project is a windows executable
48 /// </summary> 48 /// </summary>
49 WinExe, 49 WinExe,
50 /// <summary> 50 /// <summary>
51 /// The project is a library 51 /// The project is a library
52 /// </summary> 52 /// </summary>
53 Library, 53 Library,
54 /// <summary> 54 /// <summary>
55 /// The project is a website 55 /// The project is a website
56 /// </summary> 56 /// </summary>
57 Web, 57 Web,
58 } 58 }
59 59
60 /// <summary> 60 /// <summary>
61 /// 61 ///
62 /// </summary> 62 /// </summary>
63 public enum ClrRuntime 63 public enum ClrRuntime
64 { 64 {
65 /// <summary> 65 /// <summary>
66 /// 66 ///
67 /// </summary> 67 /// </summary>
68 Microsoft, 68 Microsoft,
69 /// <summary> 69 /// <summary>
70 /// 70 ///
71 /// </summary> 71 /// </summary>
72 Mono 72 Mono
73 } 73 }
74 /// <summary> 74 /// <summary>
75 /// The version of the .NET framework to use (Required for VS2008) 75 /// The version of the .NET framework to use (Required for VS2008)
76 /// <remarks>We don't need .NET 1.1 in here, it'll default when using vs2003.</remarks> 76 /// <remarks>We don't need .NET 1.1 in here, it'll default when using vs2003.</remarks>
77 /// </summary> 77 /// </summary>
78 public enum FrameworkVersion 78 public enum FrameworkVersion
79 { 79 {
80 /// <summary> 80 /// <summary>
81 /// .NET 2.0 81 /// .NET 2.0
82 /// </summary> 82 /// </summary>
83 v2_0, 83 v2_0,
84 /// <summary> 84 /// <summary>
85 /// .NET 3.0 85 /// .NET 3.0
86 /// </summary> 86 /// </summary>
87 v3_0, 87 v3_0,
88 /// <summary> 88 /// <summary>
89 /// .NET 3.5 89 /// .NET 3.5
90 /// </summary> 90 /// </summary>
91 v3_5, 91 v3_5,
92 /// <summary> 92 /// <summary>
93 /// .NET 4.0 93 /// .NET 4.0
94 /// </summary> 94 /// </summary>
95 v4_0, 95 v4_0,
96 /// <summary> 96 /// <summary>
97 /// .NET 4.5 97 /// .NET 4.5
98 /// </summary> 98 /// </summary>
@@ -102,477 +102,477 @@ namespace Prebuild.Core.Nodes
102 /// </summary> 102 /// </summary>
103 v4_5_1 103 v4_5_1
104 } 104 }
105 /// <summary> 105 /// <summary>
106 /// The Node object representing /Prebuild/Solution/Project elements 106 /// The Node object representing /Prebuild/Solution/Project elements
107 /// </summary> 107 /// </summary>
108 [DataNode("Project")] 108 [DataNode("Project")]
109 public class ProjectNode : DataNode, IComparable 109 public class ProjectNode : DataNode, IComparable
110 { 110 {
111 #region Fields 111 #region Fields
112 112
113 private string m_Name = "unknown"; 113 private string m_Name = "unknown";
114 private string m_Path = ""; 114 private string m_Path = "";
115 private string m_FullPath = ""; 115 private string m_FullPath = "";
116 private string m_AssemblyName; 116 private string m_AssemblyName;
117 private string m_AppIcon = ""; 117 private string m_AppIcon = "";
118 private string m_ConfigFile = ""; 118 private string m_ConfigFile = "";
119 private string m_DesignerFolder = ""; 119 private string m_DesignerFolder = "";
120 private string m_Language = "C#"; 120 private string m_Language = "C#";
121 private ProjectType m_Type = ProjectType.Exe; 121 private ProjectType m_Type = ProjectType.Exe;
122 private ClrRuntime m_Runtime = ClrRuntime.Microsoft; 122 private ClrRuntime m_Runtime = ClrRuntime.Microsoft;
123 private FrameworkVersion m_Framework = FrameworkVersion.v2_0; 123 private FrameworkVersion m_Framework = FrameworkVersion.v2_0;
124 private string m_StartupObject = ""; 124 private string m_StartupObject = "";
125 private string m_RootNamespace; 125 private string m_RootNamespace;
126 private string m_FilterGroups = ""; 126 private string m_FilterGroups = "";
127 private string m_Version = ""; 127 private string m_Version = "";
128 private Guid m_Guid; 128 private Guid m_Guid;
129 private string m_DebugStartParameters; 129 private string m_DebugStartParameters;
130 130
131 private readonly Dictionary<string, ConfigurationNode> m_Configurations = new Dictionary<string, ConfigurationNode>(); 131 private readonly Dictionary<string, ConfigurationNode> m_Configurations = new Dictionary<string, ConfigurationNode>();
132 private readonly List<ReferencePathNode> m_ReferencePaths = new List<ReferencePathNode>(); 132 private readonly List<ReferencePathNode> m_ReferencePaths = new List<ReferencePathNode>();
133 private readonly List<ReferenceNode> m_References = new List<ReferenceNode>(); 133 private readonly List<ReferenceNode> m_References = new List<ReferenceNode>();
134 private readonly List<AuthorNode> m_Authors = new List<AuthorNode>(); 134 private readonly List<AuthorNode> m_Authors = new List<AuthorNode>();
135 private FilesNode m_Files; 135 private FilesNode m_Files;
136 136
137 #endregion 137 #endregion
138 138
139 #region Properties 139 #region Properties
140 140
141 /// <summary> 141 /// <summary>
142 /// Gets the name. 142 /// Gets the name.
143 /// </summary> 143 /// </summary>
144 /// <value>The name.</value> 144 /// <value>The name.</value>
145 public string Name 145 public string Name
146 { 146 {
147 get 147 get
148 { 148 {
149 return m_Name; 149 return m_Name;
150 } 150 }
151 } 151 }
152 /// <summary> 152 /// <summary>
153 /// The version of the .NET Framework to compile under 153 /// The version of the .NET Framework to compile under
154 /// </summary> 154 /// </summary>
155 public FrameworkVersion FrameworkVersion 155 public FrameworkVersion FrameworkVersion
156 { 156 {
157 get 157 get
158 { 158 {
159 return m_Framework; 159 return m_Framework;
160 } 160 }
161 } 161 }
162 /// <summary> 162 /// <summary>
163 /// Gets the path. 163 /// Gets the path.
164 /// </summary> 164 /// </summary>
165 /// <value>The path.</value> 165 /// <value>The path.</value>
166 public string Path 166 public string Path
167 { 167 {
168 get 168 get
169 { 169 {
170 return m_Path; 170 return m_Path;
171 } 171 }
172 } 172 }
173 173
174 /// <summary> 174 /// <summary>
175 /// Gets the filter groups. 175 /// Gets the filter groups.
176 /// </summary> 176 /// </summary>
177 /// <value>The filter groups.</value> 177 /// <value>The filter groups.</value>
178 public string FilterGroups 178 public string FilterGroups
179 { 179 {
180 get 180 get
181 { 181 {
182 return m_FilterGroups; 182 return m_FilterGroups;
183 } 183 }
184 } 184 }
185 185
186 /// <summary> 186 /// <summary>
187 /// Gets the project's version 187 /// Gets the project's version
188 /// </summary> 188 /// </summary>
189 /// <value>The project's version.</value> 189 /// <value>The project's version.</value>
190 public string Version 190 public string Version
191 { 191 {
192 get 192 get
193 { 193 {
194 return m_Version; 194 return m_Version;
195 } 195 }
196 } 196 }
197 197
198 /// <summary> 198 /// <summary>
199 /// Gets the full path. 199 /// Gets the full path.
200 /// </summary> 200 /// </summary>
201 /// <value>The full path.</value> 201 /// <value>The full path.</value>
202 public string FullPath 202 public string FullPath
203 { 203 {
204 get 204 get
205 { 205 {
206 return m_FullPath; 206 return m_FullPath;
207 } 207 }
208 } 208 }
209 209
210 /// <summary> 210 /// <summary>
211 /// Gets the name of the assembly. 211 /// Gets the name of the assembly.
212 /// </summary> 212 /// </summary>
213 /// <value>The name of the assembly.</value> 213 /// <value>The name of the assembly.</value>
214 public string AssemblyName 214 public string AssemblyName
215 { 215 {
216 get 216 get
217 { 217 {
218 return m_AssemblyName; 218 return m_AssemblyName;
219 } 219 }
220 } 220 }
221 221
222 /// <summary> 222 /// <summary>
223 /// Gets the app icon. 223 /// Gets the app icon.
224 /// </summary> 224 /// </summary>
225 /// <value>The app icon.</value> 225 /// <value>The app icon.</value>
226 public string AppIcon 226 public string AppIcon
227 { 227 {
228 get 228 get
229 { 229 {
230 return m_AppIcon; 230 return m_AppIcon;
231 } 231 }
232 } 232 }
233 233
234 /// <summary> 234 /// <summary>
235 /// Gets the app icon. 235 /// Gets the app icon.
236 /// </summary> 236 /// </summary>
237 /// <value>The app icon.</value> 237 /// <value>The app icon.</value>
238 public string ConfigFile 238 public string ConfigFile
239 { 239 {
240 get 240 get
241 { 241 {
242 return m_ConfigFile; 242 return m_ConfigFile;
243 } 243 }
244 } 244 }
245 245
246 /// <summary> 246 /// <summary>
247 /// 247 ///
248 /// </summary> 248 /// </summary>
249 public string DesignerFolder 249 public string DesignerFolder
250 { 250 {
251 get 251 get
252 { 252 {
253 return m_DesignerFolder; 253 return m_DesignerFolder;
254 } 254 }
255 } 255 }
256 256
257 /// <summary> 257 /// <summary>
258 /// Gets the language. 258 /// Gets the language.
259 /// </summary> 259 /// </summary>
260 /// <value>The language.</value> 260 /// <value>The language.</value>
261 public string Language 261 public string Language
262 { 262 {
263 get 263 get
264 { 264 {
265 return m_Language; 265 return m_Language;
266 } 266 }
267 } 267 }
268 268
269 /// <summary> 269 /// <summary>
270 /// Gets the type. 270 /// Gets the type.
271 /// </summary> 271 /// </summary>
272 /// <value>The type.</value> 272 /// <value>The type.</value>
273 public ProjectType Type 273 public ProjectType Type
274 { 274 {
275 get 275 get
276 { 276 {
277 return m_Type; 277 return m_Type;
278 } 278 }
279 } 279 }
280 280
281 /// <summary> 281 /// <summary>
282 /// Gets the runtime. 282 /// Gets the runtime.
283 /// </summary> 283 /// </summary>
284 /// <value>The runtime.</value> 284 /// <value>The runtime.</value>
285 public ClrRuntime Runtime 285 public ClrRuntime Runtime
286 { 286 {
287 get 287 get
288 { 288 {
289 return m_Runtime; 289 return m_Runtime;
290 } 290 }
291 } 291 }
292 292
293 private bool m_GenerateAssemblyInfoFile; 293 private bool m_GenerateAssemblyInfoFile;
294 294
295 /// <summary> 295 /// <summary>
296 /// 296 ///
297 /// </summary> 297 /// </summary>
298 public bool GenerateAssemblyInfoFile 298 public bool GenerateAssemblyInfoFile
299 { 299 {
300 get 300 get
301 { 301 {
302 return m_GenerateAssemblyInfoFile; 302 return m_GenerateAssemblyInfoFile;
303 } 303 }
304 set 304 set
305 { 305 {
306 m_GenerateAssemblyInfoFile = value; 306 m_GenerateAssemblyInfoFile = value;
307 } 307 }
308 } 308 }
309 309
310 /// <summary> 310 /// <summary>
311 /// Gets the startup object. 311 /// Gets the startup object.
312 /// </summary> 312 /// </summary>
313 /// <value>The startup object.</value> 313 /// <value>The startup object.</value>
314 public string StartupObject 314 public string StartupObject
315 { 315 {
316 get 316 get
317 { 317 {
318 return m_StartupObject; 318 return m_StartupObject;
319 } 319 }
320 } 320 }
321 321
322 /// <summary> 322 /// <summary>
323 /// Gets the root namespace. 323 /// Gets the root namespace.
324 /// </summary> 324 /// </summary>
325 /// <value>The root namespace.</value> 325 /// <value>The root namespace.</value>
326 public string RootNamespace 326 public string RootNamespace
327 { 327 {
328 get 328 get
329 { 329 {
330 return m_RootNamespace; 330 return m_RootNamespace;
331 } 331 }
332 } 332 }
333 333
334 /// <summary> 334 /// <summary>
335 /// Gets the configurations. 335 /// Gets the configurations.
336 /// </summary> 336 /// </summary>
337 /// <value>The configurations.</value> 337 /// <value>The configurations.</value>
338 public List<ConfigurationNode> Configurations 338 public List<ConfigurationNode> Configurations
339 { 339 {
340 get 340 get
341 { 341 {
342 List<ConfigurationNode> tmp = new List<ConfigurationNode>(ConfigurationsTable.Values); 342 List<ConfigurationNode> tmp = new List<ConfigurationNode>(ConfigurationsTable.Values);
343 tmp.Sort(); 343 tmp.Sort();
344 return tmp; 344 return tmp;
345 } 345 }
346 } 346 }
347 347
348 /// <summary> 348 /// <summary>
349 /// Gets the configurations table. 349 /// Gets the configurations table.
350 /// </summary> 350 /// </summary>
351 /// <value>The configurations table.</value> 351 /// <value>The configurations table.</value>
352 public Dictionary<string, ConfigurationNode> ConfigurationsTable 352 public Dictionary<string, ConfigurationNode> ConfigurationsTable
353 { 353 {
354 get 354 get
355 { 355 {
356 return m_Configurations; 356 return m_Configurations;
357 } 357 }
358 } 358 }
359 359
360 /// <summary> 360 /// <summary>
361 /// Gets the reference paths. 361 /// Gets the reference paths.
362 /// </summary> 362 /// </summary>
363 /// <value>The reference paths.</value> 363 /// <value>The reference paths.</value>
364 public List<ReferencePathNode> ReferencePaths 364 public List<ReferencePathNode> ReferencePaths
365 { 365 {
366 get 366 get
367 { 367 {
368 List<ReferencePathNode> tmp = new List<ReferencePathNode>(m_ReferencePaths); 368 List<ReferencePathNode> tmp = new List<ReferencePathNode>(m_ReferencePaths);
369 tmp.Sort(); 369 tmp.Sort();
370 return tmp; 370 return tmp;
371 } 371 }
372 } 372 }
373 373
374 /// <summary> 374 /// <summary>
375 /// Gets the references. 375 /// Gets the references.
376 /// </summary> 376 /// </summary>
377 /// <value>The references.</value> 377 /// <value>The references.</value>
378 public List<ReferenceNode> References 378 public List<ReferenceNode> References
379 { 379 {
380 get 380 get
381 { 381 {
382 List<ReferenceNode> tmp = new List<ReferenceNode>(m_References); 382 List<ReferenceNode> tmp = new List<ReferenceNode>(m_References);
383 tmp.Sort(); 383 tmp.Sort();
384 return tmp; 384 return tmp;
385 } 385 }
386 } 386 }
387 387
388 /// <summary> 388 /// <summary>
389 /// Gets the Authors list. 389 /// Gets the Authors list.
390 /// </summary> 390 /// </summary>
391 /// <value>The list of the project's authors.</value> 391 /// <value>The list of the project's authors.</value>
392 public List<AuthorNode> Authors 392 public List<AuthorNode> Authors
393 { 393 {
394 get 394 get
395 { 395 {
396 return m_Authors; 396 return m_Authors;
397 } 397 }
398 } 398 }
399 399
400 /// <summary> 400 /// <summary>
401 /// Gets the files. 401 /// Gets the files.
402 /// </summary> 402 /// </summary>
403 /// <value>The files.</value> 403 /// <value>The files.</value>
404 public FilesNode Files 404 public FilesNode Files
405 { 405 {
406 get 406 get
407 { 407 {
408 return m_Files; 408 return m_Files;
409 } 409 }
410 } 410 }
411 411
412 /// <summary> 412 /// <summary>
413 /// Gets or sets the parent. 413 /// Gets or sets the parent.
414 /// </summary> 414 /// </summary>
415 /// <value>The parent.</value> 415 /// <value>The parent.</value>
416 public override IDataNode Parent 416 public override IDataNode Parent
417 { 417 {
418 get 418 get
419 { 419 {
420 return base.Parent; 420 return base.Parent;
421 } 421 }
422 set 422 set
423 { 423 {
424 base.Parent = value; 424 base.Parent = value;
425 if(base.Parent is SolutionNode && m_Configurations.Count < 1) 425 if(base.Parent is SolutionNode && m_Configurations.Count < 1)
426 { 426 {
427 SolutionNode parent = (SolutionNode)base.Parent; 427 SolutionNode parent = (SolutionNode)base.Parent;
428 foreach(ConfigurationNode conf in parent.Configurations) 428 foreach(ConfigurationNode conf in parent.Configurations)
429 { 429 {
430 m_Configurations[conf.NameAndPlatform] = (ConfigurationNode) conf.Clone(); 430 m_Configurations[conf.NameAndPlatform] = (ConfigurationNode) conf.Clone();
431 } 431 }
432 } 432 }
433 } 433 }
434 } 434 }
435 435
436 /// <summary> 436 /// <summary>
437 /// Gets the GUID. 437 /// Gets the GUID.
438 /// </summary> 438 /// </summary>
439 /// <value>The GUID.</value> 439 /// <value>The GUID.</value>
440 public Guid Guid 440 public Guid Guid
441 { 441 {
442 get 442 get
443 { 443 {
444 return m_Guid; 444 return m_Guid;
445 } 445 }
446 } 446 }
447 447
448 public string DebugStartParameters 448 public string DebugStartParameters
449 { 449 {
450 get 450 get
451 { 451 {
452 return m_DebugStartParameters; 452 return m_DebugStartParameters;
453 } 453 }
454 } 454 }
455 455
456 #endregion 456 #endregion
457 457
458 #region Private Methods 458 #region Private Methods
459 459
460 private void HandleConfiguration(ConfigurationNode conf) 460 private void HandleConfiguration(ConfigurationNode conf)
461 { 461 {
462 if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first, 462 if(String.Compare(conf.Name, "all", true) == 0) //apply changes to all, this may not always be applied first,
463 //so it *may* override changes to the same properties for configurations defines at the project level 463 //so it *may* override changes to the same properties for configurations defines at the project level
464 { 464 {
465 foreach(ConfigurationNode confNode in m_Configurations.Values) 465 foreach(ConfigurationNode confNode in m_Configurations.Values)
466 { 466 {
467 conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides 467 conf.CopyTo(confNode);//update the config templates defines at the project level with the overrides
468 } 468 }
469 } 469 }
470 if(m_Configurations.ContainsKey(conf.NameAndPlatform)) 470 if(m_Configurations.ContainsKey(conf.NameAndPlatform))
471 { 471 {
472 ConfigurationNode parentConf = m_Configurations[conf.NameAndPlatform]; 472 ConfigurationNode parentConf = m_Configurations[conf.NameAndPlatform];
473 conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides 473 conf.CopyTo(parentConf);//update the config templates defines at the project level with the overrides
474 } 474 }
475 else 475 else
476 { 476 {
477 m_Configurations[conf.NameAndPlatform] = conf; 477 m_Configurations[conf.NameAndPlatform] = conf;
478 } 478 }
479 } 479 }
480 480
481 #endregion 481 #endregion
482 482
483 #region Public Methods 483 #region Public Methods
484 484
485 /// <summary> 485 /// <summary>
486 /// Parses the specified node. 486 /// Parses the specified node.
487 /// </summary> 487 /// </summary>
488 /// <param name="node">The node.</param> 488 /// <param name="node">The node.</param>
489 public override void Parse(XmlNode node) 489 public override void Parse(XmlNode node)
490 { 490 {
491 m_Name = Helper.AttributeValue(node, "name", m_Name); 491 m_Name = Helper.AttributeValue(node, "name", m_Name);
492 m_Path = Helper.AttributeValue(node, "path", m_Path); 492 m_Path = Helper.AttributeValue(node, "path", m_Path);
493 m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups); 493 m_FilterGroups = Helper.AttributeValue(node, "filterGroups", m_FilterGroups);
494 m_Version = Helper.AttributeValue(node, "version", m_Version); 494 m_Version = Helper.AttributeValue(node, "version", m_Version);
495 m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon); 495 m_AppIcon = Helper.AttributeValue(node, "icon", m_AppIcon);
496 m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile); 496 m_ConfigFile = Helper.AttributeValue(node, "configFile", m_ConfigFile);
497 m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder); 497 m_DesignerFolder = Helper.AttributeValue(node, "designerFolder", m_DesignerFolder);
498 m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName); 498 m_AssemblyName = Helper.AttributeValue(node, "assemblyName", m_AssemblyName);
499 m_Language = Helper.AttributeValue(node, "language", m_Language); 499 m_Language = Helper.AttributeValue(node, "language", m_Language);
500 m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type); 500 m_Type = (ProjectType)Helper.EnumAttributeValue(node, "type", typeof(ProjectType), m_Type);
501 m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime); 501 m_Runtime = (ClrRuntime)Helper.EnumAttributeValue(node, "runtime", typeof(ClrRuntime), m_Runtime);
502 m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework); 502 m_Framework = (FrameworkVersion)Helper.EnumAttributeValue(node, "frameworkVersion", typeof(FrameworkVersion), m_Framework);
503 m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject); 503 m_StartupObject = Helper.AttributeValue(node, "startupObject", m_StartupObject);
504 m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace); 504 m_RootNamespace = Helper.AttributeValue(node, "rootNamespace", m_RootNamespace);
505 505
506 int hash = m_Name.GetHashCode(); 506 int hash = m_Name.GetHashCode();
507 Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 507 Guid guidByHash = new Guid(hash, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
508 string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString()); 508 string guid = Helper.AttributeValue(node, "guid", guidByHash.ToString());
509 m_Guid = new Guid(guid); 509 m_Guid = new Guid(guid);
510 510
511 m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false); 511 m_GenerateAssemblyInfoFile = Helper.ParseBoolean(node, "generateAssemblyInfoFile", false);
512 m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty); 512 m_DebugStartParameters = Helper.AttributeValue(node, "debugStartParameters", string.Empty);
513 513
514 if(string.IsNullOrEmpty(m_AssemblyName)) 514 if(string.IsNullOrEmpty(m_AssemblyName))
515 { 515 {
516 m_AssemblyName = m_Name; 516 m_AssemblyName = m_Name;
517 } 517 }
518 518
519 if(string.IsNullOrEmpty(m_RootNamespace)) 519 if(string.IsNullOrEmpty(m_RootNamespace))
520 { 520 {
521 m_RootNamespace = m_Name; 521 m_RootNamespace = m_Name;
522 } 522 }
523 523
524 m_FullPath = m_Path; 524 m_FullPath = m_Path;
525 try 525 try
526 { 526 {
527 m_FullPath = Helper.ResolvePath(m_FullPath); 527 m_FullPath = Helper.ResolvePath(m_FullPath);
528 } 528 }
529 catch 529 catch
530 { 530 {
531 throw new WarningException("Could not resolve Solution path: {0}", m_Path); 531 throw new WarningException("Could not resolve Solution path: {0}", m_Path);
532 } 532 }
533 533
534 Kernel.Instance.CurrentWorkingDirectory.Push(); 534 Kernel.Instance.CurrentWorkingDirectory.Push();
535 try 535 try
536 { 536 {
537 Helper.SetCurrentDir(m_FullPath); 537 Helper.SetCurrentDir(m_FullPath);
538 538
539 if( node == null ) 539 if( node == null )
540 { 540 {
541 throw new ArgumentNullException("node"); 541 throw new ArgumentNullException("node");
542 } 542 }
543 543
544 foreach(XmlNode child in node.ChildNodes) 544 foreach(XmlNode child in node.ChildNodes)
545 { 545 {
546 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 546 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
547 if(dataNode is ConfigurationNode) 547 if(dataNode is ConfigurationNode)
548 { 548 {
549 HandleConfiguration((ConfigurationNode)dataNode); 549 HandleConfiguration((ConfigurationNode)dataNode);
550 } 550 }
551 else if(dataNode is ReferencePathNode) 551 else if(dataNode is ReferencePathNode)
552 { 552 {
553 m_ReferencePaths.Add((ReferencePathNode)dataNode); 553 m_ReferencePaths.Add((ReferencePathNode)dataNode);
554 } 554 }
555 else if(dataNode is ReferenceNode) 555 else if(dataNode is ReferenceNode)
556 { 556 {
557 m_References.Add((ReferenceNode)dataNode); 557 m_References.Add((ReferenceNode)dataNode);
558 } 558 }
559 else if(dataNode is AuthorNode) 559 else if(dataNode is AuthorNode)
560 { 560 {
561 m_Authors.Add((AuthorNode)dataNode); 561 m_Authors.Add((AuthorNode)dataNode);
562 } 562 }
563 else if(dataNode is FilesNode) 563 else if(dataNode is FilesNode)
564 { 564 {
565 m_Files = (FilesNode)dataNode; 565 m_Files = (FilesNode)dataNode;
566 } 566 }
567 } 567 }
568 } 568 }
569 finally 569 finally
570 { 570 {
571 Kernel.Instance.CurrentWorkingDirectory.Pop(); 571 Kernel.Instance.CurrentWorkingDirectory.Pop();
572 } 572 }
573 } 573 }
574 574
575 #endregion 575 #endregion
576 576
577 #region IComparable Members 577 #region IComparable Members
578 578
@@ -582,6 +582,6 @@ namespace Prebuild.Core.Nodes
582 return m_Name.CompareTo(that.m_Name); 582 return m_Name.CompareTo(that.m_Name);
583 } 583 }
584 584
585 #endregion 585 #endregion
586 } 586 }
587} 587}
diff --git a/Prebuild/src/Core/Nodes/ReferenceNode.cs b/Prebuild/src/Core/Nodes/ReferenceNode.cs
index 9c5d1a3..9afb512 100644
--- a/Prebuild/src/Core/Nodes/ReferenceNode.cs
+++ b/Prebuild/src/Core/Nodes/ReferenceNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,104 +32,104 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 [DataNode("Reference")] 38 [DataNode("Reference")]
39 public class ReferenceNode : DataNode, IComparable 39 public class ReferenceNode : DataNode, IComparable
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Name = "unknown"; 43 private string m_Name = "unknown";
44 private string m_Path; 44 private string m_Path;
45 private string m_LocalCopy; 45 private string m_LocalCopy;
46 private string m_Version; 46 private string m_Version;
47 47
48 #endregion 48 #endregion
49 49
50 #region Properties 50 #region Properties
51 51
52 /// <summary> 52 /// <summary>
53 /// Gets the name. 53 /// Gets the name.
54 /// </summary> 54 /// </summary>
55 /// <value>The name.</value> 55 /// <value>The name.</value>
56 public string Name 56 public string Name
57 { 57 {
58 get 58 get
59 { 59 {
60 return m_Name; 60 return m_Name;
61 } 61 }
62 } 62 }
63 63
64 /// <summary> 64 /// <summary>
65 /// Gets the path. 65 /// Gets the path.
66 /// </summary> 66 /// </summary>
67 /// <value>The path.</value> 67 /// <value>The path.</value>
68 public string Path 68 public string Path
69 { 69 {
70 get 70 get
71 { 71 {
72 return m_Path; 72 return m_Path;
73 } 73 }
74 } 74 }
75 75
76 /// <summary> 76 /// <summary>
77 /// Gets a value indicating whether [local copy specified]. 77 /// Gets a value indicating whether [local copy specified].
78 /// </summary> 78 /// </summary>
79 /// <value><c>true</c> if [local copy specified]; otherwise, <c>false</c>.</value> 79 /// <value><c>true</c> if [local copy specified]; otherwise, <c>false</c>.</value>
80 public bool LocalCopySpecified 80 public bool LocalCopySpecified
81 { 81 {
82 get 82 get
83 { 83 {
84 return ( m_LocalCopy != null && m_LocalCopy.Length == 0); 84 return ( m_LocalCopy != null && m_LocalCopy.Length == 0);
85 } 85 }
86 } 86 }
87 87
88 /// <summary> 88 /// <summary>
89 /// Gets a value indicating whether [local copy]. 89 /// Gets a value indicating whether [local copy].
90 /// </summary> 90 /// </summary>
91 /// <value><c>true</c> if [local copy]; otherwise, <c>false</c>.</value> 91 /// <value><c>true</c> if [local copy]; otherwise, <c>false</c>.</value>
92 public bool LocalCopy 92 public bool LocalCopy
93 { 93 {
94 get 94 get
95 { 95 {
96 if( m_LocalCopy == null) 96 if( m_LocalCopy == null)
97 { 97 {
98 return false; 98 return false;
99 } 99 }
100 return bool.Parse(m_LocalCopy); 100 return bool.Parse(m_LocalCopy);
101 } 101 }
102 } 102 }
103 103
104 /// <summary> 104 /// <summary>
105 /// Gets the version. 105 /// Gets the version.
106 /// </summary> 106 /// </summary>
107 /// <value>The version.</value> 107 /// <value>The version.</value>
108 public string Version 108 public string Version
109 { 109 {
110 get 110 get
111 { 111 {
112 return m_Version; 112 return m_Version;
113 } 113 }
114 } 114 }
115 115
116 #endregion 116 #endregion
117 117
118 #region Public Methods 118 #region Public Methods
119 119
120 /// <summary> 120 /// <summary>
121 /// Parses the specified node. 121 /// Parses the specified node.
122 /// </summary> 122 /// </summary>
123 /// <param name="node">The node.</param> 123 /// <param name="node">The node.</param>
124 public override void Parse(XmlNode node) 124 public override void Parse(XmlNode node)
125 { 125 {
126 m_Name = Helper.AttributeValue(node, "name", m_Name); 126 m_Name = Helper.AttributeValue(node, "name", m_Name);
127 m_Path = Helper.AttributeValue(node, "path", m_Path); 127 m_Path = Helper.AttributeValue(node, "path", m_Path);
128 m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy); 128 m_LocalCopy = Helper.AttributeValue(node, "localCopy", m_LocalCopy);
129 m_Version = Helper.AttributeValue(node, "version", m_Version); 129 m_Version = Helper.AttributeValue(node, "version", m_Version);
130 } 130 }
131 131
132 #endregion 132 #endregion
133 133
134 #region IComparable Members 134 #region IComparable Members
135 135
@@ -140,5 +140,5 @@ namespace Prebuild.Core.Nodes
140 } 140 }
141 141
142 #endregion 142 #endregion
143 } 143 }
144} 144}
diff --git a/Prebuild/src/Core/Nodes/ReferencePathNode.cs b/Prebuild/src/Core/Nodes/ReferencePathNode.cs
index 7331cd7..29c63c5 100644
--- a/Prebuild/src/Core/Nodes/ReferencePathNode.cs
+++ b/Prebuild/src/Core/Nodes/ReferencePathNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -32,57 +32,57 @@ using Prebuild.Core.Utilities;
32 32
33namespace Prebuild.Core.Nodes 33namespace Prebuild.Core.Nodes
34{ 34{
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 [DataNode("ReferencePath")] 38 [DataNode("ReferencePath")]
39 public class ReferencePathNode : DataNode, IComparable 39 public class ReferencePathNode : DataNode, IComparable
40 { 40 {
41 #region Fields 41 #region Fields
42 42
43 private string m_Path; 43 private string m_Path;
44 44
45 #endregion 45 #endregion
46 46
47 #region Properties 47 #region Properties
48 48
49 /// <summary> 49 /// <summary>
50 /// Gets the path. 50 /// Gets the path.
51 /// </summary> 51 /// </summary>
52 /// <value>The path.</value> 52 /// <value>The path.</value>
53 public string Path 53 public string Path
54 { 54 {
55 get 55 get
56 { 56 {
57 return m_Path; 57 return m_Path;
58 } 58 }
59 } 59 }
60 60
61 #endregion 61 #endregion
62 62
63 #region Public Methods 63 #region Public Methods
64 64
65 /// <summary> 65 /// <summary>
66 /// Parses the specified node. 66 /// Parses the specified node.
67 /// </summary> 67 /// </summary>
68 /// <param name="node">The node.</param> 68 /// <param name="node">The node.</param>
69 public override void Parse(XmlNode node) 69 public override void Parse(XmlNode node)
70 { 70 {
71 if( node == null ) 71 if( node == null )
72 { 72 {
73 throw new ArgumentNullException("node"); 73 throw new ArgumentNullException("node");
74 } 74 }
75 75
76 m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText); 76 m_Path = Helper.InterpolateForEnvironmentVariables(node.InnerText);
77 if(m_Path == null) 77 if(m_Path == null)
78 { 78 {
79 m_Path = ""; 79 m_Path = "";
80 } 80 }
81 81
82 m_Path = m_Path.Trim(); 82 m_Path = m_Path.Trim();
83 } 83 }
84 84
85 #endregion 85 #endregion
86 86
87 #region IComparable Members 87 #region IComparable Members
88 88
@@ -93,5 +93,5 @@ namespace Prebuild.Core.Nodes
93 } 93 }
94 94
95 #endregion 95 #endregion
96 } 96 }
97} 97}
diff --git a/Prebuild/src/Core/Nodes/SolutionNode.cs b/Prebuild/src/Core/Nodes/SolutionNode.cs
index 10c0223..e1d5b3b 100644
--- a/Prebuild/src/Core/Nodes/SolutionNode.cs
+++ b/Prebuild/src/Core/Nodes/SolutionNode.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,35 +34,35 @@ using Prebuild.Core.Utilities;
34 34
35namespace Prebuild.Core.Nodes 35namespace Prebuild.Core.Nodes
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// 38 ///
39 /// </summary> 39 /// </summary>
40 [DataNode("Solution")] 40 [DataNode("Solution")]
41 [DataNode("EmbeddedSolution")] 41 [DataNode("EmbeddedSolution")]
42 [DebuggerDisplay("{Name}")] 42 [DebuggerDisplay("{Name}")]
43 public class SolutionNode : DataNode 43 public class SolutionNode : DataNode
44 { 44 {
45 #region Fields 45 #region Fields
46 46
47 private Guid m_Guid = Guid.NewGuid(); 47 private Guid m_Guid = Guid.NewGuid();
48 private string m_Name = "unknown"; 48 private string m_Name = "unknown";
49 private string m_Path = ""; 49 private string m_Path = "";
50 private string m_FullPath = ""; 50 private string m_FullPath = "";
51 private string m_ActiveConfig; 51 private string m_ActiveConfig;
52 private string m_Version = "1.0.0"; 52 private string m_Version = "1.0.0";
53 53
54 private OptionsNode m_Options; 54 private OptionsNode m_Options;
55 private FilesNode m_Files; 55 private FilesNode m_Files;
56 private readonly ConfigurationNodeCollection m_Configurations = new ConfigurationNodeCollection(); 56 private readonly ConfigurationNodeCollection m_Configurations = new ConfigurationNodeCollection();
57 private readonly Dictionary<string, ProjectNode> m_Projects = new Dictionary<string, ProjectNode>(); 57 private readonly Dictionary<string, ProjectNode> m_Projects = new Dictionary<string, ProjectNode>();
58 private readonly Dictionary<string, DatabaseProjectNode> m_DatabaseProjects = new Dictionary<string, DatabaseProjectNode>(); 58 private readonly Dictionary<string, DatabaseProjectNode> m_DatabaseProjects = new Dictionary<string, DatabaseProjectNode>();
59 private readonly List<ProjectNode> m_ProjectsOrder = new List<ProjectNode>(); 59 private readonly List<ProjectNode> m_ProjectsOrder = new List<ProjectNode>();
60 private readonly Dictionary<string, SolutionNode> m_Solutions = new Dictionary<string, SolutionNode>(); 60 private readonly Dictionary<string, SolutionNode> m_Solutions = new Dictionary<string, SolutionNode>();
61 private CleanupNode m_Cleanup; 61 private CleanupNode m_Cleanup;
62 62
63 #endregion 63 #endregion
64 64
65 #region Properties 65 #region Properties
66 public override IDataNode Parent 66 public override IDataNode Parent
67 { 67 {
68 get 68 get
@@ -84,142 +84,142 @@ namespace Prebuild.Core.Nodes
84 } 84 }
85 } 85 }
86 86
87 public CleanupNode Cleanup 87 public CleanupNode Cleanup
88 { 88 {
89 get 89 get
90 { 90 {
91 return m_Cleanup; 91 return m_Cleanup;
92 } 92 }
93 set 93 set
94 { 94 {
95 m_Cleanup = value; 95 m_Cleanup = value;
96 } 96 }
97 } 97 }
98 98
99 public Guid Guid 99 public Guid Guid
100 { 100 {
101 get 101 get
102 { 102 {
103 return m_Guid; 103 return m_Guid;
104 } 104 }
105 set 105 set
106 { 106 {
107 m_Guid = value; 107 m_Guid = value;
108 }
109 }
110 /// <summary>
111 /// Gets or sets the active config.
112 /// </summary>
113 /// <value>The active config.</value>
114 public string ActiveConfig
115 {
116 get
117 {
118 return m_ActiveConfig;
119 }
120 set
121 {
122 m_ActiveConfig = value;
123 }
124 }
125
126 /// <summary>
127 /// Gets the name.
128 /// </summary>
129 /// <value>The name.</value>
130 public string Name
131 {
132 get
133 {
134 return m_Name;
135 }
136 }
137
138 /// <summary>
139 /// Gets the path.
140 /// </summary>
141 /// <value>The path.</value>
142 public string Path
143 {
144 get
145 {
146 return m_Path;
147 }
148 }
149
150 /// <summary>
151 /// Gets the full path.
152 /// </summary>
153 /// <value>The full path.</value>
154 public string FullPath
155 {
156 get
157 {
158 return m_FullPath;
159 }
160 }
161
162 /// <summary>
163 /// Gets the version.
164 /// </summary>
165 /// <value>The version.</value>
166 public string Version
167 {
168 get
169 {
170 return m_Version;
171 }
172 }
173
174 /// <summary>
175 /// Gets the options.
176 /// </summary>
177 /// <value>The options.</value>
178 public OptionsNode Options
179 {
180 get
181 {
182 return m_Options;
183 }
184 }
185
186 /// <summary>
187 /// Gets the files.
188 /// </summary>
189 /// <value>The files.</value>
190 public FilesNode Files
191 {
192 get
193 {
194 return m_Files;
195 }
196 }
197
198 /// <summary>
199 /// Gets the configurations.
200 /// </summary>
201 /// <value>The configurations.</value>
202 public ConfigurationNodeCollection Configurations
203 {
204 get
205 {
206 ConfigurationNodeCollection tmp = new ConfigurationNodeCollection();
207 tmp.AddRange(ConfigurationsTable);
208 return tmp;
209 }
210 }
211
212 /// <summary>
213 /// Gets the configurations table.
214 /// </summary>
215 /// <value>The configurations table.</value>
216 public ConfigurationNodeCollection ConfigurationsTable
217 {
218 get
219 {
220 return m_Configurations;
108 } 221 }
109 } 222 }
110 /// <summary>
111 /// Gets or sets the active config.
112 /// </summary>
113 /// <value>The active config.</value>
114 public string ActiveConfig
115 {
116 get
117 {
118 return m_ActiveConfig;
119 }
120 set
121 {
122 m_ActiveConfig = value;
123 }
124 }
125
126 /// <summary>
127 /// Gets the name.
128 /// </summary>
129 /// <value>The name.</value>
130 public string Name
131 {
132 get
133 {
134 return m_Name;
135 }
136 }
137
138 /// <summary>
139 /// Gets the path.
140 /// </summary>
141 /// <value>The path.</value>
142 public string Path
143 {
144 get
145 {
146 return m_Path;
147 }
148 }
149
150 /// <summary>
151 /// Gets the full path.
152 /// </summary>
153 /// <value>The full path.</value>
154 public string FullPath
155 {
156 get
157 {
158 return m_FullPath;
159 }
160 }
161
162 /// <summary>
163 /// Gets the version.
164 /// </summary>
165 /// <value>The version.</value>
166 public string Version
167 {
168 get
169 {
170 return m_Version;
171 }
172 }
173
174 /// <summary>
175 /// Gets the options.
176 /// </summary>
177 /// <value>The options.</value>
178 public OptionsNode Options
179 {
180 get
181 {
182 return m_Options;
183 }
184 }
185
186 /// <summary>
187 /// Gets the files.
188 /// </summary>
189 /// <value>The files.</value>
190 public FilesNode Files
191 {
192 get
193 {
194 return m_Files;
195 }
196 }
197
198 /// <summary>
199 /// Gets the configurations.
200 /// </summary>
201 /// <value>The configurations.</value>
202 public ConfigurationNodeCollection Configurations
203 {
204 get
205 {
206 ConfigurationNodeCollection tmp = new ConfigurationNodeCollection();
207 tmp.AddRange(ConfigurationsTable);
208 return tmp;
209 }
210 }
211
212 /// <summary>
213 /// Gets the configurations table.
214 /// </summary>
215 /// <value>The configurations table.</value>
216 public ConfigurationNodeCollection ConfigurationsTable
217 {
218 get
219 {
220 return m_Configurations;
221 }
222 }
223 /// <summary> 223 /// <summary>
224 /// Gets the database projects. 224 /// Gets the database projects.
225 /// </summary> 225 /// </summary>
@@ -250,106 +250,106 @@ namespace Prebuild.Core.Nodes
250 return m_Solutions; 250 return m_Solutions;
251 } 251 }
252 } 252 }
253 /// <summary> 253 /// <summary>
254 /// Gets the projects. 254 /// Gets the projects.
255 /// </summary> 255 /// </summary>
256 /// <value>The projects.</value> 256 /// <value>The projects.</value>
257 public ICollection<ProjectNode> Projects 257 public ICollection<ProjectNode> Projects
258 { 258 {
259 get 259 get
260 { 260 {
261 List<ProjectNode> tmp = new List<ProjectNode>(m_Projects.Values); 261 List<ProjectNode> tmp = new List<ProjectNode>(m_Projects.Values);
262 tmp.Sort(); 262 tmp.Sort();
263 return tmp; 263 return tmp;
264 } 264 }
265 } 265 }
266 266
267 /// <summary> 267 /// <summary>
268 /// Gets the projects table. 268 /// Gets the projects table.
269 /// </summary> 269 /// </summary>
270 /// <value>The projects table.</value> 270 /// <value>The projects table.</value>
271 public Dictionary<string, ProjectNode> ProjectsTable 271 public Dictionary<string, ProjectNode> ProjectsTable
272 { 272 {
273 get 273 get
274 { 274 {
275 return m_Projects; 275 return m_Projects;
276 } 276 }
277 } 277 }
278 278
279 /// <summary> 279 /// <summary>
280 /// Gets the projects table. 280 /// Gets the projects table.
281 /// </summary> 281 /// </summary>
282 /// <value>The projects table.</value> 282 /// <value>The projects table.</value>
283 public List<ProjectNode> ProjectsTableOrder 283 public List<ProjectNode> ProjectsTableOrder
284 { 284 {
285 get 285 get
286 { 286 {
287 return m_ProjectsOrder; 287 return m_ProjectsOrder;
288 } 288 }
289 } 289 }
290 290
291 #endregion 291 #endregion
292 292
293 #region Public Methods 293 #region Public Methods
294 294
295 /// <summary> 295 /// <summary>
296 /// Parses the specified node. 296 /// Parses the specified node.
297 /// </summary> 297 /// </summary>
298 /// <param name="node">The node.</param> 298 /// <param name="node">The node.</param>
299 public override void Parse(XmlNode node) 299 public override void Parse(XmlNode node)
300 { 300 {
301 m_Name = Helper.AttributeValue(node, "name", m_Name); 301 m_Name = Helper.AttributeValue(node, "name", m_Name);
302 m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig); 302 m_ActiveConfig = Helper.AttributeValue(node, "activeConfig", m_ActiveConfig);
303 m_Path = Helper.AttributeValue(node, "path", m_Path); 303 m_Path = Helper.AttributeValue(node, "path", m_Path);
304 m_Version = Helper.AttributeValue(node, "version", m_Version); 304 m_Version = Helper.AttributeValue(node, "version", m_Version);
305 305
306 m_FullPath = m_Path; 306 m_FullPath = m_Path;
307 try 307 try
308 { 308 {
309 m_FullPath = Helper.ResolvePath(m_FullPath); 309 m_FullPath = Helper.ResolvePath(m_FullPath);
310 } 310 }
311 catch 311 catch
312 { 312 {
313 throw new WarningException("Could not resolve solution path: {0}", m_Path); 313 throw new WarningException("Could not resolve solution path: {0}", m_Path);
314 } 314 }
315 315
316 Kernel.Instance.CurrentWorkingDirectory.Push(); 316 Kernel.Instance.CurrentWorkingDirectory.Push();
317 try 317 try
318 { 318 {
319 Helper.SetCurrentDir(m_FullPath); 319 Helper.SetCurrentDir(m_FullPath);
320 320
321 if( node == null ) 321 if( node == null )
322 { 322 {
323 throw new ArgumentNullException("node"); 323 throw new ArgumentNullException("node");
324 } 324 }
325 325
326 foreach(XmlNode child in node.ChildNodes) 326 foreach(XmlNode child in node.ChildNodes)
327 { 327 {
328 IDataNode dataNode = Kernel.Instance.ParseNode(child, this); 328 IDataNode dataNode = Kernel.Instance.ParseNode(child, this);
329 if(dataNode is OptionsNode) 329 if(dataNode is OptionsNode)
330 { 330 {
331 m_Options = (OptionsNode)dataNode; 331 m_Options = (OptionsNode)dataNode;
332 } 332 }
333 else if(dataNode is FilesNode) 333 else if(dataNode is FilesNode)
334 { 334 {
335 m_Files = (FilesNode)dataNode; 335 m_Files = (FilesNode)dataNode;
336 } 336 }
337 else if(dataNode is ConfigurationNode) 337 else if(dataNode is ConfigurationNode)
338 { 338 {
339 ConfigurationNode configurationNode = (ConfigurationNode) dataNode; 339 ConfigurationNode configurationNode = (ConfigurationNode) dataNode;
340 m_Configurations[configurationNode.NameAndPlatform] = configurationNode; 340 m_Configurations[configurationNode.NameAndPlatform] = configurationNode;
341 341
342 // If the active configuration is null, then we populate it. 342 // If the active configuration is null, then we populate it.
343 if (ActiveConfig == null) 343 if (ActiveConfig == null)
344 { 344 {
345 ActiveConfig = configurationNode.Name; 345 ActiveConfig = configurationNode.Name;
346 } 346 }
347 } 347 }
348 else if(dataNode is ProjectNode) 348 else if(dataNode is ProjectNode)
349 { 349 {
350 m_Projects[((ProjectNode)dataNode).Name] = (ProjectNode) dataNode; 350 m_Projects[((ProjectNode)dataNode).Name] = (ProjectNode) dataNode;
351 m_ProjectsOrder.Add((ProjectNode)dataNode); 351 m_ProjectsOrder.Add((ProjectNode)dataNode);
352 } 352 }
353 else if(dataNode is SolutionNode) 353 else if(dataNode is SolutionNode)
354 { 354 {
355 m_Solutions[((SolutionNode)dataNode).Name] = (SolutionNode) dataNode; 355 m_Solutions[((SolutionNode)dataNode).Name] = (SolutionNode) dataNode;
@@ -369,14 +369,14 @@ namespace Prebuild.Core.Nodes
369 throw new WarningException("There can only be one Cleanup node."); 369 throw new WarningException("There can only be one Cleanup node.");
370 m_Cleanup = (CleanupNode)dataNode; 370 m_Cleanup = (CleanupNode)dataNode;
371 } 371 }
372 } 372 }
373 } 373 }
374 finally 374 finally
375 { 375 {
376 Kernel.Instance.CurrentWorkingDirectory.Pop(); 376 Kernel.Instance.CurrentWorkingDirectory.Pop();
377 } 377 }
378 } 378 }
379 379
380 #endregion 380 #endregion
381 } 381 }
382} 382}
diff --git a/Prebuild/src/Core/Parse/IfContext.cs b/Prebuild/src/Core/Parse/IfContext.cs
index 3c79d38..7729d3b 100644
--- a/Prebuild/src/Core/Parse/IfContext.cs
+++ b/Prebuild/src/Core/Parse/IfContext.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -27,128 +27,128 @@ using System;
27 27
28namespace Prebuild.Core.Parse 28namespace Prebuild.Core.Parse
29{ 29{
30 /// <summary> 30 /// <summary>
31 /// 31 ///
32 /// </summary> 32 /// </summary>
33 public enum IfState 33 public enum IfState
34 { 34 {
35 /// <summary> 35 /// <summary>
36 /// 36 ///
37 /// </summary> 37 /// </summary>
38 None, 38 None,
39 /// <summary> 39 /// <summary>
40 /// 40 ///
41 /// </summary> 41 /// </summary>
42 If, 42 If,
43 /// <summary> 43 /// <summary>
44 /// 44 ///
45 /// </summary> 45 /// </summary>
46 ElseIf, 46 ElseIf,
47 /// <summary> 47 /// <summary>
48 /// 48 ///
49 /// </summary> 49 /// </summary>
50 Else 50 Else
51 } 51 }
52 52
53 /// <summary> 53 /// <summary>
54 /// Summary description for IfContext. 54 /// Summary description for IfContext.
55 /// </summary> 55 /// </summary>
56 // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/) 56 // Inspired by the equivalent WiX class (see www.sourceforge.net/projects/wix/)
57 public class IfContext 57 public class IfContext
58 { 58 {
59 #region Properties 59 #region Properties
60 60
61 bool m_Active; 61 bool m_Active;
62 bool m_Keep; 62 bool m_Keep;
63 bool m_EverKept; 63 bool m_EverKept;
64 IfState m_State = IfState.None; 64 IfState m_State = IfState.None;
65 65
66 #endregion 66 #endregion
67 67
68 #region Constructors 68 #region Constructors
69 69
70 /// <summary> 70 /// <summary>
71 /// Initializes a new instance of the <see cref="IfContext"/> class. 71 /// Initializes a new instance of the <see cref="IfContext"/> class.
72 /// </summary> 72 /// </summary>
73 /// <param name="active">if set to <c>true</c> [active].</param> 73 /// <param name="active">if set to <c>true</c> [active].</param>
74 /// <param name="keep">if set to <c>true</c> [keep].</param> 74 /// <param name="keep">if set to <c>true</c> [keep].</param>
75 /// <param name="state">The state.</param> 75 /// <param name="state">The state.</param>
76 public IfContext(bool active, bool keep, IfState state) 76 public IfContext(bool active, bool keep, IfState state)
77 { 77 {
78 m_Active = active; 78 m_Active = active;
79 m_Keep = keep; 79 m_Keep = keep;
80 m_EverKept = keep; 80 m_EverKept = keep;
81 m_State = state; 81 m_State = state;
82 } 82 }
83 83
84 #endregion 84 #endregion
85 85
86 #region Properties 86 #region Properties
87 87
88 /// <summary> 88 /// <summary>
89 /// Gets or sets a value indicating whether this <see cref="IfContext"/> is active. 89 /// Gets or sets a value indicating whether this <see cref="IfContext"/> is active.
90 /// </summary> 90 /// </summary>
91 /// <value><c>true</c> if active; otherwise, <c>false</c>.</value> 91 /// <value><c>true</c> if active; otherwise, <c>false</c>.</value>
92 public bool Active 92 public bool Active
93 { 93 {
94 get 94 get
95 { 95 {
96 return m_Active; 96 return m_Active;
97 } 97 }
98 set 98 set
99 { 99 {
100 m_Active = value; 100 m_Active = value;
101 } 101 }
102 } 102 }
103 103
104 /// <summary> 104 /// <summary>
105 /// Gets or sets a value indicating whether this <see cref="IfContext"/> is keep. 105 /// Gets or sets a value indicating whether this <see cref="IfContext"/> is keep.
106 /// </summary> 106 /// </summary>
107 /// <value><c>true</c> if keep; otherwise, <c>false</c>.</value> 107 /// <value><c>true</c> if keep; otherwise, <c>false</c>.</value>
108 public bool Keep 108 public bool Keep
109 { 109 {
110 get 110 get
111 { 111 {
112 return m_Keep; 112 return m_Keep;
113 } 113 }
114 set 114 set
115 { 115 {
116 m_Keep = value; 116 m_Keep = value;
117 if(m_Keep) 117 if(m_Keep)
118 { 118 {
119 m_EverKept = true; 119 m_EverKept = true;
120 } 120 }
121 } 121 }
122 } 122 }
123 123
124 /// <summary> 124 /// <summary>
125 /// Gets a value indicating whether [ever kept]. 125 /// Gets a value indicating whether [ever kept].
126 /// </summary> 126 /// </summary>
127 /// <value><c>true</c> if [ever kept]; otherwise, <c>false</c>.</value> 127 /// <value><c>true</c> if [ever kept]; otherwise, <c>false</c>.</value>
128 public bool EverKept 128 public bool EverKept
129 { 129 {
130 get 130 get
131 { 131 {
132 return m_EverKept; 132 return m_EverKept;
133 } 133 }
134 } 134 }
135 135
136 /// <summary> 136 /// <summary>
137 /// Gets or sets the state. 137 /// Gets or sets the state.
138 /// </summary> 138 /// </summary>
139 /// <value>The state.</value> 139 /// <value>The state.</value>
140 public IfState State 140 public IfState State
141 { 141 {
142 get 142 get
143 { 143 {
144 return m_State; 144 return m_State;
145 } 145 }
146 set 146 set
147 { 147 {
148 m_State = value; 148 m_State = value;
149 } 149 }
150 } 150 }
151 151
152 #endregion 152 #endregion
153 } 153 }
154} 154}
diff --git a/Prebuild/src/Core/Parse/Preprocessor.cs b/Prebuild/src/Core/Parse/Preprocessor.cs
index 0648fad..0cd6e82 100644
--- a/Prebuild/src/Core/Parse/Preprocessor.cs
+++ b/Prebuild/src/Core/Parse/Preprocessor.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -31,336 +31,336 @@ using System.Xml;
31 31
32namespace Prebuild.Core.Parse 32namespace Prebuild.Core.Parse
33{ 33{
34 /// <summary> 34 /// <summary>
35 /// 35 ///
36 /// </summary> 36 /// </summary>
37 public enum OperatorSymbol 37 public enum OperatorSymbol
38 { 38 {
39 /// <summary> 39 /// <summary>
40 /// 40 ///
41 /// </summary> 41 /// </summary>
42 None, 42 None,
43 /// <summary> 43 /// <summary>
44 /// 44 ///
45 /// </summary> 45 /// </summary>
46 Equal, 46 Equal,
47 /// <summary> 47 /// <summary>
48 /// 48 ///
49 /// </summary> 49 /// </summary>
50 NotEqual, 50 NotEqual,
51 /// <summary> 51 /// <summary>
52 /// 52 ///
53 /// </summary> 53 /// </summary>
54 LessThan, 54 LessThan,
55 /// <summary> 55 /// <summary>
56 /// 56 ///
57 /// </summary> 57 /// </summary>
58 GreaterThan, 58 GreaterThan,
59 /// <summary> 59 /// <summary>
60 /// 60 ///
61 /// </summary> 61 /// </summary>
62 LessThanEqual, 62 LessThanEqual,
63 /// <summary> 63 /// <summary>
64 /// 64 ///
65 /// </summary> 65 /// </summary>
66 GreaterThanEqual 66 GreaterThanEqual
67 } 67 }
68 68
69 /// <summary> 69 /// <summary>
70 /// 70 ///
71 /// </summary> 71 /// </summary>
72 public class Preprocessor 72 public class Preprocessor
73 { 73 {
74 #region Constants 74 #region Constants
75 75
76 /// <summary> 76 /// <summary>
77 /// Includes the regex to look for file tags in the <?include 77 /// Includes the regex to look for file tags in the <?include
78 /// ?> processing instruction. 78 /// ?> processing instruction.
79 /// </summary> 79 /// </summary>
80 private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\""); 80 private static readonly Regex includeFileRegex = new Regex("file=\"(.+?)\"");
81 81
82 #endregion 82 #endregion
83 83
84 #region Fields 84 #region Fields
85 85
86 readonly XmlDocument m_OutDoc = new XmlDocument(); 86 readonly XmlDocument m_OutDoc = new XmlDocument();
87 readonly Stack<IfContext> m_IfStack = new Stack<IfContext>(); 87 readonly Stack<IfContext> m_IfStack = new Stack<IfContext>();
88 readonly Dictionary<string, object> m_Variables = new Dictionary<string, object>(); 88 readonly Dictionary<string, object> m_Variables = new Dictionary<string, object>();
89 89
90 #endregion 90 #endregion
91 91
92 #region Constructors 92 #region Constructors
93 93
94 /// <summary> 94 /// <summary>
95 /// Initializes a new instance of the <see cref="Preprocessor"/> class. 95 /// Initializes a new instance of the <see cref="Preprocessor"/> class.
96 /// </summary> 96 /// </summary>
97 public Preprocessor() 97 public Preprocessor()
98 { 98 {
99 RegisterVariable("OS", GetOS()); 99 RegisterVariable("OS", GetOS());
100 RegisterVariable("RuntimeVersion", Environment.Version.Major); 100 RegisterVariable("RuntimeVersion", Environment.Version.Major);
101 RegisterVariable("RuntimeMajor", Environment.Version.Major); 101 RegisterVariable("RuntimeMajor", Environment.Version.Major);
102 RegisterVariable("RuntimeMinor", Environment.Version.Minor); 102 RegisterVariable("RuntimeMinor", Environment.Version.Minor);
103 RegisterVariable("RuntimeRevision", Environment.Version.Revision); 103 RegisterVariable("RuntimeRevision", Environment.Version.Revision);
104 } 104 }
105 105
106 #endregion 106 #endregion
107 107
108 #region Properties 108 #region Properties
109 109
110 /// <summary> 110 /// <summary>
111 /// Gets the processed doc. 111 /// Gets the processed doc.
112 /// </summary> 112 /// </summary>
113 /// <value>The processed doc.</value> 113 /// <value>The processed doc.</value>
114 public XmlDocument ProcessedDoc 114 public XmlDocument ProcessedDoc
115 { 115 {
116 get 116 get
117 { 117 {
118 return m_OutDoc; 118 return m_OutDoc;
119 } 119 }
120 } 120 }
121 121
122 #endregion 122 #endregion
123 123
124 #region Private Methods 124 #region Private Methods
125 125
126 /// <summary> 126 /// <summary>
127 /// Parts of this code were taken from NAnt and is subject to the GPL 127 /// Parts of this code were taken from NAnt and is subject to the GPL
128 /// as per NAnt's license. Thanks to the NAnt guys for this little gem. 128 /// as per NAnt's license. Thanks to the NAnt guys for this little gem.
129 /// </summary> 129 /// </summary>
130 /// <returns></returns> 130 /// <returns></returns>
131 public static string GetOS() 131 public static string GetOS()
132 { 132 {
133 PlatformID platId = Environment.OSVersion.Platform; 133 PlatformID platId = Environment.OSVersion.Platform;
134 if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows) 134 if(platId == PlatformID.Win32NT || platId == PlatformID.Win32Windows)
135 { 135 {
136 return "Win32"; 136 return "Win32";
137 } 137 }
138 138
139 if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa")) 139 if (File.Exists("/System/Library/Frameworks/Cocoa.framework/Cocoa"))
140 { 140 {
141 return "MACOSX"; 141 return "MACOSX";
142 } 142 }
143 143
144 /* 144 /*
145 * .NET 1.x, under Mono, the UNIX code is 128. Under 145 * .NET 1.x, under Mono, the UNIX code is 128. Under
146 * .NET 2.x, Mono or MS, the UNIX code is 4 146 * .NET 2.x, Mono or MS, the UNIX code is 4
147 */ 147 */
148 if(Environment.Version.Major == 1) 148 if(Environment.Version.Major == 1)
149 { 149 {
150 if((int)platId == 128) 150 if((int)platId == 128)
151 { 151 {
152 return "UNIX"; 152 return "UNIX";
153 } 153 }
154 } 154 }
155 else if((int)platId == 4) 155 else if((int)platId == 4)
156 { 156 {
157 return "UNIX"; 157 return "UNIX";
158 } 158 }
159 159
160 return "Unknown"; 160 return "Unknown";
161 } 161 }
162 162
163 private static bool CompareNum(OperatorSymbol oper, int val1, int val2) 163 private static bool CompareNum(OperatorSymbol oper, int val1, int val2)
164 { 164 {
165 switch(oper) 165 switch(oper)
166 { 166 {
167 case OperatorSymbol.Equal: 167 case OperatorSymbol.Equal:
168 return (val1 == val2); 168 return (val1 == val2);
169 case OperatorSymbol.NotEqual: 169 case OperatorSymbol.NotEqual:
170 return (val1 != val2); 170 return (val1 != val2);
171 case OperatorSymbol.LessThan: 171 case OperatorSymbol.LessThan:
172 return (val1 < val2); 172 return (val1 < val2);
173 case OperatorSymbol.LessThanEqual: 173 case OperatorSymbol.LessThanEqual:
174 return (val1 <= val2); 174 return (val1 <= val2);
175 case OperatorSymbol.GreaterThan: 175 case OperatorSymbol.GreaterThan:
176 return (val1 > val2); 176 return (val1 > val2);
177 case OperatorSymbol.GreaterThanEqual: 177 case OperatorSymbol.GreaterThanEqual:
178 return (val1 >= val2); 178 return (val1 >= val2);
179 } 179 }
180 180
181 throw new WarningException("Unknown operator type"); 181 throw new WarningException("Unknown operator type");
182 } 182 }
183 183
184 private static bool CompareStr(OperatorSymbol oper, string val1, string val2) 184 private static bool CompareStr(OperatorSymbol oper, string val1, string val2)
185 { 185 {
186 switch(oper) 186 switch(oper)
187 { 187 {
188 case OperatorSymbol.Equal: 188 case OperatorSymbol.Equal:
189 return (val1 == val2); 189 return (val1 == val2);
190 case OperatorSymbol.NotEqual: 190 case OperatorSymbol.NotEqual:
191 return (val1 != val2); 191 return (val1 != val2);
192 case OperatorSymbol.LessThan: 192 case OperatorSymbol.LessThan:
193 return (val1.CompareTo(val2) < 0); 193 return (val1.CompareTo(val2) < 0);
194 case OperatorSymbol.LessThanEqual: 194 case OperatorSymbol.LessThanEqual:
195 return (val1.CompareTo(val2) <= 0); 195 return (val1.CompareTo(val2) <= 0);
196 case OperatorSymbol.GreaterThan: 196 case OperatorSymbol.GreaterThan:
197 return (val1.CompareTo(val2) > 0); 197 return (val1.CompareTo(val2) > 0);
198 case OperatorSymbol.GreaterThanEqual: 198 case OperatorSymbol.GreaterThanEqual:
199 return (val1.CompareTo(val2) >= 0); 199 return (val1.CompareTo(val2) >= 0);
200 } 200 }
201 201
202 throw new WarningException("Unknown operator type"); 202 throw new WarningException("Unknown operator type");
203 } 203 }
204 204
205 private static char NextChar(int idx, string str) 205 private static char NextChar(int idx, string str)
206 { 206 {
207 if((idx + 1) >= str.Length) 207 if((idx + 1) >= str.Length)
208 { 208 {
209 return Char.MaxValue; 209 return Char.MaxValue;
210 } 210 }
211 211
212 return str[idx + 1]; 212 return str[idx + 1];
213 } 213 }
214 // Very very simple expression parser. Can only match expressions of the form 214 // Very very simple expression parser. Can only match expressions of the form
215 // <var> <op> <value>: 215 // <var> <op> <value>:
216 // OS = Windows 216 // OS = Windows
217 // OS != Linux 217 // OS != Linux
218 // RuntimeMinor > 0 218 // RuntimeMinor > 0
219 private bool ParseExpression(string exp) 219 private bool ParseExpression(string exp)
220 { 220 {
221 if(exp == null) 221 if(exp == null)
222 { 222 {
223 throw new ArgumentException("Invalid expression, cannot be null"); 223 throw new ArgumentException("Invalid expression, cannot be null");
224 } 224 }
225 225
226 exp = exp.Trim(); 226 exp = exp.Trim();
227 if(exp.Length < 1) 227 if(exp.Length < 1)
228 { 228 {
229 throw new ArgumentException("Invalid expression, cannot be 0 length"); 229 throw new ArgumentException("Invalid expression, cannot be 0 length");
230 } 230 }
231 231
232 string id = ""; 232 string id = "";
233 string str = ""; 233 string str = "";
234 OperatorSymbol oper = OperatorSymbol.None; 234 OperatorSymbol oper = OperatorSymbol.None;
235 bool inStr = false; 235 bool inStr = false;
236 236
237 for(int i = 0; i < exp.Length; i++) 237 for(int i = 0; i < exp.Length; i++)
238 { 238 {
239 char c = exp[i]; 239 char c = exp[i];
240 if(Char.IsWhiteSpace(c)) 240 if(Char.IsWhiteSpace(c))
241 { 241 {
242 continue; 242 continue;
243 } 243 }
244 244
245 if(Char.IsLetterOrDigit(c) || c == '_') 245 if(Char.IsLetterOrDigit(c) || c == '_')
246 { 246 {
247 if(inStr) 247 if(inStr)
248 { 248 {
249 str += c; 249 str += c;
250 } 250 }
251 else 251 else
252 { 252 {
253 id += c; 253 id += c;
254 } 254 }
255 } 255 }
256 else if(c == '\"') 256 else if(c == '\"')
257 { 257 {
258 inStr = !inStr; 258 inStr = !inStr;
259 if(inStr) 259 if(inStr)
260 { 260 {
261 str = ""; 261 str = "";
262 } 262 }
263 } 263 }
264 else 264 else
265 { 265 {
266 if(inStr) 266 if(inStr)
267 { 267 {
268 str += c; 268 str += c;
269 } 269 }
270 else 270 else
271 { 271 {
272 switch(c) 272 switch(c)
273 { 273 {
274 case '=': 274 case '=':
275 oper = OperatorSymbol.Equal; 275 oper = OperatorSymbol.Equal;
276 break; 276 break;
277 277
278 case '!': 278 case '!':
279 if(NextChar(i, exp) == '=') 279 if(NextChar(i, exp) == '=')
280 { 280 {
281 oper = OperatorSymbol.NotEqual; 281 oper = OperatorSymbol.NotEqual;
282 } 282 }
283 283
284 break; 284 break;
285 285
286 case '<': 286 case '<':
287 if(NextChar(i, exp) == '=') 287 if(NextChar(i, exp) == '=')
288 { 288 {
289 oper = OperatorSymbol.LessThanEqual; 289 oper = OperatorSymbol.LessThanEqual;
290 } 290 }
291 else 291 else
292 { 292 {
293 oper = OperatorSymbol.LessThan; 293 oper = OperatorSymbol.LessThan;
294 } 294 }
295 295
296 break; 296 break;
297 297
298 case '>': 298 case '>':
299 if(NextChar(i, exp) == '=') 299 if(NextChar(i, exp) == '=')
300 { 300 {
301 oper = OperatorSymbol.GreaterThanEqual; 301 oper = OperatorSymbol.GreaterThanEqual;
302 } 302 }
303 else 303 else
304 { 304 {
305 oper = OperatorSymbol.GreaterThan; 305 oper = OperatorSymbol.GreaterThan;
306 } 306 }
307 307
308 break; 308 break;
309 } 309 }
310 } 310 }
311 } 311 }
312 } 312 }
313 313
314 314
315 if(inStr) 315 if(inStr)
316 { 316 {
317 throw new WarningException("Expected end of string in expression"); 317 throw new WarningException("Expected end of string in expression");
318 } 318 }
319 319
320 if(oper == OperatorSymbol.None) 320 if(oper == OperatorSymbol.None)
321 { 321 {
322 throw new WarningException("Expected operator in expression"); 322 throw new WarningException("Expected operator in expression");
323 } 323 }
324 if(id.Length < 1) 324 if(id.Length < 1)
325 { 325 {
326 throw new WarningException("Expected identifier in expression"); 326 throw new WarningException("Expected identifier in expression");
327 } 327 }
328 if(str.Length < 1) 328 if(str.Length < 1)
329 { 329 {
330 throw new WarningException("Expected value in expression"); 330 throw new WarningException("Expected value in expression");
331 } 331 }
332 332
333 bool ret; 333 bool ret;
334 try 334 try
335 { 335 {
336 object val = m_Variables[id.ToLower()]; 336 object val = m_Variables[id.ToLower()];
337 if(val == null) 337 if(val == null)
338 { 338 {
339 throw new WarningException("Unknown identifier '{0}'", id); 339 throw new WarningException("Unknown identifier '{0}'", id);
340 } 340 }
341 341
342 Type t = val.GetType(); 342 Type t = val.GetType();
343 if(t.IsAssignableFrom(typeof(int))) 343 if(t.IsAssignableFrom(typeof(int)))
344 { 344 {
345 int numVal = (int)val; 345 int numVal = (int)val;
346 int numVal2 = Int32.Parse(str); 346 int numVal2 = Int32.Parse(str);
347 ret = CompareNum(oper, numVal, numVal2); 347 ret = CompareNum(oper, numVal, numVal2);
348 } 348 }
349 else 349 else
350 { 350 {
351 string strVal = val.ToString(); 351 string strVal = val.ToString();
352 string strVal2 = str; 352 string strVal2 = str;
353 ret = CompareStr(oper, strVal, strVal2); 353 ret = CompareStr(oper, strVal, strVal2);
354 } 354 }
355 } 355 }
356 catch(ArgumentException ex) 356 catch(ArgumentException ex)
357 { 357 {
358 ex.ToString(); 358 ex.ToString();
359 throw new WarningException("Invalid value type for system variable '{0}', expected int", id); 359 throw new WarningException("Invalid value type for system variable '{0}', expected int", id);
360 } 360 }
361 361
362 return ret; 362 return ret;
363 } 363 }
364 364
365 /// <summary> 365 /// <summary>
366 /// Taken from current Prebuild included in OpenSim 0.7.x 366 /// Taken from current Prebuild included in OpenSim 0.7.x
@@ -376,13 +376,13 @@ namespace Prebuild.Core.Parse
376 if (!include.Contains ("*")) { 376 if (!include.Contains ("*")) {
377 return; 377 return;
378 } 378 }
379 379
380 // Console.WriteLine("Processing {0}", include); 380 // Console.WriteLine("Processing {0}", include);
381 381
382 // Break up the include into pre and post wildcard sections 382 // Break up the include into pre and post wildcard sections
383 string preWildcard = include.Substring (0, include.IndexOf ("*")); 383 string preWildcard = include.Substring (0, include.IndexOf ("*"));
384 string postWildcard = include.Substring (include.IndexOf ("*") + 2); 384 string postWildcard = include.Substring (include.IndexOf ("*") + 2);
385 385
386 // If preWildcard is a directory, recurse 386 // If preWildcard is a directory, recurse
387 if (Directory.Exists (preWildcard)) { 387 if (Directory.Exists (preWildcard)) {
388 string[] directories = Directory.GetDirectories (preWildcard); 388 string[] directories = Directory.GetDirectories (preWildcard);
@@ -390,7 +390,7 @@ namespace Prebuild.Core.Parse
390 Array.Reverse (directories); 390 Array.Reverse (directories);
391 foreach (string dirPath in directories) { 391 foreach (string dirPath in directories) {
392 //Console.WriteLine ("Scanning : {0}", dirPath); 392 //Console.WriteLine ("Scanning : {0}", dirPath);
393 393
394 string includeFile = Path.Combine (dirPath, postWildcard); 394 string includeFile = Path.Combine (dirPath, postWildcard);
395 if (includeFile.Contains ("*")) { 395 if (includeFile.Contains ("*")) {
396 // postWildcard included another wildcard, recurse. 396 // postWildcard included another wildcard, recurse.
@@ -408,10 +408,10 @@ namespace Prebuild.Core.Parse
408 // preWildcard is not a path to a directory, so the wildcard is in the filename 408 // preWildcard is not a path to a directory, so the wildcard is in the filename
409 string searchFilename = Path.GetFileName (preWildcard.Substring (preWildcard.IndexOf ("/") + 1) + "*" + postWildcard); 409 string searchFilename = Path.GetFileName (preWildcard.Substring (preWildcard.IndexOf ("/") + 1) + "*" + postWildcard);
410 Console.WriteLine ("searchFilename: {0}", searchFilename); 410 Console.WriteLine ("searchFilename: {0}", searchFilename);
411 411
412 string searchDirectory = Path.GetDirectoryName (preWildcard); 412 string searchDirectory = Path.GetDirectoryName (preWildcard);
413 Console.WriteLine ("searchDirectory: {0}", searchDirectory); 413 Console.WriteLine ("searchDirectory: {0}", searchDirectory);
414 414
415 string[] files = Directory.GetFiles (searchDirectory, searchFilename); 415 string[] files = Directory.GetFiles (searchDirectory, searchFilename);
416 Array.Sort (files); 416 Array.Sort (files);
417 Array.Reverse (files); 417 Array.Reverse (files);
@@ -426,227 +426,227 @@ namespace Prebuild.Core.Parse
426 } 426 }
427 } 427 }
428 428
429 #endregion 429 #endregion
430 430
431 #region Public Methods 431 #region Public Methods
432 432
433 /// <summary> 433 /// <summary>
434 /// 434 ///
435 /// </summary> 435 /// </summary>
436 /// <param name="name"></param> 436 /// <param name="name"></param>
437 /// <param name="variableValue"></param> 437 /// <param name="variableValue"></param>
438 public void RegisterVariable(string name, object variableValue) 438 public void RegisterVariable(string name, object variableValue)
439 { 439 {
440 if(name == null || variableValue == null) 440 if(name == null || variableValue == null)
441 { 441 {
442 return; 442 return;
443 } 443 }
444 444
445 m_Variables[name.ToLower()] = variableValue; 445 m_Variables[name.ToLower()] = variableValue;
446 } 446 }
447 447
448 /// <summary> 448 /// <summary>
449 /// Performs validation on the xml source as well as evaluates conditional and flow expresions 449 /// Performs validation on the xml source as well as evaluates conditional and flow expresions
450 /// </summary> 450 /// </summary>
451 /// <exception cref="ArgumentException">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</exception> 451 /// <exception cref="ArgumentException">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</exception>
452 /// <param name="initialReader"></param> 452 /// <param name="initialReader"></param>
453 /// <returns>the output xml </returns> 453 /// <returns>the output xml </returns>
454 public string Process(XmlReader initialReader) 454 public string Process(XmlReader initialReader)
455 { 455 {
456 if(initialReader == null) 456 if(initialReader == null)
457 { 457 {
458 throw new ArgumentException("Invalid XML reader to pre-process"); 458 throw new ArgumentException("Invalid XML reader to pre-process");
459 } 459 }
460 460
461 IfContext context = new IfContext(true, true, IfState.None); 461 IfContext context = new IfContext(true, true, IfState.None);
462 StringWriter xmlText = new StringWriter(); 462 StringWriter xmlText = new StringWriter();
463 XmlTextWriter writer = new XmlTextWriter(xmlText); 463 XmlTextWriter writer = new XmlTextWriter(xmlText);
464 writer.Formatting = Formatting.Indented; 464 writer.Formatting = Formatting.Indented;
465 465
466 // Create a queue of XML readers and add the initial 466 // Create a queue of XML readers and add the initial
467 // reader to it. Then we process until we run out of 467 // reader to it. Then we process until we run out of
468 // readers which lets the <?include?> operation add more 468 // readers which lets the <?include?> operation add more
469 // readers to generate a multi-file parser and not require 469 // readers to generate a multi-file parser and not require
470 // XML fragments that a recursive version would use. 470 // XML fragments that a recursive version would use.
471 Stack<XmlReader> readerStack = new Stack<XmlReader>(); 471 Stack<XmlReader> readerStack = new Stack<XmlReader>();
472 readerStack.Push(initialReader); 472 readerStack.Push(initialReader);
473 473
474 while(readerStack.Count > 0) 474 while(readerStack.Count > 0)
475 { 475 {
476 // Pop off the next reader. 476 // Pop off the next reader.
477 XmlReader reader = readerStack.Pop(); 477 XmlReader reader = readerStack.Pop();
478 478
479 // Process through this XML reader until it is 479 // Process through this XML reader until it is
480 // completed (or it is replaced by the include 480 // completed (or it is replaced by the include
481 // operation). 481 // operation).
482 while(reader.Read()) 482 while(reader.Read())
483 { 483 {
484 // The prebuild file has a series of processing 484 // The prebuild file has a series of processing
485 // instructions which allow for specific 485 // instructions which allow for specific
486 // inclusions based on operating system or to 486 // inclusions based on operating system or to
487 // include additional files. 487 // include additional files.
488 if(reader.NodeType == XmlNodeType.ProcessingInstruction) 488 if(reader.NodeType == XmlNodeType.ProcessingInstruction)
489 { 489 {
490 bool ignore = false; 490 bool ignore = false;
491 491
492 switch(reader.LocalName) 492 switch(reader.LocalName)
493 { 493 {
494 case "include": 494 case "include":
495 // use regular expressions to parse out the attributes. 495 // use regular expressions to parse out the attributes.
496 MatchCollection matches = includeFileRegex.Matches(reader.Value); 496 MatchCollection matches = includeFileRegex.Matches(reader.Value);
497 497
498 // make sure there is only one file attribute. 498 // make sure there is only one file attribute.
499 if(matches.Count > 1) 499 if(matches.Count > 1)
500 { 500 {
501 throw new WarningException("An <?include ?> node was found, but it specified more than one file."); 501 throw new WarningException("An <?include ?> node was found, but it specified more than one file.");
502 } 502 }
503 503
504 if(matches.Count == 0) 504 if(matches.Count == 0)
505 { 505 {
506 throw new WarningException("An <?include ?> node was found, but it did not specify the file attribute."); 506 throw new WarningException("An <?include ?> node was found, but it did not specify the file attribute.");
507 } 507 }
508 508
509 // ***** Adding for wildcard handling 509 // ***** Adding for wildcard handling
510 // Push current reader back onto the stack. 510 // Push current reader back onto the stack.
511 readerStack.Push (reader); 511 readerStack.Push (reader);
512 512
513 // Pull the file out from the regex and make sure it is a valid file before using it. 513 // Pull the file out from the regex and make sure it is a valid file before using it.
514 string filename = matches[0].Groups[1].Value; 514 string filename = matches[0].Groups[1].Value;
515 515
516 filename = String.Join (Path.DirectorySeparatorChar.ToString (), filename.Split (new char[] { '/', '\\' })); 516 filename = String.Join (Path.DirectorySeparatorChar.ToString (), filename.Split (new char[] { '/', '\\' }));
517 517
518 if (!filename.Contains ("*")) { 518 if (!filename.Contains ("*")) {
519 519
520 FileInfo includeFile = new FileInfo (filename); 520 FileInfo includeFile = new FileInfo (filename);
521 if (!includeFile.Exists) { 521 if (!includeFile.Exists) {
522 throw new WarningException ("Cannot include file: " + includeFile.FullName); 522 throw new WarningException ("Cannot include file: " + includeFile.FullName);
523 } 523 }
524 524
525 // Create a new reader object for this file. Then put the old reader back on the stack and start 525 // Create a new reader object for this file. Then put the old reader back on the stack and start
526 // processing using this new XML reader. 526 // processing using this new XML reader.
527 527
528 XmlReader newReader = new XmlTextReader (includeFile.Open (FileMode.Open, FileAccess.Read, FileShare.Read)); 528 XmlReader newReader = new XmlTextReader (includeFile.Open (FileMode.Open, FileAccess.Read, FileShare.Read));
529 reader = newReader; 529 reader = newReader;
530 readerStack.Push (reader); 530 readerStack.Push (reader);
531 531
532 } else { 532 } else {
533 WildCardInclude (readerStack, filename); 533 WildCardInclude (readerStack, filename);
534 } 534 }
535 535
536 reader = (XmlReader)readerStack.Pop (); 536 reader = (XmlReader)readerStack.Pop ();
537 ignore = true; 537 ignore = true;
538 break; 538 break;
539 539
540 case "if": 540 case "if":
541 m_IfStack.Push(context); 541 m_IfStack.Push(context);
542 context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If); 542 context = new IfContext(context.Keep & context.Active, ParseExpression(reader.Value), IfState.If);
543 ignore = true; 543 ignore = true;
544 break; 544 break;
545 545
546 case "elseif": 546 case "elseif":
547 if(m_IfStack.Count == 0) 547 if(m_IfStack.Count == 0)
548 { 548 {
549 throw new WarningException("Unexpected 'elseif' outside of 'if'"); 549 throw new WarningException("Unexpected 'elseif' outside of 'if'");
550 } 550 }
551 if(context.State != IfState.If && context.State != IfState.ElseIf) 551 if(context.State != IfState.If && context.State != IfState.ElseIf)
552 { 552 {
553 throw new WarningException("Unexpected 'elseif' outside of 'if'"); 553 throw new WarningException("Unexpected 'elseif' outside of 'if'");
554 } 554 }
555 555
556 context.State = IfState.ElseIf; 556 context.State = IfState.ElseIf;
557 if(!context.EverKept) 557 if(!context.EverKept)
558 { 558 {
559 context.Keep = ParseExpression(reader.Value); 559 context.Keep = ParseExpression(reader.Value);
560 } 560 }
561 else 561 else
562 { 562 {
563 context.Keep = false; 563 context.Keep = false;
564 } 564 }
565 565
566 ignore = true; 566 ignore = true;
567 break; 567 break;
568 568
569 case "else": 569 case "else":
570 if(m_IfStack.Count == 0) 570 if(m_IfStack.Count == 0)
571 { 571 {
572 throw new WarningException("Unexpected 'else' outside of 'if'"); 572 throw new WarningException("Unexpected 'else' outside of 'if'");
573 } 573 }
574 if(context.State != IfState.If && context.State != IfState.ElseIf) 574 if(context.State != IfState.If && context.State != IfState.ElseIf)
575 { 575 {
576 throw new WarningException("Unexpected 'else' outside of 'if'"); 576 throw new WarningException("Unexpected 'else' outside of 'if'");
577 } 577 }
578 578
579 context.State = IfState.Else; 579 context.State = IfState.Else;
580 context.Keep = !context.EverKept; 580 context.Keep = !context.EverKept;
581 ignore = true; 581 ignore = true;
582 break; 582 break;
583 583
584 case "endif": 584 case "endif":
585 if(m_IfStack.Count == 0) 585 if(m_IfStack.Count == 0)
586 { 586 {
587 throw new WarningException("Unexpected 'endif' outside of 'if'"); 587 throw new WarningException("Unexpected 'endif' outside of 'if'");
588 } 588 }
589 589
590 context = m_IfStack.Pop(); 590 context = m_IfStack.Pop();
591 ignore = true; 591 ignore = true;
592 break; 592 break;
593 } 593 }
594 594
595 if(ignore) 595 if(ignore)
596 { 596 {
597 continue; 597 continue;
598 } 598 }
599 }//end pre-proc instruction 599 }//end pre-proc instruction
600 600
601 if(!context.Active || !context.Keep) 601 if(!context.Active || !context.Keep)
602 { 602 {
603 continue; 603 continue;
604 } 604 }
605 605
606 switch(reader.NodeType) 606 switch(reader.NodeType)
607 { 607 {
608 case XmlNodeType.Element: 608 case XmlNodeType.Element:
609 bool empty = reader.IsEmptyElement; 609 bool empty = reader.IsEmptyElement;
610 writer.WriteStartElement(reader.Name); 610 writer.WriteStartElement(reader.Name);
611 611
612 while (reader.MoveToNextAttribute()) 612 while (reader.MoveToNextAttribute())
613 { 613 {
614 writer.WriteAttributeString(reader.Name, reader.Value); 614 writer.WriteAttributeString(reader.Name, reader.Value);
615 } 615 }
616 616
617 if(empty) 617 if(empty)
618 { 618 {
619 writer.WriteEndElement(); 619 writer.WriteEndElement();
620 } 620 }
621 621
622 break; 622 break;
623 623
624 case XmlNodeType.EndElement: 624 case XmlNodeType.EndElement:
625 writer.WriteEndElement(); 625 writer.WriteEndElement();
626 break; 626 break;
627 627
628 case XmlNodeType.Text: 628 case XmlNodeType.Text:
629 writer.WriteString(reader.Value); 629 writer.WriteString(reader.Value);
630 break; 630 break;
631 631
632 case XmlNodeType.CDATA: 632 case XmlNodeType.CDATA:
633 writer.WriteCData(reader.Value); 633 writer.WriteCData(reader.Value);
634 break; 634 break;
635 635
636 default: 636 default:
637 break; 637 break;
638 } 638 }
639 } 639 }
640 640
641 if(m_IfStack.Count != 0) 641 if(m_IfStack.Count != 0)
642 { 642 {
643 throw new WarningException("Mismatched 'if', 'endif' pair"); 643 throw new WarningException("Mismatched 'if', 'endif' pair");
644 } 644 }
645 } 645 }
646 646
647 return xmlText.ToString(); 647 return xmlText.ToString();
648 } 648 }
649 649
650 #endregion 650 #endregion
651 } 651 }
652} 652}
diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs
index e46b5a5..c52c4f1 100644
--- a/Prebuild/src/Core/Targets/AutotoolsTarget.cs
+++ b/Prebuild/src/Core/Targets/AutotoolsTarget.cs
@@ -1,1070 +1,1070 @@
1#region BSD License 1#region BSD License
2/* 2/*
3 3
4Copyright (c) 2004 - 2008 4Copyright (c) 2004 - 2008
5Matthew Holmes (matthew@wildfiregames.com), 5Matthew Holmes (matthew@wildfiregames.com),
6Dan Moorehead (dan05a@gmail.com), 6Dan Moorehead (dan05a@gmail.com),
7Dave Hudson (jendave@yahoo.com), 7Dave Hudson (jendave@yahoo.com),
8C.J. Adams-Collier (cjac@colliertech.org), 8C.J. Adams-Collier (cjac@colliertech.org),
9 9
10Redistribution and use in source and binary forms, with or without 10Redistribution and use in source and binary forms, with or without
11modification, are permitted provided that the following conditions are 11modification, are permitted provided that the following conditions are
12met: 12met:
13 13
14* Redistributions of source code must retain the above copyright 14* Redistributions of source code must retain the above copyright
15notice, this list of conditions and the following disclaimer. 15notice, this list of conditions and the following disclaimer.
16 16
17* Redistributions in binary form must reproduce the above copyright 17* Redistributions in binary form must reproduce the above copyright
18notice, this list of conditions and the following disclaimer in the 18notice, this list of conditions and the following disclaimer in the
19documentation and/or other materials provided with the distribution. 19documentation and/or other materials provided with the distribution.
20 20
21* The name of the author may not be used to endorse or promote 21* The name of the author may not be used to endorse or promote
22products derived from this software without specific prior written 22products derived from this software without specific prior written
23permission. 23permission.
24 24
25THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 28DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
29INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 32HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 33STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
34IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35POSSIBILITY OF SUCH DAMAGE. 35POSSIBILITY OF SUCH DAMAGE.
36 36
37*/ 37*/
38#endregion 38#endregion
39 39
40#region MIT X11 license 40#region MIT X11 license
41 41
42/* 42/*
43 Portions of this file authored by Lluis Sanchez Gual 43 Portions of this file authored by Lluis Sanchez Gual
44 44
45 Copyright (C) 2006 Novell, Inc (http://www.novell.com) 45 Copyright (C) 2006 Novell, Inc (http://www.novell.com)
46 46
47 Permission is hereby granted, free of charge, to any person obtaining 47 Permission is hereby granted, free of charge, to any person obtaining
48 a copy of this software and associated documentation files (the 48 a copy of this software and associated documentation files (the
49 "Software"), to deal in the Software without restriction, including 49 "Software"), to deal in the Software without restriction, including
50 without limitation the rights to use, copy, modify, merge, publish, 50 without limitation the rights to use, copy, modify, merge, publish,
51 distribute, sublicense, and/or sell copies of the Software, and to 51 distribute, sublicense, and/or sell copies of the Software, and to
52 permit persons to whom the Software is furnished to do so, subject to 52 permit persons to whom the Software is furnished to do so, subject to
53 the following conditions: 53 the following conditions:
54 54
55 The above copyright notice and this permission notice shall be 55 The above copyright notice and this permission notice shall be
56 included in all copies or substantial portions of the Software. 56 included in all copies or substantial portions of the Software.
57 57
58 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 58 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
59 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 59 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
60 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 60 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
61 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 61 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
62 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 62 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
63 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 63 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
64 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 64 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
65 */ 65 */
66 66
67#endregion 67#endregion
68using System; 68using System;
69using System.Collections.Generic; 69using System.Collections.Generic;
70using System.IO; 70using System.IO;
71using System.Reflection; 71using System.Reflection;
72using System.Text; 72using System.Text;
73using System.Text.RegularExpressions; 73using System.Text.RegularExpressions;
74using System.Xml; 74using System.Xml;
75using System.Xml.Xsl; 75using System.Xml.Xsl;
76using System.Net; 76using System.Net;
77using System.Diagnostics; 77using System.Diagnostics;
78 78
79using Prebuild.Core.Attributes; 79using Prebuild.Core.Attributes;
80using Prebuild.Core.Interfaces; 80using Prebuild.Core.Interfaces;
81using Prebuild.Core.Nodes; 81using Prebuild.Core.Nodes;
82using Prebuild.Core.Utilities; 82using Prebuild.Core.Utilities;
83 83
84namespace Prebuild.Core.Targets 84namespace Prebuild.Core.Targets
85{ 85{
86 public enum ClrVersion 86 public enum ClrVersion
87 { 87 {
88 Default, 88 Default,
89 Net_1_1, 89 Net_1_1,
90 Net_2_0 90 Net_2_0
91 } 91 }
92 92
93 public class SystemPackage 93 public class SystemPackage
94 { 94 {
95 string name; 95 string name;
96 string version; 96 string version;
97 string description; 97 string description;
98 string[] assemblies; 98 string[] assemblies;
99 bool isInternal; 99 bool isInternal;
100 ClrVersion targetVersion; 100 ClrVersion targetVersion;
101 101
102 public void Initialize(string name, 102 public void Initialize(string name,
103 string version, 103 string version,
104 string description, 104 string description,
105 string[] assemblies, 105 string[] assemblies,
106 ClrVersion targetVersion, 106 ClrVersion targetVersion,
107 bool isInternal) 107 bool isInternal)
108 { 108 {
109 this.isInternal = isInternal; 109 this.isInternal = isInternal;
110 this.name = name; 110 this.name = name;
111 this.version = version; 111 this.version = version;
112 this.assemblies = assemblies; 112 this.assemblies = assemblies;
113 this.description = description; 113 this.description = description;
114 this.targetVersion = targetVersion; 114 this.targetVersion = targetVersion;
115 } 115 }
116 116
117 public string Name 117 public string Name
118 { 118 {
119 get { return name; } 119 get { return name; }
120 } 120 }
121 121
122 public string Version 122 public string Version
123 { 123 {
124 get { return version; } 124 get { return version; }
125 } 125 }
126 126
127 public string Description 127 public string Description
128 { 128 {
129 get { return description; } 129 get { return description; }
130 } 130 }
131 131
132 public ClrVersion TargetVersion 132 public ClrVersion TargetVersion
133 { 133 {
134 get { return targetVersion; } 134 get { return targetVersion; }
135 } 135 }
136 136
137 // The package is part of the mono SDK 137 // The package is part of the mono SDK
138 public bool IsCorePackage 138 public bool IsCorePackage
139 { 139 {
140 get { return name == "mono"; } 140 get { return name == "mono"; }
141 } 141 }
142 142
143 // The package has been registered by an add-in, and is not installed 143 // The package has been registered by an add-in, and is not installed
144 // in the system. 144 // in the system.
145 public bool IsInternalPackage 145 public bool IsInternalPackage
146 { 146 {
147 get { return isInternal; } 147 get { return isInternal; }
148 } 148 }
149 149
150 public string[] Assemblies 150 public string[] Assemblies
151 { 151 {
152 get { return assemblies; } 152 get { return assemblies; }
153 } 153 }
154 154
155 } 155 }
156 156
157 157
158 /// <summary> 158 /// <summary>
159 /// 159 ///
160 /// </summary> 160 /// </summary>
161 [Target("autotools")] 161 [Target("autotools")]
162 public class AutotoolsTarget : ITarget 162 public class AutotoolsTarget : ITarget
163 { 163 {
164 #region Fields 164 #region Fields
165 165
166 Kernel m_Kernel; 166 Kernel m_Kernel;
167 XmlDocument autotoolsDoc; 167 XmlDocument autotoolsDoc;
168 XmlUrlResolver xr; 168 XmlUrlResolver xr;
169 System.Security.Policy.Evidence e; 169 System.Security.Policy.Evidence e;
170 readonly Dictionary<string, SystemPackage> assemblyPathToPackage = new Dictionary<string, SystemPackage>(); 170 readonly Dictionary<string, SystemPackage> assemblyPathToPackage = new Dictionary<string, SystemPackage>();
171 readonly Dictionary<string, string> assemblyFullNameToPath = new Dictionary<string, string>(); 171 readonly Dictionary<string, string> assemblyFullNameToPath = new Dictionary<string, string>();
172 readonly Dictionary<string, SystemPackage> packagesHash = new Dictionary<string, SystemPackage>(); 172 readonly Dictionary<string, SystemPackage> packagesHash = new Dictionary<string, SystemPackage>();
173 readonly List<SystemPackage> packages = new List<SystemPackage>(); 173 readonly List<SystemPackage> packages = new List<SystemPackage>();
174 174
175 #endregion 175 #endregion
176 176
177 #region Private Methods 177 #region Private Methods
178 178
179 private static void mkdirDashP(string dirName) 179 private static void mkdirDashP(string dirName)
180 { 180 {
181 DirectoryInfo di = new DirectoryInfo(dirName); 181 DirectoryInfo di = new DirectoryInfo(dirName);
182 if (di.Exists) 182 if (di.Exists)
183 return; 183 return;
184 184
185 string parentDirName = System.IO.Path.GetDirectoryName(dirName); 185 string parentDirName = System.IO.Path.GetDirectoryName(dirName);
186 DirectoryInfo parentDi = new DirectoryInfo(parentDirName); 186 DirectoryInfo parentDi = new DirectoryInfo(parentDirName);
187 if (!parentDi.Exists) 187 if (!parentDi.Exists)
188 mkdirDashP(parentDirName); 188 mkdirDashP(parentDirName);
189 189
190 di.Create(); 190 di.Create();
191 } 191 }
192 192
193 private static void chkMkDir(string dirName) 193 private static void chkMkDir(string dirName)
194 { 194 {
195 System.IO.DirectoryInfo di = 195 System.IO.DirectoryInfo di =
196 new System.IO.DirectoryInfo(dirName); 196 new System.IO.DirectoryInfo(dirName);
197 197
198 if (!di.Exists) 198 if (!di.Exists)
199 di.Create(); 199 di.Create();
200 } 200 }
201 201
202 private void transformToFile(string filename, XsltArgumentList argList, string nodeName) 202 private void transformToFile(string filename, XsltArgumentList argList, string nodeName)
203 { 203 {
204 // Create an XslTransform for this file 204 // Create an XslTransform for this file
205 XslTransform templateTransformer = 205 XslTransform templateTransformer =
206 new XslTransform(); 206 new XslTransform();
207 207
208 // Load up the template 208 // Load up the template
209 XmlNode templateNode = 209 XmlNode templateNode =
210 autotoolsDoc.SelectSingleNode(nodeName + "/*"); 210 autotoolsDoc.SelectSingleNode(nodeName + "/*");
211 templateTransformer.Load(templateNode.CreateNavigator(), xr, e); 211 templateTransformer.Load(templateNode.CreateNavigator(), xr, e);
212 212
213 // Create a writer for the transformed template 213 // Create a writer for the transformed template
214 XmlTextWriter templateWriter = 214 XmlTextWriter templateWriter =
215 new XmlTextWriter(filename, null); 215 new XmlTextWriter(filename, null);
216 216
217 // Perform transformation, writing the file 217 // Perform transformation, writing the file
218 templateTransformer.Transform 218 templateTransformer.Transform
219 (m_Kernel.CurrentDoc, argList, templateWriter, xr); 219 (m_Kernel.CurrentDoc, argList, templateWriter, xr);
220 } 220 }
221 221
222 static string NormalizeAsmName(string name) 222 static string NormalizeAsmName(string name)
223 { 223 {
224 int i = name.IndexOf(", PublicKeyToken=null"); 224 int i = name.IndexOf(", PublicKeyToken=null");
225 if (i != -1) 225 if (i != -1)
226 return name.Substring(0, i).Trim(); 226 return name.Substring(0, i).Trim();
227 return name; 227 return name;
228 } 228 }
229 229
230 private void AddAssembly(string assemblyfile, SystemPackage package) 230 private void AddAssembly(string assemblyfile, SystemPackage package)
231 { 231 {
232 if (!File.Exists(assemblyfile)) 232 if (!File.Exists(assemblyfile))
233 return; 233 return;
234 234
235 try 235 try
236 { 236 {
237 System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); 237 System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile);
238 assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; 238 assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile;
239 assemblyPathToPackage[assemblyfile] = package; 239 assemblyPathToPackage[assemblyfile] = package;
240 } 240 }
241 catch 241 catch
242 { 242 {
243 } 243 }
244 } 244 }
245 245
246 private static List<string> GetAssembliesWithLibInfo(string line, string file) 246 private static List<string> GetAssembliesWithLibInfo(string line, string file)
247 { 247 {
248 List<string> references = new List<string>(); 248 List<string> references = new List<string>();
249 List<string> libdirs = new List<string>(); 249 List<string> libdirs = new List<string>();
250 List<string> retval = new List<string>(); 250 List<string> retval = new List<string>();
251 foreach (string piece in line.Split(' ')) 251 foreach (string piece in line.Split(' '))
252 { 252 {
253 if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) 253 if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:"))
254 { 254 {
255 references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); 255 references.Add(ProcessPiece(piece.Substring(3).Trim(), file));
256 } 256 }
257 else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) 257 else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:"))
258 { 258 {
259 libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); 259 libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file));
260 } 260 }
261 } 261 }
262 262
263 foreach (string refrnc in references) 263 foreach (string refrnc in references)
264 { 264 {
265 foreach (string libdir in libdirs) 265 foreach (string libdir in libdirs)
266 { 266 {
267 if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) 267 if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc))
268 { 268 {
269 retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); 269 retval.Add(libdir + Path.DirectorySeparatorChar + refrnc);
270 } 270 }
271 } 271 }
272 } 272 }
273 273
274 return retval; 274 return retval;
275 } 275 }
276 276
277 private static List<string> GetAssembliesWithoutLibInfo(string line, string file) 277 private static List<string> GetAssembliesWithoutLibInfo(string line, string file)
278 { 278 {
279 List<string> references = new List<string>(); 279 List<string> references = new List<string>();
280 foreach (string reference in line.Split(' ')) 280 foreach (string reference in line.Split(' '))
281 { 281 {
282 if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) 282 if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:"))
283 { 283 {
284 string final_ref = reference.Substring(3).Trim(); 284 string final_ref = reference.Substring(3).Trim();
285 references.Add(ProcessPiece(final_ref, file)); 285 references.Add(ProcessPiece(final_ref, file));
286 } 286 }
287 } 287 }
288 return references; 288 return references;
289 } 289 }
290 290
291 private static string ProcessPiece(string piece, string pcfile) 291 private static string ProcessPiece(string piece, string pcfile)
292 { 292 {
293 int start = piece.IndexOf("${"); 293 int start = piece.IndexOf("${");
294 if (start == -1) 294 if (start == -1)
295 return piece; 295 return piece;
296 296
297 int end = piece.IndexOf("}"); 297 int end = piece.IndexOf("}");
298 if (end == -1) 298 if (end == -1)
299 return piece; 299 return piece;
300 300
301 string variable = piece.Substring(start + 2, end - start - 2); 301 string variable = piece.Substring(start + 2, end - start - 2);
302 string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); 302 string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile));
303 return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); 303 return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile);
304 } 304 }
305 305
306 private static string GetVariableFromPkgConfig(string var, string pcfile) 306 private static string GetVariableFromPkgConfig(string var, string pcfile)
307 { 307 {
308 ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); 308 ProcessStartInfo psi = new ProcessStartInfo("pkg-config");
309 psi.RedirectStandardOutput = true; 309 psi.RedirectStandardOutput = true;
310 psi.UseShellExecute = false; 310 psi.UseShellExecute = false;
311 psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); 311 psi.Arguments = String.Format("--variable={0} {1}", var, pcfile);
312 Process p = new Process(); 312 Process p = new Process();
313 p.StartInfo = psi; 313 p.StartInfo = psi;
314 p.Start(); 314 p.Start();
315 string ret = p.StandardOutput.ReadToEnd().Trim(); 315 string ret = p.StandardOutput.ReadToEnd().Trim();
316 p.WaitForExit(); 316 p.WaitForExit();
317 if (String.IsNullOrEmpty(ret)) 317 if (String.IsNullOrEmpty(ret))
318 return String.Empty; 318 return String.Empty;
319 return ret; 319 return ret;
320 } 320 }
321 321
322 private void ParsePCFile(string pcfile) 322 private void ParsePCFile(string pcfile)
323 { 323 {
324 // Don't register the package twice 324 // Don't register the package twice
325 string pname = Path.GetFileNameWithoutExtension(pcfile); 325 string pname = Path.GetFileNameWithoutExtension(pcfile);
326 if (packagesHash.ContainsKey(pname)) 326 if (packagesHash.ContainsKey(pname))
327 return; 327 return;
328 328
329 List<string> fullassemblies = null; 329 List<string> fullassemblies = null;
330 string version = ""; 330 string version = "";
331 string desc = ""; 331 string desc = "";
332 332
333 SystemPackage package = new SystemPackage(); 333 SystemPackage package = new SystemPackage();
334 334
335 using (StreamReader reader = new StreamReader(pcfile)) 335 using (StreamReader reader = new StreamReader(pcfile))
336 { 336 {
337 string line; 337 string line;
338 while ((line = reader.ReadLine()) != null) 338 while ((line = reader.ReadLine()) != null)
339 { 339 {
340 string lowerLine = line.ToLower(); 340 string lowerLine = line.ToLower();
341 if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) 341 if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1)
342 { 342 {
343 string choppedLine = line.Substring(5).Trim(); 343 string choppedLine = line.Substring(5).Trim();
344 if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) 344 if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1)
345 { 345 {
346 fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); 346 fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile);
347 } 347 }
348 else 348 else
349 { 349 {
350 fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); 350 fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile);
351 } 351 }
352 } 352 }
353 else if (lowerLine.StartsWith("version:")) 353 else if (lowerLine.StartsWith("version:"))
354 { 354 {
355 // "version:".Length == 8 355 // "version:".Length == 8
356 version = line.Substring(8).Trim(); 356 version = line.Substring(8).Trim();
357 } 357 }
358 else if (lowerLine.StartsWith("description:")) 358 else if (lowerLine.StartsWith("description:"))
359 { 359 {
360 // "description:".Length == 12 360 // "description:".Length == 12
361 desc = line.Substring(12).Trim(); 361 desc = line.Substring(12).Trim();
362 } 362 }
363 } 363 }
364 } 364 }
365 365
366 if (fullassemblies == null) 366 if (fullassemblies == null)
367 return; 367 return;
368 368
369 foreach (string assembly in fullassemblies) 369 foreach (string assembly in fullassemblies)
370 { 370 {
371 AddAssembly(assembly, package); 371 AddAssembly(assembly, package);
372 } 372 }
373 373
374 package.Initialize(pname, 374 package.Initialize(pname,
375 version, 375 version,
376 desc, 376 desc,
377 fullassemblies.ToArray(), 377 fullassemblies.ToArray(),
378 ClrVersion.Default, 378 ClrVersion.Default,
379 false); 379 false);
380 packages.Add(package); 380 packages.Add(package);
381 packagesHash[pname] = package; 381 packagesHash[pname] = package;
382 } 382 }
383 383
384 void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) 384 void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver)
385 { 385 {
386 SystemPackage package = new SystemPackage(); 386 SystemPackage package = new SystemPackage();
387 List<string> list = new List<string>(); 387 List<string> list = new List<string>();
388 388
389 string dir = Path.Combine(prefix, version); 389 string dir = Path.Combine(prefix, version);
390 if (!Directory.Exists(dir)) 390 if (!Directory.Exists(dir))
391 { 391 {
392 return; 392 return;
393 } 393 }
394 394
395 foreach (string assembly in Directory.GetFiles(dir, "*.dll")) 395 foreach (string assembly in Directory.GetFiles(dir, "*.dll"))
396 { 396 {
397 AddAssembly(assembly, package); 397 AddAssembly(assembly, package);
398 list.Add(assembly); 398 list.Add(assembly);
399 } 399 }
400 400
401 package.Initialize("mono", 401 package.Initialize("mono",
402 version, 402 version,
403 "The Mono runtime", 403 "The Mono runtime",
404 list.ToArray(), 404 list.ToArray(),
405 ver, 405 ver,
406 false); 406 false);
407 packages.Add(package); 407 packages.Add(package);
408 } 408 }
409 409
410 void RunInitialization() 410 void RunInitialization()
411 { 411 {
412 string versionDir; 412 string versionDir;
413 413
414 if (Environment.Version.Major == 1) 414 if (Environment.Version.Major == 1)
415 { 415 {
416 versionDir = "1.0"; 416 versionDir = "1.0";
417 } 417 }
418 else 418 else
419 { 419 {
420 versionDir = "2.0"; 420 versionDir = "2.0";
421 } 421 }
422 422
423 //Pull up assemblies from the installed mono system. 423 //Pull up assemblies from the installed mono system.
424 string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); 424 string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location);
425 425
426 if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) 426 if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1)
427 prefix = Path.Combine(prefix, "mono"); 427 prefix = Path.Combine(prefix, "mono");
428 else 428 else
429 prefix = Path.GetDirectoryName(prefix); 429 prefix = Path.GetDirectoryName(prefix);
430 430
431 RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); 431 RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1);
432 RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); 432 RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0);
433 433
434 string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); 434 string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH");
435 string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); 435 string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH");
436 436
437 if (String.IsNullOrEmpty(libpath)) 437 if (String.IsNullOrEmpty(libpath))
438 { 438 {
439 string path_dirs = Environment.GetEnvironmentVariable("PATH"); 439 string path_dirs = Environment.GetEnvironmentVariable("PATH");
440 foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) 440 foreach (string pathdir in path_dirs.Split(Path.PathSeparator))
441 { 441 {
442 if (pathdir == null) 442 if (pathdir == null)
443 continue; 443 continue;
444 if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) 444 if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config"))
445 { 445 {
446 libpath = Path.Combine(pathdir, ".."); 446 libpath = Path.Combine(pathdir, "..");
447 libpath = Path.Combine(libpath, "lib"); 447 libpath = Path.Combine(libpath, "lib");
448 libpath = Path.Combine(libpath, "pkgconfig"); 448 libpath = Path.Combine(libpath, "pkgconfig");
449 break; 449 break;
450 } 450 }
451 } 451 }
452 } 452 }
453 search_dirs += Path.PathSeparator + libpath; 453 search_dirs += Path.PathSeparator + libpath;
454 if (!string.IsNullOrEmpty(search_dirs)) 454 if (!string.IsNullOrEmpty(search_dirs))
455 { 455 {
456 List<string> scanDirs = new List<string>(); 456 List<string> scanDirs = new List<string>();
457 foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) 457 foreach (string potentialDir in search_dirs.Split(Path.PathSeparator))
458 { 458 {
459 if (!scanDirs.Contains(potentialDir)) 459 if (!scanDirs.Contains(potentialDir))
460 scanDirs.Add(potentialDir); 460 scanDirs.Add(potentialDir);
461 } 461 }
462 foreach (string pcdir in scanDirs) 462 foreach (string pcdir in scanDirs)
463 { 463 {
464 if (pcdir == null) 464 if (pcdir == null)
465 continue; 465 continue;
466 466
467 if (Directory.Exists(pcdir)) 467 if (Directory.Exists(pcdir))
468 { 468 {
469 foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) 469 foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc"))
470 { 470 {
471 ParsePCFile(pcfile); 471 ParsePCFile(pcfile);
472 } 472 }
473 } 473 }
474 } 474 }
475 } 475 }
476 } 476 }
477 477
478 private void WriteCombine(SolutionNode solution) 478 private void WriteCombine(SolutionNode solution)
479 { 479 {
480 #region "Create Solution directory if it doesn't exist" 480 #region "Create Solution directory if it doesn't exist"
481 string solutionDir = Path.Combine(solution.FullPath, 481 string solutionDir = Path.Combine(solution.FullPath,
482 Path.Combine("autotools", 482 Path.Combine("autotools",
483 solution.Name)); 483 solution.Name));
484 chkMkDir(solutionDir); 484 chkMkDir(solutionDir);
485 #endregion 485 #endregion
486 486
487 #region "Write Solution-level files" 487 #region "Write Solution-level files"
488 XsltArgumentList argList = new XsltArgumentList(); 488 XsltArgumentList argList = new XsltArgumentList();
489 argList.AddParam("solutionName", "", solution.Name); 489 argList.AddParam("solutionName", "", solution.Name);
490 // $solutionDir is $rootDir/$solutionName/ 490 // $solutionDir is $rootDir/$solutionName/
491 transformToFile(Path.Combine(solutionDir, "configure.ac"), 491 transformToFile(Path.Combine(solutionDir, "configure.ac"),
492 argList, "/Autotools/SolutionConfigureAc"); 492 argList, "/Autotools/SolutionConfigureAc");
493 transformToFile(Path.Combine(solutionDir, "Makefile.am"), 493 transformToFile(Path.Combine(solutionDir, "Makefile.am"),
494 argList, "/Autotools/SolutionMakefileAm"); 494 argList, "/Autotools/SolutionMakefileAm");
495 transformToFile(Path.Combine(solutionDir, "autogen.sh"), 495 transformToFile(Path.Combine(solutionDir, "autogen.sh"),
496 argList, "/Autotools/SolutionAutogenSh"); 496 argList, "/Autotools/SolutionAutogenSh");
497 #endregion 497 #endregion
498 498
499 foreach (ProjectNode project in solution.ProjectsTableOrder) 499 foreach (ProjectNode project in solution.ProjectsTableOrder)
500 { 500 {
501 m_Kernel.Log.Write(String.Format("Writing project: {0}", 501 m_Kernel.Log.Write(String.Format("Writing project: {0}",
502 project.Name)); 502 project.Name));
503 WriteProject(solution, project); 503 WriteProject(solution, project);
504 } 504 }
505 } 505 }
506 506
507 private static string FindFileReference(string refName, 507 private static string FindFileReference(string refName,
508 ProjectNode project) 508 ProjectNode project)
509 { 509 {
510 foreach (ReferencePathNode refPath in project.ReferencePaths) 510 foreach (ReferencePathNode refPath in project.ReferencePaths)
511 { 511 {
512 string fullPath = 512 string fullPath =
513 Helper.MakeFilePath(refPath.Path, refName, "dll"); 513 Helper.MakeFilePath(refPath.Path, refName, "dll");
514 514
515 if (File.Exists(fullPath)) { 515 if (File.Exists(fullPath)) {
516 return fullPath; 516 return fullPath;
517 } 517 }
518 } 518 }
519 519
520 return null; 520 return null;
521 } 521 }
522 522
523 /// <summary> 523 /// <summary>
524 /// Gets the XML doc file. 524 /// Gets the XML doc file.
525 /// </summary> 525 /// </summary>
526 /// <param name="project">The project.</param> 526 /// <param name="project">The project.</param>
527 /// <param name="conf">The conf.</param> 527 /// <param name="conf">The conf.</param>
528 /// <returns></returns> 528 /// <returns></returns>
529 public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) 529 public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf)
530 { 530 {
531 if (conf == null) 531 if (conf == null)
532 { 532 {
533 throw new ArgumentNullException("conf"); 533 throw new ArgumentNullException("conf");
534 } 534 }
535 if (project == null) 535 if (project == null)
536 { 536 {
537 throw new ArgumentNullException("project"); 537 throw new ArgumentNullException("project");
538 } 538 }
539 string docFile = (string)conf.Options["XmlDocFile"]; 539 string docFile = (string)conf.Options["XmlDocFile"];
540 // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified 540 // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified
541 // { 541 // {
542 // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; 542 // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml";
543 // } 543 // }
544 return docFile; 544 return docFile;
545 } 545 }
546 546
547 /// <summary> 547 /// <summary>
548 /// Normalizes the path. 548 /// Normalizes the path.
549 /// </summary> 549 /// </summary>
550 /// <param name="path">The path.</param> 550 /// <param name="path">The path.</param>
551 /// <returns></returns> 551 /// <returns></returns>
552 public static string NormalizePath(string path) 552 public static string NormalizePath(string path)
553 { 553 {
554 if (path == null) 554 if (path == null)
555 { 555 {
556 return ""; 556 return "";
557 } 557 }
558 558
559 StringBuilder tmpPath; 559 StringBuilder tmpPath;
560 560
561 if (Core.Parse.Preprocessor.GetOS() == "Win32") 561 if (Core.Parse.Preprocessor.GetOS() == "Win32")
562 { 562 {
563 tmpPath = new StringBuilder(path.Replace('\\', '/')); 563 tmpPath = new StringBuilder(path.Replace('\\', '/'));
564 tmpPath.Replace("/", @"\\"); 564 tmpPath.Replace("/", @"\\");
565 } 565 }
566 else 566 else
567 { 567 {
568 tmpPath = new StringBuilder(path.Replace('\\', '/')); 568 tmpPath = new StringBuilder(path.Replace('\\', '/'));
569 tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); 569 tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar);
570 } 570 }
571 return tmpPath.ToString(); 571 return tmpPath.ToString();
572 } 572 }
573 573
574 private void WriteProject(SolutionNode solution, ProjectNode project) 574 private void WriteProject(SolutionNode solution, ProjectNode project)
575 { 575 {
576 string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); 576 string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name));
577 string projectDir = Path.Combine(solutionDir, project.Name); 577 string projectDir = Path.Combine(solutionDir, project.Name);
578 string projectVersion = project.Version; 578 string projectVersion = project.Version;
579 bool hasAssemblyConfig = false; 579 bool hasAssemblyConfig = false;
580 chkMkDir(projectDir); 580 chkMkDir(projectDir);
581 581
582 List<string> 582 List<string>
583 compiledFiles = new List<string>(), 583 compiledFiles = new List<string>(),
584 contentFiles = new List<string>(), 584 contentFiles = new List<string>(),
585 embeddedFiles = new List<string>(), 585 embeddedFiles = new List<string>(),
586 586
587 binaryLibs = new List<string>(), 587 binaryLibs = new List<string>(),
588 pkgLibs = new List<string>(), 588 pkgLibs = new List<string>(),
589 systemLibs = new List<string>(), 589 systemLibs = new List<string>(),
590 runtimeLibs = new List<string>(), 590 runtimeLibs = new List<string>(),
591 591
592 extraDistFiles = new List<string>(), 592 extraDistFiles = new List<string>(),
593 localCopyTargets = new List<string>(); 593 localCopyTargets = new List<string>();
594 594
595 // If there exists a .config file for this assembly, copy 595 // If there exists a .config file for this assembly, copy
596 // it to the project folder 596 // it to the project folder
597 597
598 // TODO: Support copying .config.osx files 598 // TODO: Support copying .config.osx files
599 // TODO: support processing the .config file for native library deps 599 // TODO: support processing the .config file for native library deps
600 string projectAssemblyName = project.Name; 600 string projectAssemblyName = project.Name;
601 if (project.AssemblyName != null) 601 if (project.AssemblyName != null)
602 projectAssemblyName = project.AssemblyName; 602 projectAssemblyName = project.AssemblyName;
603 603
604 if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) 604 if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config"))
605 { 605 {
606 hasAssemblyConfig = true; 606 hasAssemblyConfig = true;
607 System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); 607 System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true);
608 extraDistFiles.Add(project.AssemblyName + ".dll.config"); 608 extraDistFiles.Add(project.AssemblyName + ".dll.config");
609 } 609 }
610 610
611 foreach (ConfigurationNode conf in project.Configurations) 611 foreach (ConfigurationNode conf in project.Configurations)
612 { 612 {
613 if (conf.Options.KeyFile != string.Empty) 613 if (conf.Options.KeyFile != string.Empty)
614 { 614 {
615 // Copy snk file into the project's directory 615 // Copy snk file into the project's directory
616 // Use the snk from the project directory directly 616 // Use the snk from the project directory directly
617 string source = Path.Combine(project.FullPath, conf.Options.KeyFile); 617 string source = Path.Combine(project.FullPath, conf.Options.KeyFile);
618 string keyFile = conf.Options.KeyFile; 618 string keyFile = conf.Options.KeyFile;
619 Regex re = new Regex(".*/"); 619 Regex re = new Regex(".*/");
620 keyFile = re.Replace(keyFile, ""); 620 keyFile = re.Replace(keyFile, "");
621 621
622 string dest = Path.Combine(projectDir, keyFile); 622 string dest = Path.Combine(projectDir, keyFile);
623 // Tell the user if there's a problem copying the file 623 // Tell the user if there's a problem copying the file
624 try 624 try
625 { 625 {
626 mkdirDashP(System.IO.Path.GetDirectoryName(dest)); 626 mkdirDashP(System.IO.Path.GetDirectoryName(dest));
627 System.IO.File.Copy(source, dest, true); 627 System.IO.File.Copy(source, dest, true);
628 } 628 }
629 catch (System.IO.IOException e) 629 catch (System.IO.IOException e)
630 { 630 {
631 Console.WriteLine(e.Message); 631 Console.WriteLine(e.Message);
632 } 632 }
633 } 633 }
634 } 634 }
635 635
636 // Copy compiled, embedded and content files into the project's directory 636 // Copy compiled, embedded and content files into the project's directory
637 foreach (string filename in project.Files) 637 foreach (string filename in project.Files)
638 { 638 {
639 string source = Path.Combine(project.FullPath, filename); 639 string source = Path.Combine(project.FullPath, filename);
640 string dest = Path.Combine(projectDir, filename); 640 string dest = Path.Combine(projectDir, filename);
641 641
642 if (filename.Contains("AssemblyInfo.cs")) 642 if (filename.Contains("AssemblyInfo.cs"))
643 { 643 {
644 // If we've got an AssemblyInfo.cs, pull the version number from it 644 // If we've got an AssemblyInfo.cs, pull the version number from it
645 string[] sources = { source }; 645 string[] sources = { source };
646 string[] args = { "" }; 646 string[] args = { "" };
647 Microsoft.CSharp.CSharpCodeProvider cscp = 647 Microsoft.CSharp.CSharpCodeProvider cscp =
648 new Microsoft.CSharp.CSharpCodeProvider(); 648 new Microsoft.CSharp.CSharpCodeProvider();
649 649
650 string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); 650 string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll");
651 System.CodeDom.Compiler.CompilerParameters cparam = 651 System.CodeDom.Compiler.CompilerParameters cparam =
652 new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); 652 new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile);
653 653
654 System.CodeDom.Compiler.CompilerResults cr = 654 System.CodeDom.Compiler.CompilerResults cr =
655 cscp.CompileAssemblyFromFile(cparam, sources); 655 cscp.CompileAssemblyFromFile(cparam, sources);
656 656
657 foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) 657 foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors)
658 Console.WriteLine("Error! '{0}'", error.ErrorText); 658 Console.WriteLine("Error! '{0}'", error.ErrorText);
659 659
660 try { 660 try {
661 string projectFullName = cr.CompiledAssembly.FullName; 661 string projectFullName = cr.CompiledAssembly.FullName;
662 Regex verRegex = new Regex("Version=([\\d\\.]+)"); 662 Regex verRegex = new Regex("Version=([\\d\\.]+)");
663 Match verMatch = verRegex.Match(projectFullName); 663 Match verMatch = verRegex.Match(projectFullName);
664 if (verMatch.Success) 664 if (verMatch.Success)
665 projectVersion = verMatch.Groups[1].Value; 665 projectVersion = verMatch.Groups[1].Value;
666 }catch{ 666 }catch{
667 Console.WriteLine("Couldn't compile AssemblyInfo.cs"); 667 Console.WriteLine("Couldn't compile AssemblyInfo.cs");
668 } 668 }
669 669
670 // Clean up the temp file 670 // Clean up the temp file
671 try 671 try
672 { 672 {
673 if (File.Exists(tempAssemblyFile)) 673 if (File.Exists(tempAssemblyFile))
674 File.Delete(tempAssemblyFile); 674 File.Delete(tempAssemblyFile);
675 } 675 }
676 catch 676 catch
677 { 677 {
678 Console.WriteLine("Error! '{0}'", e); 678 Console.WriteLine("Error! '{0}'", e);
679 } 679 }
680 680
681 } 681 }
682 682
683 // Tell the user if there's a problem copying the file 683 // Tell the user if there's a problem copying the file
684 try 684 try
685 { 685 {
686 mkdirDashP(System.IO.Path.GetDirectoryName(dest)); 686 mkdirDashP(System.IO.Path.GetDirectoryName(dest));
687 System.IO.File.Copy(source, dest, true); 687 System.IO.File.Copy(source, dest, true);
688 } 688 }
689 catch (System.IO.IOException e) 689 catch (System.IO.IOException e)
690 { 690 {
691 Console.WriteLine(e.Message); 691 Console.WriteLine(e.Message);
692 } 692 }
693 693
694 switch (project.Files.GetBuildAction(filename)) 694 switch (project.Files.GetBuildAction(filename))
695 { 695 {
696 case BuildAction.Compile: 696 case BuildAction.Compile:
697 compiledFiles.Add(filename); 697 compiledFiles.Add(filename);
698 break; 698 break;
699 case BuildAction.Content: 699 case BuildAction.Content:
700 contentFiles.Add(filename); 700 contentFiles.Add(filename);
701 extraDistFiles.Add(filename); 701 extraDistFiles.Add(filename);
702 break; 702 break;
703 case BuildAction.EmbeddedResource: 703 case BuildAction.EmbeddedResource:
704 embeddedFiles.Add(filename); 704 embeddedFiles.Add(filename);
705 break; 705 break;
706 } 706 }
707 } 707 }
708 708
709 // Set up references 709 // Set up references
710 for (int refNum = 0; refNum < project.References.Count; refNum++) 710 for (int refNum = 0; refNum < project.References.Count; refNum++)
711 { 711 {
712 ReferenceNode refr = project.References[refNum]; 712 ReferenceNode refr = project.References[refNum];
713 Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); 713 Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name);
714 714
715 /* Determine which pkg-config (.pc) file refers to 715 /* Determine which pkg-config (.pc) file refers to
716 this assembly */ 716 this assembly */
717 717
718 SystemPackage package = null; 718 SystemPackage package = null;
719 719
720 if (packagesHash.ContainsKey(refr.Name)) 720 if (packagesHash.ContainsKey(refr.Name))
721 { 721 {
722 package = packagesHash[refr.Name]; 722 package = packagesHash[refr.Name];
723 723
724 } 724 }
725 else 725 else
726 { 726 {
727 string assemblyFullName = string.Empty; 727 string assemblyFullName = string.Empty;
728 if (refAssembly != null) 728 if (refAssembly != null)
729 assemblyFullName = refAssembly.FullName; 729 assemblyFullName = refAssembly.FullName;
730 730
731 string assemblyFileName = string.Empty; 731 string assemblyFileName = string.Empty;
732 if (assemblyFullName != string.Empty && 732 if (assemblyFullName != string.Empty &&
733 assemblyFullNameToPath.ContainsKey(assemblyFullName) 733 assemblyFullNameToPath.ContainsKey(assemblyFullName)
734 ) 734 )
735 assemblyFileName = 735 assemblyFileName =
736 assemblyFullNameToPath[assemblyFullName]; 736 assemblyFullNameToPath[assemblyFullName];
737 737
738 if (assemblyFileName != string.Empty && 738 if (assemblyFileName != string.Empty &&
739 assemblyPathToPackage.ContainsKey(assemblyFileName) 739 assemblyPathToPackage.ContainsKey(assemblyFileName)
740 ) 740 )
741 package = assemblyPathToPackage[assemblyFileName]; 741 package = assemblyPathToPackage[assemblyFileName];
742 742
743 } 743 }
744 744
745 /* If we know the .pc file and it is not "mono" 745 /* If we know the .pc file and it is not "mono"
746 (already in the path), add a -pkg: argument */ 746 (already in the path), add a -pkg: argument */
747 747
748 if (package != null && 748 if (package != null &&
749 package.Name != "mono" && 749 package.Name != "mono" &&
750 !pkgLibs.Contains(package.Name) 750 !pkgLibs.Contains(package.Name)
751 ) 751 )
752 pkgLibs.Add(package.Name); 752 pkgLibs.Add(package.Name);
753 753
754 string fileRef = 754 string fileRef =
755 FindFileReference(refr.Name, (ProjectNode)refr.Parent); 755 FindFileReference(refr.Name, (ProjectNode)refr.Parent);
756 756
757 if (refr.LocalCopy || 757 if (refr.LocalCopy ||
758 solution.ProjectsTable.ContainsKey(refr.Name) || 758 solution.ProjectsTable.ContainsKey(refr.Name) ||
759 fileRef != null || 759 fileRef != null ||
760 refr.Path != null 760 refr.Path != null
761 ) 761 )
762 { 762 {
763 763
764 /* Attempt to copy the referenced lib to the 764 /* Attempt to copy the referenced lib to the
765 project's directory */ 765 project's directory */
766 766
767 string filename = refr.Name + ".dll"; 767 string filename = refr.Name + ".dll";
768 string source = filename; 768 string source = filename;
769 if (refr.Path != null) 769 if (refr.Path != null)
770 source = Path.Combine(refr.Path, source); 770 source = Path.Combine(refr.Path, source);
771 source = Path.Combine(project.FullPath, source); 771 source = Path.Combine(project.FullPath, source);
772 string dest = Path.Combine(projectDir, filename); 772 string dest = Path.Combine(projectDir, filename);
773 773
774 /* Since we depend on this binary dll to build, we 774 /* Since we depend on this binary dll to build, we
775 * will add a compile- time dependency on the 775 * will add a compile- time dependency on the
776 * copied dll, and add the dll to the list of 776 * copied dll, and add the dll to the list of
777 * files distributed with this package 777 * files distributed with this package
778 */ 778 */
779 779
780 binaryLibs.Add(refr.Name + ".dll"); 780 binaryLibs.Add(refr.Name + ".dll");
781 extraDistFiles.Add(refr.Name + ".dll"); 781 extraDistFiles.Add(refr.Name + ".dll");
782 782
783 // TODO: Support copying .config.osx files 783 // TODO: Support copying .config.osx files
784 // TODO: Support for determining native dependencies 784 // TODO: Support for determining native dependencies
785 if (File.Exists(source + ".config")) 785 if (File.Exists(source + ".config"))
786 { 786 {
787 System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); 787 System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true);
788 extraDistFiles.Add(refr.Name + ".dll.config"); 788 extraDistFiles.Add(refr.Name + ".dll.config");
789 } 789 }
790 790
791 try 791 try
792 { 792 {
793 System.IO.File.Copy(source, dest, true); 793 System.IO.File.Copy(source, dest, true);
794 } 794 }
795 catch (System.IO.IOException) 795 catch (System.IO.IOException)
796 { 796 {
797 if (solution.ProjectsTable.ContainsKey(refr.Name)){ 797 if (solution.ProjectsTable.ContainsKey(refr.Name)){
798 798
799 /* If an assembly is referenced, marked for 799 /* If an assembly is referenced, marked for
800 * local copy, in the list of projects for 800 * local copy, in the list of projects for
801 * this solution, but does not exist, put a 801 * this solution, but does not exist, put a
802 * target into the Makefile.am to build the 802 * target into the Makefile.am to build the
803 * assembly and copy it to this project's 803 * assembly and copy it to this project's
804 * directory 804 * directory
805 */ 805 */
806 806
807 ProjectNode sourcePrj = 807 ProjectNode sourcePrj =
808 ((solution.ProjectsTable[refr.Name])); 808 ((solution.ProjectsTable[refr.Name]));
809 809
810 string target = 810 string target =
811 String.Format("{0}:\n" + 811 String.Format("{0}:\n" +
812 "\t$(MAKE) -C ../{1}\n" + 812 "\t$(MAKE) -C ../{1}\n" +
813 "\tln ../{2}/$@ $@\n", 813 "\tln ../{2}/$@ $@\n",
814 filename, 814 filename,
815 sourcePrj.Name, 815 sourcePrj.Name,
816 sourcePrj.Name ); 816 sourcePrj.Name );
817 817
818 localCopyTargets.Add(target); 818 localCopyTargets.Add(target);
819 } 819 }
820 } 820 }
821 } 821 }
822 else if( !pkgLibs.Contains(refr.Name) ) 822 else if( !pkgLibs.Contains(refr.Name) )
823 { 823 {
824 // Else, let's assume it's in the GAC or the lib path 824 // Else, let's assume it's in the GAC or the lib path
825 string assemName = string.Empty; 825 string assemName = string.Empty;
826 int index = refr.Name.IndexOf(","); 826 int index = refr.Name.IndexOf(",");
827 827
828 if (index > 0) 828 if (index > 0)
829 assemName = refr.Name.Substring(0, index); 829 assemName = refr.Name.Substring(0, index);
830 else 830 else
831 assemName = refr.Name; 831 assemName = refr.Name;
832 832
833 m_Kernel.Log.Write(String.Format( 833 m_Kernel.Log.Write(String.Format(
834 "Warning: Couldn't find an appropriate assembly " + 834 "Warning: Couldn't find an appropriate assembly " +
835 "for reference:\n'{0}'", refr.Name 835 "for reference:\n'{0}'", refr.Name
836 )); 836 ));
837 systemLibs.Add(assemName); 837 systemLibs.Add(assemName);
838 } 838 }
839 } 839 }
840 840
841 const string lineSep = " \\\n\t"; 841 const string lineSep = " \\\n\t";
842 string compiledFilesString = string.Empty; 842 string compiledFilesString = string.Empty;
843 if (compiledFiles.Count > 0) 843 if (compiledFiles.Count > 0)
844 compiledFilesString = 844 compiledFilesString =
845 lineSep + string.Join(lineSep, compiledFiles.ToArray()); 845 lineSep + string.Join(lineSep, compiledFiles.ToArray());
846 846
847 string embeddedFilesString = ""; 847 string embeddedFilesString = "";
848 if (embeddedFiles.Count > 0) 848 if (embeddedFiles.Count > 0)
849 embeddedFilesString = 849 embeddedFilesString =
850 lineSep + string.Join(lineSep, embeddedFiles.ToArray()); 850 lineSep + string.Join(lineSep, embeddedFiles.ToArray());
851 851
852 string contentFilesString = ""; 852 string contentFilesString = "";
853 if (contentFiles.Count > 0) 853 if (contentFiles.Count > 0)
854 contentFilesString = 854 contentFilesString =
855 lineSep + string.Join(lineSep, contentFiles.ToArray()); 855 lineSep + string.Join(lineSep, contentFiles.ToArray());
856 856
857 string extraDistFilesString = ""; 857 string extraDistFilesString = "";
858 if (extraDistFiles.Count > 0) 858 if (extraDistFiles.Count > 0)
859 extraDistFilesString = 859 extraDistFilesString =
860 lineSep + string.Join(lineSep, extraDistFiles.ToArray()); 860 lineSep + string.Join(lineSep, extraDistFiles.ToArray());
861 861
862 string pkgLibsString = ""; 862 string pkgLibsString = "";
863 if (pkgLibs.Count > 0) 863 if (pkgLibs.Count > 0)
864 pkgLibsString = 864 pkgLibsString =
865 lineSep + string.Join(lineSep, pkgLibs.ToArray()); 865 lineSep + string.Join(lineSep, pkgLibs.ToArray());
866 866
867 string binaryLibsString = ""; 867 string binaryLibsString = "";
868 if (binaryLibs.Count > 0) 868 if (binaryLibs.Count > 0)
869 binaryLibsString = 869 binaryLibsString =
870 lineSep + string.Join(lineSep, binaryLibs.ToArray()); 870 lineSep + string.Join(lineSep, binaryLibs.ToArray());
871 871
872 string systemLibsString = ""; 872 string systemLibsString = "";
873 if (systemLibs.Count > 0) 873 if (systemLibs.Count > 0)
874 systemLibsString = 874 systemLibsString =
875 lineSep + string.Join(lineSep, systemLibs.ToArray()); 875 lineSep + string.Join(lineSep, systemLibs.ToArray());
876 876
877 string localCopyTargetsString = ""; 877 string localCopyTargetsString = "";
878 if (localCopyTargets.Count > 0) 878 if (localCopyTargets.Count > 0)
879 localCopyTargetsString = 879 localCopyTargetsString =
880 string.Join("\n", localCopyTargets.ToArray()); 880 string.Join("\n", localCopyTargets.ToArray());
881 881
882 string monoPath = ""; 882 string monoPath = "";
883 foreach (string runtimeLib in runtimeLibs) 883 foreach (string runtimeLib in runtimeLibs)
884 { 884 {
885 monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; 885 monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`";
886 } 886 }
887 887
888 // Add the project name to the list of transformation 888 // Add the project name to the list of transformation
889 // parameters 889 // parameters
890 XsltArgumentList argList = new XsltArgumentList(); 890 XsltArgumentList argList = new XsltArgumentList();
891 argList.AddParam("projectName", "", project.Name); 891 argList.AddParam("projectName", "", project.Name);
892 argList.AddParam("solutionName", "", solution.Name); 892 argList.AddParam("solutionName", "", solution.Name);
893 argList.AddParam("assemblyName", "", projectAssemblyName); 893 argList.AddParam("assemblyName", "", projectAssemblyName);
894 argList.AddParam("compiledFiles", "", compiledFilesString); 894 argList.AddParam("compiledFiles", "", compiledFilesString);
895 argList.AddParam("embeddedFiles", "", embeddedFilesString); 895 argList.AddParam("embeddedFiles", "", embeddedFilesString);
896 argList.AddParam("contentFiles", "", contentFilesString); 896 argList.AddParam("contentFiles", "", contentFilesString);
897 argList.AddParam("extraDistFiles", "", extraDistFilesString); 897 argList.AddParam("extraDistFiles", "", extraDistFilesString);
898 argList.AddParam("pkgLibs", "", pkgLibsString); 898 argList.AddParam("pkgLibs", "", pkgLibsString);
899 argList.AddParam("binaryLibs", "", binaryLibsString); 899 argList.AddParam("binaryLibs", "", binaryLibsString);
900 argList.AddParam("systemLibs", "", systemLibsString); 900 argList.AddParam("systemLibs", "", systemLibsString);
901 argList.AddParam("monoPath", "", monoPath); 901 argList.AddParam("monoPath", "", monoPath);
902 argList.AddParam("localCopyTargets", "", localCopyTargetsString); 902 argList.AddParam("localCopyTargets", "", localCopyTargetsString);
903 argList.AddParam("projectVersion", "", projectVersion); 903 argList.AddParam("projectVersion", "", projectVersion);
904 argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); 904 argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : "");
905 905
906 // Transform the templates 906 // Transform the templates
907 transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); 907 transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc");
908 transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); 908 transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm");
909 transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); 909 transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh");
910 910
911 if (project.Type == Core.Nodes.ProjectType.Library) 911 if (project.Type == Core.Nodes.ProjectType.Library)
912 transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); 912 transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn");
913 if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) 913 if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe)
914 transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); 914 transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn");
915 } 915 }
916 916
917 private void CleanProject(ProjectNode project) 917 private void CleanProject(ProjectNode project)
918 { 918 {
919 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); 919 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name);
920 string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); 920 string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am");
921 Helper.DeleteIfExists(projectFile); 921 Helper.DeleteIfExists(projectFile);
922 } 922 }
923 923
924 private void CleanSolution(SolutionNode solution) 924 private void CleanSolution(SolutionNode solution)
925 { 925 {
926 m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); 926 m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name);
927 927
928 string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); 928 string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am");
929 Helper.DeleteIfExists(slnFile); 929 Helper.DeleteIfExists(slnFile);
930 930
931 slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); 931 slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in");
932 Helper.DeleteIfExists(slnFile); 932 Helper.DeleteIfExists(slnFile);
933 933
934 slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); 934 slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac");
935 Helper.DeleteIfExists(slnFile); 935 Helper.DeleteIfExists(slnFile);
936 936
937 slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); 937 slnFile = Helper.MakeFilePath(solution.FullPath, "configure");
938 Helper.DeleteIfExists(slnFile); 938 Helper.DeleteIfExists(slnFile);
939 939
940 slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); 940 slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile");
941 Helper.DeleteIfExists(slnFile); 941 Helper.DeleteIfExists(slnFile);
942 942
943 foreach (ProjectNode project in solution.Projects) 943 foreach (ProjectNode project in solution.Projects)
944 { 944 {
945 CleanProject(project); 945 CleanProject(project);
946 } 946 }
947 947
948 m_Kernel.Log.Write(""); 948 m_Kernel.Log.Write("");
949 } 949 }
950 950
951 #endregion 951 #endregion
952 952
953 #region ITarget Members 953 #region ITarget Members
954 954
955 /// <summary> 955 /// <summary>
956 /// Writes the specified kern. 956 /// Writes the specified kern.
957 /// </summary> 957 /// </summary>
958 /// <param name="kern">The kern.</param> 958 /// <param name="kern">The kern.</param>
959 public void Write(Kernel kern) 959 public void Write(Kernel kern)
960 { 960 {
961 if (kern == null) 961 if (kern == null)
962 { 962 {
963 throw new ArgumentNullException("kern"); 963 throw new ArgumentNullException("kern");
964 } 964 }
965 m_Kernel = kern; 965 m_Kernel = kern;
966 m_Kernel.Log.Write("Parsing system pkg-config files"); 966 m_Kernel.Log.Write("Parsing system pkg-config files");
967 RunInitialization(); 967 RunInitialization();
968 968
969 const string streamName = "autotools.xml"; 969 const string streamName = "autotools.xml";
970 string fqStreamName = String.Format("Prebuild.data.{0}", 970 string fqStreamName = String.Format("Prebuild.data.{0}",
971 streamName 971 streamName
972 ); 972 );
973 973
974 // Retrieve stream for the autotools template XML 974 // Retrieve stream for the autotools template XML
975 Stream autotoolsStream = Assembly.GetExecutingAssembly() 975 Stream autotoolsStream = Assembly.GetExecutingAssembly()
976 .GetManifestResourceStream(fqStreamName); 976 .GetManifestResourceStream(fqStreamName);
977 977
978 if(autotoolsStream == null) { 978 if(autotoolsStream == null) {
979 979
980 /* 980 /*
981 * try without the default namespace prepended, in 981 * try without the default namespace prepended, in
982 * case prebuild.exe assembly was compiled with 982 * case prebuild.exe assembly was compiled with
983 * something other than Visual Studio .NET 983 * something other than Visual Studio .NET
984 */ 984 */
985 985
986 autotoolsStream = Assembly.GetExecutingAssembly() 986 autotoolsStream = Assembly.GetExecutingAssembly()
987 .GetManifestResourceStream(streamName); 987 .GetManifestResourceStream(streamName);
988 if(autotoolsStream == null){ 988 if(autotoolsStream == null){
989 string errStr = 989 string errStr =
990 String.Format("Could not find embedded resource file:\n" + 990 String.Format("Could not find embedded resource file:\n" +
991 "'{0}' or '{1}'", 991 "'{0}' or '{1}'",
992 streamName, fqStreamName 992 streamName, fqStreamName
993 ); 993 );
994 994
995 m_Kernel.Log.Write(errStr); 995 m_Kernel.Log.Write(errStr);
996 996
997 throw new System.Reflection.TargetException(errStr); 997 throw new System.Reflection.TargetException(errStr);
998 } 998 }
999 } 999 }
1000 1000
1001 // Create an XML URL Resolver with default credentials 1001 // Create an XML URL Resolver with default credentials
1002 xr = new System.Xml.XmlUrlResolver(); 1002 xr = new System.Xml.XmlUrlResolver();
1003 xr.Credentials = CredentialCache.DefaultCredentials; 1003 xr.Credentials = CredentialCache.DefaultCredentials;
1004 1004
1005 // Create a default evidence - no need to limit access 1005 // Create a default evidence - no need to limit access
1006 e = new System.Security.Policy.Evidence(); 1006 e = new System.Security.Policy.Evidence();
1007 1007
1008 // Load the autotools XML 1008 // Load the autotools XML
1009 autotoolsDoc = new XmlDocument(); 1009 autotoolsDoc = new XmlDocument();
1010 autotoolsDoc.Load(autotoolsStream); 1010 autotoolsDoc.Load(autotoolsStream);
1011 1011
1012 /* rootDir is the filesystem location where the Autotools 1012 /* rootDir is the filesystem location where the Autotools
1013 * build tree will be created - for now we'll make it 1013 * build tree will be created - for now we'll make it
1014 * $PWD/autotools 1014 * $PWD/autotools
1015 */ 1015 */
1016 1016
1017 string pwd = Directory.GetCurrentDirectory(); 1017 string pwd = Directory.GetCurrentDirectory();
1018 //string pwd = System.Environment.GetEnvironmentVariable("PWD"); 1018 //string pwd = System.Environment.GetEnvironmentVariable("PWD");
1019 //if (pwd.Length != 0) 1019 //if (pwd.Length != 0)
1020 //{ 1020 //{
1021 string rootDir = Path.Combine(pwd, "autotools"); 1021 string rootDir = Path.Combine(pwd, "autotools");
1022 //} 1022 //}
1023 //else 1023 //else
1024 //{ 1024 //{
1025 // pwd = Assembly.GetExecutingAssembly() 1025 // pwd = Assembly.GetExecutingAssembly()
1026 //} 1026 //}
1027 chkMkDir(rootDir); 1027 chkMkDir(rootDir);
1028 1028
1029 foreach (SolutionNode solution in kern.Solutions) 1029 foreach (SolutionNode solution in kern.Solutions)
1030 { 1030 {
1031 m_Kernel.Log.Write(String.Format("Writing solution: {0}", 1031 m_Kernel.Log.Write(String.Format("Writing solution: {0}",
1032 solution.Name)); 1032 solution.Name));
1033 WriteCombine(solution); 1033 WriteCombine(solution);
1034 } 1034 }
1035 m_Kernel = null; 1035 m_Kernel = null;
1036 } 1036 }
1037 1037
1038 /// <summary> 1038 /// <summary>
1039 /// Cleans the specified kern. 1039 /// Cleans the specified kern.
1040 /// </summary> 1040 /// </summary>
1041 /// <param name="kern">The kern.</param> 1041 /// <param name="kern">The kern.</param>
1042 public virtual void Clean(Kernel kern) 1042 public virtual void Clean(Kernel kern)
1043 { 1043 {
1044 if (kern == null) 1044 if (kern == null)
1045 { 1045 {
1046 throw new ArgumentNullException("kern"); 1046 throw new ArgumentNullException("kern");
1047 } 1047 }
1048 m_Kernel = kern; 1048 m_Kernel = kern;
1049 foreach (SolutionNode sol in kern.Solutions) 1049 foreach (SolutionNode sol in kern.Solutions)
1050 { 1050 {
1051 CleanSolution(sol); 1051 CleanSolution(sol);
1052 } 1052 }
1053 m_Kernel = null; 1053 m_Kernel = null;
1054 } 1054 }
1055 1055
1056 /// <summary> 1056 /// <summary>
1057 /// Gets the name. 1057 /// Gets the name.
1058 /// </summary> 1058 /// </summary>
1059 /// <value>The name.</value> 1059 /// <value>The name.</value>
1060 public string Name 1060 public string Name
1061 { 1061 {
1062 get 1062 get
1063 { 1063 {
1064 return "autotools"; 1064 return "autotools";
1065 } 1065 }
1066 } 1066 }
1067 1067
1068 #endregion 1068 #endregion
1069 } 1069 }
1070} 1070}
diff --git a/Prebuild/src/Core/Targets/DebugTarget.cs b/Prebuild/src/Core/Targets/DebugTarget.cs
index d78064f..be8aea9 100644
--- a/Prebuild/src/Core/Targets/DebugTarget.cs
+++ b/Prebuild/src/Core/Targets/DebugTarget.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -41,62 +41,62 @@ using Prebuild.Core.Nodes;
41#if (DEBUG && _DEBUG_TARGET) 41#if (DEBUG && _DEBUG_TARGET)
42namespace Prebuild.Core.Targets 42namespace Prebuild.Core.Targets
43{ 43{
44 [Target("debug")] 44 [Target("debug")]
45 public class DebugTarget : ITarget 45 public class DebugTarget : ITarget
46 { 46 {
47#region Fields 47#region Fields
48 48
49 private Kernel m_Kernel = null; 49 private Kernel m_Kernel = null;
50 50
51#endregion 51#endregion
52 52
53#region ITarget Members 53#region ITarget Members
54 54
55 public void Write() 55 public void Write()
56 { 56 {
57 foreach(SolutionNode s in m_Kernel.Solutions) 57 foreach(SolutionNode s in m_Kernel.Solutions)
58 { 58 {
59 Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path); 59 Console.WriteLine("Solution [ {0}, {1} ]", s.Name, s.Path);
60 foreach(string file in s.Files) 60 foreach(string file in s.Files)
61{ 61{
62 Console.WriteLine("\tFile [ {0} ]", file); 62 Console.WriteLine("\tFile [ {0} ]", file);
63} 63}
64 64
65 foreach(ProjectNode proj in s.Projects) 65 foreach(ProjectNode proj in s.Projects)
66 { 66 {
67 Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language); 67 Console.WriteLine("\tProject [ {0}, {1}. {2} ]", proj.Name, proj.Path, proj.Language);
68 foreach(string file in proj.Files) 68 foreach(string file in proj.Files)
69 Console.WriteLine("\t\tFile [ {0} ]", file); 69 Console.WriteLine("\t\tFile [ {0} ]", file);
70 } 70 }
71 } 71 }
72 } 72 }
73 73
74 public void Clean() 74 public void Clean()
75 { 75 {
76 Console.WriteLine("Not implemented"); 76 Console.WriteLine("Not implemented");
77 } 77 }
78 78
79 public string Name 79 public string Name
80 { 80 {
81 get 81 get
82 { 82 {
83 return "debug"; 83 return "debug";
84 } 84 }
85 } 85 }
86 86
87 public Kernel Kernel 87 public Kernel Kernel
88 { 88 {
89 get 89 get
90 { 90 {
91 return m_Kernel; 91 return m_Kernel;
92 } 92 }
93 set 93 set
94 { 94 {
95 m_Kernel = value; 95 m_Kernel = value;
96 } 96 }
97 } 97 }
98 98
99#endregion 99#endregion
100 } 100 }
101} 101}
102#endif 102#endif
diff --git a/Prebuild/src/Core/Targets/MakefileTarget.cs b/Prebuild/src/Core/Targets/MakefileTarget.cs
index 54046dd..8fe1c44 100644
--- a/Prebuild/src/Core/Targets/MakefileTarget.cs
+++ b/Prebuild/src/Core/Targets/MakefileTarget.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004 Crestez Leonard (cleonard@go.ro)
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
diff --git a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs
index ea6d2c2..85fe2db 100644
--- a/Prebuild/src/Core/Targets/MonoDevelopTarget.cs
+++ b/Prebuild/src/Core/Targets/MonoDevelopTarget.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (da
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -35,481 +35,481 @@ using Prebuild.Core.Utilities;
35 35
36namespace Prebuild.Core.Targets 36namespace Prebuild.Core.Targets
37{ 37{
38 /// <summary> 38 /// <summary>
39 /// 39 ///
40 /// </summary> 40 /// </summary>
41 [Target("monodev")] 41 [Target("monodev")]
42 public class MonoDevelopTarget : ITarget 42 public class MonoDevelopTarget : ITarget
43 { 43 {
44 #region Fields 44 #region Fields
45 45
46 private Kernel m_Kernel; 46 private Kernel m_Kernel;
47 47
48 #endregion 48 #endregion
49 49
50 #region Private Methods 50 #region Private Methods
51 51
52 private static string PrependPath(string path) 52 private static string PrependPath(string path)
53 { 53 {
54 string tmpPath = Helper.NormalizePath(path, '/'); 54 string tmpPath = Helper.NormalizePath(path, '/');
55 Regex regex = new Regex(@"(\w):/(\w+)"); 55 Regex regex = new Regex(@"(\w):/(\w+)");
56 Match match = regex.Match(tmpPath); 56 Match match = regex.Match(tmpPath);
57 if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') 57 if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/')
58 { 58 {
59 tmpPath = Helper.NormalizePath(tmpPath); 59 tmpPath = Helper.NormalizePath(tmpPath);
60 } 60 }
61 else 61 else
62 { 62 {
63 tmpPath = Helper.NormalizePath("./" + tmpPath); 63 tmpPath = Helper.NormalizePath("./" + tmpPath);
64 } 64 }
65 65
66 return tmpPath; 66 return tmpPath;
67 } 67 }
68 68
69 private static string BuildReference(SolutionNode solution, ReferenceNode refr) 69 private static string BuildReference(SolutionNode solution, ReferenceNode refr)
70 { 70 {
71 string ret = "<ProjectReference type=\""; 71 string ret = "<ProjectReference type=\"";
72 if(solution.ProjectsTable.ContainsKey(refr.Name)) 72 if(solution.ProjectsTable.ContainsKey(refr.Name))
73 { 73 {
74 ret += "Project\""; 74 ret += "Project\"";
75 ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\" refto=\"" + refr.Name + "\" />"; 75 ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\" refto=\"" + refr.Name + "\" />";
76 } 76 }
77 else 77 else
78 { 78 {
79 ProjectNode project = (ProjectNode)refr.Parent; 79 ProjectNode project = (ProjectNode)refr.Parent;
80 string fileRef = FindFileReference(refr.Name, project); 80 string fileRef = FindFileReference(refr.Name, project);
81 81
82 if(refr.Path != null || fileRef != null) 82 if(refr.Path != null || fileRef != null)
83 { 83 {
84 ret += "Assembly\" refto=\""; 84 ret += "Assembly\" refto=\"";
85 85
86 string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; 86 string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef;
87 87
88 ret += finalPath; 88 ret += finalPath;
89 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; 89 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />";
90 return ret; 90 return ret;
91 } 91 }
92 92
93 ret += "Gac\""; 93 ret += "Gac\"";
94 ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\""; 94 ret += " localcopy=\"" + refr.LocalCopy.ToString() + "\"";
95 ret += " refto=\""; 95 ret += " refto=\"";
96 try 96 try
97 { 97 {
98 /* 98 /*
99 Day changed to 28 Mar 2007 99 Day changed to 28 Mar 2007
100 ... 100 ...
101 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ? 101 08:09 < cj> is there anything that replaces Assembly.LoadFromPartialName() ?
102 08:09 < jonp> no 102 08:09 < jonp> no
103 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the 103 08:10 < jonp> in their infinite wisdom [sic], microsoft decided that the
104 ability to load any assembly version by-name was an inherently 104 ability to load any assembly version by-name was an inherently
105 bad idea 105 bad idea
106 08:11 < cj> I'm thinking of a bunch of four-letter words right now... 106 08:11 < cj> I'm thinking of a bunch of four-letter words right now...
107 08:11 < cj> security through making it difficult for the developer!!! 107 08:11 < cj> security through making it difficult for the developer!!!
108 08:12 < jonp> just use the Obsolete API 108 08:12 < jonp> just use the Obsolete API
109 08:12 < jonp> it should still work 109 08:12 < jonp> it should still work
110 08:12 < cj> alrighty. 110 08:12 < cj> alrighty.
111 08:12 < jonp> you just get warnings when using it 111 08:12 < jonp> you just get warnings when using it
112 */ 112 */
113 Assembly assem = Assembly.LoadWithPartialName(refr.Name); 113 Assembly assem = Assembly.LoadWithPartialName(refr.Name);
114 ret += assem.FullName; 114 ret += assem.FullName;
115 //ret += refr.Name; 115 //ret += refr.Name;
116 } 116 }
117 catch (System.NullReferenceException e) 117 catch (System.NullReferenceException e)
118 { 118 {
119 e.ToString(); 119 e.ToString();
120 ret += refr.Name; 120 ret += refr.Name;
121 } 121 }
122 ret += "\" />"; 122 ret += "\" />";
123 } 123 }
124 124
125 return ret; 125 return ret;
126 } 126 }
127 127
128 private static string FindFileReference(string refName, ProjectNode project) 128 private static string FindFileReference(string refName, ProjectNode project)
129 { 129 {
130 foreach(ReferencePathNode refPath in project.ReferencePaths) 130 foreach(ReferencePathNode refPath in project.ReferencePaths)
131 { 131 {
132 string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); 132 string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll");
133 133
134 if(File.Exists(fullPath)) 134 if(File.Exists(fullPath))
135 { 135 {
136 return fullPath; 136 return fullPath;
137 } 137 }
138 } 138 }
139 139
140 return null; 140 return null;
141 } 141 }
142 142
143 /// <summary> 143 /// <summary>
144 /// Gets the XML doc file. 144 /// Gets the XML doc file.
145 /// </summary> 145 /// </summary>
146 /// <param name="project">The project.</param> 146 /// <param name="project">The project.</param>
147 /// <param name="conf">The conf.</param> 147 /// <param name="conf">The conf.</param>
148 /// <returns></returns> 148 /// <returns></returns>
149 public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) 149 public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf)
150 { 150 {
151 if( conf == null ) 151 if( conf == null )
152 { 152 {
153 throw new ArgumentNullException("conf"); 153 throw new ArgumentNullException("conf");
154 } 154 }
155 if( project == null ) 155 if( project == null )
156 { 156 {
157 throw new ArgumentNullException("project"); 157 throw new ArgumentNullException("project");
158 } 158 }
159 string docFile = (string)conf.Options["XmlDocFile"]; 159 string docFile = (string)conf.Options["XmlDocFile"];
160 if(docFile != null && docFile.Length == 0)//default to assembly name if not specified 160 if(docFile != null && docFile.Length == 0)//default to assembly name if not specified
161 { 161 {
162 return "False"; 162 return "False";
163 } 163 }
164 return "True"; 164 return "True";
165 } 165 }
166 166
167 private void WriteProject(SolutionNode solution, ProjectNode project) 167 private void WriteProject(SolutionNode solution, ProjectNode project)
168 { 168 {
169 string csComp = "Mcs"; 169 string csComp = "Mcs";
170 string netRuntime = "Mono"; 170 string netRuntime = "Mono";
171 if(project.Runtime == ClrRuntime.Microsoft) 171 if(project.Runtime == ClrRuntime.Microsoft)
172 { 172 {
173 csComp = "Csc"; 173 csComp = "Csc";
174 netRuntime = "MsNet"; 174 netRuntime = "MsNet";
175 } 175 }
176 176
177 string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); 177 string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp");
178 StreamWriter ss = new StreamWriter(projFile); 178 StreamWriter ss = new StreamWriter(projFile);
179 179
180 m_Kernel.CurrentWorkingDirectory.Push(); 180 m_Kernel.CurrentWorkingDirectory.Push();
181 Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); 181 Helper.SetCurrentDir(Path.GetDirectoryName(projFile));
182 182
183 using(ss) 183 using(ss)
184 { 184 {
185 ss.WriteLine( 185 ss.WriteLine(
186 "<Project name=\"{0}\" description=\"\" standardNamespace=\"{1}\" newfilesearch=\"None\" enableviewstate=\"True\" fileversion=\"2.0\" language=\"C#\" clr-version=\"Net_2_0\" ctype=\"DotNetProject\">", 186 "<Project name=\"{0}\" description=\"\" standardNamespace=\"{1}\" newfilesearch=\"None\" enableviewstate=\"True\" fileversion=\"2.0\" language=\"C#\" clr-version=\"Net_2_0\" ctype=\"DotNetProject\">",
187 project.Name, 187 project.Name,
188 project.RootNamespace 188 project.RootNamespace
189 ); 189 );
190 190
191 int count = 0; 191 int count = 0;
192 192
193 ss.WriteLine(" <Configurations active=\"{0}\">", solution.ActiveConfig); 193 ss.WriteLine(" <Configurations active=\"{0}\">", solution.ActiveConfig);
194 194
195 foreach(ConfigurationNode conf in project.Configurations) 195 foreach(ConfigurationNode conf in project.Configurations)
196 { 196 {
197 ss.WriteLine(" <Configuration name=\"{0}\" ctype=\"DotNetProjectConfiguration\">", conf.Name); 197 ss.WriteLine(" <Configuration name=\"{0}\" ctype=\"DotNetProjectConfiguration\">", conf.Name);
198 ss.Write(" <Output"); 198 ss.Write(" <Output");
199 ss.Write(" directory=\"{0}\"", Helper.EndPath(Helper.NormalizePath(".\\" + conf.Options["OutputPath"].ToString()))); 199 ss.Write(" directory=\"{0}\"", Helper.EndPath(Helper.NormalizePath(".\\" + conf.Options["OutputPath"].ToString())));
200 ss.Write(" assembly=\"{0}\"", project.AssemblyName); 200 ss.Write(" assembly=\"{0}\"", project.AssemblyName);
201 ss.Write(" executeScript=\"{0}\"", conf.Options["RunScript"]); 201 ss.Write(" executeScript=\"{0}\"", conf.Options["RunScript"]);
202 //ss.Write(" executeBeforeBuild=\"{0}\"", conf.Options["PreBuildEvent"]); 202 //ss.Write(" executeBeforeBuild=\"{0}\"", conf.Options["PreBuildEvent"]);
203 //ss.Write(" executeAfterBuild=\"{0}\"", conf.Options["PostBuildEvent"]); 203 //ss.Write(" executeAfterBuild=\"{0}\"", conf.Options["PostBuildEvent"]);
204 if (conf.Options["PreBuildEvent"] != null && conf.Options["PreBuildEvent"].ToString().Length != 0) 204 if (conf.Options["PreBuildEvent"] != null && conf.Options["PreBuildEvent"].ToString().Length != 0)
205 { 205 {
206 ss.Write(" executeBeforeBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PreBuildEvent"].ToString())); 206 ss.Write(" executeBeforeBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PreBuildEvent"].ToString()));
207 } 207 }
208 else 208 else
209 { 209 {
210 ss.Write(" executeBeforeBuild=\"{0}\"", conf.Options["PreBuildEvent"]); 210 ss.Write(" executeBeforeBuild=\"{0}\"", conf.Options["PreBuildEvent"]);
211 } 211 }
212 if (conf.Options["PostBuildEvent"] != null && conf.Options["PostBuildEvent"].ToString().Length != 0) 212 if (conf.Options["PostBuildEvent"] != null && conf.Options["PostBuildEvent"].ToString().Length != 0)
213 { 213 {
214 ss.Write(" executeAfterBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PostBuildEvent"].ToString())); 214 ss.Write(" executeAfterBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PostBuildEvent"].ToString()));
215 } 215 }
216 else 216 else
217 { 217 {
218 ss.Write(" executeAfterBuild=\"{0}\"", conf.Options["PostBuildEvent"]); 218 ss.Write(" executeAfterBuild=\"{0}\"", conf.Options["PostBuildEvent"]);
219 } 219 }
220 ss.Write(" executeBeforeBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]); 220 ss.Write(" executeBeforeBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]);
221 ss.Write(" executeAfterBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]); 221 ss.Write(" executeAfterBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]);
222 ss.WriteLine(" />"); 222 ss.WriteLine(" />");
223 223
224 ss.Write(" <Build"); 224 ss.Write(" <Build");
225 ss.Write(" debugmode=\"True\""); 225 ss.Write(" debugmode=\"True\"");
226 if (project.Type == ProjectType.WinExe) 226 if (project.Type == ProjectType.WinExe)
227 { 227 {
228 ss.Write(" target=\"{0}\"", ProjectType.Exe.ToString()); 228 ss.Write(" target=\"{0}\"", ProjectType.Exe.ToString());
229 } 229 }
230 else 230 else
231 { 231 {
232 ss.Write(" target=\"{0}\"", project.Type); 232 ss.Write(" target=\"{0}\"", project.Type);
233 } 233 }
234 ss.WriteLine(" />"); 234 ss.WriteLine(" />");
235 235
236 ss.Write(" <Execution"); 236 ss.Write(" <Execution");
237 ss.Write(" runwithwarnings=\"{0}\"", !conf.Options.WarningsAsErrors); 237 ss.Write(" runwithwarnings=\"{0}\"", !conf.Options.WarningsAsErrors);
238 ss.Write(" consolepause=\"True\""); 238 ss.Write(" consolepause=\"True\"");
239 ss.Write(" runtime=\"{0}\"", netRuntime); 239 ss.Write(" runtime=\"{0}\"", netRuntime);
240 ss.Write(" clr-version=\"Net_2_0\""); 240 ss.Write(" clr-version=\"Net_2_0\"");
241 ss.WriteLine(" />"); 241 ss.WriteLine(" />");
242 242
243 ss.Write(" <CodeGeneration"); 243 ss.Write(" <CodeGeneration");
244 ss.Write(" compiler=\"{0}\"", csComp); 244 ss.Write(" compiler=\"{0}\"", csComp);
245 ss.Write(" warninglevel=\"{0}\"", conf.Options["WarningLevel"]); 245 ss.Write(" warninglevel=\"{0}\"", conf.Options["WarningLevel"]);
246 ss.Write(" nowarn=\"{0}\"", conf.Options["SuppressWarnings"]); 246 ss.Write(" nowarn=\"{0}\"", conf.Options["SuppressWarnings"]);
247 ss.Write(" includedebuginformation=\"{0}\"", conf.Options["DebugInformation"]); 247 ss.Write(" includedebuginformation=\"{0}\"", conf.Options["DebugInformation"]);
248 ss.Write(" optimize=\"{0}\"", conf.Options["OptimizeCode"]); 248 ss.Write(" optimize=\"{0}\"", conf.Options["OptimizeCode"]);
249 ss.Write(" unsafecodeallowed=\"{0}\"", conf.Options["AllowUnsafe"]); 249 ss.Write(" unsafecodeallowed=\"{0}\"", conf.Options["AllowUnsafe"]);
250 ss.Write(" generateoverflowchecks=\"{0}\"", conf.Options["CheckUnderflowOverflow"]); 250 ss.Write(" generateoverflowchecks=\"{0}\"", conf.Options["CheckUnderflowOverflow"]);
251 ss.Write(" mainclass=\"{0}\"", project.StartupObject); 251 ss.Write(" mainclass=\"{0}\"", project.StartupObject);
252 ss.Write(" target=\"{0}\"", project.Type); 252 ss.Write(" target=\"{0}\"", project.Type);
253 ss.Write(" definesymbols=\"{0}\"", conf.Options["CompilerDefines"]); 253 ss.Write(" definesymbols=\"{0}\"", conf.Options["CompilerDefines"]);
254 ss.Write(" generatexmldocumentation=\"{0}\"", GenerateXmlDocFile(project, conf)); 254 ss.Write(" generatexmldocumentation=\"{0}\"", GenerateXmlDocFile(project, conf));
255 ss.Write(" win32Icon=\"{0}\"", project.AppIcon); 255 ss.Write(" win32Icon=\"{0}\"", project.AppIcon);
256 ss.Write(" ctype=\"CSharpCompilerParameters\""); 256 ss.Write(" ctype=\"CSharpCompilerParameters\"");
257 ss.WriteLine(" />"); 257 ss.WriteLine(" />");
258 ss.WriteLine(" </Configuration>"); 258 ss.WriteLine(" </Configuration>");
259 259
260 count++; 260 count++;
261 } 261 }
262 ss.WriteLine(" </Configurations>"); 262 ss.WriteLine(" </Configurations>");
263 263
264 ss.Write(" <DeploymentInformation"); 264 ss.Write(" <DeploymentInformation");
265 ss.Write(" target=\"\""); 265 ss.Write(" target=\"\"");
266 ss.Write(" script=\"\""); 266 ss.Write(" script=\"\"");
267 ss.Write(" strategy=\"File\""); 267 ss.Write(" strategy=\"File\"");
268 ss.WriteLine(">"); 268 ss.WriteLine(">");
269 ss.WriteLine(" <excludeFiles />"); 269 ss.WriteLine(" <excludeFiles />");
270 ss.WriteLine(" </DeploymentInformation>"); 270 ss.WriteLine(" </DeploymentInformation>");
271 271
272 ss.WriteLine(" <Contents>"); 272 ss.WriteLine(" <Contents>");
273 foreach(string file in project.Files) 273 foreach(string file in project.Files)
274 { 274 {
275 string buildAction; 275 string buildAction;
276 string dependson = ""; 276 string dependson = "";
277 string resource_id = ""; 277 string resource_id = "";
278 string copyToOutput = ""; 278 string copyToOutput = "";
279 279
280 switch(project.Files.GetBuildAction(file)) 280 switch(project.Files.GetBuildAction(file))
281 { 281 {
282 case BuildAction.None: 282 case BuildAction.None:
283 buildAction = "Nothing"; 283 buildAction = "Nothing";
284 break; 284 break;
285 285
286 case BuildAction.Content: 286 case BuildAction.Content:
287 buildAction = "Exclude"; 287 buildAction = "Exclude";
288 break; 288 break;
289 289
290 case BuildAction.EmbeddedResource: 290 case BuildAction.EmbeddedResource:
291 buildAction = "EmbedAsResource"; 291 buildAction = "EmbedAsResource";
292 break; 292 break;
293 293
294 default: 294 default:
295 buildAction = "Compile"; 295 buildAction = "Compile";
296 break; 296 break;
297 } 297 }
298 298
299 if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) 299 if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never)
300 buildAction = "FileCopy"; 300 buildAction = "FileCopy";
301 301
302 // Sort of a hack, we try and resolve the path and make it relative, if we can. 302 // Sort of a hack, we try and resolve the path and make it relative, if we can.
303 string extension = Path.GetExtension(file); 303 string extension = Path.GetExtension(file);
304 string designer_format = string.Format(".Designer{0}", extension); 304 string designer_format = string.Format(".Designer{0}", extension);
305 305
306 if (file.EndsWith(designer_format)) 306 if (file.EndsWith(designer_format))
307 { 307 {
308 string basename = file.Substring(0, file.LastIndexOf(designer_format)); 308 string basename = file.Substring(0, file.LastIndexOf(designer_format));
309 string[] extensions = new string[] { ".cs", ".resx", ".settings" }; 309 string[] extensions = new string[] { ".cs", ".resx", ".settings" };
310 310
311 foreach(string ext in extensions) 311 foreach(string ext in extensions)
312 { 312 {
313 if (project.Files.Contains(basename + ext)) 313 if (project.Files.Contains(basename + ext))
314 { 314 {
315 dependson = string.Format(" dependson=\"{0}{1}\"", basename, ext); 315 dependson = string.Format(" dependson=\"{0}{1}\"", basename, ext);
316 break; 316 break;
317 } 317 }
318 } 318 }
319 } 319 }
320 if (extension == ".resx") 320 if (extension == ".resx")
321 { 321 {
322 buildAction = "EmbedAsResource"; 322 buildAction = "EmbedAsResource";
323 string basename = file.Substring(0, file.LastIndexOf(".resx")); 323 string basename = file.Substring(0, file.LastIndexOf(".resx"));
324 324
325 // Visual Studio type resx + form dependency 325 // Visual Studio type resx + form dependency
326 if (project.Files.Contains(basename + ".cs")) 326 if (project.Files.Contains(basename + ".cs"))
327 { 327 {
328 dependson = string.Format(" dependson=\"{0}{1}\"", basename, ".cs"); 328 dependson = string.Format(" dependson=\"{0}{1}\"", basename, ".cs");
329 } 329 }
330 330
331 // We need to specify a resources file name to avoid MissingManifestResourceExceptions 331 // We need to specify a resources file name to avoid MissingManifestResourceExceptions
332 // in libraries that are built. 332 // in libraries that are built.
333 resource_id = string.Format(" resource_id=\"{0}.{1}.resources\"", 333 resource_id = string.Format(" resource_id=\"{0}.{1}.resources\"",
334 project.AssemblyName, basename.Replace("/", ".")); 334 project.AssemblyName, basename.Replace("/", "."));
335 } 335 }
336 336
337 switch(project.Files.GetCopyToOutput(file)) 337 switch(project.Files.GetCopyToOutput(file))
338 { 338 {
339 case CopyToOutput.Always: 339 case CopyToOutput.Always:
340 copyToOutput = string.Format(" copyToOutputDirectory=\"Always\""); 340 copyToOutput = string.Format(" copyToOutputDirectory=\"Always\"");
341 break; 341 break;
342 case CopyToOutput.PreserveNewest: 342 case CopyToOutput.PreserveNewest:
343 copyToOutput = string.Format(" copyToOutputDirectory=\"PreserveNewest\""); 343 copyToOutput = string.Format(" copyToOutputDirectory=\"PreserveNewest\"");
344 break; 344 break;
345 } 345 }
346 346
347 // Sort of a hack, we try and resolve the path and make it relative, if we can. 347 // Sort of a hack, we try and resolve the path and make it relative, if we can.
348 string filePath = PrependPath(file); 348 string filePath = PrependPath(file);
349 ss.WriteLine(" <File name=\"{0}\" subtype=\"Code\" buildaction=\"{1}\"{2}{3}{4} />", 349 ss.WriteLine(" <File name=\"{0}\" subtype=\"Code\" buildaction=\"{1}\"{2}{3}{4} />",
350 filePath, buildAction, dependson, resource_id, copyToOutput); 350 filePath, buildAction, dependson, resource_id, copyToOutput);
351 } 351 }
352 ss.WriteLine(" </Contents>"); 352 ss.WriteLine(" </Contents>");
353 353
354 ss.WriteLine(" <References>"); 354 ss.WriteLine(" <References>");
355 foreach(ReferenceNode refr in project.References) 355 foreach(ReferenceNode refr in project.References)
356 { 356 {
357 ss.WriteLine(" {0}", BuildReference(solution, refr)); 357 ss.WriteLine(" {0}", BuildReference(solution, refr));
358 } 358 }
359 ss.WriteLine(" </References>"); 359 ss.WriteLine(" </References>");
360 360
361 361
362 ss.WriteLine("</Project>"); 362 ss.WriteLine("</Project>");
363 } 363 }
364 364
365 m_Kernel.CurrentWorkingDirectory.Pop(); 365 m_Kernel.CurrentWorkingDirectory.Pop();
366 } 366 }
367 367
368 private void WriteCombine(SolutionNode solution) 368 private void WriteCombine(SolutionNode solution)
369 { 369 {
370 m_Kernel.Log.Write("Creating MonoDevelop combine and project files"); 370 m_Kernel.Log.Write("Creating MonoDevelop combine and project files");
371 foreach(ProjectNode project in solution.Projects) 371 foreach(ProjectNode project in solution.Projects)
372 { 372 {
373 if(m_Kernel.AllowProject(project.FilterGroups)) 373 if(m_Kernel.AllowProject(project.FilterGroups))
374 { 374 {
375 m_Kernel.Log.Write("...Creating project: {0}", project.Name); 375 m_Kernel.Log.Write("...Creating project: {0}", project.Name);
376 WriteProject(solution, project); 376 WriteProject(solution, project);
377 } 377 }
378 } 378 }
379 379
380 m_Kernel.Log.Write(""); 380 m_Kernel.Log.Write("");
381 string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); 381 string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds");
382 StreamWriter ss = new StreamWriter(combFile); 382 StreamWriter ss = new StreamWriter(combFile);
383 383
384 m_Kernel.CurrentWorkingDirectory.Push(); 384 m_Kernel.CurrentWorkingDirectory.Push();
385 Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); 385 Helper.SetCurrentDir(Path.GetDirectoryName(combFile));
386 386
387 int count = 0; 387 int count = 0;
388 388
389 using(ss) 389 using(ss)
390 { 390 {
391 ss.WriteLine("<Combine name=\"{0}\" fileversion=\"2.0\" description=\"\">", solution.Name); 391 ss.WriteLine("<Combine name=\"{0}\" fileversion=\"2.0\" description=\"\">", solution.Name);
392 392
393 count = 0; 393 count = 0;
394 foreach(ConfigurationNode conf in solution.Configurations) 394 foreach(ConfigurationNode conf in solution.Configurations)
395 { 395 {
396 if(count == 0) 396 if(count == 0)
397 { 397 {
398 ss.WriteLine(" <Configurations active=\"{0}\">", conf.Name); 398 ss.WriteLine(" <Configurations active=\"{0}\">", conf.Name);
399 } 399 }
400 400
401 ss.WriteLine(" <Configuration name=\"{0}\" ctype=\"CombineConfiguration\">", conf.Name); 401 ss.WriteLine(" <Configuration name=\"{0}\" ctype=\"CombineConfiguration\">", conf.Name);
402 foreach(ProjectNode project in solution.Projects) 402 foreach(ProjectNode project in solution.Projects)
403 { 403 {
404 ss.WriteLine(" <Entry configuration=\"{1}\" build=\"True\" name=\"{0}\" />", project.Name, conf.Name); 404 ss.WriteLine(" <Entry configuration=\"{1}\" build=\"True\" name=\"{0}\" />", project.Name, conf.Name);
405 } 405 }
406 ss.WriteLine(" </Configuration>"); 406 ss.WriteLine(" </Configuration>");
407 407
408 count++; 408 count++;
409 } 409 }
410 ss.WriteLine(" </Configurations>"); 410 ss.WriteLine(" </Configurations>");
411 411
412 count = 0; 412 count = 0;
413 413
414 foreach(ProjectNode project in solution.Projects) 414 foreach(ProjectNode project in solution.Projects)
415 { 415 {
416 if(count == 0) 416 if(count == 0)
417 ss.WriteLine(" <StartMode startupentry=\"{0}\" single=\"True\">", project.Name); 417 ss.WriteLine(" <StartMode startupentry=\"{0}\" single=\"True\">", project.Name);
418 418
419 ss.WriteLine(" <Execute type=\"None\" entry=\"{0}\" />", project.Name); 419 ss.WriteLine(" <Execute type=\"None\" entry=\"{0}\" />", project.Name);
420 count++; 420 count++;
421 } 421 }
422 ss.WriteLine(" </StartMode>"); 422 ss.WriteLine(" </StartMode>");
423 423
424 ss.WriteLine(" <Entries>"); 424 ss.WriteLine(" <Entries>");
425 foreach(ProjectNode project in solution.Projects) 425 foreach(ProjectNode project in solution.Projects)
426 { 426 {
427 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); 427 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath);
428 ss.WriteLine(" <Entry filename=\"{0}\" />", 428 ss.WriteLine(" <Entry filename=\"{0}\" />",
429 Helper.MakeFilePath(path, project.Name, "mdp")); 429 Helper.MakeFilePath(path, project.Name, "mdp"));
430 } 430 }
431 ss.WriteLine(" </Entries>"); 431 ss.WriteLine(" </Entries>");
432 432
433 ss.WriteLine("</Combine>"); 433 ss.WriteLine("</Combine>");
434 } 434 }
435 435
436 m_Kernel.CurrentWorkingDirectory.Pop(); 436 m_Kernel.CurrentWorkingDirectory.Pop();
437 } 437 }
438 438
439 private void CleanProject(ProjectNode project) 439 private void CleanProject(ProjectNode project)
440 { 440 {
441 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); 441 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name);
442 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp"); 442 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "mdp");
443 Helper.DeleteIfExists(projectFile); 443 Helper.DeleteIfExists(projectFile);
444 } 444 }
445 445
446 private void CleanSolution(SolutionNode solution) 446 private void CleanSolution(SolutionNode solution)
447 { 447 {
448 m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name); 448 m_Kernel.Log.Write("Cleaning MonoDevelop combine and project files for", solution.Name);
449 449
450 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds"); 450 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "mds");
451 Helper.DeleteIfExists(slnFile); 451 Helper.DeleteIfExists(slnFile);
452 452
453 foreach(ProjectNode project in solution.Projects) 453 foreach(ProjectNode project in solution.Projects)
454 { 454 {
455 CleanProject(project); 455 CleanProject(project);
456 } 456 }
457 457
458 m_Kernel.Log.Write(""); 458 m_Kernel.Log.Write("");
459 } 459 }
460 460
461 #endregion 461 #endregion
462 462
463 #region ITarget Members 463 #region ITarget Members
464 464
465 /// <summary> 465 /// <summary>
466 /// Writes the specified kern. 466 /// Writes the specified kern.
467 /// </summary> 467 /// </summary>
468 /// <param name="kern">The kern.</param> 468 /// <param name="kern">The kern.</param>
469 public void Write(Kernel kern) 469 public void Write(Kernel kern)
470 { 470 {
471 if( kern == null ) 471 if( kern == null )
472 { 472 {
473 throw new ArgumentNullException("kern"); 473 throw new ArgumentNullException("kern");
474 } 474 }
475 m_Kernel = kern; 475 m_Kernel = kern;
476 foreach(SolutionNode solution in kern.Solutions) 476 foreach(SolutionNode solution in kern.Solutions)
477 { 477 {
478 WriteCombine(solution); 478 WriteCombine(solution);
479 } 479 }
480 m_Kernel = null; 480 m_Kernel = null;
481 } 481 }
482 482
483 /// <summary> 483 /// <summary>
484 /// Cleans the specified kern. 484 /// Cleans the specified kern.
485 /// </summary> 485 /// </summary>
486 /// <param name="kern">The kern.</param> 486 /// <param name="kern">The kern.</param>
487 public virtual void Clean(Kernel kern) 487 public virtual void Clean(Kernel kern)
488 { 488 {
489 if( kern == null ) 489 if( kern == null )
490 { 490 {
491 throw new ArgumentNullException("kern"); 491 throw new ArgumentNullException("kern");
492 } 492 }
493 m_Kernel = kern; 493 m_Kernel = kern;
494 foreach(SolutionNode sol in kern.Solutions) 494 foreach(SolutionNode sol in kern.Solutions)
495 { 495 {
496 CleanSolution(sol); 496 CleanSolution(sol);
497 } 497 }
498 m_Kernel = null; 498 m_Kernel = null;
499 } 499 }
500 500
501 /// <summary> 501 /// <summary>
502 /// Gets the name. 502 /// Gets the name.
503 /// </summary> 503 /// </summary>
504 /// <value>The name.</value> 504 /// <value>The name.</value>
505 public string Name 505 public string Name
506 { 506 {
507 get 507 get
508 { 508 {
509 return "sharpdev"; 509 return "sharpdev";
510 } 510 }
511 } 511 }
512 512
513 #endregion 513 #endregion
514 } 514 }
515} 515}
diff --git a/Prebuild/src/Core/Targets/NAntTarget.cs b/Prebuild/src/Core/Targets/NAntTarget.cs
index 9a86767..21bc80e 100644
--- a/Prebuild/src/Core/Targets/NAntTarget.cs
+++ b/Prebuild/src/Core/Targets/NAntTarget.cs
@@ -47,36 +47,36 @@ using Prebuild.Core.Utilities;
47 47
48namespace Prebuild.Core.Targets 48namespace Prebuild.Core.Targets
49{ 49{
50 /// <summary> 50 /// <summary>
51 /// 51 ///
52 /// </summary> 52 /// </summary>
53 [Target("nant")] 53 [Target("nant")]
54 public class NAntTarget : ITarget 54 public class NAntTarget : ITarget
55 { 55 {
56 #region Fields 56 #region Fields
57 57
58 private Kernel m_Kernel; 58 private Kernel m_Kernel;
59 59
60 #endregion 60 #endregion
61 61
62 #region Private Methods 62 #region Private Methods
63 63
64 private static string PrependPath(string path) 64 private static string PrependPath(string path)
65 { 65 {
66 string tmpPath = Helper.NormalizePath(path, '/'); 66 string tmpPath = Helper.NormalizePath(path, '/');
67 Regex regex = new Regex(@"(\w):/(\w+)"); 67 Regex regex = new Regex(@"(\w):/(\w+)");
68 Match match = regex.Match(tmpPath); 68 Match match = regex.Match(tmpPath);
69 //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') 69 //if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/')
70 //{ 70 //{
71 tmpPath = Helper.NormalizePath(tmpPath); 71 tmpPath = Helper.NormalizePath(tmpPath);
72 //} 72 //}
73 // else 73 // else
74 // { 74 // {
75 // tmpPath = Helper.NormalizePath("./" + tmpPath); 75 // tmpPath = Helper.NormalizePath("./" + tmpPath);
76 // } 76 // }
77 77
78 return tmpPath; 78 return tmpPath;
79 } 79 }
80 80
81 private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr) 81 private static string BuildReference(SolutionNode solution, ProjectNode currentProject, ReferenceNode refr)
82 { 82 {
@@ -85,7 +85,7 @@ namespace Prebuild.Core.Targets
85 { 85 {
86 return refr.Path; 86 return refr.Path;
87 } 87 }
88 88
89 if (solution.ProjectsTable.ContainsKey(refr.Name)) 89 if (solution.ProjectsTable.ContainsKey(refr.Name))
90 { 90 {
91 ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name]; 91 ProjectNode projectRef = (ProjectNode) solution.ProjectsTable[refr.Name];
@@ -113,7 +113,7 @@ namespace Prebuild.Core.Targets
113 return refr.Name + ".dll"; 113 return refr.Name + ".dll";
114 } 114 }
115 115
116 public static string GetRefFileName(string refName) 116 public static string GetRefFileName(string refName)
117 { 117 {
118 if (ExtensionSpecified(refName)) 118 if (ExtensionSpecified(refName))
119 { 119 {
@@ -140,11 +140,11 @@ namespace Prebuild.Core.Targets
140 return extension; 140 return extension;
141 } 141 }
142 142
143 private static string FindFileReference(string refName, ProjectNode project) 143 private static string FindFileReference(string refName, ProjectNode project)
144 { 144 {
145 foreach (ReferencePathNode refPath in project.ReferencePaths) 145 foreach (ReferencePathNode refPath in project.ReferencePaths)
146 { 146 {
147 string fullPath = Helper.MakeFilePath(refPath.Path, refName); 147 string fullPath = Helper.MakeFilePath(refPath.Path, refName);
148 148
149 if (File.Exists(fullPath)) 149 if (File.Exists(fullPath))
150 { 150 {
@@ -153,10 +153,10 @@ namespace Prebuild.Core.Targets
153 153
154 fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); 154 fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll");
155 155
156 if (File.Exists(fullPath)) 156 if (File.Exists(fullPath))
157 { 157 {
158 return fullPath; 158 return fullPath;
159 } 159 }
160 160
161 fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe"); 161 fullPath = Helper.MakeFilePath(refPath.Path, refName, "exe");
162 162
@@ -164,162 +164,162 @@ namespace Prebuild.Core.Targets
164 { 164 {
165 return fullPath; 165 return fullPath;
166 } 166 }
167 } 167 }
168 168
169 return null; 169 return null;
170 } 170 }
171 171
172 /// <summary> 172 /// <summary>
173 /// Gets the XML doc file. 173 /// Gets the XML doc file.
174 /// </summary> 174 /// </summary>
175 /// <param name="project">The project.</param> 175 /// <param name="project">The project.</param>
176 /// <param name="conf">The conf.</param> 176 /// <param name="conf">The conf.</param>
177 /// <returns></returns> 177 /// <returns></returns>
178 public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) 178 public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf)
179 { 179 {
180 if (conf == null) 180 if (conf == null)
181 { 181 {
182 throw new ArgumentNullException("conf"); 182 throw new ArgumentNullException("conf");
183 } 183 }
184 if (project == null) 184 if (project == null)
185 { 185 {
186 throw new ArgumentNullException("project"); 186 throw new ArgumentNullException("project");
187 } 187 }
188 string docFile = (string)conf.Options["XmlDocFile"]; 188 string docFile = (string)conf.Options["XmlDocFile"];
189 // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified 189 // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified
190 // { 190 // {
191 // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; 191 // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml";
192 // } 192 // }
193 return docFile; 193 return docFile;
194 } 194 }
195 195
196 private void WriteProject(SolutionNode solution, ProjectNode project) 196 private void WriteProject(SolutionNode solution, ProjectNode project)
197 { 197 {
198 string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build"); 198 string projFile = Helper.MakeFilePath(project.FullPath, project.Name + GetProjectExtension(project), "build");
199 StreamWriter ss = new StreamWriter(projFile); 199 StreamWriter ss = new StreamWriter(projFile);
200 200
201 m_Kernel.CurrentWorkingDirectory.Push(); 201 m_Kernel.CurrentWorkingDirectory.Push();
202 Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); 202 Helper.SetCurrentDir(Path.GetDirectoryName(projFile));
203 bool hasDoc = false; 203 bool hasDoc = false;
204 204
205 using (ss) 205 using (ss)
206 { 206 {
207 ss.WriteLine("<?xml version=\"1.0\" ?>"); 207 ss.WriteLine("<?xml version=\"1.0\" ?>");
208 ss.WriteLine("<project name=\"{0}\" default=\"build\">", project.Name); 208 ss.WriteLine("<project name=\"{0}\" default=\"build\">", project.Name);
209 ss.WriteLine(" <target name=\"{0}\">", "build"); 209 ss.WriteLine(" <target name=\"{0}\">", "build");
210 ss.WriteLine(" <echo message=\"Build Directory is ${project::get-base-directory()}/${build.dir}\" />"); 210 ss.WriteLine(" <echo message=\"Build Directory is ${project::get-base-directory()}/${build.dir}\" />");
211 ss.WriteLine(" <mkdir dir=\"${project::get-base-directory()}/${build.dir}\" />"); 211 ss.WriteLine(" <mkdir dir=\"${project::get-base-directory()}/${build.dir}\" />");
212 212
213 ss.Write(" <csc "); 213 ss.Write(" <csc ");
214 ss.Write(" target=\"{0}\"", project.Type.ToString().ToLower()); 214 ss.Write(" target=\"{0}\"", project.Type.ToString().ToLower());
215 ss.Write(" debug=\"{0}\"", "${build.debug}"); 215 ss.Write(" debug=\"{0}\"", "${build.debug}");
216 ss.Write(" platform=\"${build.platform}\""); 216 ss.Write(" platform=\"${build.platform}\"");
217 217
218 218
219 foreach (ConfigurationNode conf in project.Configurations) 219 foreach (ConfigurationNode conf in project.Configurations)
220 { 220 {
221 if (conf.Options.KeyFile != "") 221 if (conf.Options.KeyFile != "")
222 { 222 {
223 ss.Write(" keyfile=\"{0}\"", conf.Options.KeyFile); 223 ss.Write(" keyfile=\"{0}\"", conf.Options.KeyFile);
224 break; 224 break;
225 } 225 }
226 } 226 }
227 foreach (ConfigurationNode conf in project.Configurations) 227 foreach (ConfigurationNode conf in project.Configurations)
228 { 228 {
229 ss.Write(" unsafe=\"{0}\"", conf.Options.AllowUnsafe); 229 ss.Write(" unsafe=\"{0}\"", conf.Options.AllowUnsafe);
230 break; 230 break;
231 } 231 }
232 foreach (ConfigurationNode conf in project.Configurations) 232 foreach (ConfigurationNode conf in project.Configurations)
233 { 233 {
234 ss.Write(" warnaserror=\"{0}\"", conf.Options.WarningsAsErrors); 234 ss.Write(" warnaserror=\"{0}\"", conf.Options.WarningsAsErrors);
235 break; 235 break;
236 } 236 }
237 foreach (ConfigurationNode conf in project.Configurations) 237 foreach (ConfigurationNode conf in project.Configurations)
238 { 238 {
239 ss.Write(" define=\"{0}\"", conf.Options.CompilerDefines); 239 ss.Write(" define=\"{0}\"", conf.Options.CompilerDefines);
240 break; 240 break;
241 } 241 }
242 foreach (ConfigurationNode conf in project.Configurations) 242 foreach (ConfigurationNode conf in project.Configurations)
243 { 243 {
244 ss.Write(" nostdlib=\"{0}\"", conf.Options["NoStdLib"]); 244 ss.Write(" nostdlib=\"{0}\"", conf.Options["NoStdLib"]);
245 break; 245 break;
246 } 246 }
247 247
248 ss.Write(" main=\"{0}\"", project.StartupObject); 248 ss.Write(" main=\"{0}\"", project.StartupObject);
249 249
250 foreach (ConfigurationNode conf in project.Configurations) 250 foreach (ConfigurationNode conf in project.Configurations)
251 { 251 {
252 if (GetXmlDocFile(project, conf) != "") 252 if (GetXmlDocFile(project, conf) != "")
253 { 253 {
254 ss.Write(" doc=\"{0}\"", "${project::get-base-directory()}/${build.dir}/" + GetXmlDocFile(project, conf)); 254 ss.Write(" doc=\"{0}\"", "${project::get-base-directory()}/${build.dir}/" + GetXmlDocFile(project, conf));
255 hasDoc = true; 255 hasDoc = true;
256 } 256 }
257 break; 257 break;
258 } 258 }
259 ss.Write(" output=\"{0}", "${project::get-base-directory()}/${build.dir}/${project::get-name()}"); 259 ss.Write(" output=\"{0}", "${project::get-base-directory()}/${build.dir}/${project::get-name()}");
260 if (project.Type == ProjectType.Library) 260 if (project.Type == ProjectType.Library)
261 { 261 {
262 ss.Write(".dll\""); 262 ss.Write(".dll\"");
263 } 263 }
264 else 264 else
265 { 265 {
266 ss.Write(".exe\""); 266 ss.Write(".exe\"");
267 } 267 }
268 if (project.AppIcon != null && project.AppIcon.Length != 0) 268 if (project.AppIcon != null && project.AppIcon.Length != 0)
269 { 269 {
270 ss.Write(" win32icon=\"{0}\"", Helper.NormalizePath(project.AppIcon, '/')); 270 ss.Write(" win32icon=\"{0}\"", Helper.NormalizePath(project.AppIcon, '/'));
271 } 271 }
272 // This disables a very different behavior between VS and NAnt. With Nant, 272 // This disables a very different behavior between VS and NAnt. With Nant,
273 // If you have using System.Xml; it will ensure System.Xml.dll is referenced, 273 // If you have using System.Xml; it will ensure System.Xml.dll is referenced,
274 // but not in VS. This will force the behaviors to match, so when it works 274 // but not in VS. This will force the behaviors to match, so when it works
275 // in nant, it will work in VS. 275 // in nant, it will work in VS.
276 ss.Write(" noconfig=\"true\""); 276 ss.Write(" noconfig=\"true\"");
277 ss.WriteLine(">"); 277 ss.WriteLine(">");
278 ss.WriteLine(" <resources prefix=\"{0}\" dynamicprefix=\"true\" >", project.RootNamespace); 278 ss.WriteLine(" <resources prefix=\"{0}\" dynamicprefix=\"true\" >", project.RootNamespace);
279 foreach (string file in project.Files) 279 foreach (string file in project.Files)
280 { 280 {
281 switch (project.Files.GetBuildAction(file)) 281 switch (project.Files.GetBuildAction(file))
282 { 282 {
283 case BuildAction.EmbeddedResource: 283 case BuildAction.EmbeddedResource:
284 ss.WriteLine(" {0}", "<include name=\"" + Helper.NormalizePath(PrependPath(file), '/') + "\" />"); 284 ss.WriteLine(" {0}", "<include name=\"" + Helper.NormalizePath(PrependPath(file), '/') + "\" />");
285 break; 285 break;
286 default: 286 default:
287 if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) 287 if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings)
288 { 288 {
289 ss.WriteLine(" <include name=\"{0}\" />", file.Substring(0, file.LastIndexOf('.')) + ".resx"); 289 ss.WriteLine(" <include name=\"{0}\" />", file.Substring(0, file.LastIndexOf('.')) + ".resx");
290 } 290 }
291 break; 291 break;
292 } 292 }
293 } 293 }
294 //if (project.Files.GetSubType(file).ToString() != "Code") 294 //if (project.Files.GetSubType(file).ToString() != "Code")
295 //{ 295 //{
296 // ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); 296 // ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx");
297 297
298 ss.WriteLine(" </resources>"); 298 ss.WriteLine(" </resources>");
299 ss.WriteLine(" <sources failonempty=\"true\">"); 299 ss.WriteLine(" <sources failonempty=\"true\">");
300 foreach (string file in project.Files) 300 foreach (string file in project.Files)
301 { 301 {
302 switch (project.Files.GetBuildAction(file)) 302 switch (project.Files.GetBuildAction(file))
303 { 303 {
304 case BuildAction.Compile: 304 case BuildAction.Compile:
305 ss.WriteLine(" <include name=\"" + Helper.NormalizePath(PrependPath(file), '/') + "\" />"); 305 ss.WriteLine(" <include name=\"" + Helper.NormalizePath(PrependPath(file), '/') + "\" />");
306 break; 306 break;
307 default: 307 default:
308 break; 308 break;
309 } 309 }
310 } 310 }
311 ss.WriteLine(" </sources>"); 311 ss.WriteLine(" </sources>");
312 ss.WriteLine(" <references basedir=\"${project::get-base-directory()}\">"); 312 ss.WriteLine(" <references basedir=\"${project::get-base-directory()}\">");
313 ss.WriteLine(" <lib>"); 313 ss.WriteLine(" <lib>");
314 ss.WriteLine(" <include name=\"${project::get-base-directory()}\" />"); 314 ss.WriteLine(" <include name=\"${project::get-base-directory()}\" />");
315 foreach(ReferencePathNode refPath in project.ReferencePaths) 315 foreach(ReferencePathNode refPath in project.ReferencePaths)
316 { 316 {
317 ss.WriteLine(" <include name=\"${project::get-base-directory()}/" + refPath.Path.TrimEnd('/', '\\') + "\" />"); 317 ss.WriteLine(" <include name=\"${project::get-base-directory()}/" + refPath.Path.TrimEnd('/', '\\') + "\" />");
318 } 318 }
319 ss.WriteLine(" </lib>"); 319 ss.WriteLine(" </lib>");
320 foreach (ReferenceNode refr in project.References) 320 foreach (ReferenceNode refr in project.References)
321 { 321 {
322 string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/'); 322 string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReference(solution, project, refr)), '/');
323 if (refr.Path != null) { 323 if (refr.Path != null) {
324 if (ExtensionSpecified(refr.Name)) 324 if (ExtensionSpecified(refr.Name))
325 { 325 {
@@ -334,12 +334,12 @@ namespace Prebuild.Core.Targets
334 { 334 {
335 ss.WriteLine (" <include name=\"" + path + "\" />"); 335 ss.WriteLine (" <include name=\"" + path + "\" />");
336 } 336 }
337 } 337 }
338 ss.WriteLine(" </references>"); 338 ss.WriteLine(" </references>");
339 339
340 ss.WriteLine(" </csc>"); 340 ss.WriteLine(" </csc>");
341 341
342 foreach (ConfigurationNode conf in project.Configurations) 342 foreach (ConfigurationNode conf in project.Configurations)
343 { 343 {
344 if (!String.IsNullOrEmpty(conf.Options.OutputPath)) 344 if (!String.IsNullOrEmpty(conf.Options.OutputPath))
345 { 345 {
@@ -361,170 +361,170 @@ namespace Prebuild.Core.Targets
361 } 361 }
362 } 362 }
363 363
364 ss.WriteLine(" </target>"); 364 ss.WriteLine(" </target>");
365 365
366 ss.WriteLine(" <target name=\"clean\">"); 366 ss.WriteLine(" <target name=\"clean\">");
367 ss.WriteLine(" <delete dir=\"${bin.dir}\" failonerror=\"false\" />"); 367 ss.WriteLine(" <delete dir=\"${bin.dir}\" failonerror=\"false\" />");
368 ss.WriteLine(" <delete dir=\"${obj.dir}\" failonerror=\"false\" />"); 368 ss.WriteLine(" <delete dir=\"${obj.dir}\" failonerror=\"false\" />");
369 ss.WriteLine(" </target>"); 369 ss.WriteLine(" </target>");
370 370
371 ss.WriteLine(" <target name=\"doc\" description=\"Creates documentation.\">"); 371 ss.WriteLine(" <target name=\"doc\" description=\"Creates documentation.\">");
372 if (hasDoc) 372 if (hasDoc)
373 { 373 {
374 ss.WriteLine(" <property name=\"doc.target\" value=\"\" />"); 374 ss.WriteLine(" <property name=\"doc.target\" value=\"\" />");
375 ss.WriteLine(" <if test=\"${platform::is-unix()}\">"); 375 ss.WriteLine(" <if test=\"${platform::is-unix()}\">");
376 ss.WriteLine(" <property name=\"doc.target\" value=\"Web\" />"); 376 ss.WriteLine(" <property name=\"doc.target\" value=\"Web\" />");
377 ss.WriteLine(" </if>"); 377 ss.WriteLine(" </if>");
378 ss.WriteLine(" <ndoc failonerror=\"false\" verbose=\"true\">"); 378 ss.WriteLine(" <ndoc failonerror=\"false\" verbose=\"true\">");
379 ss.WriteLine(" <assemblies basedir=\"${project::get-base-directory()}\">"); 379 ss.WriteLine(" <assemblies basedir=\"${project::get-base-directory()}\">");
380 ss.Write(" <include name=\"${build.dir}/${project::get-name()}"); 380 ss.Write(" <include name=\"${build.dir}/${project::get-name()}");
381 if (project.Type == ProjectType.Library) 381 if (project.Type == ProjectType.Library)
382 { 382 {
383 ss.WriteLine(".dll\" />"); 383 ss.WriteLine(".dll\" />");
384 } 384 }
385 else 385 else
386 { 386 {
387 ss.WriteLine(".exe\" />"); 387 ss.WriteLine(".exe\" />");
388 } 388 }
389 389
390 ss.WriteLine(" </assemblies>"); 390 ss.WriteLine(" </assemblies>");
391 ss.WriteLine(" <summaries basedir=\"${project::get-base-directory()}\">"); 391 ss.WriteLine(" <summaries basedir=\"${project::get-base-directory()}\">");
392 ss.WriteLine(" <include name=\"${build.dir}/${project::get-name()}.xml\"/>"); 392 ss.WriteLine(" <include name=\"${build.dir}/${project::get-name()}.xml\"/>");
393 ss.WriteLine(" </summaries>"); 393 ss.WriteLine(" </summaries>");
394 ss.WriteLine(" <referencepaths basedir=\"${project::get-base-directory()}\">"); 394 ss.WriteLine(" <referencepaths basedir=\"${project::get-base-directory()}\">");
395 ss.WriteLine(" <include name=\"${build.dir}\" />"); 395 ss.WriteLine(" <include name=\"${build.dir}\" />");
396 // foreach(ReferenceNode refr in project.References) 396 // foreach(ReferenceNode refr in project.References)
397 // { 397 // {
398 // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/'); 398 // string path = Helper.NormalizePath(Helper.MakePathRelativeTo(project.FullPath, BuildReferencePath(solution, refr)), '/');
399 // if (path != "") 399 // if (path != "")
400 // { 400 // {
401 // ss.WriteLine(" <include name=\"{0}\" />", path); 401 // ss.WriteLine(" <include name=\"{0}\" />", path);
402 // } 402 // }
403 // } 403 // }
404 ss.WriteLine(" </referencepaths>"); 404 ss.WriteLine(" </referencepaths>");
405 ss.WriteLine(" <documenters>"); 405 ss.WriteLine(" <documenters>");
406 ss.WriteLine(" <documenter name=\"MSDN\">"); 406 ss.WriteLine(" <documenter name=\"MSDN\">");
407 ss.WriteLine(" <property name=\"OutputDirectory\" value=\"${project::get-base-directory()}/${build.dir}/doc/${project::get-name()}\" />"); 407 ss.WriteLine(" <property name=\"OutputDirectory\" value=\"${project::get-base-directory()}/${build.dir}/doc/${project::get-name()}\" />");
408 ss.WriteLine(" <property name=\"OutputTarget\" value=\"${doc.target}\" />"); 408 ss.WriteLine(" <property name=\"OutputTarget\" value=\"${doc.target}\" />");
409 ss.WriteLine(" <property name=\"HtmlHelpName\" value=\"${project::get-name()}\" />"); 409 ss.WriteLine(" <property name=\"HtmlHelpName\" value=\"${project::get-name()}\" />");
410 ss.WriteLine(" <property name=\"IncludeFavorites\" value=\"False\" />"); 410 ss.WriteLine(" <property name=\"IncludeFavorites\" value=\"False\" />");
411 ss.WriteLine(" <property name=\"Title\" value=\"${project::get-name()} SDK Documentation\" />"); 411 ss.WriteLine(" <property name=\"Title\" value=\"${project::get-name()} SDK Documentation\" />");
412 ss.WriteLine(" <property name=\"SplitTOCs\" value=\"False\" />"); 412 ss.WriteLine(" <property name=\"SplitTOCs\" value=\"False\" />");
413 ss.WriteLine(" <property name=\"DefaulTOC\" value=\"\" />"); 413 ss.WriteLine(" <property name=\"DefaulTOC\" value=\"\" />");
414 ss.WriteLine(" <property name=\"ShowVisualBasic\" value=\"True\" />"); 414 ss.WriteLine(" <property name=\"ShowVisualBasic\" value=\"True\" />");
415 ss.WriteLine(" <property name=\"AutoDocumentConstructors\" value=\"True\" />"); 415 ss.WriteLine(" <property name=\"AutoDocumentConstructors\" value=\"True\" />");
416 ss.WriteLine(" <property name=\"ShowMissingSummaries\" value=\"${build.debug}\" />"); 416 ss.WriteLine(" <property name=\"ShowMissingSummaries\" value=\"${build.debug}\" />");
417 ss.WriteLine(" <property name=\"ShowMissingRemarks\" value=\"${build.debug}\" />"); 417 ss.WriteLine(" <property name=\"ShowMissingRemarks\" value=\"${build.debug}\" />");
418 ss.WriteLine(" <property name=\"ShowMissingParams\" value=\"${build.debug}\" />"); 418 ss.WriteLine(" <property name=\"ShowMissingParams\" value=\"${build.debug}\" />");
419 ss.WriteLine(" <property name=\"ShowMissingReturns\" value=\"${build.debug}\" />"); 419 ss.WriteLine(" <property name=\"ShowMissingReturns\" value=\"${build.debug}\" />");
420 ss.WriteLine(" <property name=\"ShowMissingValues\" value=\"${build.debug}\" />"); 420 ss.WriteLine(" <property name=\"ShowMissingValues\" value=\"${build.debug}\" />");
421 ss.WriteLine(" <property name=\"DocumentInternals\" value=\"False\" />"); 421 ss.WriteLine(" <property name=\"DocumentInternals\" value=\"False\" />");
422 ss.WriteLine(" <property name=\"DocumentPrivates\" value=\"False\" />"); 422 ss.WriteLine(" <property name=\"DocumentPrivates\" value=\"False\" />");
423 ss.WriteLine(" <property name=\"DocumentProtected\" value=\"True\" />"); 423 ss.WriteLine(" <property name=\"DocumentProtected\" value=\"True\" />");
424 ss.WriteLine(" <property name=\"DocumentEmptyNamespaces\" value=\"${build.debug}\" />"); 424 ss.WriteLine(" <property name=\"DocumentEmptyNamespaces\" value=\"${build.debug}\" />");
425 ss.WriteLine(" <property name=\"IncludeAssemblyVersion\" value=\"True\" />"); 425 ss.WriteLine(" <property name=\"IncludeAssemblyVersion\" value=\"True\" />");
426 ss.WriteLine(" </documenter>"); 426 ss.WriteLine(" </documenter>");
427 ss.WriteLine(" </documenters>"); 427 ss.WriteLine(" </documenters>");
428 ss.WriteLine(" </ndoc>"); 428 ss.WriteLine(" </ndoc>");
429 } 429 }
430 ss.WriteLine(" </target>"); 430 ss.WriteLine(" </target>");
431 ss.WriteLine("</project>"); 431 ss.WriteLine("</project>");
432 } 432 }
433 m_Kernel.CurrentWorkingDirectory.Pop(); 433 m_Kernel.CurrentWorkingDirectory.Pop();
434 } 434 }
435 435
436 private void WriteCombine(SolutionNode solution) 436 private void WriteCombine(SolutionNode solution)
437 { 437 {
438 m_Kernel.Log.Write("Creating NAnt build files"); 438 m_Kernel.Log.Write("Creating NAnt build files");
439 foreach (ProjectNode project in solution.Projects) 439 foreach (ProjectNode project in solution.Projects)
440 { 440 {
441 if (m_Kernel.AllowProject(project.FilterGroups)) 441 if (m_Kernel.AllowProject(project.FilterGroups))
442 { 442 {
443 m_Kernel.Log.Write("...Creating project: {0}", project.Name); 443 m_Kernel.Log.Write("...Creating project: {0}", project.Name);
444 WriteProject(solution, project); 444 WriteProject(solution, project);
445 } 445 }
446 } 446 }
447 447
448 m_Kernel.Log.Write(""); 448 m_Kernel.Log.Write("");
449 string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build"); 449 string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "build");
450 StreamWriter ss = new StreamWriter(combFile); 450 StreamWriter ss = new StreamWriter(combFile);
451 451
452 m_Kernel.CurrentWorkingDirectory.Push(); 452 m_Kernel.CurrentWorkingDirectory.Push();
453 Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); 453 Helper.SetCurrentDir(Path.GetDirectoryName(combFile));
454 454
455 using (ss) 455 using (ss)
456 { 456 {
457 ss.WriteLine("<?xml version=\"1.0\" ?>"); 457 ss.WriteLine("<?xml version=\"1.0\" ?>");
458 ss.WriteLine("<project name=\"{0}\" default=\"build\">", solution.Name); 458 ss.WriteLine("<project name=\"{0}\" default=\"build\">", solution.Name);
459 ss.WriteLine(" <echo message=\"Using '${nant.settings.currentframework}' Framework\"/>"); 459 ss.WriteLine(" <echo message=\"Using '${nant.settings.currentframework}' Framework\"/>");
460 ss.WriteLine(); 460 ss.WriteLine();
461 461
462 //ss.WriteLine(" <property name=\"dist.dir\" value=\"dist\" />"); 462 //ss.WriteLine(" <property name=\"dist.dir\" value=\"dist\" />");
463 //ss.WriteLine(" <property name=\"source.dir\" value=\"source\" />"); 463 //ss.WriteLine(" <property name=\"source.dir\" value=\"source\" />");
464 ss.WriteLine(" <property name=\"bin.dir\" value=\"bin\" />"); 464 ss.WriteLine(" <property name=\"bin.dir\" value=\"bin\" />");
465 ss.WriteLine(" <property name=\"obj.dir\" value=\"obj\" />"); 465 ss.WriteLine(" <property name=\"obj.dir\" value=\"obj\" />");
466 ss.WriteLine(" <property name=\"doc.dir\" value=\"doc\" />"); 466 ss.WriteLine(" <property name=\"doc.dir\" value=\"doc\" />");
467 ss.WriteLine(" <property name=\"project.main.dir\" value=\"${project::get-base-directory()}\" />"); 467 ss.WriteLine(" <property name=\"project.main.dir\" value=\"${project::get-base-directory()}\" />");
468 468
469 // Use the active configuration, which is the first configuration name in the prebuild file. 469 // Use the active configuration, which is the first configuration name in the prebuild file.
470 Dictionary<string,string> emittedConfigurations = new Dictionary<string, string>(); 470 Dictionary<string,string> emittedConfigurations = new Dictionary<string, string>();
471 471
472 ss.WriteLine(" <property name=\"project.config\" value=\"{0}\" />", solution.ActiveConfig); 472 ss.WriteLine(" <property name=\"project.config\" value=\"{0}\" />", solution.ActiveConfig);
473 ss.WriteLine(); 473 ss.WriteLine();
474 474
475 foreach (ConfigurationNode conf in solution.Configurations) 475 foreach (ConfigurationNode conf in solution.Configurations)
476 { 476 {
477 // If the name isn't in the emitted configurations, we give a high level target to the 477 // If the name isn't in the emitted configurations, we give a high level target to the
478 // platform specific on. This lets "Debug" point to "Debug-AnyCPU". 478 // platform specific on. This lets "Debug" point to "Debug-AnyCPU".
479 if (!emittedConfigurations.ContainsKey(conf.Name)) 479 if (!emittedConfigurations.ContainsKey(conf.Name))
480 { 480 {
481 // Add it to the dictionary so we only emit one. 481 // Add it to the dictionary so we only emit one.
482 emittedConfigurations.Add(conf.Name, conf.Platform); 482 emittedConfigurations.Add(conf.Name, conf.Platform);
483 483
484 // Write out the target block. 484 // Write out the target block.
485 ss.WriteLine(" <target name=\"{0}\" description=\"{0}|{1}\" depends=\"{0}-{1}\">", conf.Name, conf.Platform); 485 ss.WriteLine(" <target name=\"{0}\" description=\"{0}|{1}\" depends=\"{0}-{1}\">", conf.Name, conf.Platform);
486 ss.WriteLine(" </target>"); 486 ss.WriteLine(" </target>");
487 ss.WriteLine(); 487 ss.WriteLine();
488 } 488 }
489 489
490 // Write out the target for the configuration. 490 // Write out the target for the configuration.
491 ss.WriteLine(" <target name=\"{0}-{1}\" description=\"{0}|{1}\">", conf.Name, conf.Platform); 491 ss.WriteLine(" <target name=\"{0}-{1}\" description=\"{0}|{1}\">", conf.Name, conf.Platform);
492 ss.WriteLine(" <property name=\"project.config\" value=\"{0}\" />", conf.Name); 492 ss.WriteLine(" <property name=\"project.config\" value=\"{0}\" />", conf.Name);
493 ss.WriteLine(" <property name=\"build.debug\" value=\"{0}\" />", conf.Options["DebugInformation"].ToString().ToLower()); 493 ss.WriteLine(" <property name=\"build.debug\" value=\"{0}\" />", conf.Options["DebugInformation"].ToString().ToLower());
494 ss.WriteLine("\t\t <property name=\"build.platform\" value=\"{0}\" />", conf.Platform); 494 ss.WriteLine("\t\t <property name=\"build.platform\" value=\"{0}\" />", conf.Platform);
495 ss.WriteLine(" </target>"); 495 ss.WriteLine(" </target>");
496 ss.WriteLine(); 496 ss.WriteLine();
497 } 497 }
498 498
499 ss.WriteLine(" <target name=\"net-1.1\" description=\"Sets framework to .NET 1.1\">"); 499 ss.WriteLine(" <target name=\"net-1.1\" description=\"Sets framework to .NET 1.1\">");
500 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"net-1.1\" />"); 500 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"net-1.1\" />");
501 ss.WriteLine(" </target>"); 501 ss.WriteLine(" </target>");
502 ss.WriteLine(); 502 ss.WriteLine();
503 503
504 ss.WriteLine(" <target name=\"net-2.0\" description=\"Sets framework to .NET 2.0\">"); 504 ss.WriteLine(" <target name=\"net-2.0\" description=\"Sets framework to .NET 2.0\">");
505 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"net-2.0\" />"); 505 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"net-2.0\" />");
506 ss.WriteLine(" </target>"); 506 ss.WriteLine(" </target>");
507 ss.WriteLine(); 507 ss.WriteLine();
508 508
509 ss.WriteLine(" <target name=\"net-3.5\" description=\"Sets framework to .NET 3.5\">"); 509 ss.WriteLine(" <target name=\"net-3.5\" description=\"Sets framework to .NET 3.5\">");
510 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"net-3.5\" />"); 510 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"net-3.5\" />");
511 ss.WriteLine(" </target>"); 511 ss.WriteLine(" </target>");
512 ss.WriteLine(); 512 ss.WriteLine();
513 513
514 ss.WriteLine(" <target name=\"mono-1.0\" description=\"Sets framework to mono 1.0\">"); 514 ss.WriteLine(" <target name=\"mono-1.0\" description=\"Sets framework to mono 1.0\">");
515 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"mono-1.0\" />"); 515 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"mono-1.0\" />");
516 ss.WriteLine(" </target>"); 516 ss.WriteLine(" </target>");
517 ss.WriteLine(); 517 ss.WriteLine();
518 518
519 ss.WriteLine(" <target name=\"mono-2.0\" description=\"Sets framework to mono 2.0\">"); 519 ss.WriteLine(" <target name=\"mono-2.0\" description=\"Sets framework to mono 2.0\">");
520 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"mono-2.0\" />"); 520 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"mono-2.0\" />");
521 ss.WriteLine(" </target>"); 521 ss.WriteLine(" </target>");
522 ss.WriteLine(); 522 ss.WriteLine();
523 523
524 ss.WriteLine(" <target name=\"mono-3.5\" description=\"Sets framework to mono 3.5\">"); 524 ss.WriteLine(" <target name=\"mono-3.5\" description=\"Sets framework to mono 3.5\">");
525 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"mono-3.5\" />"); 525 ss.WriteLine(" <property name=\"nant.settings.currentframework\" value=\"mono-3.5\" />");
526 ss.WriteLine(" </target>"); 526 ss.WriteLine(" </target>");
527 ss.WriteLine(); 527 ss.WriteLine();
528 528
529 ss.WriteLine(" <target name=\"init\" description=\"\">"); 529 ss.WriteLine(" <target name=\"init\" description=\"\">");
530 ss.WriteLine(" <call target=\"${project.config}\" />"); 530 ss.WriteLine(" <call target=\"${project.config}\" />");
@@ -625,7 +625,7 @@ namespace Prebuild.Core.Targets
625 } 625 }
626 } 626 }
627 627
628 ss.WriteLine(" <delete dir=\"${obj.dir}\" failonerror=\"false\" />"); 628 ss.WriteLine(" <delete dir=\"${obj.dir}\" failonerror=\"false\" />");
629 foreach (ProjectNode project in solution.Projects) 629 foreach (ProjectNode project in solution.Projects)
630 { 630 {
631 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); 631 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath);
diff --git a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs
index 66dd1bc..40a210d 100644
--- a/Prebuild/src/Core/Targets/SharpDevelop2Target.cs
+++ b/Prebuild/src/Core/Targets/SharpDevelop2Target.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -29,11 +29,11 @@ using Prebuild.Core.Attributes;
29 29
30namespace Prebuild.Core.Targets 30namespace Prebuild.Core.Targets
31{ 31{
32 /// <summary> 32 /// <summary>
33 /// 33 ///
34 /// </summary> 34 /// </summary>
35 [Target("sharpdev2")] 35 [Target("sharpdev2")]
36 public class SharpDevelop2Target : VS2005Target 36 public class SharpDevelop2Target : VS2005Target
37 { 37 {
38 #region Properties 38 #region Properties
39 public override string VersionName 39 public override string VersionName
@@ -45,38 +45,38 @@ namespace Prebuild.Core.Targets
45 } 45 }
46 #endregion 46 #endregion
47 47
48 #region Public Methods 48 #region Public Methods
49 49
50 /// <summary> 50 /// <summary>
51 /// Writes the specified kern. 51 /// Writes the specified kern.
52 /// </summary> 52 /// </summary>
53 /// <param name="kern">The kern.</param> 53 /// <param name="kern">The kern.</param>
54 public override void Write(Kernel kern) 54 public override void Write(Kernel kern)
55 { 55 {
56 base.Write(kern); 56 base.Write(kern);
57 } 57 }
58 58
59 /// <summary> 59 /// <summary>
60 /// Cleans the specified kern. 60 /// Cleans the specified kern.
61 /// </summary> 61 /// </summary>
62 /// <param name="kern">The kern.</param> 62 /// <param name="kern">The kern.</param>
63 public override void Clean(Kernel kern) 63 public override void Clean(Kernel kern)
64 { 64 {
65 base.Clean(kern); 65 base.Clean(kern);
66 } 66 }
67 67
68 /// <summary> 68 /// <summary>
69 /// Gets the name. 69 /// Gets the name.
70 /// </summary> 70 /// </summary>
71 /// <value>The name.</value> 71 /// <value>The name.</value>
72 public override string Name 72 public override string Name
73 { 73 {
74 get 74 get
75 { 75 {
76 return "sharpdev2"; 76 return "sharpdev2";
77 } 77 }
78 } 78 }
79 79
80 #endregion 80 #endregion
81 } 81 }
82} 82}
diff --git a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs
index 8e32050..acab9f4 100644
--- a/Prebuild/src/Core/Targets/SharpDevelopTarget.cs
+++ b/Prebuild/src/Core/Targets/SharpDevelopTarget.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (da
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,392 +34,392 @@ using Prebuild.Core.Utilities;
34 34
35namespace Prebuild.Core.Targets 35namespace Prebuild.Core.Targets
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// 38 ///
39 /// </summary> 39 /// </summary>
40 [Target("sharpdev")] 40 [Target("sharpdev")]
41 public class SharpDevelopTarget : ITarget 41 public class SharpDevelopTarget : ITarget
42 { 42 {
43 #region Fields 43 #region Fields
44 44
45 private Kernel m_Kernel; 45 private Kernel m_Kernel;
46 46
47 #endregion 47 #endregion
48 48
49 #region Private Methods 49 #region Private Methods
50 50
51 private static string PrependPath(string path) 51 private static string PrependPath(string path)
52 { 52 {
53 string tmpPath = Helper.NormalizePath(path, '/'); 53 string tmpPath = Helper.NormalizePath(path, '/');
54 Regex regex = new Regex(@"(\w):/(\w+)"); 54 Regex regex = new Regex(@"(\w):/(\w+)");
55 Match match = regex.Match(tmpPath); 55 Match match = regex.Match(tmpPath);
56 if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/') 56 if(match.Success || tmpPath[0] == '.' || tmpPath[0] == '/')
57 { 57 {
58 tmpPath = Helper.NormalizePath(tmpPath); 58 tmpPath = Helper.NormalizePath(tmpPath);
59 } 59 }
60 else 60 else
61 { 61 {
62 tmpPath = Helper.NormalizePath("./" + tmpPath); 62 tmpPath = Helper.NormalizePath("./" + tmpPath);
63 } 63 }
64 64
65 return tmpPath; 65 return tmpPath;
66 } 66 }
67 67
68 private static string BuildReference(SolutionNode solution, ReferenceNode refr) 68 private static string BuildReference(SolutionNode solution, ReferenceNode refr)
69 { 69 {
70 string ret = "<Reference type=\""; 70 string ret = "<Reference type=\"";
71 if(solution.ProjectsTable.ContainsKey(refr.Name)) 71 if(solution.ProjectsTable.ContainsKey(refr.Name))
72 { 72 {
73 ret += "Project\" refto=\"" + refr.Name; 73 ret += "Project\" refto=\"" + refr.Name;
74 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; 74 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />";
75 } 75 }
76 else 76 else
77 { 77 {
78 ProjectNode project = (ProjectNode)refr.Parent; 78 ProjectNode project = (ProjectNode)refr.Parent;
79 string fileRef = FindFileReference(refr.Name, project); 79 string fileRef = FindFileReference(refr.Name, project);
80 80
81 if(refr.Path != null || fileRef != null) 81 if(refr.Path != null || fileRef != null)
82 { 82 {
83 ret += "Assembly\" refto=\""; 83 ret += "Assembly\" refto=\"";
84 84
85 string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef; 85 string finalPath = (refr.Path != null) ? Helper.MakeFilePath(refr.Path, refr.Name, "dll") : fileRef;
86 86
87 ret += finalPath; 87 ret += finalPath;
88 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; 88 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />";
89 return ret; 89 return ret;
90 } 90 }
91 91
92 ret += "Gac\" refto=\""; 92 ret += "Gac\" refto=\"";
93 try 93 try
94 { 94 {
95 //Assembly assem = Assembly.Load(refr.Name); 95 //Assembly assem = Assembly.Load(refr.Name);
96 ret += refr.Name;// assem.FullName; 96 ret += refr.Name;// assem.FullName;
97 } 97 }
98 catch (System.NullReferenceException e) 98 catch (System.NullReferenceException e)
99 { 99 {
100 e.ToString(); 100 e.ToString();
101 ret += refr.Name; 101 ret += refr.Name;
102 } 102 }
103 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />"; 103 ret += "\" localcopy=\"" + refr.LocalCopy.ToString() + "\" />";
104 } 104 }
105 105
106 return ret; 106 return ret;
107 } 107 }
108 108
109 private static string FindFileReference(string refName, ProjectNode project) 109 private static string FindFileReference(string refName, ProjectNode project)
110 { 110 {
111 foreach(ReferencePathNode refPath in project.ReferencePaths) 111 foreach(ReferencePathNode refPath in project.ReferencePaths)
112 { 112 {
113 string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll"); 113 string fullPath = Helper.MakeFilePath(refPath.Path, refName, "dll");
114 114
115 if(File.Exists(fullPath)) 115 if(File.Exists(fullPath))
116 { 116 {
117 return fullPath; 117 return fullPath;
118 } 118 }
119 } 119 }
120 120
121 return null; 121 return null;
122 } 122 }
123 123
124 /// <summary> 124 /// <summary>
125 /// Gets the XML doc file. 125 /// Gets the XML doc file.
126 /// </summary> 126 /// </summary>
127 /// <param name="project">The project.</param> 127 /// <param name="project">The project.</param>
128 /// <param name="conf">The conf.</param> 128 /// <param name="conf">The conf.</param>
129 /// <returns></returns> 129 /// <returns></returns>
130 public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf) 130 public static string GenerateXmlDocFile(ProjectNode project, ConfigurationNode conf)
131 { 131 {
132 if( conf == null ) 132 if( conf == null )
133 { 133 {
134 throw new ArgumentNullException("conf"); 134 throw new ArgumentNullException("conf");
135 } 135 }
136 if( project == null ) 136 if( project == null )
137 { 137 {
138 throw new ArgumentNullException("project"); 138 throw new ArgumentNullException("project");
139 } 139 }
140 string docFile = (string)conf.Options["XmlDocFile"]; 140 string docFile = (string)conf.Options["XmlDocFile"];
141 if(docFile != null && docFile.Length == 0)//default to assembly name if not specified 141 if(docFile != null && docFile.Length == 0)//default to assembly name if not specified
142 { 142 {
143 return "False"; 143 return "False";
144 } 144 }
145 return "True"; 145 return "True";
146 } 146 }
147 147
148 private void WriteProject(SolutionNode solution, ProjectNode project) 148 private void WriteProject(SolutionNode solution, ProjectNode project)
149 { 149 {
150 string csComp = "Csc"; 150 string csComp = "Csc";
151 string netRuntime = "MsNet"; 151 string netRuntime = "MsNet";
152 if(project.Runtime == ClrRuntime.Mono) 152 if(project.Runtime == ClrRuntime.Mono)
153 { 153 {
154 csComp = "Mcs"; 154 csComp = "Mcs";
155 netRuntime = "Mono"; 155 netRuntime = "Mono";
156 } 156 }
157 157
158 string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); 158 string projFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx");
159 StreamWriter ss = new StreamWriter(projFile); 159 StreamWriter ss = new StreamWriter(projFile);
160 160
161 m_Kernel.CurrentWorkingDirectory.Push(); 161 m_Kernel.CurrentWorkingDirectory.Push();
162 Helper.SetCurrentDir(Path.GetDirectoryName(projFile)); 162 Helper.SetCurrentDir(Path.GetDirectoryName(projFile));
163 163
164 using(ss) 164 using(ss)
165 { 165 {
166 ss.WriteLine( 166 ss.WriteLine(
167 "<Project name=\"{0}\" standardNamespace=\"{1}\" description=\"\" newfilesearch=\"None\" enableviewstate=\"True\" version=\"1.1\" projecttype=\"C#\">", 167 "<Project name=\"{0}\" standardNamespace=\"{1}\" description=\"\" newfilesearch=\"None\" enableviewstate=\"True\" version=\"1.1\" projecttype=\"C#\">",
168 project.Name, 168 project.Name,
169 project.RootNamespace 169 project.RootNamespace
170 ); 170 );
171 171
172 ss.WriteLine(" <Contents>"); 172 ss.WriteLine(" <Contents>");
173 foreach(string file in project.Files) 173 foreach(string file in project.Files)
174 { 174 {
175 string buildAction = "Compile"; 175 string buildAction = "Compile";
176 switch(project.Files.GetBuildAction(file)) 176 switch(project.Files.GetBuildAction(file))
177 { 177 {
178 case BuildAction.None: 178 case BuildAction.None:
179 buildAction = "Nothing"; 179 buildAction = "Nothing";
180 break; 180 break;
181 181
182 case BuildAction.Content: 182 case BuildAction.Content:
183 buildAction = "Exclude"; 183 buildAction = "Exclude";
184 break; 184 break;
185 185
186 case BuildAction.EmbeddedResource: 186 case BuildAction.EmbeddedResource:
187 buildAction = "EmbedAsResource"; 187 buildAction = "EmbedAsResource";
188 break; 188 break;
189 189
190 default: 190 default:
191 buildAction = "Compile"; 191 buildAction = "Compile";
192 break; 192 break;
193 } 193 }
194 194
195 // Sort of a hack, we try and resolve the path and make it relative, if we can. 195 // Sort of a hack, we try and resolve the path and make it relative, if we can.
196 string filePath = PrependPath(file); 196 string filePath = PrependPath(file);
197 ss.WriteLine(" <File name=\"{0}\" subtype=\"Code\" buildaction=\"{1}\" dependson=\"\" data=\"\" />", filePath, buildAction); 197 ss.WriteLine(" <File name=\"{0}\" subtype=\"Code\" buildaction=\"{1}\" dependson=\"\" data=\"\" />", filePath, buildAction);
198 } 198 }
199 ss.WriteLine(" </Contents>"); 199 ss.WriteLine(" </Contents>");
200 200
201 ss.WriteLine(" <References>"); 201 ss.WriteLine(" <References>");
202 foreach(ReferenceNode refr in project.References) 202 foreach(ReferenceNode refr in project.References)
203 { 203 {
204 ss.WriteLine(" {0}", BuildReference(solution, refr)); 204 ss.WriteLine(" {0}", BuildReference(solution, refr));
205 } 205 }
206 ss.WriteLine(" </References>"); 206 ss.WriteLine(" </References>");
207 207
208 ss.Write(" <DeploymentInformation"); 208 ss.Write(" <DeploymentInformation");
209 ss.Write(" target=\"\""); 209 ss.Write(" target=\"\"");
210 ss.Write(" script=\"\""); 210 ss.Write(" script=\"\"");
211 ss.Write(" strategy=\"File\""); 211 ss.Write(" strategy=\"File\"");
212 ss.WriteLine(" />"); 212 ss.WriteLine(" />");
213 213
214 int count = 0; 214 int count = 0;
215 215
216 ss.WriteLine(" <Configurations active=\"{0}\">", solution.ActiveConfig); 216 ss.WriteLine(" <Configurations active=\"{0}\">", solution.ActiveConfig);
217 217
218 foreach(ConfigurationNode conf in project.Configurations) 218 foreach(ConfigurationNode conf in project.Configurations)
219 { 219 {
220 ss.Write(" <Configuration"); 220 ss.Write(" <Configuration");
221 ss.Write(" runwithwarnings=\"True\""); 221 ss.Write(" runwithwarnings=\"True\"");
222 ss.Write(" name=\"{0}\"", conf.Name); 222 ss.Write(" name=\"{0}\"", conf.Name);
223 ss.WriteLine(">"); 223 ss.WriteLine(">");
224 ss.Write(" <CodeGeneration"); 224 ss.Write(" <CodeGeneration");
225 ss.Write(" runtime=\"{0}\"", netRuntime); 225 ss.Write(" runtime=\"{0}\"", netRuntime);
226 ss.Write(" compiler=\"{0}\"", csComp); 226 ss.Write(" compiler=\"{0}\"", csComp);
227 ss.Write(" compilerversion=\"\""); 227 ss.Write(" compilerversion=\"\"");
228 ss.Write(" warninglevel=\"{0}\"", conf.Options["WarningLevel"]); 228 ss.Write(" warninglevel=\"{0}\"", conf.Options["WarningLevel"]);
229 ss.Write(" nowarn=\"{0}\"", conf.Options["SuppressWarnings"]); 229 ss.Write(" nowarn=\"{0}\"", conf.Options["SuppressWarnings"]);
230 ss.Write(" includedebuginformation=\"{0}\"", conf.Options["DebugInformation"]); 230 ss.Write(" includedebuginformation=\"{0}\"", conf.Options["DebugInformation"]);
231 ss.Write(" optimize=\"{0}\"", conf.Options["OptimizeCode"]); 231 ss.Write(" optimize=\"{0}\"", conf.Options["OptimizeCode"]);
232 ss.Write(" unsafecodeallowed=\"{0}\"", conf.Options["AllowUnsafe"]); 232 ss.Write(" unsafecodeallowed=\"{0}\"", conf.Options["AllowUnsafe"]);
233 ss.Write(" generateoverflowchecks=\"{0}\"", conf.Options["CheckUnderflowOverflow"]); 233 ss.Write(" generateoverflowchecks=\"{0}\"", conf.Options["CheckUnderflowOverflow"]);
234 ss.Write(" mainclass=\"{0}\"", project.StartupObject); 234 ss.Write(" mainclass=\"{0}\"", project.StartupObject);
235 ss.Write(" target=\"{0}\"", project.Type); 235 ss.Write(" target=\"{0}\"", project.Type);
236 ss.Write(" definesymbols=\"{0}\"", conf.Options["CompilerDefines"]); 236 ss.Write(" definesymbols=\"{0}\"", conf.Options["CompilerDefines"]);
237 ss.Write(" generatexmldocumentation=\"{0}\"", GenerateXmlDocFile(project, conf)); 237 ss.Write(" generatexmldocumentation=\"{0}\"", GenerateXmlDocFile(project, conf));
238 ss.Write(" win32Icon=\"{0}\"", Helper.NormalizePath(".\\" + project.AppIcon)); 238 ss.Write(" win32Icon=\"{0}\"", Helper.NormalizePath(".\\" + project.AppIcon));
239 ss.Write(" noconfig=\"{0}\"", "False"); 239 ss.Write(" noconfig=\"{0}\"", "False");
240 ss.Write(" nostdlib=\"{0}\"", conf.Options["NoStdLib"]); 240 ss.Write(" nostdlib=\"{0}\"", conf.Options["NoStdLib"]);
241 ss.WriteLine(" />"); 241 ss.WriteLine(" />");
242 242
243 ss.Write(" <Execution"); 243 ss.Write(" <Execution");
244 ss.Write(" commandlineparameters=\"\""); 244 ss.Write(" commandlineparameters=\"\"");
245 ss.Write(" consolepause=\"True\""); 245 ss.Write(" consolepause=\"True\"");
246 ss.WriteLine(" />"); 246 ss.WriteLine(" />");
247 247
248 ss.Write(" <Output"); 248 ss.Write(" <Output");
249 ss.Write(" directory=\".\\{0}\"", Helper.NormalizePath(conf.Options["OutputPath"].ToString())); 249 ss.Write(" directory=\".\\{0}\"", Helper.NormalizePath(conf.Options["OutputPath"].ToString()));
250 ss.Write(" assembly=\"{0}\"", project.AssemblyName); 250 ss.Write(" assembly=\"{0}\"", project.AssemblyName);
251 ss.Write(" executeScript=\"{0}\"", conf.Options["RunScript"]); 251 ss.Write(" executeScript=\"{0}\"", conf.Options["RunScript"]);
252 if (conf.Options["PreBuildEvent"] != null && conf.Options["PreBuildEvent"].ToString().Length != 0) 252 if (conf.Options["PreBuildEvent"] != null && conf.Options["PreBuildEvent"].ToString().Length != 0)
253 { 253 {
254 ss.Write(" executeBeforeBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PreBuildEvent"].ToString())); 254 ss.Write(" executeBeforeBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PreBuildEvent"].ToString()));
255 } 255 }
256 else 256 else
257 { 257 {
258 ss.Write(" executeBeforeBuild=\"{0}\"", conf.Options["PreBuildEvent"]); 258 ss.Write(" executeBeforeBuild=\"{0}\"", conf.Options["PreBuildEvent"]);
259 } 259 }
260 if (conf.Options["PostBuildEvent"] != null && conf.Options["PostBuildEvent"].ToString().Length != 0) 260 if (conf.Options["PostBuildEvent"] != null && conf.Options["PostBuildEvent"].ToString().Length != 0)
261 { 261 {
262 ss.Write(" executeAfterBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PostBuildEvent"].ToString())); 262 ss.Write(" executeAfterBuild=\"{0}\"", Helper.NormalizePath(conf.Options["PostBuildEvent"].ToString()));
263 } 263 }
264 else 264 else
265 { 265 {
266 ss.Write(" executeAfterBuild=\"{0}\"", conf.Options["PostBuildEvent"]); 266 ss.Write(" executeAfterBuild=\"{0}\"", conf.Options["PostBuildEvent"]);
267 } 267 }
268 ss.Write(" executeBeforeBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]); 268 ss.Write(" executeBeforeBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]);
269 ss.Write(" executeAfterBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]); 269 ss.Write(" executeAfterBuildArguments=\"{0}\"", conf.Options["PreBuildEventArgs"]);
270 ss.WriteLine(" />"); 270 ss.WriteLine(" />");
271 ss.WriteLine(" </Configuration>"); 271 ss.WriteLine(" </Configuration>");
272 272
273 count++; 273 count++;
274 } 274 }
275 ss.WriteLine(" </Configurations>"); 275 ss.WriteLine(" </Configurations>");
276 ss.WriteLine("</Project>"); 276 ss.WriteLine("</Project>");
277 } 277 }
278 278
279 m_Kernel.CurrentWorkingDirectory.Pop(); 279 m_Kernel.CurrentWorkingDirectory.Pop();
280 } 280 }
281 281
282 private void WriteCombine(SolutionNode solution) 282 private void WriteCombine(SolutionNode solution)
283 { 283 {
284 m_Kernel.Log.Write("Creating SharpDevelop combine and project files"); 284 m_Kernel.Log.Write("Creating SharpDevelop combine and project files");
285 foreach(ProjectNode project in solution.Projects) 285 foreach(ProjectNode project in solution.Projects)
286 { 286 {
287 if(m_Kernel.AllowProject(project.FilterGroups)) 287 if(m_Kernel.AllowProject(project.FilterGroups))
288 { 288 {
289 m_Kernel.Log.Write("...Creating project: {0}", project.Name); 289 m_Kernel.Log.Write("...Creating project: {0}", project.Name);
290 WriteProject(solution, project); 290 WriteProject(solution, project);
291 } 291 }
292 } 292 }
293 293
294 m_Kernel.Log.Write(""); 294 m_Kernel.Log.Write("");
295 string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); 295 string combFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx");
296 StreamWriter ss = new StreamWriter(combFile); 296 StreamWriter ss = new StreamWriter(combFile);
297 297
298 m_Kernel.CurrentWorkingDirectory.Push(); 298 m_Kernel.CurrentWorkingDirectory.Push();
299 Helper.SetCurrentDir(Path.GetDirectoryName(combFile)); 299 Helper.SetCurrentDir(Path.GetDirectoryName(combFile));
300 300
301 using(ss) 301 using(ss)
302 { 302 {
303 ss.WriteLine("<Combine fileversion=\"1.0\" name=\"{0}\" description=\"\">", solution.Name); 303 ss.WriteLine("<Combine fileversion=\"1.0\" name=\"{0}\" description=\"\">", solution.Name);
304 304
305 int count = 0; 305 int count = 0;
306 foreach(ProjectNode project in solution.Projects) 306 foreach(ProjectNode project in solution.Projects)
307 { 307 {
308 if(count == 0) 308 if(count == 0)
309 ss.WriteLine(" <StartMode startupentry=\"{0}\" single=\"True\">", project.Name); 309 ss.WriteLine(" <StartMode startupentry=\"{0}\" single=\"True\">", project.Name);
310 310
311 ss.WriteLine(" <Execute entry=\"{0}\" type=\"None\" />", project.Name); 311 ss.WriteLine(" <Execute entry=\"{0}\" type=\"None\" />", project.Name);
312 count++; 312 count++;
313 } 313 }
314 ss.WriteLine(" </StartMode>"); 314 ss.WriteLine(" </StartMode>");
315 315
316 ss.WriteLine(" <Entries>"); 316 ss.WriteLine(" <Entries>");
317 foreach(ProjectNode project in solution.Projects) 317 foreach(ProjectNode project in solution.Projects)
318 { 318 {
319 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); 319 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath);
320 ss.WriteLine(" <Entry filename=\"{0}\" />", 320 ss.WriteLine(" <Entry filename=\"{0}\" />",
321 Helper.MakeFilePath(path, project.Name, "prjx")); 321 Helper.MakeFilePath(path, project.Name, "prjx"));
322 } 322 }
323 ss.WriteLine(" </Entries>"); 323 ss.WriteLine(" </Entries>");
324 324
325 count = 0; 325 count = 0;
326 foreach(ConfigurationNode conf in solution.Configurations) 326 foreach(ConfigurationNode conf in solution.Configurations)
327 { 327 {
328 if(count == 0) 328 if(count == 0)
329 { 329 {
330 ss.WriteLine(" <Configurations active=\"{0}\">", conf.Name); 330 ss.WriteLine(" <Configurations active=\"{0}\">", conf.Name);
331 } 331 }
332 332
333 ss.WriteLine(" <Configuration name=\"{0}\">", conf.Name); 333 ss.WriteLine(" <Configuration name=\"{0}\">", conf.Name);
334 foreach(ProjectNode project in solution.Projects) 334 foreach(ProjectNode project in solution.Projects)
335 { 335 {
336 ss.WriteLine(" <Entry name=\"{0}\" configurationname=\"{1}\" build=\"True\" />", project.Name, conf.Name); 336 ss.WriteLine(" <Entry name=\"{0}\" configurationname=\"{1}\" build=\"True\" />", project.Name, conf.Name);
337 } 337 }
338 ss.WriteLine(" </Configuration>"); 338 ss.WriteLine(" </Configuration>");
339 339
340 count++; 340 count++;
341 } 341 }
342 ss.WriteLine(" </Configurations>"); 342 ss.WriteLine(" </Configurations>");
343 ss.WriteLine("</Combine>"); 343 ss.WriteLine("</Combine>");
344 } 344 }
345 345
346 m_Kernel.CurrentWorkingDirectory.Pop(); 346 m_Kernel.CurrentWorkingDirectory.Pop();
347 } 347 }
348 348
349 private void CleanProject(ProjectNode project) 349 private void CleanProject(ProjectNode project)
350 { 350 {
351 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); 351 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name);
352 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx"); 352 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "prjx");
353 Helper.DeleteIfExists(projectFile); 353 Helper.DeleteIfExists(projectFile);
354 } 354 }
355 355
356 private void CleanSolution(SolutionNode solution) 356 private void CleanSolution(SolutionNode solution)
357 { 357 {
358 m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name); 358 m_Kernel.Log.Write("Cleaning SharpDevelop combine and project files for", solution.Name);
359 359
360 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx"); 360 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "cmbx");
361 Helper.DeleteIfExists(slnFile); 361 Helper.DeleteIfExists(slnFile);
362 362
363 foreach(ProjectNode project in solution.Projects) 363 foreach(ProjectNode project in solution.Projects)
364 { 364 {
365 CleanProject(project); 365 CleanProject(project);
366 } 366 }
367 367
368 m_Kernel.Log.Write(""); 368 m_Kernel.Log.Write("");
369 } 369 }
370 370
371 #endregion 371 #endregion
372 372
373 #region ITarget Members 373 #region ITarget Members
374 374
375 /// <summary> 375 /// <summary>
376 /// Writes the specified kern. 376 /// Writes the specified kern.
377 /// </summary> 377 /// </summary>
378 /// <param name="kern">The kern.</param> 378 /// <param name="kern">The kern.</param>
379 public void Write(Kernel kern) 379 public void Write(Kernel kern)
380 { 380 {
381 if( kern == null ) 381 if( kern == null )
382 { 382 {
383 throw new ArgumentNullException("kern"); 383 throw new ArgumentNullException("kern");
384 } 384 }
385 m_Kernel = kern; 385 m_Kernel = kern;
386 foreach(SolutionNode solution in kern.Solutions) 386 foreach(SolutionNode solution in kern.Solutions)
387 { 387 {
388 WriteCombine(solution); 388 WriteCombine(solution);
389 } 389 }
390 m_Kernel = null; 390 m_Kernel = null;
391 } 391 }
392 392
393 /// <summary> 393 /// <summary>
394 /// Cleans the specified kern. 394 /// Cleans the specified kern.
395 /// </summary> 395 /// </summary>
396 /// <param name="kern">The kern.</param> 396 /// <param name="kern">The kern.</param>
397 public virtual void Clean(Kernel kern) 397 public virtual void Clean(Kernel kern)
398 { 398 {
399 if( kern == null ) 399 if( kern == null )
400 { 400 {
401 throw new ArgumentNullException("kern"); 401 throw new ArgumentNullException("kern");
402 } 402 }
403 m_Kernel = kern; 403 m_Kernel = kern;
404 foreach(SolutionNode sol in kern.Solutions) 404 foreach(SolutionNode sol in kern.Solutions)
405 { 405 {
406 CleanSolution(sol); 406 CleanSolution(sol);
407 } 407 }
408 m_Kernel = null; 408 m_Kernel = null;
409 } 409 }
410 410
411 /// <summary> 411 /// <summary>
412 /// Gets the name. 412 /// Gets the name.
413 /// </summary> 413 /// </summary>
414 /// <value>The name.</value> 414 /// <value>The name.</value>
415 public string Name 415 public string Name
416 { 416 {
417 get 417 get
418 { 418 {
419 return "sharpdev"; 419 return "sharpdev";
420 } 420 }
421 } 421 }
422 422
423 #endregion 423 #endregion
424 } 424 }
425} 425}
diff --git a/Prebuild/src/Core/Targets/ToolInfo.cs b/Prebuild/src/Core/Targets/ToolInfo.cs
index 935c674..984d20e 100644
--- a/Prebuild/src/Core/Targets/ToolInfo.cs
+++ b/Prebuild/src/Core/Targets/ToolInfo.cs
@@ -4,194 +4,194 @@ using System.Text;
4 4
5namespace Prebuild.Core.Targets 5namespace Prebuild.Core.Targets
6{ 6{
7 /// <summary> 7 /// <summary>
8 /// 8 ///
9 /// </summary> 9 /// </summary>
10 public struct ToolInfo 10 public struct ToolInfo
11 { 11 {
12 string name; 12 string name;
13 string guid; 13 string guid;
14 string fileExtension; 14 string fileExtension;
15 string xmlTag; 15 string xmlTag;
16 string importProject; 16 string importProject;
17 17
18 /// <summary> 18 /// <summary>
19 /// Gets or sets the name. 19 /// Gets or sets the name.
20 /// </summary> 20 /// </summary>
21 /// <value>The name.</value> 21 /// <value>The name.</value>
22 public string Name 22 public string Name
23 { 23 {
24 get 24 get
25 { 25 {
26 return name; 26 return name;
27 } 27 }
28 set 28 set
29 { 29 {
30 name = value; 30 name = value;
31 } 31 }
32 } 32 }
33 33
34 /// <summary> 34 /// <summary>
35 /// Gets or sets the GUID. 35 /// Gets or sets the GUID.
36 /// </summary> 36 /// </summary>
37 /// <value>The GUID.</value> 37 /// <value>The GUID.</value>
38 public string Guid 38 public string Guid
39 { 39 {
40 get 40 get
41 { 41 {
42 return guid; 42 return guid;
43 } 43 }
44 set 44 set
45 { 45 {
46 guid = value; 46 guid = value;
47 } 47 }
48 } 48 }
49 49
50 /// <summary> 50 /// <summary>
51 /// Gets or sets the file extension. 51 /// Gets or sets the file extension.
52 /// </summary> 52 /// </summary>
53 /// <value>The file extension.</value> 53 /// <value>The file extension.</value>
54 public string FileExtension 54 public string FileExtension
55 { 55 {
56 get 56 get
57 { 57 {
58 return fileExtension; 58 return fileExtension;
59 } 59 }
60 set 60 set
61 { 61 {
62 fileExtension = value; 62 fileExtension = value;
63 } 63 }
64 } 64 }
65 public string LanguageExtension 65 public string LanguageExtension
66 { 66 {
67 get 67 get
68 { 68 {
69 switch (this.Name) 69 switch (this.Name)
70 { 70 {
71 case "C#": 71 case "C#":
72 return ".cs"; 72 return ".cs";
73 case "VisualBasic": 73 case "VisualBasic":
74 return ".vb"; 74 return ".vb";
75 case "Boo": 75 case "Boo":
76 return ".boo"; 76 return ".boo";
77 default: 77 default:
78 return ".cs"; 78 return ".cs";
79 } 79 }
80 } 80 }
81 } 81 }
82 /// <summary> 82 /// <summary>
83 /// Gets or sets the XML tag. 83 /// Gets or sets the XML tag.
84 /// </summary> 84 /// </summary>
85 /// <value>The XML tag.</value> 85 /// <value>The XML tag.</value>
86 public string XmlTag 86 public string XmlTag
87 { 87 {
88 get 88 get
89 { 89 {
90 return xmlTag; 90 return xmlTag;
91 } 91 }
92 set 92 set
93 { 93 {
94 xmlTag = value; 94 xmlTag = value;
95 } 95 }
96 } 96 }
97 97
98 /// <summary> 98 /// <summary>
99 /// Gets or sets the import project property. 99 /// Gets or sets the import project property.
100 /// </summary> 100 /// </summary>
101 /// <value>The ImportProject tag.</value> 101 /// <value>The ImportProject tag.</value>
102 public string ImportProject 102 public string ImportProject
103 { 103 {
104 get 104 get
105 { 105 {
106 return importProject; 106 return importProject;
107 } 107 }
108 set 108 set
109 { 109 {
110 importProject = value; 110 importProject = value;
111 } 111 }
112 } 112 }
113 113
114 /// <summary> 114 /// <summary>
115 /// Initializes a new instance of the <see cref="ToolInfo"/> class. 115 /// Initializes a new instance of the <see cref="ToolInfo"/> class.
116 /// </summary> 116 /// </summary>
117 /// <param name="name">The name.</param> 117 /// <param name="name">The name.</param>
118 /// <param name="guid">The GUID.</param> 118 /// <param name="guid">The GUID.</param>
119 /// <param name="fileExtension">The file extension.</param> 119 /// <param name="fileExtension">The file extension.</param>
120 /// <param name="xml">The XML.</param> 120 /// <param name="xml">The XML.</param>
121 /// <param name="importProject">The import project.</param> 121 /// <param name="importProject">The import project.</param>
122 public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject) 122 public ToolInfo(string name, string guid, string fileExtension, string xml, string importProject)
123 { 123 {
124 this.name = name; 124 this.name = name;
125 this.guid = guid; 125 this.guid = guid;
126 this.fileExtension = fileExtension; 126 this.fileExtension = fileExtension;
127 this.xmlTag = xml; 127 this.xmlTag = xml;
128 this.importProject = importProject; 128 this.importProject = importProject;
129 } 129 }
130 130
131 /// <summary> 131 /// <summary>
132 /// Initializes a new instance of the <see cref="ToolInfo"/> class. 132 /// Initializes a new instance of the <see cref="ToolInfo"/> class.
133 /// </summary> 133 /// </summary>
134 /// <param name="name">The name.</param> 134 /// <param name="name">The name.</param>
135 /// <param name="guid">The GUID.</param> 135 /// <param name="guid">The GUID.</param>
136 /// <param name="fileExtension">The file extension.</param> 136 /// <param name="fileExtension">The file extension.</param>
137 /// <param name="xml">The XML.</param> 137 /// <param name="xml">The XML.</param>
138 public ToolInfo(string name, string guid, string fileExtension, string xml) 138 public ToolInfo(string name, string guid, string fileExtension, string xml)
139 { 139 {
140 this.name = name; 140 this.name = name;
141 this.guid = guid; 141 this.guid = guid;
142 this.fileExtension = fileExtension; 142 this.fileExtension = fileExtension;
143 this.xmlTag = xml; 143 this.xmlTag = xml;
144 this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets"; 144 this.importProject = "$(MSBuildBinPath)\\Microsoft." + xml + ".Targets";
145 } 145 }
146 146
147 /// <summary> 147 /// <summary>
148 /// Equals operator 148 /// Equals operator
149 /// </summary> 149 /// </summary>
150 /// <param name="obj">ToolInfo to compare</param> 150 /// <param name="obj">ToolInfo to compare</param>
151 /// <returns>true if toolInfos are equal</returns> 151 /// <returns>true if toolInfos are equal</returns>
152 public override bool Equals(object obj) 152 public override bool Equals(object obj)
153 { 153 {
154 if (obj == null) 154 if (obj == null)
155 { 155 {
156 throw new ArgumentNullException("obj"); 156 throw new ArgumentNullException("obj");
157 } 157 }
158 if (obj.GetType() != typeof(ToolInfo)) 158 if (obj.GetType() != typeof(ToolInfo))
159 return false; 159 return false;
160 160
161 ToolInfo c = (ToolInfo)obj; 161 ToolInfo c = (ToolInfo)obj;
162 return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject)); 162 return ((this.name == c.name) && (this.guid == c.guid) && (this.fileExtension == c.fileExtension) && (this.importProject == c.importProject));
163 } 163 }
164 164
165 /// <summary> 165 /// <summary>
166 /// Equals operator 166 /// Equals operator
167 /// </summary> 167 /// </summary>
168 /// <param name="c1">ToolInfo to compare</param> 168 /// <param name="c1">ToolInfo to compare</param>
169 /// <param name="c2">ToolInfo to compare</param> 169 /// <param name="c2">ToolInfo to compare</param>
170 /// <returns>True if toolInfos are equal</returns> 170 /// <returns>True if toolInfos are equal</returns>
171 public static bool operator ==(ToolInfo c1, ToolInfo c2) 171 public static bool operator ==(ToolInfo c1, ToolInfo c2)
172 { 172 {
173 return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag)); 173 return ((c1.name == c2.name) && (c1.guid == c2.guid) && (c1.fileExtension == c2.fileExtension) && (c1.importProject == c2.importProject) && (c1.xmlTag == c2.xmlTag));
174 } 174 }
175 175
176 /// <summary> 176 /// <summary>
177 /// Not equals operator 177 /// Not equals operator
178 /// </summary> 178 /// </summary>
179 /// <param name="c1">ToolInfo to compare</param> 179 /// <param name="c1">ToolInfo to compare</param>
180 /// <param name="c2">ToolInfo to compare</param> 180 /// <param name="c2">ToolInfo to compare</param>
181 /// <returns>True if toolInfos are not equal</returns> 181 /// <returns>True if toolInfos are not equal</returns>
182 public static bool operator !=(ToolInfo c1, ToolInfo c2) 182 public static bool operator !=(ToolInfo c1, ToolInfo c2)
183 { 183 {
184 return !(c1 == c2); 184 return !(c1 == c2);
185 } 185 }
186 186
187 /// <summary> 187 /// <summary>
188 /// Hash Code 188 /// Hash Code
189 /// </summary> 189 /// </summary>
190 /// <returns>Hash code</returns> 190 /// <returns>Hash code</returns>
191 public override int GetHashCode() 191 public override int GetHashCode()
192 { 192 {
193 return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode(); 193 return name.GetHashCode() ^ guid.GetHashCode() ^ this.fileExtension.GetHashCode() ^ this.importProject.GetHashCode() ^ this.xmlTag.GetHashCode();
194 194
195 } 195 }
196 } 196 }
197} 197}
diff --git a/Prebuild/src/Core/Targets/VS2002Target.cs b/Prebuild/src/Core/Targets/VS2002Target.cs
index 2292624..d7f6dd1 100644
--- a/Prebuild/src/Core/Targets/VS2002Target.cs
+++ b/Prebuild/src/Core/Targets/VS2002Target.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -29,59 +29,59 @@ using Prebuild.Core.Attributes;
29 29
30namespace Prebuild.Core.Targets 30namespace Prebuild.Core.Targets
31{ 31{
32 /// <summary> 32 /// <summary>
33 /// 33 ///
34 /// </summary> 34 /// </summary>
35 [Target("vs2002")] 35 [Target("vs2002")]
36 public class VS2002Target : VS2003Target 36 public class VS2002Target : VS2003Target
37 { 37 {
38 #region Private Methods 38 #region Private Methods
39 39
40 private void SetVS2002() 40 private void SetVS2002()
41 { 41 {
42 this.SolutionVersion = "7.00"; 42 this.SolutionVersion = "7.00";
43 this.ProductVersion = "7.0.9254"; 43 this.ProductVersion = "7.0.9254";
44 this.SchemaVersion = "1.0"; 44 this.SchemaVersion = "1.0";
45 this.VersionName = "2002"; 45 this.VersionName = "2002";
46 this.Version = VSVersion.VS70; 46 this.Version = VSVersion.VS70;
47 } 47 }
48 48
49 #endregion 49 #endregion
50 50
51 #region Public Methods 51 #region Public Methods
52 52
53 /// <summary> 53 /// <summary>
54 /// Writes the specified kern. 54 /// Writes the specified kern.
55 /// </summary> 55 /// </summary>
56 /// <param name="kern">The kern.</param> 56 /// <param name="kern">The kern.</param>
57 public override void Write(Kernel kern) 57 public override void Write(Kernel kern)
58 { 58 {
59 SetVS2002(); 59 SetVS2002();
60 base.Write(kern); 60 base.Write(kern);
61 } 61 }
62 62
63 /// <summary> 63 /// <summary>
64 /// Cleans the specified kern. 64 /// Cleans the specified kern.
65 /// </summary> 65 /// </summary>
66 /// <param name="kern">The kern.</param> 66 /// <param name="kern">The kern.</param>
67 public override void Clean(Kernel kern) 67 public override void Clean(Kernel kern)
68 { 68 {
69 SetVS2002(); 69 SetVS2002();
70 base.Clean(kern); 70 base.Clean(kern);
71 } 71 }
72 72
73 /// <summary> 73 /// <summary>
74 /// Gets the name. 74 /// Gets the name.
75 /// </summary> 75 /// </summary>
76 /// <value>The name.</value> 76 /// <value>The name.</value>
77 public override string Name 77 public override string Name
78 { 78 {
79 get 79 get
80 { 80 {
81 return "vs2002"; 81 return "vs2002";
82 } 82 }
83 } 83 }
84 84
85 #endregion 85 #endregion
86 } 86 }
87} 87}
diff --git a/Prebuild/src/Core/Targets/VS2003Target.cs b/Prebuild/src/Core/Targets/VS2003Target.cs
index 10e2dc4..f4b4517 100644
--- a/Prebuild/src/Core/Targets/VS2003Target.cs
+++ b/Prebuild/src/Core/Targets/VS2003Target.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -34,560 +34,560 @@ using Prebuild.Core.Utilities;
34 34
35namespace Prebuild.Core.Targets 35namespace Prebuild.Core.Targets
36{ 36{
37 [Target("vs2003")] 37 [Target("vs2003")]
38 public class VS2003Target : ITarget 38 public class VS2003Target : ITarget
39 { 39 {
40 40
41 #region Fields 41 #region Fields
42 42
43 string solutionVersion = "8.00"; 43 string solutionVersion = "8.00";
44 string productVersion = "7.10.3077"; 44 string productVersion = "7.10.3077";
45 string schemaVersion = "2.0"; 45 string schemaVersion = "2.0";
46 string versionName = "2003"; 46 string versionName = "2003";
47 VSVersion version = VSVersion.VS71; 47 VSVersion version = VSVersion.VS71;
48 48
49 readonly Dictionary<string, ToolInfo> m_Tools = new Dictionary<string, ToolInfo>(); 49 readonly Dictionary<string, ToolInfo> m_Tools = new Dictionary<string, ToolInfo>();
50 Kernel m_Kernel; 50 Kernel m_Kernel;
51 51
52 /// <summary> 52 /// <summary>
53 /// Gets or sets the solution version. 53 /// Gets or sets the solution version.
54 /// </summary> 54 /// </summary>
55 /// <value>The solution version.</value> 55 /// <value>The solution version.</value>
56 protected string SolutionVersion 56 protected string SolutionVersion
57 { 57 {
58 get 58 get
59 { 59 {
60 return solutionVersion; 60 return solutionVersion;
61 } 61 }
62 set 62 set
63 { 63 {
64 solutionVersion = value; 64 solutionVersion = value;
65 } 65 }
66 } 66 }
67 /// <summary> 67 /// <summary>
68 /// Gets or sets the product version. 68 /// Gets or sets the product version.
69 /// </summary> 69 /// </summary>
70 /// <value>The product version.</value> 70 /// <value>The product version.</value>
71 protected string ProductVersion 71 protected string ProductVersion
72 { 72 {
73 get 73 get
74 { 74 {
75 return productVersion; 75 return productVersion;
76 } 76 }
77 set 77 set
78 { 78 {
79 productVersion = value; 79 productVersion = value;
80 } 80 }
81 } 81 }
82 /// <summary> 82 /// <summary>
83 /// Gets or sets the schema version. 83 /// Gets or sets the schema version.
84 /// </summary> 84 /// </summary>
85 /// <value>The schema version.</value> 85 /// <value>The schema version.</value>
86 protected string SchemaVersion 86 protected string SchemaVersion
87 { 87 {
88 get 88 get
89 { 89 {
90 return schemaVersion; 90 return schemaVersion;
91 } 91 }
92 set 92 set
93 { 93 {
94 schemaVersion = value; 94 schemaVersion = value;
95 } 95 }
96 } 96 }
97 /// <summary> 97 /// <summary>
98 /// Gets or sets the name of the version. 98 /// Gets or sets the name of the version.
99 /// </summary> 99 /// </summary>
100 /// <value>The name of the version.</value> 100 /// <value>The name of the version.</value>
101 protected string VersionName 101 protected string VersionName
102 { 102 {
103 get 103 get
104 { 104 {
105 return versionName; 105 return versionName;
106 } 106 }
107 set 107 set
108 { 108 {
109 versionName = value; 109 versionName = value;
110 } 110 }
111 } 111 }
112 /// <summary> 112 /// <summary>
113 /// Gets or sets the version. 113 /// Gets or sets the version.
114 /// </summary> 114 /// </summary>
115 /// <value>The version.</value> 115 /// <value>The version.</value>
116 protected VSVersion Version 116 protected VSVersion Version
117 { 117 {
118 get 118 get
119 { 119 {
120 return version; 120 return version;
121 } 121 }
122 set 122 set
123 { 123 {
124 version = value; 124 version = value;
125 } 125 }
126 } 126 }
127 127
128 #endregion 128 #endregion
129 129
130 #region Constructors 130 #region Constructors
131 131
132 /// <summary> 132 /// <summary>
133 /// Initializes a new instance of the <see cref="VS2003Target"/> class. 133 /// Initializes a new instance of the <see cref="VS2003Target"/> class.
134 /// </summary> 134 /// </summary>
135 public VS2003Target() 135 public VS2003Target()
136 { 136 {
137 m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP"); 137 m_Tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP");
138 m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic"); 138 m_Tools["VB.NET"] = new ToolInfo("VB.NET", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic");
139 } 139 }
140 140
141 #endregion 141 #endregion
142 142
143 #region Private Methods 143 #region Private Methods
144 144
145 private string MakeRefPath(ProjectNode project) 145 private string MakeRefPath(ProjectNode project)
146 { 146 {
147 string ret = ""; 147 string ret = "";
148 foreach(ReferencePathNode node in project.ReferencePaths) 148 foreach(ReferencePathNode node in project.ReferencePaths)
149 { 149 {
150 try 150 try
151 { 151 {
152 string fullPath = Helper.ResolvePath(node.Path); 152 string fullPath = Helper.ResolvePath(node.Path);
153 if(ret.Length < 1) 153 if(ret.Length < 1)
154 { 154 {
155 ret = fullPath; 155 ret = fullPath;
156 } 156 }
157 else 157 else
158 { 158 {
159 ret += ";" + fullPath; 159 ret += ";" + fullPath;
160 } 160 }
161 } 161 }
162 catch(ArgumentException) 162 catch(ArgumentException)
163 { 163 {
164 m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); 164 m_Kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path);
165 } 165 }
166 } 166 }
167 167
168 return ret; 168 return ret;
169 } 169 }
170 170
171 private void WriteProject(SolutionNode solution, ProjectNode project) 171 private void WriteProject(SolutionNode solution, ProjectNode project)
172 { 172 {
173 if(!m_Tools.ContainsKey(project.Language)) 173 if(!m_Tools.ContainsKey(project.Language))
174 { 174 {
175 throw new UnknownLanguageException("Unknown .NET language: " + project.Language); 175 throw new UnknownLanguageException("Unknown .NET language: " + project.Language);
176 } 176 }
177 177
178 ToolInfo toolInfo = m_Tools[project.Language]; 178 ToolInfo toolInfo = m_Tools[project.Language];
179 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); 179 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension);
180 StreamWriter ps = new StreamWriter(projectFile); 180 StreamWriter ps = new StreamWriter(projectFile);
181 181
182 m_Kernel.CurrentWorkingDirectory.Push(); 182 m_Kernel.CurrentWorkingDirectory.Push();
183 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); 183 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile));
184 184
185 using(ps) 185 using(ps)
186 { 186 {
187 ps.WriteLine("<VisualStudioProject>"); 187 ps.WriteLine("<VisualStudioProject>");
188 ps.WriteLine(" <{0}", toolInfo.XmlTag); 188 ps.WriteLine(" <{0}", toolInfo.XmlTag);
189 ps.WriteLine("\t\t\t\tProjectType = \"Local\""); 189 ps.WriteLine("\t\t\t\tProjectType = \"Local\"");
190 ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", ProductVersion); 190 ps.WriteLine("\t\t\t\tProductVersion = \"{0}\"", ProductVersion);
191 ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", SchemaVersion); 191 ps.WriteLine("\t\t\t\tSchemaVersion = \"{0}\"", SchemaVersion);
192 ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper()); 192 ps.WriteLine("\t\t\t\tProjectGuid = \"{{{0}}}\"", project.Guid.ToString().ToUpper());
193 ps.WriteLine("\t\t>"); 193 ps.WriteLine("\t\t>");
194 194
195 ps.WriteLine("\t\t\t\t<Build>"); 195 ps.WriteLine("\t\t\t\t<Build>");
196 ps.WriteLine(" <Settings"); 196 ps.WriteLine(" <Settings");
197 ps.WriteLine("\t\t\t\t ApplicationIcon = \"{0}\"",project.AppIcon); 197 ps.WriteLine("\t\t\t\t ApplicationIcon = \"{0}\"",project.AppIcon);
198 ps.WriteLine("\t\t\t\t AssemblyKeyContainerName = \"\""); 198 ps.WriteLine("\t\t\t\t AssemblyKeyContainerName = \"\"");
199 ps.WriteLine("\t\t\t\t AssemblyName = \"{0}\"", project.AssemblyName); 199 ps.WriteLine("\t\t\t\t AssemblyName = \"{0}\"", project.AssemblyName);
200 ps.WriteLine("\t\t\t\t AssemblyOriginatorKeyFile = \"\""); 200 ps.WriteLine("\t\t\t\t AssemblyOriginatorKeyFile = \"\"");
201 ps.WriteLine("\t\t\t\t DefaultClientScript = \"JScript\""); 201 ps.WriteLine("\t\t\t\t DefaultClientScript = \"JScript\"");
202 ps.WriteLine("\t\t\t\t DefaultHTMLPageLayout = \"Grid\""); 202 ps.WriteLine("\t\t\t\t DefaultHTMLPageLayout = \"Grid\"");
203 ps.WriteLine("\t\t\t\t DefaultTargetSchema = \"IE50\""); 203 ps.WriteLine("\t\t\t\t DefaultTargetSchema = \"IE50\"");
204 ps.WriteLine("\t\t\t\t DelaySign = \"false\""); 204 ps.WriteLine("\t\t\t\t DelaySign = \"false\"");
205 205
206 if(Version == VSVersion.VS70) 206 if(Version == VSVersion.VS70)
207 { 207 {
208 ps.WriteLine("\t\t\t\t NoStandardLibraries = \"false\""); 208 ps.WriteLine("\t\t\t\t NoStandardLibraries = \"false\"");
209 } 209 }
210 210
211 ps.WriteLine("\t\t\t\t OutputType = \"{0}\"", project.Type); 211 ps.WriteLine("\t\t\t\t OutputType = \"{0}\"", project.Type);
212 212
213 foreach(ConfigurationNode conf in project.Configurations) 213 foreach(ConfigurationNode conf in project.Configurations)
214 { 214 {
215 if (conf.Options["PreBuildEvent"] != null && conf.Options["PreBuildEvent"].ToString().Length != 0) 215 if (conf.Options["PreBuildEvent"] != null && conf.Options["PreBuildEvent"].ToString().Length != 0)
216 { 216 {
217 ps.WriteLine("\t\t\t\t PreBuildEvent = \"{0}\"", Helper.NormalizePath(conf.Options["PreBuildEvent"].ToString())); 217 ps.WriteLine("\t\t\t\t PreBuildEvent = \"{0}\"", Helper.NormalizePath(conf.Options["PreBuildEvent"].ToString()));
218 } 218 }
219 else 219 else
220 { 220 {
221 ps.WriteLine("\t\t\t\t PreBuildEvent = \"{0}\"", conf.Options["PreBuildEvent"]); 221 ps.WriteLine("\t\t\t\t PreBuildEvent = \"{0}\"", conf.Options["PreBuildEvent"]);
222 } 222 }
223 if (conf.Options["PostBuildEvent"] != null && conf.Options["PostBuildEvent"].ToString().Length != 0) 223 if (conf.Options["PostBuildEvent"] != null && conf.Options["PostBuildEvent"].ToString().Length != 0)
224 { 224 {
225 ps.WriteLine("\t\t\t\t PostBuildEvent = \"{0}\"", Helper.NormalizePath(conf.Options["PostBuildEvent"].ToString())); 225 ps.WriteLine("\t\t\t\t PostBuildEvent = \"{0}\"", Helper.NormalizePath(conf.Options["PostBuildEvent"].ToString()));
226 } 226 }
227 else 227 else
228 { 228 {
229 ps.WriteLine("\t\t\t\t PostBuildEvent = \"{0}\"", conf.Options["PostBuildEvent"]); 229 ps.WriteLine("\t\t\t\t PostBuildEvent = \"{0}\"", conf.Options["PostBuildEvent"]);
230 } 230 }
231 if (conf.Options["RunPostBuildEvent"] == null) 231 if (conf.Options["RunPostBuildEvent"] == null)
232 { 232 {
233 ps.WriteLine("\t\t\t\t RunPostBuildEvent = \"{0}\"", "OnBuildSuccess"); 233 ps.WriteLine("\t\t\t\t RunPostBuildEvent = \"{0}\"", "OnBuildSuccess");
234 } 234 }
235 else 235 else
236 { 236 {
237 ps.WriteLine("\t\t\t\t RunPostBuildEvent = \"{0}\"", conf.Options["RunPostBuildEvent"]); 237 ps.WriteLine("\t\t\t\t RunPostBuildEvent = \"{0}\"", conf.Options["RunPostBuildEvent"]);
238 } 238 }
239 break; 239 break;
240 } 240 }
241 241
242 ps.WriteLine("\t\t\t\t RootNamespace = \"{0}\"", project.RootNamespace); 242 ps.WriteLine("\t\t\t\t RootNamespace = \"{0}\"", project.RootNamespace);
243 ps.WriteLine("\t\t\t\t StartupObject = \"{0}\"", project.StartupObject); 243 ps.WriteLine("\t\t\t\t StartupObject = \"{0}\"", project.StartupObject);
244 ps.WriteLine("\t\t >"); 244 ps.WriteLine("\t\t >");
245 245
246 foreach(ConfigurationNode conf in project.Configurations) 246 foreach(ConfigurationNode conf in project.Configurations)
247 { 247 {
248 ps.WriteLine("\t\t\t\t <Config"); 248 ps.WriteLine("\t\t\t\t <Config");
249 ps.WriteLine("\t\t\t\t Name = \"{0}\"", conf.Name); 249 ps.WriteLine("\t\t\t\t Name = \"{0}\"", conf.Name);
250 ps.WriteLine("\t\t\t\t AllowUnsafeBlocks = \"{0}\"", conf.Options["AllowUnsafe"].ToString().ToLower()); 250 ps.WriteLine("\t\t\t\t AllowUnsafeBlocks = \"{0}\"", conf.Options["AllowUnsafe"].ToString().ToLower());
251 ps.WriteLine("\t\t\t\t BaseAddress = \"{0}\"", conf.Options["BaseAddress"]); 251 ps.WriteLine("\t\t\t\t BaseAddress = \"{0}\"", conf.Options["BaseAddress"]);
252 ps.WriteLine("\t\t\t\t CheckForOverflowUnderflow = \"{0}\"", conf.Options["CheckUnderflowOverflow"].ToString().ToLower()); 252 ps.WriteLine("\t\t\t\t CheckForOverflowUnderflow = \"{0}\"", conf.Options["CheckUnderflowOverflow"].ToString().ToLower());
253 ps.WriteLine("\t\t\t\t ConfigurationOverrideFile = \"\""); 253 ps.WriteLine("\t\t\t\t ConfigurationOverrideFile = \"\"");
254 ps.WriteLine("\t\t\t\t DefineConstants = \"{0}\"", conf.Options["CompilerDefines"]); 254 ps.WriteLine("\t\t\t\t DefineConstants = \"{0}\"", conf.Options["CompilerDefines"]);
255 ps.WriteLine("\t\t\t\t DocumentationFile = \"{0}\"", GetXmlDocFile(project, conf));//default to the assembly name 255 ps.WriteLine("\t\t\t\t DocumentationFile = \"{0}\"", GetXmlDocFile(project, conf));//default to the assembly name
256 ps.WriteLine("\t\t\t\t DebugSymbols = \"{0}\"", conf.Options["DebugInformation"].ToString().ToLower()); 256 ps.WriteLine("\t\t\t\t DebugSymbols = \"{0}\"", conf.Options["DebugInformation"].ToString().ToLower());
257 ps.WriteLine("\t\t\t\t FileAlignment = \"{0}\"", conf.Options["FileAlignment"]); 257 ps.WriteLine("\t\t\t\t FileAlignment = \"{0}\"", conf.Options["FileAlignment"]);
258 ps.WriteLine("\t\t\t\t IncrementalBuild = \"{0}\"", conf.Options["IncrementalBuild"].ToString().ToLower()); 258 ps.WriteLine("\t\t\t\t IncrementalBuild = \"{0}\"", conf.Options["IncrementalBuild"].ToString().ToLower());
259 259
260 if(Version == VSVersion.VS71) 260 if(Version == VSVersion.VS71)
261 { 261 {
262 ps.WriteLine("\t\t\t\t NoStdLib = \"{0}\"", conf.Options["NoStdLib"].ToString().ToLower()); 262 ps.WriteLine("\t\t\t\t NoStdLib = \"{0}\"", conf.Options["NoStdLib"].ToString().ToLower());
263 ps.WriteLine("\t\t\t\t NoWarn = \"{0}\"", conf.Options["SuppressWarnings"].ToString().ToLower()); 263 ps.WriteLine("\t\t\t\t NoWarn = \"{0}\"", conf.Options["SuppressWarnings"].ToString().ToLower());
264 } 264 }
265 265
266 ps.WriteLine("\t\t\t\t Optimize = \"{0}\"", conf.Options["OptimizeCode"].ToString().ToLower()); 266 ps.WriteLine("\t\t\t\t Optimize = \"{0}\"", conf.Options["OptimizeCode"].ToString().ToLower());
267 ps.WriteLine(" OutputPath = \"{0}\"", 267 ps.WriteLine(" OutputPath = \"{0}\"",
268 Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); 268 Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString())));
269 ps.WriteLine(" RegisterForComInterop = \"{0}\"", conf.Options["RegisterComInterop"].ToString().ToLower()); 269 ps.WriteLine(" RegisterForComInterop = \"{0}\"", conf.Options["RegisterComInterop"].ToString().ToLower());
270 ps.WriteLine(" RemoveIntegerChecks = \"{0}\"", conf.Options["RemoveIntegerChecks"].ToString().ToLower()); 270 ps.WriteLine(" RemoveIntegerChecks = \"{0}\"", conf.Options["RemoveIntegerChecks"].ToString().ToLower());
271 ps.WriteLine(" TreatWarningsAsErrors = \"{0}\"", conf.Options["WarningsAsErrors"].ToString().ToLower()); 271 ps.WriteLine(" TreatWarningsAsErrors = \"{0}\"", conf.Options["WarningsAsErrors"].ToString().ToLower());
272 ps.WriteLine(" WarningLevel = \"{0}\"", conf.Options["WarningLevel"]); 272 ps.WriteLine(" WarningLevel = \"{0}\"", conf.Options["WarningLevel"]);
273 ps.WriteLine(" />"); 273 ps.WriteLine(" />");
274 } 274 }
275 275
276 ps.WriteLine(" </Settings>"); 276 ps.WriteLine(" </Settings>");
277 277
278 ps.WriteLine(" <References>"); 278 ps.WriteLine(" <References>");
279 foreach(ReferenceNode refr in project.References) 279 foreach(ReferenceNode refr in project.References)
280 { 280 {
281 ps.WriteLine(" <Reference"); 281 ps.WriteLine(" <Reference");
282 ps.WriteLine(" Name = \"{0}\"", refr.Name); 282 ps.WriteLine(" Name = \"{0}\"", refr.Name);
283 ps.WriteLine(" AssemblyName = \"{0}\"", refr.Name); 283 ps.WriteLine(" AssemblyName = \"{0}\"", refr.Name);
284 284
285 if(solution.ProjectsTable.ContainsKey(refr.Name)) 285 if(solution.ProjectsTable.ContainsKey(refr.Name))
286 { 286 {
287 ProjectNode refProject = solution.ProjectsTable[refr.Name]; 287 ProjectNode refProject = solution.ProjectsTable[refr.Name];
288 ps.WriteLine(" Project = \"{{{0}}}\"", refProject.Guid.ToString().ToUpper()); 288 ps.WriteLine(" Project = \"{{{0}}}\"", refProject.Guid.ToString().ToUpper());
289 ps.WriteLine(" Package = \"{0}\"", toolInfo.Guid.ToUpper()); 289 ps.WriteLine(" Package = \"{0}\"", toolInfo.Guid.ToUpper());
290 } 290 }
291 else 291 else
292 { 292 {
293 if(refr.Path != null) 293 if(refr.Path != null)
294 { 294 {
295 ps.WriteLine(" HintPath = \"{0}\"", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); 295 ps.WriteLine(" HintPath = \"{0}\"", Helper.MakeFilePath(refr.Path, refr.Name, "dll"));
296 } 296 }
297 297
298 } 298 }
299 299
300 if(refr.LocalCopySpecified) 300 if(refr.LocalCopySpecified)
301 { 301 {
302 ps.WriteLine(" Private = \"{0}\"",refr.LocalCopy); 302 ps.WriteLine(" Private = \"{0}\"",refr.LocalCopy);
303 } 303 }
304 304
305 ps.WriteLine(" />"); 305 ps.WriteLine(" />");
306 } 306 }
307 ps.WriteLine(" </References>"); 307 ps.WriteLine(" </References>");
308 308
309 ps.WriteLine(" </Build>"); 309 ps.WriteLine(" </Build>");
310 ps.WriteLine(" <Files>"); 310 ps.WriteLine(" <Files>");
311 311
312 ps.WriteLine(" <Include>"); 312 ps.WriteLine(" <Include>");
313 313
314 foreach(string file in project.Files) 314 foreach(string file in project.Files)
315 { 315 {
316 string fileName = file.Replace(".\\", ""); 316 string fileName = file.Replace(".\\", "");
317 ps.WriteLine(" <File"); 317 ps.WriteLine(" <File");
318 ps.WriteLine(" RelPath = \"{0}\"", fileName); 318 ps.WriteLine(" RelPath = \"{0}\"", fileName);
319 ps.WriteLine(" SubType = \"{0}\"", project.Files.GetSubType(file)); 319 ps.WriteLine(" SubType = \"{0}\"", project.Files.GetSubType(file));
320 ps.WriteLine(" BuildAction = \"{0}\"", project.Files.GetBuildAction(file)); 320 ps.WriteLine(" BuildAction = \"{0}\"", project.Files.GetBuildAction(file));
321 ps.WriteLine(" />"); 321 ps.WriteLine(" />");
322 322
323 if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings) 323 if (project.Files.GetSubType(file) != SubType.Code && project.Files.GetSubType(file) != SubType.Settings)
324 { 324 {
325 ps.WriteLine(" <File"); 325 ps.WriteLine(" <File");
326 ps.WriteLine(" RelPath = \"{0}\"", fileName.Substring(0, fileName.LastIndexOf('.')) + ".resx"); 326 ps.WriteLine(" RelPath = \"{0}\"", fileName.Substring(0, fileName.LastIndexOf('.')) + ".resx");
327 int slash = fileName.LastIndexOf('\\'); 327 int slash = fileName.LastIndexOf('\\');
328 if (slash == -1) 328 if (slash == -1)
329 { 329 {
330 ps.WriteLine(" DependentUpon = \"{0}\"", fileName); 330 ps.WriteLine(" DependentUpon = \"{0}\"", fileName);
331 } 331 }
332 else 332 else
333 { 333 {
334 ps.WriteLine(" DependentUpon = \"{0}\"", fileName.Substring(slash + 1, fileName.Length - slash - 1)); 334 ps.WriteLine(" DependentUpon = \"{0}\"", fileName.Substring(slash + 1, fileName.Length - slash - 1));
335 } 335 }
336 ps.WriteLine(" BuildAction = \"{0}\"", "EmbeddedResource"); 336 ps.WriteLine(" BuildAction = \"{0}\"", "EmbeddedResource");
337 ps.WriteLine(" />"); 337 ps.WriteLine(" />");
338 338
339 } 339 }
340 } 340 }
341 ps.WriteLine(" </Include>"); 341 ps.WriteLine(" </Include>");
342 342
343 ps.WriteLine(" </Files>"); 343 ps.WriteLine(" </Files>");
344 ps.WriteLine(" </{0}>", toolInfo.XmlTag); 344 ps.WriteLine(" </{0}>", toolInfo.XmlTag);
345 ps.WriteLine("</VisualStudioProject>"); 345 ps.WriteLine("</VisualStudioProject>");
346 } 346 }
347 347
348 ps = new StreamWriter(projectFile + ".user"); 348 ps = new StreamWriter(projectFile + ".user");
349 using(ps) 349 using(ps)
350 { 350 {
351 ps.WriteLine("<VisualStudioProject>"); 351 ps.WriteLine("<VisualStudioProject>");
352 ps.WriteLine(" <{0}>", toolInfo.XmlTag); 352 ps.WriteLine(" <{0}>", toolInfo.XmlTag);
353 ps.WriteLine(" <Build>"); 353 ps.WriteLine(" <Build>");
354 354
355 ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); 355 ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project));
356 foreach(ConfigurationNode conf in project.Configurations) 356 foreach(ConfigurationNode conf in project.Configurations)
357 { 357 {
358 ps.WriteLine(" <Config"); 358 ps.WriteLine(" <Config");
359 ps.WriteLine(" Name = \"{0}\"", conf.Name); 359 ps.WriteLine(" Name = \"{0}\"", conf.Name);
360 ps.WriteLine(" />"); 360 ps.WriteLine(" />");
361 } 361 }
362 ps.WriteLine(" </Settings>"); 362 ps.WriteLine(" </Settings>");
363 363
364 ps.WriteLine(" </Build>"); 364 ps.WriteLine(" </Build>");
365 ps.WriteLine(" </{0}>", toolInfo.XmlTag); 365 ps.WriteLine(" </{0}>", toolInfo.XmlTag);
366 ps.WriteLine("</VisualStudioProject>"); 366 ps.WriteLine("</VisualStudioProject>");
367 } 367 }
368 368
369 m_Kernel.CurrentWorkingDirectory.Pop(); 369 m_Kernel.CurrentWorkingDirectory.Pop();
370 } 370 }
371 371
372 /// <summary> 372 /// <summary>
373 /// Gets the XML doc file. 373 /// Gets the XML doc file.
374 /// </summary> 374 /// </summary>
375 /// <param name="project">The project.</param> 375 /// <param name="project">The project.</param>
376 /// <param name="conf">The conf.</param> 376 /// <param name="conf">The conf.</param>
377 /// <returns></returns> 377 /// <returns></returns>
378 public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) 378 public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf)
379 { 379 {
380 if( conf == null ) 380 if( conf == null )
381 { 381 {
382 throw new ArgumentNullException("conf"); 382 throw new ArgumentNullException("conf");
383 } 383 }
384 if( project == null ) 384 if( project == null )
385 { 385 {
386 throw new ArgumentNullException("project"); 386 throw new ArgumentNullException("project");
387 } 387 }
388 // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false 388 // if(!(bool)conf.Options["GenerateXmlDocFile"]) //default to none, if the generate option is false
389 // { 389 // {
390 // return string.Empty; 390 // return string.Empty;
391 // } 391 // }
392 392
393 //default to "AssemblyName.xml" 393 //default to "AssemblyName.xml"
394 //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; 394 //string defaultValue = Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml";
395 //return (string)conf.Options["XmlDocFile", defaultValue]; 395 //return (string)conf.Options["XmlDocFile", defaultValue];
396 396
397 //default to no XmlDocFile file 397 //default to no XmlDocFile file
398 return (string)conf.Options["XmlDocFile", ""]; 398 return (string)conf.Options["XmlDocFile", ""];
399 } 399 }
400 400
401 private void WriteSolution(SolutionNode solution) 401 private void WriteSolution(SolutionNode solution)
402 { 402 {
403 m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", VersionName); 403 m_Kernel.Log.Write("Creating Visual Studio {0} solution and project files", VersionName);
404 404
405 foreach(ProjectNode project in solution.Projects) 405 foreach(ProjectNode project in solution.Projects)
406 { 406 {
407 if(m_Kernel.AllowProject(project.FilterGroups)) 407 if(m_Kernel.AllowProject(project.FilterGroups))
408 { 408 {
409 m_Kernel.Log.Write("...Creating project: {0}", project.Name); 409 m_Kernel.Log.Write("...Creating project: {0}", project.Name);
410 WriteProject(solution, project); 410 WriteProject(solution, project);
411 } 411 }
412 } 412 }
413 413
414 m_Kernel.Log.Write(""); 414 m_Kernel.Log.Write("");
415 string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); 415 string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln");
416 StreamWriter ss = new StreamWriter(solutionFile); 416 StreamWriter ss = new StreamWriter(solutionFile);
417 417
418 m_Kernel.CurrentWorkingDirectory.Push(); 418 m_Kernel.CurrentWorkingDirectory.Push();
419 Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); 419 Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile));
420 420
421 using(ss) 421 using(ss)
422 { 422 {
423 ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); 423 ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion);
424 foreach(ProjectNode project in solution.Projects) 424 foreach(ProjectNode project in solution.Projects)
425 { 425 {
426 if(!m_Tools.ContainsKey(project.Language)) 426 if(!m_Tools.ContainsKey(project.Language))
427 { 427 {
428 throw new UnknownLanguageException("Unknown .NET language: " + project.Language); 428 throw new UnknownLanguageException("Unknown .NET language: " + project.Language);
429 } 429 }
430 430
431 ToolInfo toolInfo = m_Tools[project.Language]; 431 ToolInfo toolInfo = m_Tools[project.Language];
432 432
433 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath); 433 string path = Helper.MakePathRelativeTo(solution.FullPath, project.FullPath);
434 ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"", 434 ss.WriteLine("Project(\"{0}\") = \"{1}\", \"{2}\", \"{{{3}}}\"",
435 toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name, 435 toolInfo.Guid, project.Name, Helper.MakeFilePath(path, project.Name,
436 toolInfo.FileExtension), project.Guid.ToString().ToUpper()); 436 toolInfo.FileExtension), project.Guid.ToString().ToUpper());
437 437
438 ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); 438 ss.WriteLine("\tProjectSection(ProjectDependencies) = postProject");
439 ss.WriteLine("\tEndProjectSection"); 439 ss.WriteLine("\tEndProjectSection");
440 440
441 ss.WriteLine("EndProject"); 441 ss.WriteLine("EndProject");
442 } 442 }
443 443
444 ss.WriteLine("Global"); 444 ss.WriteLine("Global");
445 445
446 ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); 446 ss.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution");
447 foreach(ConfigurationNode conf in solution.Configurations) 447 foreach(ConfigurationNode conf in solution.Configurations)
448 { 448 {
449 ss.WriteLine("\t\t{0} = {0}", conf.Name); 449 ss.WriteLine("\t\t{0} = {0}", conf.Name);
450 } 450 }
451 ss.WriteLine("\tEndGlobalSection"); 451 ss.WriteLine("\tEndGlobalSection");
452 452
453 ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution"); 453 ss.WriteLine("\tGlobalSection(ProjectDependencies) = postSolution");
454 foreach(ProjectNode project in solution.Projects) 454 foreach(ProjectNode project in solution.Projects)
455 { 455 {
456 for(int i = 0; i < project.References.Count; i++) 456 for(int i = 0; i < project.References.Count; i++)
457 { 457 {
458 ReferenceNode refr = project.References[i]; 458 ReferenceNode refr = project.References[i];
459 if(solution.ProjectsTable.ContainsKey(refr.Name)) 459 if(solution.ProjectsTable.ContainsKey(refr.Name))
460 { 460 {
461 ProjectNode refProject = solution.ProjectsTable[refr.Name]; 461 ProjectNode refProject = solution.ProjectsTable[refr.Name];
462 ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})", 462 ss.WriteLine("\t\t({{{0}}}).{1} = ({{{2}}})",
463 project.Guid.ToString().ToUpper() 463 project.Guid.ToString().ToUpper()
464 , i, 464 , i,
465 refProject.Guid.ToString().ToUpper() 465 refProject.Guid.ToString().ToUpper()
466 ); 466 );
467 } 467 }
468 } 468 }
469 } 469 }
470 ss.WriteLine("\tEndGlobalSection"); 470 ss.WriteLine("\tEndGlobalSection");
471 471
472 ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); 472 ss.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution");
473 foreach(ProjectNode project in solution.Projects) 473 foreach(ProjectNode project in solution.Projects)
474 { 474 {
475 foreach(ConfigurationNode conf in solution.Configurations) 475 foreach(ConfigurationNode conf in solution.Configurations)
476 { 476 {
477 ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET", 477 ss.WriteLine("\t\t{{{0}}}.{1}.ActiveCfg = {1}|.NET",
478 project.Guid.ToString().ToUpper(), 478 project.Guid.ToString().ToUpper(),
479 conf.Name); 479 conf.Name);
480 480
481 ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET", 481 ss.WriteLine("\t\t{{{0}}}.{1}.Build.0 = {1}|.NET",
482 project.Guid.ToString().ToUpper(), 482 project.Guid.ToString().ToUpper(),
483 conf.Name); 483 conf.Name);
484 } 484 }
485 } 485 }
486 ss.WriteLine("\tEndGlobalSection"); 486 ss.WriteLine("\tEndGlobalSection");
487 487
488 if(solution.Files != null) 488 if(solution.Files != null)
489 { 489 {
490 ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution"); 490 ss.WriteLine("\tGlobalSection(SolutionItems) = postSolution");
491 foreach(string file in solution.Files) 491 foreach(string file in solution.Files)
492 { 492 {
493 ss.WriteLine("\t\t{0} = {0}", file); 493 ss.WriteLine("\t\t{0} = {0}", file);
494 } 494 }
495 ss.WriteLine("\tEndGlobalSection"); 495 ss.WriteLine("\tEndGlobalSection");
496 } 496 }
497 497
498 ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); 498 ss.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution");
499 ss.WriteLine("\tEndGlobalSection"); 499 ss.WriteLine("\tEndGlobalSection");
500 ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); 500 ss.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution");
501 ss.WriteLine("\tEndGlobalSection"); 501 ss.WriteLine("\tEndGlobalSection");
502 502
503 ss.WriteLine("EndGlobal"); 503 ss.WriteLine("EndGlobal");
504 } 504 }
505 505
506 m_Kernel.CurrentWorkingDirectory.Pop(); 506 m_Kernel.CurrentWorkingDirectory.Pop();
507 } 507 }
508 508
509 private void CleanProject(ProjectNode project) 509 private void CleanProject(ProjectNode project)
510 { 510 {
511 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); 511 m_Kernel.Log.Write("...Cleaning project: {0}", project.Name);
512 512
513 ToolInfo toolInfo = m_Tools[project.Language]; 513 ToolInfo toolInfo = m_Tools[project.Language];
514 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); 514 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension);
515 string userFile = projectFile + ".user"; 515 string userFile = projectFile + ".user";
516 516
517 Helper.DeleteIfExists(projectFile); 517 Helper.DeleteIfExists(projectFile);
518 Helper.DeleteIfExists(userFile); 518 Helper.DeleteIfExists(userFile);
519 } 519 }
520 520
521 private void CleanSolution(SolutionNode solution) 521 private void CleanSolution(SolutionNode solution)
522 { 522 {
523 m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", VersionName, solution.Name); 523 m_Kernel.Log.Write("Cleaning Visual Studio {0} solution and project files", VersionName, solution.Name);
524 524
525 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); 525 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln");
526 string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); 526 string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo");
527 527
528 Helper.DeleteIfExists(slnFile); 528 Helper.DeleteIfExists(slnFile);
529 Helper.DeleteIfExists(suoFile); 529 Helper.DeleteIfExists(suoFile);
530 530
531 foreach(ProjectNode project in solution.Projects) 531 foreach(ProjectNode project in solution.Projects)
532 { 532 {
533 CleanProject(project); 533 CleanProject(project);
534 } 534 }
535 535
536 m_Kernel.Log.Write(""); 536 m_Kernel.Log.Write("");
537 } 537 }
538 538
539 #endregion 539 #endregion
540 540
541 #region ITarget Members 541 #region ITarget Members
542 542
543 /// <summary> 543 /// <summary>
544 /// Writes the specified kern. 544 /// Writes the specified kern.
545 /// </summary> 545 /// </summary>
546 /// <param name="kern">The kern.</param> 546 /// <param name="kern">The kern.</param>
547 public virtual void Write(Kernel kern) 547 public virtual void Write(Kernel kern)
548 { 548 {
549 if( kern == null ) 549 if( kern == null )
550 { 550 {
551 throw new ArgumentNullException("kern"); 551 throw new ArgumentNullException("kern");
552 } 552 }
553 m_Kernel = kern; 553 m_Kernel = kern;
554 foreach(SolutionNode sol in m_Kernel.Solutions) 554 foreach(SolutionNode sol in m_Kernel.Solutions)
555 { 555 {
556 WriteSolution(sol); 556 WriteSolution(sol);
557 } 557 }
558 m_Kernel = null; 558 m_Kernel = null;
559 } 559 }
560 560
561 /// <summary> 561 /// <summary>
562 /// Cleans the specified kern. 562 /// Cleans the specified kern.
563 /// </summary> 563 /// </summary>
564 /// <param name="kern">The kern.</param> 564 /// <param name="kern">The kern.</param>
565 public virtual void Clean(Kernel kern) 565 public virtual void Clean(Kernel kern)
566 { 566 {
567 if( kern == null ) 567 if( kern == null )
568 { 568 {
569 throw new ArgumentNullException("kern"); 569 throw new ArgumentNullException("kern");
570 } 570 }
571 m_Kernel = kern; 571 m_Kernel = kern;
572 foreach(SolutionNode sol in m_Kernel.Solutions) 572 foreach(SolutionNode sol in m_Kernel.Solutions)
573 { 573 {
574 CleanSolution(sol); 574 CleanSolution(sol);
575 } 575 }
576 m_Kernel = null; 576 m_Kernel = null;
577 } 577 }
578 578
579 /// <summary> 579 /// <summary>
580 /// Gets the name. 580 /// Gets the name.
581 /// </summary> 581 /// </summary>
582 /// <value>The name.</value> 582 /// <value>The name.</value>
583 public virtual string Name 583 public virtual string Name
584 { 584 {
585 get 585 get
586 { 586 {
587 return "vs2003"; 587 return "vs2003";
588 } 588 }
589 } 589 }
590 590
591 #endregion 591 #endregion
592 } 592 }
593} 593}
diff --git a/Prebuild/src/Core/Targets/VS2005Target.cs b/Prebuild/src/Core/Targets/VS2005Target.cs
index 9c70e26..e5a0939 100644
--- a/Prebuild/src/Core/Targets/VS2005Target.cs
+++ b/Prebuild/src/Core/Targets/VS2005Target.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com)
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -35,7 +35,7 @@ using Prebuild.Core.Utilities;
35namespace Prebuild.Core.Targets 35namespace Prebuild.Core.Targets
36{ 36{
37 /// <summary> 37 /// <summary>
38 /// 38 ///
39 /// </summary> 39 /// </summary>
40 [Target("vs2005")] 40 [Target("vs2005")]
41 public class VS2005Target : VSGenericTarget 41 public class VS2005Target : VSGenericTarget
@@ -137,9 +137,9 @@ namespace Prebuild.Core.Targets
137 /// <summary> 137 /// <summary>
138 /// Initializes a new instance of the <see cref="VS2005Target"/> class. 138 /// Initializes a new instance of the <see cref="VS2005Target"/> class.
139 /// </summary> 139 /// </summary>
140 public VS2005Target() 140 public VS2005Target()
141 : base() 141 : base()
142 { 142 {
143 } 143 }
144 144
145 #endregion 145 #endregion
diff --git a/Prebuild/src/Core/Targets/VS2008Target.cs b/Prebuild/src/Core/Targets/VS2008Target.cs
index fee4f7f..a3f3aca 100644
--- a/Prebuild/src/Core/Targets/VS2008Target.cs
+++ b/Prebuild/src/Core/Targets/VS2008Target.cs
@@ -11,86 +11,86 @@ using System.CodeDom.Compiler;
11namespace Prebuild.Core.Targets 11namespace Prebuild.Core.Targets
12{ 12{
13 13
14 /// <summary> 14 /// <summary>
15 /// 15 ///
16 /// </summary> 16 /// </summary>
17 [Target("vs2008")] 17 [Target("vs2008")]
18 public class VS2008Target : VSGenericTarget 18 public class VS2008Target : VSGenericTarget
19 { 19 {
20 #region Fields 20 #region Fields
21 string solutionVersion = "10.00"; 21 string solutionVersion = "10.00";
22 string productVersion = "9.0.21022"; 22 string productVersion = "9.0.21022";
23 string schemaVersion = "2.0"; 23 string schemaVersion = "2.0";
24 string versionName = "Visual Studio 2008"; 24 string versionName = "Visual Studio 2008";
25 string name = "vs2008"; 25 string name = "vs2008";
26 VSVersion version = VSVersion.VS90; 26 VSVersion version = VSVersion.VS90;
27 27
28 /// <summary> 28 /// <summary>
29 /// Gets or sets the solution version. 29 /// Gets or sets the solution version.
30 /// </summary> 30 /// </summary>
31 /// <value>The solution version.</value> 31 /// <value>The solution version.</value>
32 public override string SolutionVersion 32 public override string SolutionVersion
33 { 33 {
34 get 34 get
35 { 35 {
36 return solutionVersion; 36 return solutionVersion;
37 } 37 }
38 } 38 }
39 /// <summary> 39 /// <summary>
40 /// Gets or sets the product version. 40 /// Gets or sets the product version.
41 /// </summary> 41 /// </summary>
42 /// <value>The product version.</value> 42 /// <value>The product version.</value>
43 public override string ProductVersion 43 public override string ProductVersion
44 { 44 {
45 get 45 get
46 { 46 {
47 return productVersion; 47 return productVersion;
48 } 48 }
49 } 49 }
50 /// <summary> 50 /// <summary>
51 /// Gets or sets the schema version. 51 /// Gets or sets the schema version.
52 /// </summary> 52 /// </summary>
53 /// <value>The schema version.</value> 53 /// <value>The schema version.</value>
54 public override string SchemaVersion 54 public override string SchemaVersion
55 { 55 {
56 get 56 get
57 { 57 {
58 return schemaVersion; 58 return schemaVersion;
59 } 59 }
60 } 60 }
61 /// <summary> 61 /// <summary>
62 /// Gets or sets the name of the version. 62 /// Gets or sets the name of the version.
63 /// </summary> 63 /// </summary>
64 /// <value>The name of the version.</value> 64 /// <value>The name of the version.</value>
65 public override string VersionName 65 public override string VersionName
66 { 66 {
67 get 67 get
68 { 68 {
69 return versionName; 69 return versionName;
70 } 70 }
71 } 71 }
72 /// <summary> 72 /// <summary>
73 /// Gets or sets the version. 73 /// Gets or sets the version.
74 /// </summary> 74 /// </summary>
75 /// <value>The version.</value> 75 /// <value>The version.</value>
76 public override VSVersion Version 76 public override VSVersion Version
77 { 77 {
78 get 78 get
79 { 79 {
80 return version; 80 return version;
81 } 81 }
82 } 82 }
83 /// <summary> 83 /// <summary>
84 /// Gets the name. 84 /// Gets the name.
85 /// </summary> 85 /// </summary>
86 /// <value>The name.</value> 86 /// <value>The name.</value>
87 public override string Name 87 public override string Name
88 { 88 {
89 get 89 get
90 { 90 {
91 return name; 91 return name;
92 } 92 }
93 } 93 }
94 94
95 protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) 95 protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion)
96 { 96 {
@@ -110,18 +110,18 @@ namespace Prebuild.Core.Targets
110 get { return "# Visual Studio 2008"; } 110 get { return "# Visual Studio 2008"; }
111 } 111 }
112 112
113 #endregion 113 #endregion
114 114
115 #region Constructors 115 #region Constructors
116 116
117 /// <summary> 117 /// <summary>
118 /// Initializes a new instance of the <see cref="VS2005Target"/> class. 118 /// Initializes a new instance of the <see cref="VS2005Target"/> class.
119 /// </summary> 119 /// </summary>
120 public VS2008Target() 120 public VS2008Target()
121 : base() 121 : base()
122 { 122 {
123 } 123 }
124 124
125 #endregion 125 #endregion
126 } 126 }
127} 127}
diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs
index e8aeab5..b4c79dc 100644
--- a/Prebuild/src/Core/Targets/VS2010Target.cs
+++ b/Prebuild/src/Core/Targets/VS2010Target.cs
@@ -11,96 +11,96 @@ using System.CodeDom.Compiler;
11namespace Prebuild.Core.Targets 11namespace Prebuild.Core.Targets
12{ 12{
13 13
14 /// <summary> 14 /// <summary>
15 /// 15 ///
16 /// </summary> 16 /// </summary>
17 [Target("vs2010")] 17 [Target("vs2010")]
18 public class VS2010Target : VSGenericTarget 18 public class VS2010Target : VSGenericTarget
19 { 19 {
20 #region Fields 20 #region Fields
21 21
22 string solutionVersion = "11.00"; 22 string solutionVersion = "11.00";
23 string productVersion = "9.0.30729"; 23 string productVersion = "9.0.30729";
24 string schemaVersion = "2.0"; 24 string schemaVersion = "2.0";
25 string versionName = "Visual Studio 2010"; 25 string versionName = "Visual Studio 2010";
26 string name = "vs2010"; 26 string name = "vs2010";
27 VSVersion version = VSVersion.VS10; 27 VSVersion version = VSVersion.VS10;
28 28
29 #endregion 29 #endregion
30 30
31 #region Properties 31 #region Properties
32 32
33 /// <summary> 33 /// <summary>
34 /// Gets or sets the solution version. 34 /// Gets or sets the solution version.
35 /// </summary> 35 /// </summary>
36 /// <value>The solution version.</value> 36 /// <value>The solution version.</value>
37 public override string SolutionVersion 37 public override string SolutionVersion
38 { 38 {
39 get 39 get
40 { 40 {
41 return solutionVersion; 41 return solutionVersion;
42 } 42 }
43 } 43 }
44 44
45 /// <summary> 45 /// <summary>
46 /// Gets or sets the product version. 46 /// Gets or sets the product version.
47 /// </summary> 47 /// </summary>
48 /// <value>The product version.</value> 48 /// <value>The product version.</value>
49 public override string ProductVersion 49 public override string ProductVersion
50 { 50 {
51 get 51 get
52 { 52 {
53 return productVersion; 53 return productVersion;
54 } 54 }
55 } 55 }
56 56
57 /// <summary> 57 /// <summary>
58 /// Gets or sets the schema version. 58 /// Gets or sets the schema version.
59 /// </summary> 59 /// </summary>
60 /// <value>The schema version.</value> 60 /// <value>The schema version.</value>
61 public override string SchemaVersion 61 public override string SchemaVersion
62 { 62 {
63 get 63 get
64 { 64 {
65 return schemaVersion; 65 return schemaVersion;
66 } 66 }
67 } 67 }
68 68
69 /// <summary> 69 /// <summary>
70 /// Gets or sets the name of the version. 70 /// Gets or sets the name of the version.
71 /// </summary> 71 /// </summary>
72 /// <value>The name of the version.</value> 72 /// <value>The name of the version.</value>
73 public override string VersionName 73 public override string VersionName
74 { 74 {
75 get 75 get
76 { 76 {
77 return versionName; 77 return versionName;
78 } 78 }
79 } 79 }
80 80
81 /// <summary> 81 /// <summary>
82 /// Gets or sets the version. 82 /// Gets or sets the version.
83 /// </summary> 83 /// </summary>
84 /// <value>The version.</value> 84 /// <value>The version.</value>
85 public override VSVersion Version 85 public override VSVersion Version
86 { 86 {
87 get 87 get
88 { 88 {
89 return version; 89 return version;
90 } 90 }
91 } 91 }
92 92
93 /// <summary> 93 /// <summary>
94 /// Gets the name. 94 /// Gets the name.
95 /// </summary> 95 /// </summary>
96 /// <value>The name.</value> 96 /// <value>The name.</value>
97 public override string Name 97 public override string Name
98 { 98 {
99 get 99 get
100 { 100 {
101 return name; 101 return name;
102 } 102 }
103 } 103 }
104 104
105 protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) 105 protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion)
106 { 106 {
@@ -110,7 +110,7 @@ namespace Prebuild.Core.Targets
110 case FrameworkVersion.v4_5: 110 case FrameworkVersion.v4_5:
111 case FrameworkVersion.v4_0: 111 case FrameworkVersion.v4_0:
112 case FrameworkVersion.v3_5: 112 case FrameworkVersion.v3_5:
113 return "ToolsVersion=\"4.0\""; 113 return "ToolsVersion=\"4.0\"";
114 case FrameworkVersion.v3_0: 114 case FrameworkVersion.v3_0:
115 return "ToolsVersion=\"3.0\""; 115 return "ToolsVersion=\"3.0\"";
116 default: 116 default:
@@ -123,18 +123,18 @@ namespace Prebuild.Core.Targets
123 get { return "# Visual Studio 2010"; } 123 get { return "# Visual Studio 2010"; }
124 } 124 }
125 125
126 #endregion 126 #endregion
127 127
128 #region Constructors 128 #region Constructors
129 129
130 /// <summary> 130 /// <summary>
131 /// Initializes a new instance of the <see cref="VS2005Target"/> class. 131 /// Initializes a new instance of the <see cref="VS2005Target"/> class.
132 /// </summary> 132 /// </summary>
133 public VS2010Target() 133 public VS2010Target()
134 : base() 134 : base()
135 { 135 {
136 } 136 }
137 137
138 #endregion 138 #endregion
139 } 139 }
140} 140}
diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs
index af61704..400788b 100644
--- a/Prebuild/src/Core/Targets/VSGenericTarget.cs
+++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs
@@ -1,972 +1,972 @@
1#region BSD License 1#region BSD License
2/* 2/*
3Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) 3Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com)
4 4
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8 * Redistributions of source code must retain the above copyright notice, this list of conditions 8 * Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13 * The name of the author may not be used to endorse or promote products derived from this software 13 * The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */ 23 */
24#endregion 24#endregion
25 25
26using System; 26using System;
27using System.Collections.Generic; 27using System.Collections.Generic;
28using System.Collections.Specialized; 28using System.Collections.Specialized;
29using System.IO; 29using System.IO;
30using Prebuild.Core.Interfaces; 30using Prebuild.Core.Interfaces;
31using Prebuild.Core.Nodes; 31using Prebuild.Core.Nodes;
32using Prebuild.Core.Utilities; 32using Prebuild.Core.Utilities;
33using System.CodeDom.Compiler; 33using System.CodeDom.Compiler;
34 34
35namespace Prebuild.Core.Targets 35namespace Prebuild.Core.Targets
36{ 36{
37 37
38 /// <summary> 38 /// <summary>
39 /// 39 ///
40 /// </summary> 40 /// </summary>
41 public abstract class VSGenericTarget : ITarget 41 public abstract class VSGenericTarget : ITarget
42 { 42 {
43 #region Fields 43 #region Fields
44 44
45 readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>(); 45 readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>();
46// NameValueCollection CopyFiles = new NameValueCollection(); 46// NameValueCollection CopyFiles = new NameValueCollection();
47 Kernel kernel; 47 Kernel kernel;
48 #endregion 48 #endregion
49 49
50 #region Properties 50 #region Properties
51 /// <summary> 51 /// <summary>
52 /// Gets or sets the solution version. 52 /// Gets or sets the solution version.
53 /// </summary> 53 /// </summary>
54 /// <value>The solution version.</value> 54 /// <value>The solution version.</value>
55 public abstract string SolutionVersion { get; } 55 public abstract string SolutionVersion { get; }
56 /// <summary> 56 /// <summary>
57 /// Gets or sets the product version. 57 /// Gets or sets the product version.
58 /// </summary> 58 /// </summary>
59 /// <value>The product version.</value> 59 /// <value>The product version.</value>
60 public abstract string ProductVersion { get; } 60 public abstract string ProductVersion { get; }
61 /// <summary> 61 /// <summary>
62 /// Gets or sets the schema version. 62 /// Gets or sets the schema version.
63 /// </summary> 63 /// </summary>
64 /// <value>The schema version.</value> 64 /// <value>The schema version.</value>
65 public abstract string SchemaVersion { get; } 65 public abstract string SchemaVersion { get; }
66 /// <summary> 66 /// <summary>
67 /// Gets or sets the name of the version. 67 /// Gets or sets the name of the version.
68 /// </summary> 68 /// </summary>
69 /// <value>The name of the version.</value> 69 /// <value>The name of the version.</value>
70 public abstract string VersionName { get; } 70 public abstract string VersionName { get; }
71 /// <summary> 71 /// <summary>
72 /// Gets or sets the version. 72 /// Gets or sets the version.
73 /// </summary> 73 /// </summary>
74 /// <value>The version.</value> 74 /// <value>The version.</value>
75 public abstract VSVersion Version { get; } 75 public abstract VSVersion Version { get; }
76 /// <summary> 76 /// <summary>
77 /// Gets the name. 77 /// Gets the name.
78 /// </summary> 78 /// </summary>
79 /// <value>The name.</value> 79 /// <value>The name.</value>
80 public abstract string Name { get; } 80 public abstract string Name { get; }
81 81
82 protected abstract string GetToolsVersionXml(FrameworkVersion version); 82 protected abstract string GetToolsVersionXml(FrameworkVersion version);
83 public abstract string SolutionTag { get; } 83 public abstract string SolutionTag { get; }
84 84
85 #endregion 85 #endregion
86 86
87 #region Constructors 87 #region Constructors
88 88
89 /// <summary> 89 /// <summary>
90 /// Initializes a new instance of the <see cref="VSGenericTarget"/> class. 90 /// Initializes a new instance of the <see cref="VSGenericTarget"/> class.
91 /// </summary> 91 /// </summary>
92 protected VSGenericTarget() 92 protected VSGenericTarget()
93 { 93 {
94 tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); 94 tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets");
95 tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); 95 tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN");
96 tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); 96 tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets");
97 tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); 97 tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets");
98 tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); 98 tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null);
99 } 99 }
100 100
101 #endregion 101 #endregion
102 102
103 #region Private Methods 103 #region Private Methods
104 104
105 private string MakeRefPath(ProjectNode project) 105 private string MakeRefPath(ProjectNode project)
106 { 106 {
107 string ret = ""; 107 string ret = "";
108 foreach (ReferencePathNode node in project.ReferencePaths) 108 foreach (ReferencePathNode node in project.ReferencePaths)
109 { 109 {
110 try 110 try
111 { 111 {
112 string fullPath = Helper.ResolvePath(node.Path); 112 string fullPath = Helper.ResolvePath(node.Path);
113 if (ret.Length < 1) 113 if (ret.Length < 1)
114 { 114 {
115 ret = fullPath; 115 ret = fullPath;
116 } 116 }
117 else 117 else
118 { 118 {
119 ret += ";" + fullPath; 119 ret += ";" + fullPath;
120 } 120 }
121 } 121 }
122 catch (ArgumentException) 122 catch (ArgumentException)
123 { 123 {
124 kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); 124 kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path);
125 } 125 }
126 } 126 }
127 127
128 return ret; 128 return ret;
129 } 129 }
130 130
131 private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) 131 private static ProjectNode FindProjectInSolution(string name, SolutionNode solution)
132 { 132 {
133 SolutionNode node = solution; 133 SolutionNode node = solution;
134 134
135 while (node.Parent is SolutionNode) 135 while (node.Parent is SolutionNode)
136 node = node.Parent as SolutionNode; 136 node = node.Parent as SolutionNode;
137 137
138 return FindProjectInSolutionRecursively(name, node); 138 return FindProjectInSolutionRecursively(name, node);
139 } 139 }
140 140
141 private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) 141 private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution)
142 { 142 {
143 if (solution.ProjectsTable.ContainsKey(name)) 143 if (solution.ProjectsTable.ContainsKey(name))
144 return solution.ProjectsTable[name]; 144 return solution.ProjectsTable[name];
145 145
146 foreach (SolutionNode child in solution.Solutions) 146 foreach (SolutionNode child in solution.Solutions)
147 { 147 {
148 ProjectNode node = FindProjectInSolutionRecursively(name, child); 148 ProjectNode node = FindProjectInSolutionRecursively(name, child);
149 if (node != null) 149 if (node != null)
150 return node; 150 return node;
151 } 151 }
152 152
153 return null; 153 return null;
154 } 154 }
155 155
156 private void WriteProject(SolutionNode solution, ProjectNode project) 156 private void WriteProject(SolutionNode solution, ProjectNode project)
157 { 157 {
158 if (!tools.ContainsKey(project.Language)) 158 if (!tools.ContainsKey(project.Language))
159 { 159 {
160 throw new UnknownLanguageException("Unknown .NET language: " + project.Language); 160 throw new UnknownLanguageException("Unknown .NET language: " + project.Language);
161 } 161 }
162 162
163 ToolInfo toolInfo = tools[project.Language]; 163 ToolInfo toolInfo = tools[project.Language];
164 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); 164 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension);
165 StreamWriter ps = new StreamWriter(projectFile); 165 StreamWriter ps = new StreamWriter(projectFile);
166 166
167 kernel.CurrentWorkingDirectory.Push(); 167 kernel.CurrentWorkingDirectory.Push();
168 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); 168 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile));
169 169
170 #region Project File 170 #region Project File
171 using (ps) 171 using (ps)
172 { 172 {
173 string targets = ""; 173 string targets = "";
174 174
175 if(project.Files.CopyFiles > 0) 175 if(project.Files.CopyFiles > 0)
176 targets = "Build;CopyFiles"; 176 targets = "Build;CopyFiles";
177 else 177 else
178 targets = "Build"; 178 targets = "Build";
179 179
180 ps.WriteLine("<Project DefaultTargets=\"{0}\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {1}>", targets, GetToolsVersionXml(project.FrameworkVersion)); 180 ps.WriteLine("<Project DefaultTargets=\"{0}\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {1}>", targets, GetToolsVersionXml(project.FrameworkVersion));
181 ps.WriteLine(" <PropertyGroup>"); 181 ps.WriteLine(" <PropertyGroup>");
182 ps.WriteLine(" <ProjectType>Local</ProjectType>"); 182 ps.WriteLine(" <ProjectType>Local</ProjectType>");
183 ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion); 183 ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion);
184 ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", SchemaVersion); 184 ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", SchemaVersion);
185 ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper()); 185 ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper());
186 186
187 // Visual Studio has a hard coded guid for the project type 187 // Visual Studio has a hard coded guid for the project type
188 if (project.Type == ProjectType.Web) 188 if (project.Type == ProjectType.Web)
189 ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>"); 189 ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>");
190 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); 190 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>");
191 ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon); 191 ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon);
192 ps.WriteLine(" <AssemblyKeyContainerName>"); 192 ps.WriteLine(" <AssemblyKeyContainerName>");
193 ps.WriteLine(" </AssemblyKeyContainerName>"); 193 ps.WriteLine(" </AssemblyKeyContainerName>");
194 ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName); 194 ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName);
195 foreach (ConfigurationNode conf in project.Configurations) 195 foreach (ConfigurationNode conf in project.Configurations)
196 { 196 {
197 if (conf.Options.KeyFile != "") 197 if (conf.Options.KeyFile != "")
198 { 198 {
199 ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile); 199 ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile);
200 ps.WriteLine(" <SignAssembly>true</SignAssembly>"); 200 ps.WriteLine(" <SignAssembly>true</SignAssembly>");
201 break; 201 break;
202 } 202 }
203 } 203 }
204 ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>"); 204 ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>");
205 ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>"); 205 ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>");
206 ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>"); 206 ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>");
207 ps.WriteLine(" <DelaySign>false</DelaySign>"); 207 ps.WriteLine(" <DelaySign>false</DelaySign>");
208 ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", ".")); 208 ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", "."));
209 209
210 ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); 210 ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString());
211 ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder); 211 ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder);
212 ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace); 212 ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace);
213 ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject); 213 ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject);
214 if (string.IsNullOrEmpty(project.DebugStartParameters)) 214 if (string.IsNullOrEmpty(project.DebugStartParameters))
215 { 215 {
216 ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters); 216 ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters);
217 } 217 }
218 ps.WriteLine(" <FileUpgradeFlags>"); 218 ps.WriteLine(" <FileUpgradeFlags>");
219 ps.WriteLine(" </FileUpgradeFlags>"); 219 ps.WriteLine(" </FileUpgradeFlags>");
220 220
221 ps.WriteLine(" </PropertyGroup>"); 221 ps.WriteLine(" </PropertyGroup>");
222 222
223 foreach (ConfigurationNode conf in project.Configurations) 223 foreach (ConfigurationNode conf in project.Configurations)
224 { 224 {
225 ps.Write(" <PropertyGroup "); 225 ps.Write(" <PropertyGroup ");
226 ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|{1}' \">", conf.Name, conf.Platform); 226 ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|{1}' \">", conf.Name, conf.Platform);
227 ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]); 227 ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]);
228 ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]); 228 ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]);
229 ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]); 229 ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]);
230 ps.WriteLine(" <ConfigurationOverrideFile>"); 230 ps.WriteLine(" <ConfigurationOverrideFile>");
231 ps.WriteLine(" </ConfigurationOverrideFile>"); 231 ps.WriteLine(" </ConfigurationOverrideFile>");
232 ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]); 232 ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]);
233 ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); 233 ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString()));
234 ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]); 234 ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]);
235 ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]); 235 ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]);
236 ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]); 236 ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]);
237 if (project.Type != ProjectType.Web) 237 if (project.Type != ProjectType.Web)
238 ps.WriteLine(" <OutputPath>{0}</OutputPath>", 238 ps.WriteLine(" <OutputPath>{0}</OutputPath>",
239 Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); 239 Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString())));
240 else 240 else
241 ps.WriteLine(" <OutputPath>{0}</OutputPath>", 241 ps.WriteLine(" <OutputPath>{0}</OutputPath>",
242 Helper.EndPath(Helper.NormalizePath("bin\\"))); 242 Helper.EndPath(Helper.NormalizePath("bin\\")));
243 243
244 ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]); 244 ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]);
245 ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]); 245 ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]);
246 ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]); 246 ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]);
247 ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]); 247 ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]);
248 ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]); 248 ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]);
249 ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]); 249 ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]);
250 ps.WriteLine(" <PlatformTarget>{0}</PlatformTarget>", conf.Platform); 250 ps.WriteLine(" <PlatformTarget>{0}</PlatformTarget>", conf.Platform);
251 ps.WriteLine(" </PropertyGroup>"); 251 ps.WriteLine(" </PropertyGroup>");
252 } 252 }
253 253
254 //ps.WriteLine(" </Settings>"); 254 //ps.WriteLine(" </Settings>");
255 255
256 Dictionary<ReferenceNode, ProjectNode> projectReferences = new Dictionary<ReferenceNode, ProjectNode>(); 256 Dictionary<ReferenceNode, ProjectNode> projectReferences = new Dictionary<ReferenceNode, ProjectNode>();
257 List<ReferenceNode> otherReferences = new List<ReferenceNode>(); 257 List<ReferenceNode> otherReferences = new List<ReferenceNode>();
258 258
259 foreach (ReferenceNode refr in project.References) 259 foreach (ReferenceNode refr in project.References)
260 { 260 {
261 ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); 261 ProjectNode projectNode = FindProjectInSolution(refr.Name, solution);
262 262
263 if (projectNode == null) 263 if (projectNode == null)
264 otherReferences.Add(refr); 264 otherReferences.Add(refr);
265 else 265 else
266 projectReferences.Add(refr, projectNode); 266 projectReferences.Add(refr, projectNode);
267 } 267 }
268 // Assembly References 268 // Assembly References
269 ps.WriteLine(" <ItemGroup>"); 269 ps.WriteLine(" <ItemGroup>");
270 270
271 foreach (ReferenceNode refr in otherReferences) 271 foreach (ReferenceNode refr in otherReferences)
272 { 272 {
273 ps.Write(" <Reference"); 273 ps.Write(" <Reference");
274 ps.Write(" Include=\""); 274 ps.Write(" Include=\"");
275 ps.Write(refr.Name); 275 ps.Write(refr.Name);
276 ps.WriteLine("\" >"); 276 ps.WriteLine("\" >");
277 ps.Write(" <Name>"); 277 ps.Write(" <Name>");
278 ps.Write(refr.Name); 278 ps.Write(refr.Name);
279 ps.WriteLine("</Name>"); 279 ps.WriteLine("</Name>");
280 280
281 if(!String.IsNullOrEmpty(refr.Path)) 281 if(!String.IsNullOrEmpty(refr.Path))
282 { 282 {
283 // Use absolute path to assembly (for determining assembly type) 283 // Use absolute path to assembly (for determining assembly type)
284 string absolutePath = Path.Combine(project.FullPath, refr.Path); 284 string absolutePath = Path.Combine(project.FullPath, refr.Path);
285 if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { 285 if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) {
286 // Assembly is an executable (exe) 286 // Assembly is an executable (exe)
287 ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); 287 ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "exe"));
288 } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { 288 } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) {
289 // Assembly is an library (dll) 289 // Assembly is an library (dll)
290 ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); 290 ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll"));
291 } else { 291 } else {
292 string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); 292 string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll");
293 kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); 293 kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath);
294 ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); 294 ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll"));
295 } 295 }
296 } 296 }
297 297
298 ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy); 298 ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy);
299 ps.WriteLine(" </Reference>"); 299 ps.WriteLine(" </Reference>");
300 } 300 }
301 ps.WriteLine(" </ItemGroup>"); 301 ps.WriteLine(" </ItemGroup>");
302 302
303 //Project References 303 //Project References
304 ps.WriteLine(" <ItemGroup>"); 304 ps.WriteLine(" <ItemGroup>");
305 foreach (KeyValuePair<ReferenceNode, ProjectNode> pair in projectReferences) 305 foreach (KeyValuePair<ReferenceNode, ProjectNode> pair in projectReferences)
306 { 306 {
307 ToolInfo tool = tools[pair.Value.Language]; 307 ToolInfo tool = tools[pair.Value.Language];
308 if (tools == null) 308 if (tools == null)
309 throw new UnknownLanguageException(); 309 throw new UnknownLanguageException();
310 310
311 string path = 311 string path =
312 Helper.MakePathRelativeTo(project.FullPath, 312 Helper.MakePathRelativeTo(project.FullPath,
313 Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); 313 Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension));
314 ps.WriteLine(" <ProjectReference Include=\"{0}\">", path); 314 ps.WriteLine(" <ProjectReference Include=\"{0}\">", path);
315 315
316 // TODO: Allow reference to visual basic projects 316 // TODO: Allow reference to visual basic projects
317 ps.WriteLine(" <Name>{0}</Name>", pair.Value.Name); 317 ps.WriteLine(" <Name>{0}</Name>", pair.Value.Name);
318 ps.WriteLine(" <Project>{0}</Project>", pair.Value.Guid.ToString("B").ToUpper()); 318 ps.WriteLine(" <Project>{0}</Project>", pair.Value.Guid.ToString("B").ToUpper());
319 ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper()); 319 ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper());
320 320
321 //This is the Copy Local flag in VS 321 //This is the Copy Local flag in VS
322 ps.WriteLine(" <Private>{0}</Private>", pair.Key.LocalCopy); 322 ps.WriteLine(" <Private>{0}</Private>", pair.Key.LocalCopy);
323 323
324 ps.WriteLine(" </ProjectReference>"); 324 ps.WriteLine(" </ProjectReference>");
325 } 325 }
326 ps.WriteLine(" </ItemGroup>"); 326 ps.WriteLine(" </ItemGroup>");
327 327
328 // ps.WriteLine(" </Build>"); 328 // ps.WriteLine(" </Build>");
329 ps.WriteLine(" <ItemGroup>"); 329 ps.WriteLine(" <ItemGroup>");
330 330
331 // ps.WriteLine(" <Include>"); 331 // ps.WriteLine(" <Include>");
332 List<string> list = new List<string>(); 332 List<string> list = new List<string>();
333 333
334 foreach (string path in project.Files) 334 foreach (string path in project.Files)
335 { 335 {
336 string lower = path.ToLower(); 336 string lower = path.ToLower();
337 if (lower.EndsWith(".resx")) 337 if (lower.EndsWith(".resx"))
338 { 338 {
339 string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); 339 string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension);
340 if (!list.Contains(codebehind)) 340 if (!list.Contains(codebehind))
341 list.Add(codebehind); 341 list.Add(codebehind);
342 } 342 }
343 343
344 } 344 }
345 345
346 346
347 foreach (string filePath in project.Files) 347 foreach (string filePath in project.Files)
348 { 348 {
349 // Add the filePath with the destination as the key 349 // Add the filePath with the destination as the key
350 // will use it later to form the copy parameters with Include lists 350 // will use it later to form the copy parameters with Include lists
351 // for each destination 351 // for each destination
352 if (project.Files.GetBuildAction(filePath) == BuildAction.Copy) 352 if (project.Files.GetBuildAction(filePath) == BuildAction.Copy)
353 continue; 353 continue;
354 // if (file == "Properties\\Bind.Designer.cs") 354 // if (file == "Properties\\Bind.Designer.cs")
355 // { 355 // {
356 // Console.WriteLine("Wait a minute!"); 356 // Console.WriteLine("Wait a minute!");
357 // Console.WriteLine(project.Files.GetSubType(file).ToString()); 357 // Console.WriteLine(project.Files.GetSubType(file).ToString());
358 // } 358 // }
359 SubType subType = project.Files.GetSubType(filePath); 359 SubType subType = project.Files.GetSubType(filePath);
360 360
361 // Visual Studio chokes on file names if forward slash is used as a path separator 361 // Visual Studio chokes on file names if forward slash is used as a path separator
362 // instead of backslash. So we must make sure that all file paths written to the 362 // instead of backslash. So we must make sure that all file paths written to the
363 // project file use \ as a path separator. 363 // project file use \ as a path separator.
364 string file = filePath.Replace(@"/", @"\"); 364 string file = filePath.Replace(@"/", @"\");
365 365
366 if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer 366 if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer
367 && subType != SubType.CodeBehind) 367 && subType != SubType.CodeBehind)
368 { 368 {
369 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); 369 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx");
370 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); 370 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file));
371 ps.WriteLine(" <SubType>Designer</SubType>"); 371 ps.WriteLine(" <SubType>Designer</SubType>");
372 ps.WriteLine(" </EmbeddedResource>"); 372 ps.WriteLine(" </EmbeddedResource>");
373 // 373 //
374 } 374 }
375 375
376 if (subType == SubType.Designer) 376 if (subType == SubType.Designer)
377 { 377 {
378 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file); 378 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file);
379 379
380 string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; 380 string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs";
381 string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; 381 string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs";
382 382
383 // Check for a parent .cs file with the same name as this designer file 383 // Check for a parent .cs file with the same name as this designer file
384 if (File.Exists(Helper.NormalizePath(dependent_name))) 384 if (File.Exists(Helper.NormalizePath(dependent_name)))
385 { 385 {
386 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); 386 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name));
387 } 387 }
388 else 388 else
389 { 389 {
390 ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>"); 390 ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>");
391 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", Path.GetFileName(autogen_name)); 391 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", Path.GetFileName(autogen_name));
392 ps.WriteLine(" <SubType>" + subType + "</SubType>"); 392 ps.WriteLine(" <SubType>" + subType + "</SubType>");
393 } 393 }
394 394
395 ps.WriteLine(" </EmbeddedResource>"); 395 ps.WriteLine(" </EmbeddedResource>");
396 if (File.Exists(Helper.NormalizePath(autogen_name))) 396 if (File.Exists(Helper.NormalizePath(autogen_name)))
397 { 397 {
398 ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name); 398 ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name);
399 //ps.WriteLine(" <DesignTime>True</DesignTime>"); 399 //ps.WriteLine(" <DesignTime>True</DesignTime>");
400 400
401 // If a parent .cs file exists, link this autogen file to it. Otherwise link 401 // If a parent .cs file exists, link this autogen file to it. Otherwise link
402 // to the designer file 402 // to the designer file
403 if (File.Exists(dependent_name)) 403 if (File.Exists(dependent_name))
404 { 404 {
405 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); 405 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name));
406 } 406 }
407 else 407 else
408 { 408 {
409 ps.WriteLine(" <AutoGen>True</AutoGen>"); 409 ps.WriteLine(" <AutoGen>True</AutoGen>");
410 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(filePath)); 410 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(filePath));
411 } 411 }
412 412
413 ps.WriteLine(" </Compile>"); 413 ps.WriteLine(" </Compile>");
414 } 414 }
415 list.Add(autogen_name); 415 list.Add(autogen_name);
416 } 416 }
417 if (subType == SubType.Settings) 417 if (subType == SubType.Settings)
418 { 418 {
419 ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); 419 ps.Write(" <{0} ", project.Files.GetBuildAction(filePath));
420 ps.WriteLine("Include=\"{0}\">", file); 420 ps.WriteLine("Include=\"{0}\">", file);
421 string fileName = Path.GetFileName(filePath); 421 string fileName = Path.GetFileName(filePath);
422 if (project.Files.GetBuildAction(filePath) == BuildAction.None) 422 if (project.Files.GetBuildAction(filePath) == BuildAction.None)
423 { 423 {
424 ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>"); 424 ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>");
425 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); 425 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs");
426 } 426 }
427 else 427 else
428 { 428 {
429 ps.WriteLine(" <SubType>Code</SubType>"); 429 ps.WriteLine(" <SubType>Code</SubType>");
430 ps.WriteLine(" <AutoGen>True</AutoGen>"); 430 ps.WriteLine(" <AutoGen>True</AutoGen>");
431 ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); 431 ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>");
432 string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); 432 string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.'));
433 string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); 433 string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.'));
434 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings")); 434 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings"));
435 } 435 }
436 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath)); 436 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath));
437 } 437 }
438 else if (subType != SubType.Designer) 438 else if (subType != SubType.Designer)
439 { 439 {
440 string path = Helper.NormalizePath(file); 440 string path = Helper.NormalizePath(file);
441 string path_lower = path.ToLower(); 441 string path_lower = path.ToLower();
442 442
443 if (!list.Contains(filePath)) 443 if (!list.Contains(filePath))
444 { 444 {
445 ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); 445 ps.Write(" <{0} ", project.Files.GetBuildAction(filePath));
446 446
447 int startPos = 0; 447 int startPos = 0;
448 if (project.Files.GetPreservePath(filePath)) 448 if (project.Files.GetPreservePath(filePath))
449 { 449 {
450 while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) 450 while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1)
451 startPos++; 451 startPos++;
452 452
453 } 453 }
454 else 454 else
455 { 455 {
456 startPos = file.LastIndexOf(Path.GetFileName(path)); 456 startPos = file.LastIndexOf(Path.GetFileName(path));
457 } 457 }
458 458
459 // be sure to write out the path with backslashes so VS recognizes 459 // be sure to write out the path with backslashes so VS recognizes
460 // the file properly. 460 // the file properly.
461 ps.WriteLine("Include=\"{0}\">", file); 461 ps.WriteLine("Include=\"{0}\">", file);
462 462
463 int last_period_index = file.LastIndexOf('.'); 463 int last_period_index = file.LastIndexOf('.');
464 string short_file_name = (last_period_index >= 0) 464 string short_file_name = (last_period_index >= 0)
465 ? file.Substring(0, last_period_index) 465 ? file.Substring(0, last_period_index)
466 : file; 466 : file;
467 string extension = Path.GetExtension(path); 467 string extension = Path.GetExtension(path);
468 // make this upper case, so that when File.Exists tests for the 468 // make this upper case, so that when File.Exists tests for the
469 // existence of a designer file on a case-sensitive platform, 469 // existence of a designer file on a case-sensitive platform,
470 // it is correctly identified. 470 // it is correctly identified.
471 string designer_format = string.Format(".Designer{0}", extension); 471 string designer_format = string.Format(".Designer{0}", extension);
472 472
473 if (path_lower.EndsWith(designer_format.ToLowerInvariant())) 473 if (path_lower.EndsWith(designer_format.ToLowerInvariant()))
474 { 474 {
475 int designer_index = path.IndexOf(designer_format); 475 int designer_index = path.IndexOf(designer_format);
476 string file_name = path.Substring(0, designer_index); 476 string file_name = path.Substring(0, designer_index);
477 477
478 // There are two corrections to the next lines: 478 // There are two corrections to the next lines:
479 // 1. Fix the connection between a designer file and a form 479 // 1. Fix the connection between a designer file and a form
480 // or usercontrol that don't have an associated resx file. 480 // or usercontrol that don't have an associated resx file.
481 // 2. Connect settings files to associated designer files. 481 // 2. Connect settings files to associated designer files.
482 if (File.Exists(file_name + extension)) 482 if (File.Exists(file_name + extension))
483 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + extension)); 483 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + extension));
484 else if (File.Exists(file_name + ".resx")) 484 else if (File.Exists(file_name + ".resx"))
485 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx")); 485 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx"));
486 else if (File.Exists(file_name + ".settings")) 486 else if (File.Exists(file_name + ".settings"))
487 { 487 {
488 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".settings")); 488 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".settings"));
489 ps.WriteLine(" <AutoGen>True</AutoGen>"); 489 ps.WriteLine(" <AutoGen>True</AutoGen>");
490 ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); 490 ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>");
491 } 491 }
492 } 492 }
493 else if (subType == SubType.CodeBehind) 493 else if (subType == SubType.CodeBehind)
494 { 494 {
495 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name)); 495 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name));
496 } 496 }
497 if (project.Files.GetIsLink(filePath)) 497 if (project.Files.GetIsLink(filePath))
498 { 498 {
499 string alias = project.Files.GetLinkPath(filePath); 499 string alias = project.Files.GetLinkPath(filePath);
500 alias += file.Substring(startPos); 500 alias += file.Substring(startPos);
501 alias = Helper.NormalizePath(alias); 501 alias = Helper.NormalizePath(alias);
502 ps.WriteLine(" <Link>{0}</Link>", alias); 502 ps.WriteLine(" <Link>{0}</Link>", alias);
503 } 503 }
504 else if (project.Files.GetBuildAction(filePath) != BuildAction.None) 504 else if (project.Files.GetBuildAction(filePath) != BuildAction.None)
505 { 505 {
506 if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) 506 if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource)
507 { 507 {
508 ps.WriteLine(" <SubType>{0}</SubType>", subType); 508 ps.WriteLine(" <SubType>{0}</SubType>", subType);
509 } 509 }
510 } 510 }
511 511
512 if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) 512 if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never)
513 { 513 {
514 ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(filePath)); 514 ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(filePath));
515 } 515 }
516 516
517 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath)); 517 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath));
518 } 518 }
519 } 519 }
520 } 520 }
521 ps.WriteLine(" </ItemGroup>"); 521 ps.WriteLine(" </ItemGroup>");
522 522
523 /* 523 /*
524 * Copy Task 524 * Copy Task
525 * 525 *
526 */ 526 */
527 if ( project.Files.CopyFiles > 0 ) { 527 if ( project.Files.CopyFiles > 0 ) {
528 528
529 Dictionary<string, string> IncludeTags = new Dictionary<string, string>(); 529 Dictionary<string, string> IncludeTags = new Dictionary<string, string>();
530 int TagCount = 0; 530 int TagCount = 0;
531 531
532 // Handle Copy tasks 532 // Handle Copy tasks
533 ps.WriteLine(" <ItemGroup>"); 533 ps.WriteLine(" <ItemGroup>");
534 foreach (string destPath in project.Files.Destinations) 534 foreach (string destPath in project.Files.Destinations)
535 { 535 {
536 string tag = "FilesToCopy_" + TagCount.ToString("0000"); 536 string tag = "FilesToCopy_" + TagCount.ToString("0000");
537 537
538 ps.WriteLine(" <{0} Include=\"{1}\" />", tag, String.Join(";", project.Files.SourceFiles(destPath))); 538 ps.WriteLine(" <{0} Include=\"{1}\" />", tag, String.Join(";", project.Files.SourceFiles(destPath)));
539 IncludeTags.Add(destPath, tag); 539 IncludeTags.Add(destPath, tag);
540 TagCount++; 540 TagCount++;
541 } 541 }
542 542
543 ps.WriteLine(" </ItemGroup>"); 543 ps.WriteLine(" </ItemGroup>");
544 544
545 ps.WriteLine(" <Target Name=\"CopyFiles\">"); 545 ps.WriteLine(" <Target Name=\"CopyFiles\">");
546 546
547 foreach (string destPath in project.Files.Destinations) 547 foreach (string destPath in project.Files.Destinations)
548 { 548 {
549 ps.WriteLine(" <Copy SourceFiles=\"@({0})\" DestinationFolder=\"{1}\" />", 549 ps.WriteLine(" <Copy SourceFiles=\"@({0})\" DestinationFolder=\"{1}\" />",
550 IncludeTags[destPath], destPath); 550 IncludeTags[destPath], destPath);
551 } 551 }
552 552
553 ps.WriteLine(" </Target>"); 553 ps.WriteLine(" </Target>");
554 } 554 }
555 555
556 ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />"); 556 ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />");
557 ps.WriteLine(" <PropertyGroup>"); 557 ps.WriteLine(" <PropertyGroup>");
558 ps.WriteLine(" <PreBuildEvent>"); 558 ps.WriteLine(" <PreBuildEvent>");
559 ps.WriteLine(" </PreBuildEvent>"); 559 ps.WriteLine(" </PreBuildEvent>");
560 ps.WriteLine(" <PostBuildEvent>"); 560 ps.WriteLine(" <PostBuildEvent>");
561 ps.WriteLine(" </PostBuildEvent>"); 561 ps.WriteLine(" </PostBuildEvent>");
562 ps.WriteLine(" </PropertyGroup>"); 562 ps.WriteLine(" </PropertyGroup>");
563 ps.WriteLine("</Project>"); 563 ps.WriteLine("</Project>");
564 } 564 }
565 #endregion 565 #endregion
566 566
567 #region User File 567 #region User File
568 568
569 ps = new StreamWriter(projectFile + ".user"); 569 ps = new StreamWriter(projectFile + ".user");
570 using (ps) 570 using (ps)
571 { 571 {
572 // Get the first configuration from the project. 572 // Get the first configuration from the project.
573 ConfigurationNode firstConfiguration = null; 573 ConfigurationNode firstConfiguration = null;
574 574
575 if (project.Configurations.Count > 0) 575 if (project.Configurations.Count > 0)
576 { 576 {
577 firstConfiguration = project.Configurations[0]; 577 firstConfiguration = project.Configurations[0];
578 } 578 }
579 579
580 ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">"); 580 ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">");
581 //ps.WriteLine( "<VisualStudioProject>" ); 581 //ps.WriteLine( "<VisualStudioProject>" );
582 //ps.WriteLine(" <{0}>", toolInfo.XMLTag); 582 //ps.WriteLine(" <{0}>", toolInfo.XMLTag);
583 //ps.WriteLine(" <Build>"); 583 //ps.WriteLine(" <Build>");
584 ps.WriteLine(" <PropertyGroup>"); 584 ps.WriteLine(" <PropertyGroup>");
585 //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); 585 //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project));
586 586
587 if (firstConfiguration != null) 587 if (firstConfiguration != null)
588 { 588 {
589 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">{0}</Configuration>", firstConfiguration.Name); 589 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">{0}</Configuration>", firstConfiguration.Name);
590 ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">{0}</Platform>", firstConfiguration.Platform); 590 ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">{0}</Platform>", firstConfiguration.Platform);
591 } 591 }
592 592
593 ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project)); 593 ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project));
594 ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", ProductVersion); 594 ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", ProductVersion);
595 ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>"); 595 ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>");
596 ps.WriteLine(" <ProjectTrust>0</ProjectTrust>"); 596 ps.WriteLine(" <ProjectTrust>0</ProjectTrust>");
597 ps.WriteLine(" </PropertyGroup>"); 597 ps.WriteLine(" </PropertyGroup>");
598 foreach (ConfigurationNode conf in project.Configurations) 598 foreach (ConfigurationNode conf in project.Configurations)
599 { 599 {
600 ps.Write(" <PropertyGroup"); 600 ps.Write(" <PropertyGroup");
601 ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|{1}' \"", conf.Name, conf.Platform); 601 ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|{1}' \"", conf.Name, conf.Platform);
602 ps.WriteLine(" />"); 602 ps.WriteLine(" />");
603 } 603 }
604 ps.WriteLine("</Project>"); 604 ps.WriteLine("</Project>");
605 } 605 }
606 #endregion 606 #endregion
607 607
608 kernel.CurrentWorkingDirectory.Pop(); 608 kernel.CurrentWorkingDirectory.Pop();
609 } 609 }
610 610
611 private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) 611 private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk)
612 { 612 {
613 kernel.Log.Write("Creating {0} solution and project files", VersionName); 613 kernel.Log.Write("Creating {0} solution and project files", VersionName);
614 614
615 foreach (SolutionNode child in solution.Solutions) 615 foreach (SolutionNode child in solution.Solutions)
616 { 616 {
617 kernel.Log.Write("...Creating folder: {0}", child.Name); 617 kernel.Log.Write("...Creating folder: {0}", child.Name);
618 WriteSolution(child, false); 618 WriteSolution(child, false);
619 } 619 }
620 620
621 foreach (ProjectNode project in solution.Projects) 621 foreach (ProjectNode project in solution.Projects)
622 { 622 {
623 kernel.Log.Write("...Creating project: {0}", project.Name); 623 kernel.Log.Write("...Creating project: {0}", project.Name);
624 WriteProject(solution, project); 624 WriteProject(solution, project);
625 } 625 }
626 626
627 foreach (DatabaseProjectNode project in solution.DatabaseProjects) 627 foreach (DatabaseProjectNode project in solution.DatabaseProjects)
628 { 628 {
629 kernel.Log.Write("...Creating database project: {0}", project.Name); 629 kernel.Log.Write("...Creating database project: {0}", project.Name);
630 WriteDatabaseProject(solution, project); 630 WriteDatabaseProject(solution, project);
631 } 631 }
632 632
633 if (writeSolutionToDisk) // only write main solution 633 if (writeSolutionToDisk) // only write main solution
634 { 634 {
635 kernel.Log.Write(""); 635 kernel.Log.Write("");
636 string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); 636 string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln");
637 637
638 using (StreamWriter ss = new StreamWriter(solutionFile)) 638 using (StreamWriter ss = new StreamWriter(solutionFile))
639 { 639 {
640 kernel.CurrentWorkingDirectory.Push(); 640 kernel.CurrentWorkingDirectory.Push();
641 Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); 641 Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile));
642 642
643 ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); 643 ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion);
644 ss.WriteLine(SolutionTag); 644 ss.WriteLine(SolutionTag);
645 645
646 WriteProjectDeclarations(ss, solution, solution); 646 WriteProjectDeclarations(ss, solution, solution);
647 647
648 ss.WriteLine("Global"); 648 ss.WriteLine("Global");
649 649
650 ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); 650 ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution");
651 foreach (ConfigurationNode conf in solution.Configurations) 651 foreach (ConfigurationNode conf in solution.Configurations)
652 { 652 {
653 ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); 653 ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform);
654 } 654 }
655 ss.WriteLine("\tEndGlobalSection"); 655 ss.WriteLine("\tEndGlobalSection");
656 656
657 ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); 657 ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution");
658 WriteConfigurationLines(solution.Configurations, solution, ss); 658 WriteConfigurationLines(solution.Configurations, solution, ss);
659 ss.WriteLine("\tEndGlobalSection"); 659 ss.WriteLine("\tEndGlobalSection");
660 660
661 if (solution.Solutions.Count > 0) 661 if (solution.Solutions.Count > 0)
662 { 662 {
663 ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); 663 ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution");
664 foreach (SolutionNode embeddedSolution in solution.Solutions) 664 foreach (SolutionNode embeddedSolution in solution.Solutions)
665 { 665 {
666 WriteNestedProjectMap(ss, embeddedSolution); 666 WriteNestedProjectMap(ss, embeddedSolution);
667 } 667 }
668 ss.WriteLine("\tEndGlobalSection"); 668 ss.WriteLine("\tEndGlobalSection");
669 } 669 }
670 670
671 ss.WriteLine("EndGlobal"); 671 ss.WriteLine("EndGlobal");
672 } 672 }
673 673
674 kernel.CurrentWorkingDirectory.Pop(); 674 kernel.CurrentWorkingDirectory.Pop();
675 } 675 }
676 } 676 }
677 677
678 private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) 678 private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution)
679 { 679 {
680 foreach (SolutionNode childSolution in embeddedSolution.Solutions) 680 foreach (SolutionNode childSolution in embeddedSolution.Solutions)
681 { 681 {
682 WriteEmbeddedSolution(writer, childSolution); 682 WriteEmbeddedSolution(writer, childSolution);
683 WriteProjectDeclarations(writer, actualSolution, childSolution); 683 WriteProjectDeclarations(writer, actualSolution, childSolution);
684 } 684 }
685 685
686 foreach (ProjectNode project in embeddedSolution.Projects) 686 foreach (ProjectNode project in embeddedSolution.Projects)
687 { 687 {
688 WriteProject(actualSolution, writer, project); 688 WriteProject(actualSolution, writer, project);
689 } 689 }
690 690
691 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) 691 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects)
692 { 692 {
693 WriteProject(actualSolution, writer, dbProject); 693 WriteProject(actualSolution, writer, dbProject);
694 } 694 }
695 695
696 if (actualSolution.Guid == embeddedSolution.Guid) 696 if (actualSolution.Guid == embeddedSolution.Guid)
697 { 697 {
698 WriteSolutionFiles(actualSolution, writer); 698 WriteSolutionFiles(actualSolution, writer);
699 } 699 }
700 } 700 }
701 701
702 private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) 702 private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution)
703 { 703 {
704 foreach (ProjectNode project in embeddedSolution.Projects) 704 foreach (ProjectNode project in embeddedSolution.Projects)
705 { 705 {
706 WriteNestedProject(writer, embeddedSolution, project.Guid); 706 WriteNestedProject(writer, embeddedSolution, project.Guid);
707 } 707 }
708 708
709 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) 709 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects)
710 { 710 {
711 WriteNestedProject(writer, embeddedSolution, dbProject.Guid); 711 WriteNestedProject(writer, embeddedSolution, dbProject.Guid);
712 } 712 }
713 713
714 foreach (SolutionNode child in embeddedSolution.Solutions) 714 foreach (SolutionNode child in embeddedSolution.Solutions)
715 { 715 {
716 WriteNestedProject(writer, embeddedSolution, child.Guid); 716 WriteNestedProject(writer, embeddedSolution, child.Guid);
717 WriteNestedProjectMap(writer, child); 717 WriteNestedProjectMap(writer, child);
718 } 718 }
719 } 719 }
720 720
721 private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) 721 private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid)
722 { 722 {
723 WriteNestedFolder(writer, solution.Guid, projectGuid); 723 WriteNestedFolder(writer, solution.Guid, projectGuid);
724 } 724 }
725 725
726 private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) 726 private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid)
727 { 727 {
728 writer.WriteLine("\t\t{0} = {1}", 728 writer.WriteLine("\t\t{0} = {1}",
729 childGuid.ToString("B").ToUpper(), 729 childGuid.ToString("B").ToUpper(),
730 parentGuid.ToString("B").ToUpper()); 730 parentGuid.ToString("B").ToUpper());
731 } 731 }
732 732
733 private static void WriteConfigurationLines(IEnumerable<ConfigurationNode> configurations, SolutionNode solution, TextWriter ss) 733 private static void WriteConfigurationLines(IEnumerable<ConfigurationNode> configurations, SolutionNode solution, TextWriter ss)
734 { 734 {
735 foreach (ProjectNode project in solution.Projects) 735 foreach (ProjectNode project in solution.Projects)
736 { 736 {
737 foreach (ConfigurationNode conf in configurations) 737 foreach (ConfigurationNode conf in configurations)
738 { 738 {
739 ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", 739 ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}",
740 project.Guid.ToString("B").ToUpper(), 740 project.Guid.ToString("B").ToUpper(),
741 conf.NameAndPlatform); 741 conf.NameAndPlatform);
742 742
743 ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", 743 ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}",
744 project.Guid.ToString("B").ToUpper(), 744 project.Guid.ToString("B").ToUpper(),
745 conf.NameAndPlatform); 745 conf.NameAndPlatform);
746 } 746 }
747 } 747 }
748 748
749 foreach (SolutionNode child in solution.Solutions) 749 foreach (SolutionNode child in solution.Solutions)
750 { 750 {
751 WriteConfigurationLines(configurations, child, ss); 751 WriteConfigurationLines(configurations, child, ss);
752 } 752 }
753 } 753 }
754 754
755 private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) 755 private void WriteSolutionFiles(SolutionNode solution, TextWriter ss)
756 { 756 {
757 if(solution.Files != null && solution.Files.Count > 0) 757 if(solution.Files != null && solution.Files.Count > 0)
758 WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); 758 WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files);
759 } 759 }
760 760
761 private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) 761 private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution)
762 { 762 {
763 WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); 763 WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files);
764 } 764 }
765 765
766 private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) 766 private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project)
767 { 767 {
768 WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); 768 WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath);
769 } 769 }
770 770
771 private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) 771 private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject)
772 { 772 {
773 if (solution.Files != null && solution.Files.Count > 0) 773 if (solution.Files != null && solution.Files.Count > 0)
774 WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); 774 WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath);
775 } 775 }
776 776
777 const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; 777 const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\"";
778 const string ProjectDeclarationEndFormat = "EndProject"; 778 const string ProjectDeclarationEndFormat = "EndProject";
779 779
780 private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) 780 private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath)
781 { 781 {
782 if (!tools.ContainsKey(language)) 782 if (!tools.ContainsKey(language))
783 throw new UnknownLanguageException("Unknown .NET language: " + language); 783 throw new UnknownLanguageException("Unknown .NET language: " + language);
784 784
785 ToolInfo toolInfo = tools[language]; 785 ToolInfo toolInfo = tools[language];
786 786
787 string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); 787 string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath);
788 788
789 path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); 789 path = Helper.MakeFilePath(path, name, toolInfo.FileExtension);
790 790
791 WriteProject(ss, language, guid, name, path); 791 WriteProject(ss, language, guid, name, path);
792 } 792 }
793 793
794 private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) 794 private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location)
795 { 795 {
796 WriteProject(writer, language, projectGuid, name, location, null); 796 WriteProject(writer, language, projectGuid, name, location, null);
797 } 797 }
798 798
799 private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) 799 private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files)
800 { 800 {
801 if (!tools.ContainsKey(language)) 801 if (!tools.ContainsKey(language))
802 throw new UnknownLanguageException("Unknown .NET language: " + language); 802 throw new UnknownLanguageException("Unknown .NET language: " + language);
803 803
804 ToolInfo toolInfo = tools[language]; 804 ToolInfo toolInfo = tools[language];
805 805
806 writer.WriteLine(ProjectDeclarationBeginFormat, 806 writer.WriteLine(ProjectDeclarationBeginFormat,
807 toolInfo.Guid, 807 toolInfo.Guid,
808 name, 808 name,
809 location, 809 location,
810 projectGuid.ToString("B").ToUpper()); 810 projectGuid.ToString("B").ToUpper());
811 811
812 if (files != null) 812 if (files != null)
813 { 813 {
814 writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); 814 writer.WriteLine("\tProjectSection(SolutionItems) = preProject");
815 815
816 foreach (string file in files) 816 foreach (string file in files)
817 writer.WriteLine("\t\t{0} = {0}", file); 817 writer.WriteLine("\t\t{0} = {0}", file);
818 818
819 writer.WriteLine("\tEndProjectSection"); 819 writer.WriteLine("\tEndProjectSection");
820 } 820 }
821 821
822 writer.WriteLine(ProjectDeclarationEndFormat); 822 writer.WriteLine(ProjectDeclarationEndFormat);
823 } 823 }
824 824
825 private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) 825 private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project)
826 { 826 {
827 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); 827 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp");
828 IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); 828 IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " ");
829 829
830 kernel.CurrentWorkingDirectory.Push(); 830 kernel.CurrentWorkingDirectory.Push();
831 831
832 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); 832 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile));
833 833
834 using (ps) 834 using (ps)
835 { 835 {
836 ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); 836 ps.WriteLine("# Microsoft Developer Studio Project File - Database Project");
837 ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); 837 ps.WriteLine("Begin DataProject = \"{0}\"", project.Name);
838 ps.Indent++; 838 ps.Indent++;
839 ps.WriteLine("MSDTVersion = \"80\""); 839 ps.WriteLine("MSDTVersion = \"80\"");
840 // TODO: Use the project.Files property 840 // TODO: Use the project.Files property
841 if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) 841 if (ContainsSqlFiles(Path.GetDirectoryName(projectFile)))
842 WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); 842 WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile));
843 843
844 ps.WriteLine("Begin DBRefFolder = \"Database References\""); 844 ps.WriteLine("Begin DBRefFolder = \"Database References\"");
845 ps.Indent++; 845 ps.Indent++;
846 foreach (DatabaseReferenceNode reference in project.References) 846 foreach (DatabaseReferenceNode reference in project.References)
847 { 847 {
848 ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); 848 ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name);
849 ps.Indent++; 849 ps.Indent++;
850 ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); 850 ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString);
851 ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); 851 ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper());
852 //ps.WriteLine("Colorizer = 5"); 852 //ps.WriteLine("Colorizer = 5");
853 ps.Indent--; 853 ps.Indent--;
854 ps.WriteLine("End"); 854 ps.WriteLine("End");
855 } 855 }
856 ps.Indent--; 856 ps.Indent--;
857 ps.WriteLine("End"); 857 ps.WriteLine("End");
858 ps.Indent--; 858 ps.Indent--;
859 ps.WriteLine("End"); 859 ps.WriteLine("End");
860 860
861 ps.Flush(); 861 ps.Flush();
862 } 862 }
863 863
864 kernel.CurrentWorkingDirectory.Pop(); 864 kernel.CurrentWorkingDirectory.Pop();
865 } 865 }
866 866
867 private static bool ContainsSqlFiles(string folder) 867 private static bool ContainsSqlFiles(string folder)
868 { 868 {
869 if(Directory.GetFiles(folder, "*.sql").Length > 0) 869 if(Directory.GetFiles(folder, "*.sql").Length > 0)
870 return true; // if the folder contains 1 .sql file, that's good enough 870 return true; // if the folder contains 1 .sql file, that's good enough
871 871
872 foreach (string child in Directory.GetDirectories(folder)) 872 foreach (string child in Directory.GetDirectories(folder))
873 { 873 {
874 if (ContainsSqlFiles(child)) 874 if (ContainsSqlFiles(child))
875 return true; // if 1 child folder contains a .sql file, still good enough 875 return true; // if 1 child folder contains a .sql file, still good enough
876 } 876 }
877 877
878 return false; 878 return false;
879 } 879 }
880 880
881 private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) 881 private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder)
882 { 882 {
883 foreach (string child in Directory.GetDirectories(folder)) 883 foreach (string child in Directory.GetDirectories(folder))
884 { 884 {
885 if (ContainsSqlFiles(child)) 885 if (ContainsSqlFiles(child))
886 { 886 {
887 writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); 887 writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child));
888 writer.Indent++; 888 writer.Indent++;
889 WriteDatabaseFoldersAndFiles(writer, child); 889 WriteDatabaseFoldersAndFiles(writer, child);
890 writer.Indent--; 890 writer.Indent--;
891 writer.WriteLine("End"); 891 writer.WriteLine("End");
892 } 892 }
893 } 893 }
894 foreach (string file in Directory.GetFiles(folder, "*.sql")) 894 foreach (string file in Directory.GetFiles(folder, "*.sql"))
895 { 895 {
896 writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); 896 writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file));
897 } 897 }
898 } 898 }
899 899
900 private void CleanProject(ProjectNode project) 900 private void CleanProject(ProjectNode project)
901 { 901 {
902 kernel.Log.Write("...Cleaning project: {0}", project.Name); 902 kernel.Log.Write("...Cleaning project: {0}", project.Name);
903 903
904 ToolInfo toolInfo = tools[project.Language]; 904 ToolInfo toolInfo = tools[project.Language];
905 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); 905 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension);
906 string userFile = projectFile + ".user"; 906 string userFile = projectFile + ".user";
907 907
908 Helper.DeleteIfExists(projectFile); 908 Helper.DeleteIfExists(projectFile);
909 Helper.DeleteIfExists(userFile); 909 Helper.DeleteIfExists(userFile);
910 } 910 }
911 911
912 private void CleanSolution(SolutionNode solution) 912 private void CleanSolution(SolutionNode solution)
913 { 913 {
914 kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); 914 kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name);
915 915
916 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); 916 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln");
917 string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); 917 string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo");
918 918
919 Helper.DeleteIfExists(slnFile); 919 Helper.DeleteIfExists(slnFile);
920 Helper.DeleteIfExists(suoFile); 920 Helper.DeleteIfExists(suoFile);
921 921
922 foreach (ProjectNode project in solution.Projects) 922 foreach (ProjectNode project in solution.Projects)
923 { 923 {
924 CleanProject(project); 924 CleanProject(project);
925 } 925 }
926 926
927 kernel.Log.Write(""); 927 kernel.Log.Write("");
928 } 928 }
929 929
930 #endregion 930 #endregion
931 931
932 #region ITarget Members 932 #region ITarget Members
933 933
934 /// <summary> 934 /// <summary>
935 /// Writes the specified kern. 935 /// Writes the specified kern.
936 /// </summary> 936 /// </summary>
937 /// <param name="kern">The kern.</param> 937 /// <param name="kern">The kern.</param>
938 public virtual void Write(Kernel kern) 938 public virtual void Write(Kernel kern)
939 { 939 {
940 if (kern == null) 940 if (kern == null)
941 { 941 {
942 throw new ArgumentNullException("kern"); 942 throw new ArgumentNullException("kern");
943 } 943 }
944 kernel = kern; 944 kernel = kern;
945 foreach (SolutionNode sol in kernel.Solutions) 945 foreach (SolutionNode sol in kernel.Solutions)
946 { 946 {
947 WriteSolution(sol, true); 947 WriteSolution(sol, true);
948 } 948 }
949 kernel = null; 949 kernel = null;
950 } 950 }
951 951
952 /// <summary> 952 /// <summary>
953 /// Cleans the specified kern. 953 /// Cleans the specified kern.
954 /// </summary> 954 /// </summary>
955 /// <param name="kern">The kern.</param> 955 /// <param name="kern">The kern.</param>
956 public virtual void Clean(Kernel kern) 956 public virtual void Clean(Kernel kern)
957 { 957 {
958 if (kern == null) 958 if (kern == null)
959 { 959 {
960 throw new ArgumentNullException("kern"); 960 throw new ArgumentNullException("kern");
961 } 961 }
962 kernel = kern; 962 kernel = kern;
963 foreach (SolutionNode sol in kernel.Solutions) 963 foreach (SolutionNode sol in kernel.Solutions)
964 { 964 {
965 CleanSolution(sol); 965 CleanSolution(sol);
966 } 966 }
967 kernel = null; 967 kernel = null;
968 } 968 }
969 969
970 #endregion 970 #endregion
971 } 971 }
972} 972}
diff --git a/Prebuild/src/Core/Targets/VSVersion.cs b/Prebuild/src/Core/Targets/VSVersion.cs
index 699b5ca..a7434c6 100644
--- a/Prebuild/src/Core/Targets/VSVersion.cs
+++ b/Prebuild/src/Core/Targets/VSVersion.cs
@@ -5,16 +5,16 @@ Copyright (c) 2008-2009 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -25,30 +25,30 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O
25 25
26namespace Prebuild.Core.Targets 26namespace Prebuild.Core.Targets
27{ 27{
28 /// <summary> 28 /// <summary>
29 /// 29 ///
30 /// </summary> 30 /// </summary>
31 public enum VSVersion 31 public enum VSVersion
32 { 32 {
33 /// <summary> 33 /// <summary>
34 /// Visual Studio 2002 34 /// Visual Studio 2002
35 /// </summary> 35 /// </summary>
36 VS70, 36 VS70,
37 /// <summary> 37 /// <summary>
38 /// Visual Studio 2003 38 /// Visual Studio 2003
39 /// </summary> 39 /// </summary>
40 VS71, 40 VS71,
41 /// <summary> 41 /// <summary>
42 /// Visual Studio 2005 42 /// Visual Studio 2005
43 /// </summary> 43 /// </summary>
44 VS80, 44 VS80,
45 /// <summary> 45 /// <summary>
46 /// Visual Studio 2008 46 /// Visual Studio 2008
47 /// </summary> 47 /// </summary>
48 VS90, 48 VS90,
49 /// <summary> 49 /// <summary>
50 /// Visual Studio 2010 50 /// Visual Studio 2010
51 /// </summary> 51 /// </summary>
52 VS10 52 VS10
53 } 53 }
54} 54}
diff --git a/Prebuild/src/Core/Targets/XcodeTarget.cs b/Prebuild/src/Core/Targets/XcodeTarget.cs
index 5393cec..d2c86a0 100644
--- a/Prebuild/src/Core/Targets/XcodeTarget.cs
+++ b/Prebuild/src/Core/Targets/XcodeTarget.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (da
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -36,7 +36,7 @@ using Prebuild.Core.Utilities;
36namespace Prebuild.Core.Targets 36namespace Prebuild.Core.Targets
37{ 37{
38 /// <summary> 38 /// <summary>
39 /// 39 ///
40 /// </summary> 40 /// </summary>
41 [Target("xcode")] 41 [Target("xcode")]
42 public class XcodeTarget : ITarget 42 public class XcodeTarget : ITarget
@@ -282,7 +282,7 @@ namespace Prebuild.Core.Targets
282 } 282 }
283 //if (project.Files.GetSubType(file).ToString() != "Code") 283 //if (project.Files.GetSubType(file).ToString() != "Code")
284 //{ 284 //{
285 // ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); 285 // ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx");
286 286
287 ss.WriteLine(" </resources>"); 287 ss.WriteLine(" </resources>");
288 ss.WriteLine(" <sources failonempty=\"true\">"); 288 ss.WriteLine(" <sources failonempty=\"true\">");
diff --git a/Prebuild/src/Core/UnknownLanguageException.cs b/Prebuild/src/Core/UnknownLanguageException.cs
index 607b66c..71fc885 100644
--- a/Prebuild/src/Core/UnknownLanguageException.cs
+++ b/Prebuild/src/Core/UnknownLanguageException.cs
@@ -6,12 +6,12 @@
6 * modify it under the terms of the GNU Lesser General Public 6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version. 8 * version 2.1 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details. 13 * Lesser General Public License for more details.
14 * 14 *
15 * You should have received a copy of the GNU Lesser General Public 15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software 16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -20,44 +20,44 @@
20using System; 20using System;
21using System.Runtime.Serialization; 21using System.Runtime.Serialization;
22 22
23namespace Prebuild.Core 23namespace Prebuild.Core
24{ 24{
25 /// <summary> 25 /// <summary>
26 /// </summary> 26 /// </summary>
27 [Serializable()] 27 [Serializable()]
28 public class UnknownLanguageException : Exception 28 public class UnknownLanguageException : Exception
29 { 29 {
30 /// <summary> 30 /// <summary>
31 /// Basic exception. 31 /// Basic exception.
32 /// </summary> 32 /// </summary>
33 public UnknownLanguageException() 33 public UnknownLanguageException()
34 { 34 {
35 } 35 }
36 36
37 /// <summary> 37 /// <summary>
38 /// Exception with specified string 38 /// Exception with specified string
39 /// </summary> 39 /// </summary>
40 /// <param name="message">Exception message</param> 40 /// <param name="message">Exception message</param>
41 public UnknownLanguageException(string message): base(message) 41 public UnknownLanguageException(string message): base(message)
42 { 42 {
43 } 43 }
44 44
45 /// <summary> 45 /// <summary>
46 /// 46 ///
47 /// </summary> 47 /// </summary>
48 /// <param name="message"></param> 48 /// <param name="message"></param>
49 /// <param name="exception"></param> 49 /// <param name="exception"></param>
50 public UnknownLanguageException(string message, Exception exception) : base(message, exception) 50 public UnknownLanguageException(string message, Exception exception) : base(message, exception)
51 { 51 {
52 } 52 }
53 53
54 /// <summary> 54 /// <summary>
55 /// 55 ///
56 /// </summary> 56 /// </summary>
57 /// <param name="info"></param> 57 /// <param name="info"></param>
58 /// <param name="context"></param> 58 /// <param name="context"></param>
59 protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context ) 59 protected UnknownLanguageException(SerializationInfo info, StreamingContext context) : base( info, context )
60 { 60 {
61 } 61 }
62 } 62 }
63} 63}
diff --git a/Prebuild/src/Core/Utilities/CommandLineCollection.cs b/Prebuild/src/Core/Utilities/CommandLineCollection.cs
index 786fa1e..5e6face 100644
--- a/Prebuild/src/Core/Utilities/CommandLineCollection.cs
+++ b/Prebuild/src/Core/Utilities/CommandLineCollection.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -27,126 +27,126 @@ using System.Collections;
27using System.Collections.Generic; 27using System.Collections.Generic;
28 28
29namespace Prebuild.Core.Utilities 29namespace Prebuild.Core.Utilities
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// The CommandLine class parses and interprets the command-line arguments passed to 32 /// The CommandLine class parses and interprets the command-line arguments passed to
33 /// prebuild. 33 /// prebuild.
34 /// </summary> 34 /// </summary>
35 public class CommandLineCollection : IEnumerable<KeyValuePair<string, string>> 35 public class CommandLineCollection : IEnumerable<KeyValuePair<string, string>>
36 { 36 {
37 #region Fields 37 #region Fields
38 38
39 // The raw OS arguments 39 // The raw OS arguments
40 private readonly string[] m_RawArgs; 40 private readonly string[] m_RawArgs;
41 41
42 // Command-line argument storage 42 // Command-line argument storage
43 private readonly Dictionary<string, string> m_Arguments = new Dictionary<string, string>(); 43 private readonly Dictionary<string, string> m_Arguments = new Dictionary<string, string>();
44 44
45 #endregion 45 #endregion
46 46
47 #region Constructors 47 #region Constructors
48 48
49 /// <summary> 49 /// <summary>
50 /// Create a new CommandLine instance and set some internal variables. 50 /// Create a new CommandLine instance and set some internal variables.
51 /// </summary> 51 /// </summary>
52 public CommandLineCollection(string[] args) 52 public CommandLineCollection(string[] args)
53 { 53 {
54 m_RawArgs = args; 54 m_RawArgs = args;
55 55
56 Parse(); 56 Parse();
57 } 57 }
58 58
59 #endregion 59 #endregion
60 60
61 #region Private Methods 61 #region Private Methods
62 62
63 private void Parse() 63 private void Parse()
64 { 64 {
65 if(m_RawArgs.Length < 1) 65 if(m_RawArgs.Length < 1)
66 return; 66 return;
67 67
68 int idx = 0; 68 int idx = 0;
69 string lastArg = null; 69 string lastArg = null;
70 70
71 while(idx <m_RawArgs.Length) 71 while(idx <m_RawArgs.Length)
72 { 72 {
73 string arg = m_RawArgs[idx]; 73 string arg = m_RawArgs[idx];
74 74
75 if(arg.Length > 2 && arg[0] == '/') 75 if(arg.Length > 2 && arg[0] == '/')
76 { 76 {
77 arg = arg.Substring(1); 77 arg = arg.Substring(1);
78 lastArg = arg; 78 lastArg = arg;
79 m_Arguments[arg] = ""; 79 m_Arguments[arg] = "";
80 } 80 }
81 else 81 else
82 { 82 {
83 if(lastArg != null) 83 if(lastArg != null)
84 { 84 {
85 m_Arguments[lastArg] = arg; 85 m_Arguments[lastArg] = arg;
86 lastArg = null; 86 lastArg = null;
87 } 87 }
88 } 88 }
89 89
90 idx++; 90 idx++;
91 } 91 }
92 } 92 }
93 93
94 #endregion 94 #endregion
95 95
96 #region Public Methods 96 #region Public Methods
97 97
98 /// <summary> 98 /// <summary>
99 /// Wases the passed. 99 /// Wases the passed.
100 /// </summary> 100 /// </summary>
101 /// <param name="arg">The arg.</param> 101 /// <param name="arg">The arg.</param>
102 /// <returns></returns> 102 /// <returns></returns>
103 public bool WasPassed(string arg) 103 public bool WasPassed(string arg)
104 { 104 {
105 return (m_Arguments.ContainsKey(arg)); 105 return (m_Arguments.ContainsKey(arg));
106 } 106 }
107 107
108 #endregion 108 #endregion
109 109
110 #region Properties 110 #region Properties
111 111
112 /// <summary> 112 /// <summary>
113 /// Gets the parameter associated with the command line option 113 /// Gets the parameter associated with the command line option
114 /// </summary> 114 /// </summary>
115 /// <remarks>Returns null if option was not specified, 115 /// <remarks>Returns null if option was not specified,
116 /// null string if no parameter was specified, and the value if a parameter was specified</remarks> 116 /// null string if no parameter was specified, and the value if a parameter was specified</remarks>
117 public string this[string index] 117 public string this[string index]
118 { 118 {
119 get 119 get
120 { 120 {
121 if(m_Arguments.ContainsKey(index)) 121 if(m_Arguments.ContainsKey(index))
122 { 122 {
123 return (m_Arguments[index]); 123 return (m_Arguments[index]);
124 } 124 }
125 return null; 125 return null;
126 } 126 }
127 } 127 }
128 128
129 #endregion 129 #endregion
130 130
131 #region IEnumerable Members 131 #region IEnumerable Members
132 132
133 /// <summary> 133 /// <summary>
134 /// Returns an enumerator that can iterate through a collection. 134 /// Returns an enumerator that can iterate through a collection.
135 /// </summary> 135 /// </summary>
136 /// <returns> 136 /// <returns>
137 /// An <see cref="T:System.Collections.IDictionaryEnumerator"/> 137 /// An <see cref="T:System.Collections.IDictionaryEnumerator"/>
138 /// that can be used to iterate through the collection. 138 /// that can be used to iterate through the collection.
139 /// </returns> 139 /// </returns>
140 public IEnumerator<KeyValuePair<string, string>> GetEnumerator() 140 public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
141 { 141 {
142 return m_Arguments.GetEnumerator(); 142 return m_Arguments.GetEnumerator();
143 } 143 }
144 144
145 IEnumerator IEnumerable.GetEnumerator() 145 IEnumerator IEnumerable.GetEnumerator()
146 { 146 {
147 return GetEnumerator(); 147 return GetEnumerator();
148 } 148 }
149 149
150 #endregion 150 #endregion
151 } 151 }
152} 152}
diff --git a/Prebuild/src/Core/Utilities/CurrentDirectory.cs b/Prebuild/src/Core/Utilities/CurrentDirectory.cs
index 9624c35..d743d83 100644
--- a/Prebuild/src/Core/Utilities/CurrentDirectory.cs
+++ b/Prebuild/src/Core/Utilities/CurrentDirectory.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -28,41 +28,41 @@ using System.Collections.Generic;
28 28
29namespace Prebuild.Core.Utilities 29namespace Prebuild.Core.Utilities
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// 32 ///
33 /// </summary> 33 /// </summary>
34 public class CurrentDirectory 34 public class CurrentDirectory
35 { 35 {
36 #region Fields 36 #region Fields
37 37
38 private readonly Stack<string> m_Stack = new Stack<string>(); 38 private readonly Stack<string> m_Stack = new Stack<string>();
39 39
40 #endregion 40 #endregion
41 41
42 #region Public Methods 42 #region Public Methods
43 43
44 /// <summary> 44 /// <summary>
45 /// Pushes this instance. 45 /// Pushes this instance.
46 /// </summary> 46 /// </summary>
47 public void Push() 47 public void Push()
48 { 48 {
49 m_Stack.Push(Environment.CurrentDirectory); 49 m_Stack.Push(Environment.CurrentDirectory);
50 } 50 }
51 51
52 /// <summary> 52 /// <summary>
53 /// Pops this instance. 53 /// Pops this instance.
54 /// </summary> 54 /// </summary>
55 public void Pop() 55 public void Pop()
56 { 56 {
57 if(m_Stack.Count < 1) 57 if(m_Stack.Count < 1)
58 { 58 {
59 return; 59 return;
60 } 60 }
61
62 string cwd = m_Stack.Pop();
63 Helper.SetCurrentDir(cwd);
64 }
65 61
66 #endregion 62 string cwd = m_Stack.Pop();
67 } 63 Helper.SetCurrentDir(cwd);
64 }
65
66 #endregion
67 }
68} 68}
diff --git a/Prebuild/src/Core/Utilities/Helper.cs b/Prebuild/src/Core/Utilities/Helper.cs
index 8c3e968..a440e58 100644
--- a/Prebuild/src/Core/Utilities/Helper.cs
+++ b/Prebuild/src/Core/Utilities/Helper.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -35,541 +35,541 @@ using Prebuild.Core.Nodes;
35 35
36namespace Prebuild.Core.Utilities 36namespace Prebuild.Core.Utilities
37{ 37{
38 /// <summary> 38 /// <summary>
39 /// 39 ///
40 /// </summary> 40 /// </summary>
41 public class Helper 41 public class Helper
42 { 42 {
43 #region Fields 43 #region Fields
44 44
45 static bool checkForOSVariables; 45 static bool checkForOSVariables;
46 46
47 /// <summary> 47 /// <summary>
48 /// 48 ///
49 /// </summary> 49 /// </summary>
50 public static bool CheckForOSVariables 50 public static bool CheckForOSVariables
51 { 51 {
52 get 52 get
53 { 53 {
54 return checkForOSVariables; 54 return checkForOSVariables;
55 } 55 }
56 set 56 set
57 { 57 {
58 checkForOSVariables = value; 58 checkForOSVariables = value;
59 } 59 }
60 } 60 }
61 61
62 #endregion 62 #endregion
63 63
64 #region Public Methods 64 #region Public Methods
65 65
66 #region String Parsing 66 #region String Parsing
67 67
68 public delegate string StringLookup(string key); 68 public delegate string StringLookup(string key);
69 69
70 /// <summary> 70 /// <summary>
71 /// Gets a collection of StringLocationPair objects that represent the matches 71 /// Gets a collection of StringLocationPair objects that represent the matches
72 /// </summary> 72 /// </summary>
73 /// <param name="target">The target.</param> 73 /// <param name="target">The target.</param>
74 /// <param name="beforeGroup">The before group.</param> 74 /// <param name="beforeGroup">The before group.</param>
75 /// <param name="afterGroup">The after group.</param> 75 /// <param name="afterGroup">The after group.</param>
76 /// <param name="includeDelimitersInSubstrings">if set to <c>true</c> [include delimiters in substrings].</param> 76 /// <param name="includeDelimitersInSubstrings">if set to <c>true</c> [include delimiters in substrings].</param>
77 /// <returns></returns> 77 /// <returns></returns>
78 public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings) 78 public static StringCollection FindGroups(string target, string beforeGroup, string afterGroup, bool includeDelimitersInSubstrings)
79 { 79 {
80 if( beforeGroup == null ) 80 if( beforeGroup == null )
81 { 81 {
82 throw new ArgumentNullException("beforeGroup"); 82 throw new ArgumentNullException("beforeGroup");
83 } 83 }
84 if( afterGroup == null ) 84 if( afterGroup == null )
85 { 85 {
86 throw new ArgumentNullException("afterGroup"); 86 throw new ArgumentNullException("afterGroup");
87 } 87 }
88 StringCollection results = new StringCollection(); 88 StringCollection results = new StringCollection();
89 if(target == null || target.Length == 0) 89 if(target == null || target.Length == 0)
90 { 90 {
91 return results; 91 return results;
92 } 92 }
93 93
94 int beforeMod = 0; 94 int beforeMod = 0;
95 int afterMod = 0; 95 int afterMod = 0;
96 if(includeDelimitersInSubstrings) 96 if(includeDelimitersInSubstrings)
97 { 97 {
98 //be sure to not exlude the delims 98 //be sure to not exlude the delims
99 beforeMod = beforeGroup.Length; 99 beforeMod = beforeGroup.Length;
100 afterMod = afterGroup.Length; 100 afterMod = afterGroup.Length;
101 } 101 }
102 int startIndex = 0; 102 int startIndex = 0;
103 while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) { 103 while((startIndex = target.IndexOf(beforeGroup,startIndex)) != -1) {
104 int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it 104 int endIndex = target.IndexOf(afterGroup,startIndex);//the index of the char after it
105 if(endIndex == -1) 105 if(endIndex == -1)
106 { 106 {
107 break; 107 break;
108 } 108 }
109 int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string 109 int length = endIndex - startIndex - beforeGroup.Length;//move to the first char in the string
110 string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod, 110 string substring = substring = target.Substring(startIndex + beforeGroup.Length - beforeMod,
111 length - afterMod); 111 length - afterMod);
112 112
113 results.Add(substring); 113 results.Add(substring);
114 //results.Add(new StringLocationPair(substring,startIndex)); 114 //results.Add(new StringLocationPair(substring,startIndex));
115 startIndex = endIndex + 1; 115 startIndex = endIndex + 1;
116 //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization 116 //the Interpolate*() methods will not work if expressions are expandded inside expression due to an optimization
117 //so start after endIndex 117 //so start after endIndex
118 118
119 } 119 }
120 return results; 120 return results;
121 } 121 }
122 122
123 /// <summary> 123 /// <summary>
124 /// Replaces the groups. 124 /// Replaces the groups.
125 /// </summary> 125 /// </summary>
126 /// <param name="target">The target.</param> 126 /// <param name="target">The target.</param>
127 /// <param name="beforeGroup">The before group.</param> 127 /// <param name="beforeGroup">The before group.</param>
128 /// <param name="afterGroup">The after group.</param> 128 /// <param name="afterGroup">The after group.</param>
129 /// <param name="lookup">The lookup.</param> 129 /// <param name="lookup">The lookup.</param>
130 /// <returns></returns> 130 /// <returns></returns>
131 public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) { 131 public static string ReplaceGroups(string target, string beforeGroup, string afterGroup, StringLookup lookup) {
132 if( target == null ) 132 if( target == null )
133 { 133 {
134 throw new ArgumentNullException("target"); 134 throw new ArgumentNullException("target");
135 } 135 }
136 //int targetLength = target.Length; 136 //int targetLength = target.Length;
137 StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false); 137 StringCollection strings = FindGroups(target,beforeGroup,afterGroup,false);
138 if( lookup == null ) 138 if( lookup == null )
139 { 139 {
140 throw new ArgumentNullException("lookup"); 140 throw new ArgumentNullException("lookup");
141 } 141 }
142 foreach(string substring in strings) 142 foreach(string substring in strings)
143 { 143 {
144 target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) ); 144 target = target.Replace(beforeGroup + substring + afterGroup, lookup(substring) );
145 } 145 }
146 return target; 146 return target;
147 } 147 }
148 148
149 /// <summary> 149 /// <summary>
150 /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate 150 /// Replaces ${var} statements in a string with the corresonding values as detirmined by the lookup delegate
151 /// </summary> 151 /// </summary>
152 /// <param name="target">The target.</param> 152 /// <param name="target">The target.</param>
153 /// <param name="lookup">The lookup.</param> 153 /// <param name="lookup">The lookup.</param>
154 /// <returns></returns> 154 /// <returns></returns>
155 public static string InterpolateForVariables(string target, StringLookup lookup) 155 public static string InterpolateForVariables(string target, StringLookup lookup)
156 { 156 {
157 return ReplaceGroups(target, "${" , "}" , lookup); 157 return ReplaceGroups(target, "${" , "}" , lookup);
158 } 158 }
159 159
160 /// <summary> 160 /// <summary>
161 /// Replaces ${var} statements in a string with the corresonding environment variable with name var 161 /// Replaces ${var} statements in a string with the corresonding environment variable with name var
162 /// </summary> 162 /// </summary>
163 /// <param name="target"></param> 163 /// <param name="target"></param>
164 /// <returns></returns> 164 /// <returns></returns>
165 public static string InterpolateForEnvironmentVariables(string target) 165 public static string InterpolateForEnvironmentVariables(string target)
166 { 166 {
167 return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable)); 167 return InterpolateForVariables(target, new StringLookup(Environment.GetEnvironmentVariable));
168 } 168 }
169 169
170 #endregion 170 #endregion
171 171
172 /// <summary> 172 /// <summary>
173 /// Translates the value. 173 /// Translates the value.
174 /// </summary> 174 /// </summary>
175 /// <param name="translateType">Type of the translate.</param> 175 /// <param name="translateType">Type of the translate.</param>
176 /// <param name="translationItem">The translation item.</param> 176 /// <param name="translationItem">The translation item.</param>
177 /// <returns></returns> 177 /// <returns></returns>
178 public static object TranslateValue(Type translateType, string translationItem) 178 public static object TranslateValue(Type translateType, string translationItem)
179 { 179 {
180 if(translationItem == null) 180 if(translationItem == null)
181 { 181 {
182 return null; 182 return null;
183 } 183 }
184 184
185 try 185 try
186 { 186 {
187 string lowerVal = translationItem.ToLower(); 187 string lowerVal = translationItem.ToLower();
188 if(translateType == typeof(bool)) 188 if(translateType == typeof(bool))
189 { 189 {
190 return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on"); 190 return (lowerVal == "true" || lowerVal == "1" || lowerVal == "y" || lowerVal == "yes" || lowerVal == "on");
191 } 191 }
192 else if(translateType == typeof(int)) 192 else if(translateType == typeof(int))
193 { 193 {
194 return (Int32.Parse(translationItem)); 194 return (Int32.Parse(translationItem));
195 } 195 }
196 else 196 else
197 { 197 {
198 return translationItem; 198 return translationItem;
199 } 199 }
200 } 200 }
201 catch(FormatException) 201 catch(FormatException)
202 { 202 {
203 return null; 203 return null;
204 } 204 }
205 } 205 }
206 206
207 /// <summary> 207 /// <summary>
208 /// Deletes if exists. 208 /// Deletes if exists.
209 /// </summary> 209 /// </summary>
210 /// <param name="file">The file.</param> 210 /// <param name="file">The file.</param>
211 /// <returns></returns> 211 /// <returns></returns>
212 public static bool DeleteIfExists(string file) 212 public static bool DeleteIfExists(string file)
213 { 213 {
214 string resFile = null; 214 string resFile = null;
215 try 215 try
216 { 216 {
217 resFile = ResolvePath(file); 217 resFile = ResolvePath(file);
218 } 218 }
219 catch(ArgumentException) 219 catch(ArgumentException)
220 { 220 {
221 return false; 221 return false;
222 } 222 }
223 223
224 if(!File.Exists(resFile)) 224 if(!File.Exists(resFile))
225 { 225 {
226 return false; 226 return false;
227 } 227 }
228 228
229 File.Delete(resFile); 229 File.Delete(resFile);
230 return true; 230 return true;
231 } 231 }
232 232
233 static readonly char seperator = Path.DirectorySeparatorChar; 233 static readonly char seperator = Path.DirectorySeparatorChar;
234 234
235 // This little gem was taken from the NeL source, thanks guys! 235 // This little gem was taken from the NeL source, thanks guys!
236 /// <summary> 236 /// <summary>
237 /// Makes a relative path 237 /// Makes a relative path
238 /// </summary> 238 /// </summary>
239 /// <param name="startPath">Path to start from</param> 239 /// <param name="startPath">Path to start from</param>
240 /// <param name="endPath">Path to end at</param> 240 /// <param name="endPath">Path to end at</param>
241 /// <returns>Path that will get from startPath to endPath</returns> 241 /// <returns>Path that will get from startPath to endPath</returns>
242 public static string MakePathRelativeTo(string startPath, string endPath) 242 public static string MakePathRelativeTo(string startPath, string endPath)
243 { 243 {
244 string tmp = NormalizePath(startPath, seperator); 244 string tmp = NormalizePath(startPath, seperator);
245 string src = NormalizePath(endPath, seperator); 245 string src = NormalizePath(endPath, seperator);
246 string prefix = ""; 246 string prefix = "";
247 247
248 while(true) 248 while(true)
249 { 249 {
250 if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0)) 250 if((String.Compare(tmp, 0, src, 0, tmp.Length) == 0))
251 { 251 {
252 string ret; 252 string ret;
253 int size = tmp.Length; 253 int size = tmp.Length;
254 if(size == src.Length) 254 if(size == src.Length)
255 { 255 {
256 return "./"; 256 return "./";
257 } 257 }
258 if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator) 258 if((src.Length > tmp.Length) && src[tmp.Length - 1] != seperator)
259 { 259 {
260 } 260 }
261 else 261 else
262 { 262 {
263 ret = prefix + endPath.Substring(size, endPath.Length - size); 263 ret = prefix + endPath.Substring(size, endPath.Length - size);
264 ret = ret.Trim(); 264 ret = ret.Trim();
265 if(ret[0] == seperator) 265 if(ret[0] == seperator)
266 { 266 {
267 ret = "." + ret; 267 ret = "." + ret;
268 } 268 }
269 269
270 return NormalizePath(ret); 270 return NormalizePath(ret);
271 } 271 }
272
273 }
274 272
275 if(tmp.Length < 2) 273 }
276 { 274
277 break; 275 if(tmp.Length < 2)
278 } 276 {
277 break;
278 }
279 279
280 int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2); 280 int lastPos = tmp.LastIndexOf(seperator, tmp.Length - 2);
281 int prevPos = tmp.IndexOf(seperator); 281 int prevPos = tmp.IndexOf(seperator);
282 282
283 if((lastPos == prevPos) || (lastPos == -1)) 283 if((lastPos == prevPos) || (lastPos == -1))
284 { 284 {
285 break; 285 break;
286 } 286 }
287 287
288 tmp = tmp.Substring(0, lastPos + 1); 288 tmp = tmp.Substring(0, lastPos + 1);
289 prefix += ".." + seperator.ToString(); 289 prefix += ".." + seperator.ToString();
290 } 290 }
291 291
292 return endPath; 292 return endPath;
293 } 293 }
294 294
295 /// <summary> 295 /// <summary>
296 /// Resolves the path. 296 /// Resolves the path.
297 /// </summary> 297 /// </summary>
298 /// <param name="path">The path.</param> 298 /// <param name="path">The path.</param>
299 /// <returns></returns> 299 /// <returns></returns>
300 public static string ResolvePath(string path) 300 public static string ResolvePath(string path)
301 { 301 {
302 string tmpPath = NormalizePath(path); 302 string tmpPath = NormalizePath(path);
303 if(tmpPath.Length < 1) 303 if(tmpPath.Length < 1)
304 { 304 {
305 tmpPath = "."; 305 tmpPath = ".";
306 } 306 }
307 307
308 tmpPath = Path.GetFullPath(tmpPath); 308 tmpPath = Path.GetFullPath(tmpPath);
309 if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath)) 309 if(!File.Exists(tmpPath) && !Directory.Exists(tmpPath))
310 { 310 {
311 throw new ArgumentException("Path could not be resolved: " + tmpPath); 311 throw new ArgumentException("Path could not be resolved: " + tmpPath);
312 } 312 }
313 313
314 return tmpPath; 314 return tmpPath;
315 } 315 }
316 316
317 /// <summary> 317 /// <summary>
318 /// Normalizes the path. 318 /// Normalizes the path.
319 /// </summary> 319 /// </summary>
320 /// <param name="path">The path.</param> 320 /// <param name="path">The path.</param>
321 /// <param name="separatorCharacter">The separator character.</param> 321 /// <param name="separatorCharacter">The separator character.</param>
322 /// <returns></returns> 322 /// <returns></returns>
323 public static string NormalizePath(string path, char separatorCharacter) 323 public static string NormalizePath(string path, char separatorCharacter)
324 { 324 {
325 if(path == null || path == "" || path.Length < 1) 325 if(path == null || path == "" || path.Length < 1)
326 { 326 {
327 return ""; 327 return "";
328 } 328 }
329 329
330 string tmpPath = path.Replace('\\', '/'); 330 string tmpPath = path.Replace('\\', '/');
331 tmpPath = tmpPath.Replace('/', separatorCharacter); 331 tmpPath = tmpPath.Replace('/', separatorCharacter);
332 return tmpPath; 332 return tmpPath;
333 } 333 }
334 334
335 /// <summary> 335 /// <summary>
336 /// Normalizes the path. 336 /// Normalizes the path.
337 /// </summary> 337 /// </summary>
338 /// <param name="path">The path.</param> 338 /// <param name="path">The path.</param>
339 /// <returns></returns> 339 /// <returns></returns>
340 public static string NormalizePath(string path) 340 public static string NormalizePath(string path)
341 { 341 {
342 return NormalizePath(path, Path.DirectorySeparatorChar); 342 return NormalizePath(path, Path.DirectorySeparatorChar);
343 } 343 }
344 344
345 /// <summary> 345 /// <summary>
346 /// Ends the path. 346 /// Ends the path.
347 /// </summary> 347 /// </summary>
348 /// <param name="path">The path.</param> 348 /// <param name="path">The path.</param>
349 /// <param name="separatorCharacter">The separator character.</param> 349 /// <param name="separatorCharacter">The separator character.</param>
350 /// <returns></returns> 350 /// <returns></returns>
351 public static string EndPath(string path, char separatorCharacter) 351 public static string EndPath(string path, char separatorCharacter)
352 { 352 {
353 if(path == null || path == "" || path.Length < 1) 353 if(path == null || path == "" || path.Length < 1)
354 { 354 {
355 return ""; 355 return "";
356 } 356 }
357 357
358 if(!path.EndsWith(separatorCharacter.ToString())) 358 if(!path.EndsWith(separatorCharacter.ToString()))
359 { 359 {
360 return (path + separatorCharacter); 360 return (path + separatorCharacter);
361 } 361 }
362 362
363 return path; 363 return path;
364 } 364 }
365 365
366 /// <summary> 366 /// <summary>
367 /// Ends the path. 367 /// Ends the path.
368 /// </summary> 368 /// </summary>
369 /// <param name="path">The path.</param> 369 /// <param name="path">The path.</param>
370 /// <returns></returns> 370 /// <returns></returns>
371 public static string EndPath(string path) 371 public static string EndPath(string path)
372 { 372 {
373 return EndPath(path, Path.DirectorySeparatorChar); 373 return EndPath(path, Path.DirectorySeparatorChar);
374 } 374 }
375 375
376 /// <summary> 376 /// <summary>
377 /// Makes the file path. 377 /// Makes the file path.
378 /// </summary> 378 /// </summary>
379 /// <param name="path">The path.</param> 379 /// <param name="path">The path.</param>
380 /// <param name="name">The name.</param> 380 /// <param name="name">The name.</param>
381 /// <param name="ext">The ext.</param> 381 /// <param name="ext">The ext.</param>
382 /// <returns></returns> 382 /// <returns></returns>
383 public static string MakeFilePath(string path, string name, string ext) 383 public static string MakeFilePath(string path, string name, string ext)
384 { 384 {
385 string ret = EndPath(NormalizePath(path)); 385 string ret = EndPath(NormalizePath(path));
386 386
387 if( name == null ) 387 if( name == null )
388 { 388 {
389 throw new ArgumentNullException("name"); 389 throw new ArgumentNullException("name");
390 } 390 }
391 391
392 ret += name; 392 ret += name;
393 if(!name.EndsWith("." + ext)) 393 if(!name.EndsWith("." + ext))
394 { 394 {
395 ret += "." + ext; 395 ret += "." + ext;
396 } 396 }
397 397
398 //foreach(char c in Path.GetInvalidPathChars()) 398 //foreach(char c in Path.GetInvalidPathChars())
399 //{ 399 //{
400 // ret = ret.Replace(c, '_'); 400 // ret = ret.Replace(c, '_');
401 //} 401 //}
402 402
403 return ret; 403 return ret;
404 } 404 }
405 405
406 /// <summary> 406 /// <summary>
407 /// Makes the file path. 407 /// Makes the file path.
408 /// </summary> 408 /// </summary>
409 /// <param name="path">The path.</param> 409 /// <param name="path">The path.</param>
410 /// <param name="name">The name.</param> 410 /// <param name="name">The name.</param>
411 /// <returns></returns> 411 /// <returns></returns>
412 public static string MakeFilePath(string path, string name) 412 public static string MakeFilePath(string path, string name)
413 { 413 {
414 string ret = EndPath(NormalizePath(path)); 414 string ret = EndPath(NormalizePath(path));
415 415
416 if( name == null ) 416 if( name == null )
417 { 417 {
418 throw new ArgumentNullException("name"); 418 throw new ArgumentNullException("name");
419 } 419 }
420 420
421 ret += name; 421 ret += name;
422 422
423 //foreach (char c in Path.GetInvalidPathChars()) 423 //foreach (char c in Path.GetInvalidPathChars())
424 //{ 424 //{
425 // ret = ret.Replace(c, '_'); 425 // ret = ret.Replace(c, '_');
426 //} 426 //}
427 427
428 return ret; 428 return ret;
429 } 429 }
430 430
431 /// <summary> 431 /// <summary>
432 /// 432 ///
433 /// </summary> 433 /// </summary>
434 /// <param name="path"></param> 434 /// <param name="path"></param>
435 /// <returns></returns> 435 /// <returns></returns>
436 public static string MakeReferencePath(string path) 436 public static string MakeReferencePath(string path)
437 { 437 {
438 string ret = EndPath(NormalizePath(path)); 438 string ret = EndPath(NormalizePath(path));
439 439
440 //foreach (char c in Path.GetInvalidPathChars()) 440 //foreach (char c in Path.GetInvalidPathChars())
441 //{ 441 //{
442 // ret = ret.Replace(c, '_'); 442 // ret = ret.Replace(c, '_');
443 //} 443 //}
444 444
445 return ret; 445 return ret;
446 } 446 }
447 447
448 /// <summary> 448 /// <summary>
449 /// Sets the current dir. 449 /// Sets the current dir.
450 /// </summary> 450 /// </summary>
451 /// <param name="path">The path.</param> 451 /// <param name="path">The path.</param>
452 public static void SetCurrentDir(string path) 452 public static void SetCurrentDir(string path)
453 { 453 {
454 if( path == null ) 454 if( path == null )
455 { 455 {
456 throw new ArgumentNullException("path"); 456 throw new ArgumentNullException("path");
457 } 457 }
458 if(path.Length < 1) 458 if(path.Length < 1)
459 { 459 {
460 return; 460 return;
461 } 461 }
462 462
463 Environment.CurrentDirectory = path; 463 Environment.CurrentDirectory = path;
464 } 464 }
465 465
466 /// <summary> 466 /// <summary>
467 /// Checks the type. 467 /// Checks the type.
468 /// </summary> 468 /// </summary>
469 /// <param name="typeToCheck">The type to check.</param> 469 /// <param name="typeToCheck">The type to check.</param>
470 /// <param name="attr">The attr.</param> 470 /// <param name="attr">The attr.</param>
471 /// <param name="inter">The inter.</param> 471 /// <param name="inter">The inter.</param>
472 /// <returns></returns> 472 /// <returns></returns>
473 public static object CheckType(Type typeToCheck, Type attr, Type inter) 473 public static object CheckType(Type typeToCheck, Type attr, Type inter)
474 { 474 {
475 if(typeToCheck == null || attr == null) 475 if(typeToCheck == null || attr == null)
476 { 476 {
477 return null; 477 return null;
478 } 478 }
479 479
480 object[] attrs = typeToCheck.GetCustomAttributes(attr, false); 480 object[] attrs = typeToCheck.GetCustomAttributes(attr, false);
481 if(attrs == null || attrs.Length < 1) 481 if(attrs == null || attrs.Length < 1)
482 { 482 {
483 return null; 483 return null;
484 } 484 }
485 if( inter == null ) 485 if( inter == null )
486 { 486 {
487 throw new ArgumentNullException("inter"); 487 throw new ArgumentNullException("inter");
488 } 488 }
489 489
490 if(typeToCheck.GetInterface(inter.FullName) == null) 490 if(typeToCheck.GetInterface(inter.FullName) == null)
491 { 491 {
492 return null; 492 return null;
493 } 493 }
494 494
495 return attrs[0]; 495 return attrs[0];
496 } 496 }
497 497
498 /// <summary> 498 /// <summary>
499 /// Attributes the value. 499 /// Attributes the value.
500 /// </summary> 500 /// </summary>
501 /// <param name="node">The node.</param> 501 /// <param name="node">The node.</param>
502 /// <param name="attr">The attr.</param> 502 /// <param name="attr">The attr.</param>
503 /// <param name="def">The def.</param> 503 /// <param name="def">The def.</param>
504 /// <returns></returns> 504 /// <returns></returns>
505 public static string AttributeValue(XmlNode node, string attr, string def) 505 public static string AttributeValue(XmlNode node, string attr, string def)
506 { 506 {
507 if( node == null ) 507 if( node == null )
508 { 508 {
509 throw new ArgumentNullException("node"); 509 throw new ArgumentNullException("node");
510 } 510 }
511 if(node.Attributes[attr] == null) 511 if(node.Attributes[attr] == null)
512 { 512 {
513 return def; 513 return def;
514 } 514 }
515 string val = node.Attributes[attr].Value; 515 string val = node.Attributes[attr].Value;
516 if(!CheckForOSVariables) 516 if(!CheckForOSVariables)
517 { 517 {
518 return val; 518 return val;
519 } 519 }
520 520
521 return InterpolateForEnvironmentVariables(val); 521 return InterpolateForEnvironmentVariables(val);
522 } 522 }
523 523
524 /// <summary> 524 /// <summary>
525 /// Parses the boolean. 525 /// Parses the boolean.
526 /// </summary> 526 /// </summary>
527 /// <param name="node">The node.</param> 527 /// <param name="node">The node.</param>
528 /// <param name="attr">The attr.</param> 528 /// <param name="attr">The attr.</param>
529 /// <param name="defaultValue">if set to <c>true</c> [default value].</param> 529 /// <param name="defaultValue">if set to <c>true</c> [default value].</param>
530 /// <returns></returns> 530 /// <returns></returns>
531 public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue) 531 public static bool ParseBoolean(XmlNode node, string attr, bool defaultValue)
532 { 532 {
533 if( node == null ) 533 if( node == null )
534 { 534 {
535 throw new ArgumentNullException("node"); 535 throw new ArgumentNullException("node");
536 } 536 }
537 if(node.Attributes[attr] == null) 537 if(node.Attributes[attr] == null)
538 { 538 {
539 return defaultValue; 539 return defaultValue;
540 } 540 }
541 return bool.Parse(node.Attributes[attr].Value); 541 return bool.Parse(node.Attributes[attr].Value);
542 } 542 }
543 543
544 /// <summary> 544 /// <summary>
545 /// Enums the attribute value. 545 /// Enums the attribute value.
546 /// </summary> 546 /// </summary>
547 /// <param name="node">The node.</param> 547 /// <param name="node">The node.</param>
548 /// <param name="attr">The attr.</param> 548 /// <param name="attr">The attr.</param>
549 /// <param name="enumType">Type of the enum.</param> 549 /// <param name="enumType">Type of the enum.</param>
550 /// <param name="def">The def.</param> 550 /// <param name="def">The def.</param>
551 /// <returns></returns> 551 /// <returns></returns>
552 public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def) 552 public static object EnumAttributeValue(XmlNode node, string attr, Type enumType, object def)
553 { 553 {
554 if( def == null ) 554 if( def == null )
555 { 555 {
556 throw new ArgumentNullException("def"); 556 throw new ArgumentNullException("def");
557 } 557 }
558 string val = AttributeValue(node, attr, def.ToString()); 558 string val = AttributeValue(node, attr, def.ToString());
559 return Enum.Parse(enumType, val, true); 559 return Enum.Parse(enumType, val, true);
560 } 560 }
561 561
562 /// <summary> 562 /// <summary>
563 /// 563 ///
564 /// </summary> 564 /// </summary>
565 /// <param name="assemblyName"></param> 565 /// <param name="assemblyName"></param>
566 /// <param name="projectType"></param> 566 /// <param name="projectType"></param>
567 /// <returns></returns> 567 /// <returns></returns>
568 public static string AssemblyFullName(string assemblyName, ProjectType projectType) 568 public static string AssemblyFullName(string assemblyName, ProjectType projectType)
569 { 569 {
570 return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe"); 570 return assemblyName + (projectType == ProjectType.Library ? ".dll" : ".exe");
571 } 571 }
572 572
573 #endregion 573 #endregion
574 } 574 }
575} 575}
diff --git a/Prebuild/src/Core/Utilities/Log.cs b/Prebuild/src/Core/Utilities/Log.cs
index 4df3def..cd95633 100644
--- a/Prebuild/src/Core/Utilities/Log.cs
+++ b/Prebuild/src/Core/Utilities/Log.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -28,74 +28,74 @@ using System.IO;
28 28
29namespace Prebuild.Core.Utilities 29namespace Prebuild.Core.Utilities
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// 32 ///
33 /// </summary> 33 /// </summary>
34 public enum LogType 34 public enum LogType
35 { 35 {
36 /// <summary> 36 /// <summary>
37 /// 37 ///
38 /// </summary> 38 /// </summary>
39 None, 39 None,
40 /// <summary> 40 /// <summary>
41 /// 41 ///
42 /// </summary> 42 /// </summary>
43 Info, 43 Info,
44 /// <summary> 44 /// <summary>
45 /// 45 ///
46 /// </summary> 46 /// </summary>
47 Warning, 47 Warning,
48 /// <summary> 48 /// <summary>
49 /// 49 ///
50 /// </summary> 50 /// </summary>
51 Error 51 Error
52 } 52 }
53 53
54 /// <summary> 54 /// <summary>
55 /// 55 ///
56 /// </summary> 56 /// </summary>
57 [Flags] 57 [Flags]
58 public enum LogTargets 58 public enum LogTargets
59 { 59 {
60 /// <summary> 60 /// <summary>
61 /// 61 ///
62 /// </summary> 62 /// </summary>
63 None = 0, 63 None = 0,
64 /// <summary> 64 /// <summary>
65 /// 65 ///
66 /// </summary> 66 /// </summary>
67 Null = 1, 67 Null = 1,
68 /// <summary> 68 /// <summary>
69 /// 69 ///
70 /// </summary> 70 /// </summary>
71 File = 2, 71 File = 2,
72 /// <summary> 72 /// <summary>
73 /// 73 ///
74 /// </summary> 74 /// </summary>
75 Console = 4 75 Console = 4
76 } 76 }
77 77
78 /// <summary> 78 /// <summary>
79 /// Summary description for Log. 79 /// Summary description for Log.
80 /// </summary> 80 /// </summary>
81 public class Log : IDisposable 81 public class Log : IDisposable
82 { 82 {
83 #region Fields 83 #region Fields
84 84
85 private TextWriter m_Writer; 85 private TextWriter m_Writer;
86 private LogTargets m_Target = LogTargets.Null; 86 private LogTargets m_Target = LogTargets.Null;
87 bool disposed; 87 bool disposed;
88 88
89 #endregion 89 #endregion
90 90
91 #region Constructors 91 #region Constructors
92 92
93 /// <summary> 93 /// <summary>
94 /// Initializes a new instance of the <see cref="Log"/> class. 94 /// Initializes a new instance of the <see cref="Log"/> class.
95 /// </summary> 95 /// </summary>
96 /// <param name="target">The target.</param> 96 /// <param name="target">The target.</param>
97 /// <param name="fileName">Name of the file.</param> 97 /// <param name="fileName">Name of the file.</param>
98 public Log(LogTargets target, string fileName) 98 public Log(LogTargets target, string fileName)
99 { 99 {
100 m_Target = target; 100 m_Target = target;
101 101
@@ -111,166 +111,166 @@ namespace Prebuild.Core.Utilities
111 } 111 }
112 } 112 }
113 113
114 #endregion 114 #endregion
115 115
116 #region Public Methods 116 #region Public Methods
117 117
118 /// <summary> 118 /// <summary>
119 /// Writes this instance. 119 /// Writes this instance.
120 /// </summary> 120 /// </summary>
121 public void Write() 121 public void Write()
122 { 122 {
123 Write(string.Empty); 123 Write(string.Empty);
124 } 124 }
125 125
126 /// <summary> 126 /// <summary>
127 /// Writes the specified MSG. 127 /// Writes the specified MSG.
128 /// </summary> 128 /// </summary>
129 /// <param name="msg">The MSG.</param> 129 /// <param name="msg">The MSG.</param>
130 public void Write(string msg) 130 public void Write(string msg)
131 { 131 {
132 if((m_Target & LogTargets.Null) != 0) 132 if((m_Target & LogTargets.Null) != 0)
133 { 133 {
134 return; 134 return;
135 } 135 }
136 136
137 if((m_Target & LogTargets.Console) != 0) 137 if((m_Target & LogTargets.Console) != 0)
138 { 138 {
139 Console.WriteLine(msg); 139 Console.WriteLine(msg);
140 } 140 }
141 if((m_Target & LogTargets.File) != 0 && m_Writer != null) 141 if((m_Target & LogTargets.File) != 0 && m_Writer != null)
142 { 142 {
143 m_Writer.WriteLine(msg); 143 m_Writer.WriteLine(msg);
144 } 144 }
145 } 145 }
146 146
147 /// <summary> 147 /// <summary>
148 /// Writes the specified format. 148 /// Writes the specified format.
149 /// </summary> 149 /// </summary>
150 /// <param name="format">The format.</param> 150 /// <param name="format">The format.</param>
151 /// <param name="args">The args.</param> 151 /// <param name="args">The args.</param>
152 public void Write(string format, params object[] args) 152 public void Write(string format, params object[] args)
153 { 153 {
154 Write(string.Format(format,args)); 154 Write(string.Format(format,args));
155 } 155 }
156 156
157 /// <summary> 157 /// <summary>
158 /// Writes the specified type. 158 /// Writes the specified type.
159 /// </summary> 159 /// </summary>
160 /// <param name="type">The type.</param> 160 /// <param name="type">The type.</param>
161 /// <param name="format">The format.</param> 161 /// <param name="format">The format.</param>
162 /// <param name="args">The args.</param> 162 /// <param name="args">The args.</param>
163 public void Write(LogType type, string format, params object[] args) 163 public void Write(LogType type, string format, params object[] args)
164 { 164 {
165 if((m_Target & LogTargets.Null) != 0) 165 if((m_Target & LogTargets.Null) != 0)
166 { 166 {
167 return; 167 return;
168 } 168 }
169 169
170 string str = ""; 170 string str = "";
171 switch(type) 171 switch(type)
172 { 172 {
173 case LogType.Info: 173 case LogType.Info:
174 str = "[I] "; 174 str = "[I] ";
175 break; 175 break;
176 case LogType.Warning: 176 case LogType.Warning:
177 str = "[!] "; 177 str = "[!] ";
178 break; 178 break;
179 case LogType.Error: 179 case LogType.Error:
180 str = "[X] "; 180 str = "[X] ";
181 break; 181 break;
182 } 182 }
183 183
184 Write(str + format,args); 184 Write(str + format,args);
185 } 185 }
186 186
187 /// <summary> 187 /// <summary>
188 /// Writes the exception. 188 /// Writes the exception.
189 /// </summary> 189 /// </summary>
190 /// <param name="type">The type.</param> 190 /// <param name="type">The type.</param>
191 /// <param name="ex">The ex.</param> 191 /// <param name="ex">The ex.</param>
192 public void WriteException(LogType type, Exception ex) 192 public void WriteException(LogType type, Exception ex)
193 { 193 {
194 if(ex != null) 194 if(ex != null)
195 { 195 {
196 Write(type, ex.Message); 196 Write(type, ex.Message);
197 //#if DEBUG 197 //#if DEBUG
198 m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name); 198 m_Writer.WriteLine("Exception @{0} stack trace [[", ex.TargetSite.Name);
199 m_Writer.WriteLine(ex.StackTrace); 199 m_Writer.WriteLine(ex.StackTrace);
200 m_Writer.WriteLine("]]"); 200 m_Writer.WriteLine("]]");
201 //#endif 201 //#endif
202 } 202 }
203 } 203 }
204 204
205 /// <summary> 205 /// <summary>
206 /// Flushes this instance. 206 /// Flushes this instance.
207 /// </summary> 207 /// </summary>
208 public void Flush() 208 public void Flush()
209 { 209 {
210 if(m_Writer != null) 210 if(m_Writer != null)
211 { 211 {
212 m_Writer.Flush(); 212 m_Writer.Flush();
213 } 213 }
214 } 214 }
215 215
216 #endregion 216 #endregion
217 217
218 #region IDisposable Members 218 #region IDisposable Members
219
220 /// <summary>
221 /// Performs application-defined tasks associated with freeing, releasing, or
222 /// resetting unmanaged resources.
223 /// </summary>
224 public void Dispose()
225 {
226 Dispose(true);
227 GC.SuppressFinalize(this);
228 }
219 229
220 /// <summary> 230 /// <summary>
221 /// Performs application-defined tasks associated with freeing, releasing, or 231 /// Dispose objects
222 /// resetting unmanaged resources. 232 /// </summary>
223 /// </summary> 233 /// <param name="disposing">
224 public void Dispose() 234 /// If true, it will dispose close the handle
225 { 235 /// </param>
226 Dispose(true); 236 /// <remarks>
227 GC.SuppressFinalize(this); 237 /// Will dispose managed and unmanaged resources.
228 } 238 /// </remarks>
239 protected virtual void Dispose(bool disposing)
240 {
241 if (!this.disposed)
242 {
243 if (disposing)
244 {
245 if (m_Writer != null)
246 {
247 m_Writer.Close();
248 m_Writer = null;
249 }
250 }
251 }
252 this.disposed = true;
253 }
229 254
230 /// <summary> 255 /// <summary>
231 /// Dispose objects 256 ///
232 /// </summary> 257 /// </summary>
233 /// <param name="disposing"> 258 ~Log()
234 /// If true, it will dispose close the handle 259 {
235 /// </param> 260 this.Dispose(false);
236 /// <remarks> 261 }
237 /// Will dispose managed and unmanaged resources.
238 /// </remarks>
239 protected virtual void Dispose(bool disposing)
240 {
241 if (!this.disposed)
242 {
243 if (disposing)
244 {
245 if (m_Writer != null)
246 {
247 m_Writer.Close();
248 m_Writer = null;
249 }
250 }
251 }
252 this.disposed = true;
253 }
254 262
255 /// <summary> 263 /// <summary>
256 /// 264 /// Closes and destroys this object
257 /// </summary> 265 /// </summary>
258 ~Log() 266 /// <remarks>
259 { 267 /// Same as Dispose(true)
260 this.Dispose(false); 268 /// </remarks>
261 } 269 public void Close()
262 270 {
263 /// <summary> 271 Dispose();
264 /// Closes and destroys this object 272 }
265 /// </summary>
266 /// <remarks>
267 /// Same as Dispose(true)
268 /// </remarks>
269 public void Close()
270 {
271 Dispose();
272 }
273 273
274 #endregion 274 #endregion
275 } 275 }
276} 276}
diff --git a/Prebuild/src/Core/WarningException.cs b/Prebuild/src/Core/WarningException.cs
index b7c3668..721f43d 100644
--- a/Prebuild/src/Core/WarningException.cs
+++ b/Prebuild/src/Core/WarningException.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -28,57 +28,57 @@ using System.Runtime.Serialization;
28 28
29namespace Prebuild.Core 29namespace Prebuild.Core
30{ 30{
31 /// <summary> 31 /// <summary>
32 /// 32 ///
33 /// </summary> 33 /// </summary>
34 [Serializable] 34 [Serializable]
35 public class WarningException : Exception 35 public class WarningException : Exception
36 { 36 {
37 #region Constructors 37 #region Constructors
38 38
39 /// <summary> 39 /// <summary>
40 /// 40 ///
41 /// </summary> 41 /// </summary>
42 public WarningException() 42 public WarningException()
43 { 43 {
44 } 44 }
45 45
46 /// <summary> 46 /// <summary>
47 /// 47 ///
48 /// </summary> 48 /// </summary>
49 /// <param name="format"></param> 49 /// <param name="format"></param>
50 /// <param name="args"></param> 50 /// <param name="args"></param>
51 public WarningException(string format, params object[] args) 51 public WarningException(string format, params object[] args)
52 : base(String.Format(format, args)) 52 : base(String.Format(format, args))
53 { 53 {
54 } 54 }
55 55
56 /// <summary> 56 /// <summary>
57 /// Exception with specified string 57 /// Exception with specified string
58 /// </summary> 58 /// </summary>
59 /// <param name="message">Exception message</param> 59 /// <param name="message">Exception message</param>
60 public WarningException(string message): base(message) 60 public WarningException(string message): base(message)
61 { 61 {
62 } 62 }
63 63
64 /// <summary> 64 /// <summary>
65 /// 65 ///
66 /// </summary> 66 /// </summary>
67 /// <param name="message"></param> 67 /// <param name="message"></param>
68 /// <param name="exception"></param> 68 /// <param name="exception"></param>
69 public WarningException(string message, Exception exception) : base(message, exception) 69 public WarningException(string message, Exception exception) : base(message, exception)
70 { 70 {
71 } 71 }
72 72
73 /// <summary> 73 /// <summary>
74 /// 74 ///
75 /// </summary> 75 /// </summary>
76 /// <param name="info"></param> 76 /// <param name="info"></param>
77 /// <param name="context"></param> 77 /// <param name="context"></param>
78 protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context ) 78 protected WarningException(SerializationInfo info, StreamingContext context) : base( info, context )
79 { 79 {
80 } 80 }
81 81
82 #endregion 82 #endregion
83 } 83 }
84} 84}
diff --git a/Prebuild/src/Prebuild.cs b/Prebuild/src/Prebuild.cs
index 35a5dfa..996dea0 100644
--- a/Prebuild/src/Prebuild.cs
+++ b/Prebuild/src/Prebuild.cs
@@ -5,16 +5,16 @@ Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehea
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
@@ -42,50 +42,50 @@ using System.EnterpriseServices.Internal;
42using Prebuild.Core; 42using Prebuild.Core;
43using Prebuild.Core.Utilities; 43using Prebuild.Core.Utilities;
44 44
45namespace Prebuild 45namespace Prebuild
46{ 46{
47 /// <summary> 47 /// <summary>
48 /// 48 ///
49 /// </summary> 49 /// </summary>
50 class Prebuild 50 class Prebuild
51 { 51 {
52 #region Main 52 #region Main
53 53
54 [STAThread] 54 [STAThread]
55 static void Main(string[] args) 55 static void Main(string[] args)
56 { 56 {
57 Kernel kernel = null; 57 Kernel kernel = null;
58 try 58 try
59 { 59 {
60 kernel = Kernel.Instance; 60 kernel = Kernel.Instance;
61 kernel.Initialize(LogTargets.File | LogTargets.Console, args); 61 kernel.Initialize(LogTargets.File | LogTargets.Console, args);
62 bool exit = false; 62 bool exit = false;
63 63
64 if(kernel.CommandLine.WasPassed("usage")) 64 if(kernel.CommandLine.WasPassed("usage"))
65 { 65 {
66 exit = true; 66 exit = true;
67 OutputUsage(); 67 OutputUsage();
68 } 68 }
69 if(kernel.CommandLine.WasPassed("showtargets")) 69 if(kernel.CommandLine.WasPassed("showtargets"))
70 { 70 {
71 exit = true; 71 exit = true;
72 OutputTargets(kernel); 72 OutputTargets(kernel);
73 } 73 }
74 if(kernel.CommandLine.WasPassed("install")) 74 if(kernel.CommandLine.WasPassed("install"))
75 { 75 {
76 exit = true; 76 exit = true;
77 InstallAssembly(kernel); 77 InstallAssembly(kernel);
78 } 78 }
79 if(kernel.CommandLine.WasPassed("remove")) 79 if(kernel.CommandLine.WasPassed("remove"))
80 { 80 {
81 exit = true; 81 exit = true;
82 RemoveAssembly(kernel); 82 RemoveAssembly(kernel);
83 } 83 }
84 84
85 if(!exit) 85 if(!exit)
86 { 86 {
87 kernel.Process(); 87 kernel.Process();
88 } 88 }
89 } 89 }
90#if !DEBUG 90#if !DEBUG
91 catch (Exception ex) 91 catch (Exception ex)
@@ -96,70 +96,70 @@ namespace Prebuild
96#endif 96#endif
97 finally 97 finally
98 { 98 {
99 if(kernel != null && kernel.PauseAfterFinish) 99 if(kernel != null && kernel.PauseAfterFinish)
100 { 100 {
101 Console.WriteLine("\nPress enter to continue..."); 101 Console.WriteLine("\nPress enter to continue...");
102 Console.ReadLine(); 102 Console.ReadLine();
103 } 103 }
104 } 104 }
105 } 105 }
106 106
107 #endregion 107 #endregion
108 108
109 #region Private Methods 109 #region Private Methods
110 110
111 private static void InstallAssembly(Kernel kernel) 111 private static void InstallAssembly(Kernel kernel)
112 { 112 {
113 Publish publish = new Publish(); 113 Publish publish = new Publish();
114 string file = kernel.CommandLine["install"]; 114 string file = kernel.CommandLine["install"];
115 //Console.WriteLine(".."+file+".."); 115 //Console.WriteLine(".."+file+"..");
116 publish.GacInstall(file); 116 publish.GacInstall(file);
117 } 117 }
118 118
119 private static void RemoveAssembly(Kernel kernel) 119 private static void RemoveAssembly(Kernel kernel)
120 { 120 {
121 Publish publish = new Publish(); 121 Publish publish = new Publish();
122 string file = kernel.CommandLine["remove"]; 122 string file = kernel.CommandLine["remove"];
123 publish.GacRemove(file); 123 publish.GacRemove(file);
124 } 124 }
125 125
126 private static void OutputUsage() 126 private static void OutputUsage()
127 { 127 {
128 Console.WriteLine("Usage: prebuild /target <target> [options]"); 128 Console.WriteLine("Usage: prebuild /target <target> [options]");
129 Console.WriteLine("Available command-line switches:"); 129 Console.WriteLine("Available command-line switches:");
130 Console.WriteLine(); 130 Console.WriteLine();
131 Console.WriteLine("/target Target for Prebuild"); 131 Console.WriteLine("/target Target for Prebuild");
132 Console.WriteLine("/clean Clean the build files for the given target"); 132 Console.WriteLine("/clean Clean the build files for the given target");
133 Console.WriteLine("/file XML file to process"); 133 Console.WriteLine("/file XML file to process");
134 Console.WriteLine("/log Log file to write to"); 134 Console.WriteLine("/log Log file to write to");
135 Console.WriteLine("/ppo Pre-process the file, but perform no other processing"); 135 Console.WriteLine("/ppo Pre-process the file, but perform no other processing");
136 Console.WriteLine("/pause Pauses the application after execution to view the output"); 136 Console.WriteLine("/pause Pauses the application after execution to view the output");
137 Console.WriteLine("/yes Default to yes to any questions asked"); 137 Console.WriteLine("/yes Default to yes to any questions asked");
138 Console.WriteLine("/install Install assembly into the GAC"); 138 Console.WriteLine("/install Install assembly into the GAC");
139 Console.WriteLine("/remove Remove assembly from the GAC"); 139 Console.WriteLine("/remove Remove assembly from the GAC");
140 Console.WriteLine(); 140 Console.WriteLine();
141 Console.WriteLine("See 'prebuild /showtargets for a list of available targets"); 141 Console.WriteLine("See 'prebuild /showtargets for a list of available targets");
142 Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information"); 142 Console.WriteLine("See readme.txt or check out http://dnpb.sourceforge.net for more information");
143 Console.WriteLine(); 143 Console.WriteLine();
144 } 144 }
145 145
146 private static void OutputTargets(Kernel kern) 146 private static void OutputTargets(Kernel kern)
147 { 147 {
148 Console.WriteLine("Targets available in Prebuild:"); 148 Console.WriteLine("Targets available in Prebuild:");
149 Console.WriteLine(""); 149 Console.WriteLine("");
150 if(kern.Targets.Keys.Count > 0) 150 if(kern.Targets.Keys.Count > 0)
151 { 151 {
152 string[] targs = new string[kern.Targets.Keys.Count]; 152 string[] targs = new string[kern.Targets.Keys.Count];
153 kern.Targets.Keys.CopyTo(targs, 0); 153 kern.Targets.Keys.CopyTo(targs, 0);
154 Array.Sort(targs); 154 Array.Sort(targs);
155 foreach(string target in targs) 155 foreach(string target in targs)
156 { 156 {
157 Console.WriteLine(target); 157 Console.WriteLine(target);
158 } 158 }
159 } 159 }
160 Console.WriteLine(""); 160 Console.WriteLine("");
161 } 161 }
162 162
163 #endregion 163 #endregion
164 } 164 }
165} 165}
diff --git a/Prebuild/src/Properties/AssemblyInfo.cs b/Prebuild/src/Properties/AssemblyInfo.cs
index 013743d..f9d90bb 100644
--- a/Prebuild/src/Properties/AssemblyInfo.cs
+++ b/Prebuild/src/Properties/AssemblyInfo.cs
@@ -52,7 +52,7 @@ using System.Resources;
52[assembly: CLSCompliant(true)] 52[assembly: CLSCompliant(true)]
53 53
54// 54//
55// General Information about an assembly is controlled through the following 55// General Information about an assembly is controlled through the following
56// set of attributes. Change these attribute values to modify the information 56// set of attributes. Change these attribute values to modify the information
57// associated with an assembly. 57// associated with an assembly.
58// 58//
@@ -77,34 +77,34 @@ using System.Resources;
77// Version information for an assembly consists of the following four values: 77// Version information for an assembly consists of the following four values:
78// 78//
79// Major Version 79// Major Version
80// Minor Version 80// Minor Version
81// Build Number 81// Build Number
82// Revision 82// Revision
83// 83//
84// You can specify all the values or you can default the Revision and Build Numbers 84// You can specify all the values or you can default the Revision and Build Numbers
85// by using the '*' as shown below: 85// by using the '*' as shown below:
86 86
87// 87//
88// In order to sign your assembly you must specify a key to use. Refer to the 88// In order to sign your assembly you must specify a key to use. Refer to the
89// Microsoft .NET Framework documentation for more information on assembly signing. 89// Microsoft .NET Framework documentation for more information on assembly signing.
90// 90//
91// Use the attributes below to control which key is used for signing. 91// Use the attributes below to control which key is used for signing.
92// 92//
93// Notes: 93// Notes:
94// (*) If no key is specified, the assembly is not signed. 94// (*) If no key is specified, the assembly is not signed.
95// (*) KeyName refers to a key that has been installed in the Crypto Service 95// (*) KeyName refers to a key that has been installed in the Crypto Service
96// Provider (CSP) on your machine. KeyFile refers to a file which contains 96// Provider (CSP) on your machine. KeyFile refers to a file which contains
97// a key. 97// a key.
98// (*) If the KeyFile and the KeyName values are both specified, the 98// (*) If the KeyFile and the KeyName values are both specified, the
99// following processing occurs: 99// following processing occurs:
100// (1) If the KeyName can be found in the CSP, that key is used. 100// (1) If the KeyName can be found in the CSP, that key is used.
101// (2) If the KeyName does not exist and the KeyFile does exist, the key 101// (2) If the KeyName does not exist and the KeyFile does exist, the key
102// in the KeyFile is installed into the CSP and used. 102// in the KeyFile is installed into the CSP and used.
103// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. 103// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
104// When specifying the KeyFile, the location of the KeyFile should be 104// When specifying the KeyFile, the location of the KeyFile should be
105// relative to the project output directory which is 105// relative to the project output directory which is
106// %Project Directory%\obj\<configuration>. For example, if your KeyFile is 106// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
107// located in the project directory, you would specify the AssemblyKeyFile 107// located in the project directory, you would specify the AssemblyKeyFile
108// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] 108// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
109// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework 109// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
110// documentation for more information on this. 110// documentation for more information on this.