aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xOpenSim/Framework/Monitoring/Stats/EventHistogram.cs346
-rwxr-xr-xOpenSim/Region/PhysicsModules/BulletS/Tests/BulletSimTests.cs112
-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/ConfigurationNodeCollection.cs142
-rw-r--r--Prebuild/src/Core/Nodes/DatabaseProjectNode.cs186
-rw-r--r--Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs126
-rw-r--r--Prebuild/src/Core/Targets/AutotoolsTarget.cs2140
-rw-r--r--Prebuild/src/Core/Targets/VSGenericTarget.cs1944
9 files changed, 2661 insertions, 2661 deletions
diff --git a/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs b/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs
index f51f322..bc56372 100755
--- a/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs
+++ b/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs
@@ -1,173 +1,173 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright 7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright 9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the 12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products 13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission. 14 * derived from this software without specific prior written permission.
15 * 15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY 16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Linq; 30using System.Linq;
31using System.Text; 31using System.Text;
32 32
33using OpenMetaverse.StructuredData; 33using OpenMetaverse.StructuredData;
34 34
35namespace OpenSim.Framework.Monitoring 35namespace OpenSim.Framework.Monitoring
36{ 36{
37// Create a time histogram of events. The histogram is built in a wrap-around 37// Create a time histogram of events. The histogram is built in a wrap-around
38// array of equally distributed buckets. 38// array of equally distributed buckets.
39// For instance, a minute long histogram of second sized buckets would be: 39// For instance, a minute long histogram of second sized buckets would be:
40// new EventHistogram(60, 1000) 40// new EventHistogram(60, 1000)
41public class EventHistogram 41public class EventHistogram
42{ 42{
43 private int m_timeBase; 43 private int m_timeBase;
44 private int m_numBuckets; 44 private int m_numBuckets;
45 private int m_bucketMilliseconds; 45 private int m_bucketMilliseconds;
46 private int m_lastBucket; 46 private int m_lastBucket;
47 private int m_totalHistogramMilliseconds; 47 private int m_totalHistogramMilliseconds;
48 private long[] m_histogram; 48 private long[] m_histogram;
49 private object histoLock = new object(); 49 private object histoLock = new object();
50 50
51 public EventHistogram(int numberOfBuckets, int millisecondsPerBucket) 51 public EventHistogram(int numberOfBuckets, int millisecondsPerBucket)
52 { 52 {
53 m_numBuckets = numberOfBuckets; 53 m_numBuckets = numberOfBuckets;
54 m_bucketMilliseconds = millisecondsPerBucket; 54 m_bucketMilliseconds = millisecondsPerBucket;
55 m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds; 55 m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds;
56 56
57 m_histogram = new long[m_numBuckets]; 57 m_histogram = new long[m_numBuckets];
58 Zero(); 58 Zero();
59 m_lastBucket = 0; 59 m_lastBucket = 0;
60 m_timeBase = Util.EnvironmentTickCount(); 60 m_timeBase = Util.EnvironmentTickCount();
61 } 61 }
62 62
63 public void Event() 63 public void Event()
64 { 64 {
65 this.Event(1); 65 this.Event(1);
66 } 66 }
67 67
68 // Record an event at time 'now' in the histogram. 68 // Record an event at time 'now' in the histogram.
69 public void Event(int cnt) 69 public void Event(int cnt)
70 { 70 {
71 lock (histoLock) 71 lock (histoLock)
72 { 72 {
73 // The time as displaced from the base of the histogram 73 // The time as displaced from the base of the histogram
74 int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase); 74 int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase);
75 75
76 // If more than the total time of the histogram, we just start over 76 // If more than the total time of the histogram, we just start over
77 if (bucketTime > m_totalHistogramMilliseconds) 77 if (bucketTime > m_totalHistogramMilliseconds)
78 { 78 {
79 Zero(); 79 Zero();
80 m_lastBucket = 0; 80 m_lastBucket = 0;
81 m_timeBase = Util.EnvironmentTickCount(); 81 m_timeBase = Util.EnvironmentTickCount();
82 } 82 }
83 else 83 else
84 { 84 {
85 // To which bucket should we add this event? 85 // To which bucket should we add this event?
86 int bucket = bucketTime / m_bucketMilliseconds; 86 int bucket = bucketTime / m_bucketMilliseconds;
87 87
88 // Advance m_lastBucket to the new bucket. Zero any buckets skipped over. 88 // Advance m_lastBucket to the new bucket. Zero any buckets skipped over.
89 while (bucket != m_lastBucket) 89 while (bucket != m_lastBucket)
90 { 90 {
91 // Zero from just after the last bucket to the new bucket or the end 91 // Zero from just after the last bucket to the new bucket or the end
92 for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++) 92 for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++)
93 { 93 {
94 m_histogram[jj] = 0; 94 m_histogram[jj] = 0;
95 } 95 }
96 m_lastBucket = bucket; 96 m_lastBucket = bucket;
97 // If the new bucket is off the end, wrap around to the beginning 97 // If the new bucket is off the end, wrap around to the beginning
98 if (bucket > m_numBuckets) 98 if (bucket > m_numBuckets)
99 { 99 {
100 bucket -= m_numBuckets; 100 bucket -= m_numBuckets;
101 m_lastBucket = 0; 101 m_lastBucket = 0;
102 m_histogram[m_lastBucket] = 0; 102 m_histogram[m_lastBucket] = 0;
103 m_timeBase += m_totalHistogramMilliseconds; 103 m_timeBase += m_totalHistogramMilliseconds;
104 } 104 }
105 } 105 }
106 } 106 }
107 m_histogram[m_lastBucket] += cnt; 107 m_histogram[m_lastBucket] += cnt;
108 } 108 }
109 } 109 }
110 110
111 // Get a copy of the current histogram 111 // Get a copy of the current histogram
112 public long[] GetHistogram() 112 public long[] GetHistogram()
113 { 113 {
114 long[] ret = new long[m_numBuckets]; 114 long[] ret = new long[m_numBuckets];
115 lock (histoLock) 115 lock (histoLock)
116 { 116 {
117 int indx = m_lastBucket + 1; 117 int indx = m_lastBucket + 1;
118 for (int ii = 0; ii < m_numBuckets; ii++, indx++) 118 for (int ii = 0; ii < m_numBuckets; ii++, indx++)
119 { 119 {
120 if (indx >= m_numBuckets) 120 if (indx >= m_numBuckets)
121 indx = 0; 121 indx = 0;
122 ret[ii] = m_histogram[indx]; 122 ret[ii] = m_histogram[indx];
123 } 123 }
124 } 124 }
125 return ret; 125 return ret;
126 } 126 }
127 127
128 public OSDMap GetHistogramAsOSDMap() 128 public OSDMap GetHistogramAsOSDMap()
129 { 129 {
130 OSDMap ret = new OSDMap(); 130 OSDMap ret = new OSDMap();
131 131
132 ret.Add("Buckets", OSD.FromInteger(m_numBuckets)); 132 ret.Add("Buckets", OSD.FromInteger(m_numBuckets));
133 ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds)); 133 ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds));
134 ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds)); 134 ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds));
135 135
136 // Compute a number for the first bucket in the histogram. 136 // Compute a number for the first bucket in the histogram.
137 // This will allow readers to know how this histogram relates to any previously read histogram. 137 // This will allow readers to know how this histogram relates to any previously read histogram.
138 int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1; 138 int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1;
139 ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum)); 139 ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum));
140 140
141 ret.Add("Values", GetHistogramAsOSDArray()); 141 ret.Add("Values", GetHistogramAsOSDArray());
142 142
143 return ret; 143 return ret;
144 } 144 }
145 // Get a copy of the current histogram 145 // Get a copy of the current histogram
146 public OSDArray GetHistogramAsOSDArray() 146 public OSDArray GetHistogramAsOSDArray()
147 { 147 {
148 OSDArray ret = new OSDArray(m_numBuckets); 148 OSDArray ret = new OSDArray(m_numBuckets);
149 lock (histoLock) 149 lock (histoLock)
150 { 150 {
151 int indx = m_lastBucket + 1; 151 int indx = m_lastBucket + 1;
152 for (int ii = 0; ii < m_numBuckets; ii++, indx++) 152 for (int ii = 0; ii < m_numBuckets; ii++, indx++)
153 { 153 {
154 if (indx >= m_numBuckets) 154 if (indx >= m_numBuckets)
155 indx = 0; 155 indx = 0;
156 ret[ii] = OSD.FromLong(m_histogram[indx]); 156 ret[ii] = OSD.FromLong(m_histogram[indx]);
157 } 157 }
158 } 158 }
159 return ret; 159 return ret;
160 } 160 }
161 161
162 // Zero out the histogram 162 // Zero out the histogram
163 public void Zero() 163 public void Zero()
164 { 164 {
165 lock (histoLock) 165 lock (histoLock)
166 { 166 {
167 for (int ii = 0; ii < m_numBuckets; ii++) 167 for (int ii = 0; ii < m_numBuckets; ii++)
168 m_histogram[ii] = 0; 168 m_histogram[ii] = 0;
169 } 169 }
170 } 170 }
171} 171}
172 172
173} 173}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/Tests/BulletSimTests.cs b/OpenSim/Region/PhysicsModules/BulletS/Tests/BulletSimTests.cs
index 0be1f4c..14d0bdc 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/Tests/BulletSimTests.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/Tests/BulletSimTests.cs
@@ -1,56 +1,56 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright 7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright 9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the 12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products 13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission. 14 * derived from this software without specific prior written permission.
15 * 15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY 16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Linq; 30using System.Linq;
31using System.Text; 31using System.Text;
32 32
33using NUnit.Framework; 33using NUnit.Framework;
34using log4net; 34using log4net;
35 35
36using OpenSim.Tests.Common; 36using OpenSim.Tests.Common;
37 37
38namespace OpenSim.Region.PhysicsModule.BulletS.Tests 38namespace OpenSim.Region.PhysicsModule.BulletS.Tests
39{ 39{
40[TestFixture] 40[TestFixture]
41public class BulletSimTests : OpenSimTestCase 41public class BulletSimTests : OpenSimTestCase
42{ 42{
43 // Documentation on attributes: http://www.nunit.org/index.php?p=attributes&r=2.6.1 43 // Documentation on attributes: http://www.nunit.org/index.php?p=attributes&r=2.6.1
44 // Documentation on assertions: http://www.nunit.org/index.php?p=assertions&r=2.6.1 44 // Documentation on assertions: http://www.nunit.org/index.php?p=assertions&r=2.6.1
45 45
46 [TestFixtureSetUp] 46 [TestFixtureSetUp]
47 public void Init() 47 public void Init()
48 { 48 {
49 } 49 }
50 50
51 [TestFixtureTearDown] 51 [TestFixtureTearDown]
52 public void TearDown() 52 public void TearDown()
53 { 53 {
54 } 54 }
55} 55}
56} 56}
diff --git a/Prebuild/src/Core/Nodes/CleanFilesNode.cs b/Prebuild/src/Core/Nodes/CleanFilesNode.cs
index dc2da9a..71405f9 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..b8131b0 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/ConfigurationNodeCollection.cs b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs
index 7c59ac5..1c38d9e 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/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..845db24 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/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs
index e46b5a5..485e4dd 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/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs
index af61704..b7c71e6 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}