2 using System.Collections;
\r
5 using System.Text.RegularExpressions;
\r
7 using System.Xml.Serialization;
\r
8 using System.Diagnostics;
\r
10 namespace Mfconsulting.General.Prj2Make
\r
12 public class CmbxMaker
\r
14 public static string slash;
\r
15 static Hashtable projNameInfo = new Hashtable();
\r
16 static Hashtable projGuidInfo = new Hashtable();
\r
17 private Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine m_cmbObject;
\r
18 private bool m_bIsUnix;
\r
19 private bool m_bIsMcs;
\r
20 private bool m_bIsUsingLib;
\r
22 // Flag use to determine if the LIB variable will be used in
\r
23 // the Makefile that prj2make generates
\r
24 public bool IsUsingLib
\r
26 get{ return m_bIsUsingLib; }
\r
27 set{ m_bIsUsingLib = value; }
\r
30 // Determines if the makefile is intended for nmake or gmake for urposes of path separator character
\r
33 get{ return m_bIsUnix; }
\r
34 set{ m_bIsUnix = value; }
\r
37 // Determines if using MCS or CSC
\r
40 get{ return m_bIsMcs; }
\r
41 set{ m_bIsMcs = value; }
\r
44 public Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine Solucion {
\r
45 get { return m_cmbObject; }
\r
52 m_bIsUsingLib = false;
\r
55 // Combine desirialization
\r
56 protected Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine LoadCmbFromFile (string strIn)
\r
58 FileStream fs = new FileStream (strIn, FileMode.Open);
\r
60 XmlSerializer xmlSer = new XmlSerializer (typeof(Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine));
\r
61 Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine cmbObj = (Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine) xmlSer.Deserialize (fs);
\r
68 protected void ParseMdCsProj(string fname)
\r
72 PrjxInfo pi = new PrjxInfo(m_bIsUnix, m_bIsMcs, fname);
\r
73 projectName = pi.name;
\r
74 projNameInfo[projectName] = pi;
\r
77 protected void ParseCombine(string fname)
\r
79 string CombineFilePath = fname;
\r
81 // convert backslashes to slashes
\r
82 CombineFilePath = CombineFilePath.Replace("\\", "/");
\r
84 // loads the file in order to deserialize and
\r
85 // build the object graph
\r
87 m_cmbObject = LoadCmbFromFile (CombineFilePath);
\r
88 } catch (Exception exc) {
\r
91 String.Format ("Could not load the file {0}\nException: {1}",
\r
98 foreach(Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry ent in m_cmbObject.Entries)
\r
100 string projectName = System.IO.Path.GetFileNameWithoutExtension(ent.filename);
\r
101 string csprojPath = ent.filename;
\r
103 if (csprojPath.EndsWith(".prjx"))
\r
105 PrjxInfo pi = new PrjxInfo(m_bIsUnix, m_bIsMcs, csprojPath);
\r
107 projNameInfo[projectName] = pi;
\r
112 public string MdCmbxHelper(bool isUnixMode, bool isMcsMode, bool isSln, string slnFile)
\r
114 bool noCommonTargets = false;
\r
115 bool noProjectTargets = false;
\r
116 bool noFlags = false;
\r
118 StringBuilder MakefileBuilder = new StringBuilder();
\r
120 m_bIsUnix = isUnixMode;
\r
121 m_bIsMcs = isMcsMode;
\r
123 if(m_bIsUnix == true && m_bIsMcs == true)
\r
125 m_bIsUsingLib = true;
\r
139 string d = Path.GetDirectoryName(slnFile);
\r
142 Directory.SetCurrentDirectory(d);
\r
144 if (isSln == true) {
\r
145 // We invoke the ParseSolution
\r
146 // by passing the file obtained
\r
147 ParseCombine (slnFile);
\r
150 // We invoke the ParseMsCsProj
\r
151 // by passing the file obtained
\r
152 ParseMdCsProj (slnFile);
\r
157 if (m_bIsUnix) // gmake
\r
159 MakefileBuilder.Append("ifndef TARGET\n");
\r
160 MakefileBuilder.Append("\tTARGET=./bin/Debug\n");
\r
161 MakefileBuilder.Append("else\n");
\r
162 MakefileBuilder.Append("\tTARGET=./bin/$(TARGET)\n");
\r
163 MakefileBuilder.Append("endif\n\n");
\r
165 if (m_bIsMcs == false)
\r
167 MakefileBuilder.Append("MCS=csc\n");
\r
168 MakefileBuilder.Append("MCSFLAGS=-nologo\n\n");
\r
169 MakefileBuilder.Append("ifdef (RELEASE)\n");
\r
170 MakefileBuilder.Append("\tMCSFLAGS=$(MCSFLAGS) -optimize+ -d:TRACE\n");
\r
171 MakefileBuilder.Append("else\n");
\r
172 MakefileBuilder.Append("\tMCSFLAGS=$(MCSFLAGS) -debug+ -d:TRACE,DEBUG\n");
\r
173 MakefileBuilder.Append("endif\n");
\r
177 MakefileBuilder.Append("MCS=mcs\n");
\r
178 MakefileBuilder.Append("ifndef (RELEASE)\n");
\r
179 MakefileBuilder.Append("\tMCSFLAGS=-debug \n");
\r
180 MakefileBuilder.Append("endif\n");
\r
181 // Define and add the information used in the -lib: arguments passed to the
\r
182 // compiler to assist in finding non-fullyqualified assembly references.
\r
183 if(m_bIsUsingLib == true)
\r
185 string strlibDir = PkgConfigInvoker.GetPkgVariableValue("mono", "libdir");
\r
187 if (strlibDir == null)
\r
189 strlibDir = "/usr/lib";
\r
192 MakefileBuilder.AppendFormat("\nLIBS=-lib:{0} -lib:{1}\n\n",
\r
193 Path.Combine(strlibDir.TrimEnd(), "mono/1.0"),
\r
194 Path.Combine(strlibDir.TrimEnd(), "mono/gtk-sharp")
\r
201 MakefileBuilder.Append("!if !defined (TARGET)\n");
\r
202 MakefileBuilder.Append("TARGET=.\\bin\\Debug\n");
\r
203 MakefileBuilder.Append("!else\n");
\r
204 MakefileBuilder.Append("TARGET=.\\bin\\$(TARGET)\n");
\r
205 MakefileBuilder.Append("!endif\n\n");
\r
207 if (m_bIsMcs == false)
\r
209 MakefileBuilder.Append("MCS=csc\n");
\r
210 MakefileBuilder.Append("MCSFLAGS=-nologo\n\n");
\r
211 MakefileBuilder.Append("!if !defined(RELEASE)\n");
\r
212 MakefileBuilder.Append("MCSFLAGS=$(MCSFLAGS) -optimize+ -d:TRACE\n");
\r
213 MakefileBuilder.Append("!else\n");
\r
214 MakefileBuilder.Append("MCSFLAGS=$(MCSFLAGS) -debug+ -d:TRACE,DEBUG\n");
\r
215 MakefileBuilder.Append("!endif\n");
\r
219 MakefileBuilder.Append("MCS=mcs\n");
\r
220 MakefileBuilder.Append("!if !defined(RELEASE)\n");
\r
221 MakefileBuilder.Append("MCSFLAGS=-debug \n");
\r
222 MakefileBuilder.Append("!endif\n");
\r
226 MakefileBuilder.Append("\n");
\r
230 MakefileBuilder.Append("!if !defined(MCS)\n");
\r
231 MakefileBuilder.Append("!error You must provide MCS when making\n");
\r
232 MakefileBuilder.Append("!endif\n\n");
\r
235 foreach (PrjxInfo prjI in projNameInfo.Values)
\r
237 MakefileBuilder.AppendFormat("{0}=$(TARGET){1}{2}\n", prjI.makename_ext, slash, prjI.assembly_name);
\r
238 MakefileBuilder.AppendFormat("{0}_PDB=$(TARGET){1}{2}\n", prjI.makename, slash, prjI.assembly_name.Replace(".dll",".pdb"));
\r
239 MakefileBuilder.AppendFormat("{0}_SRC={1}\n", prjI.makename, prjI.src);
\r
240 MakefileBuilder.AppendFormat("{0}_RES={1}\n\n", prjI.makename, prjI.res);
\r
244 foreach (PrjxInfo pi in projNameInfo.Values)
\r
249 foreach (Mfconsulting.General.Prj2Make.Schema.Prjx.Reference rf in pi.Proyecto.References)
\r
254 string assemblyName = rf.refto;
\r
256 // HACK - under Unix filenames are case sensitive
\r
257 // Under Windows there's no agreement on Xml vs XML ;-)
\r
258 if (0 == String.Compare(assemblyName, "System.Xml", true))
\r
260 assemblyName = "System.Xml";
\r
263 // Check to see if there is a coma in the
\r
264 // reference. This could indicate a GAC
\r
266 nPos = assemblyName.IndexOf(',');
\r
269 if (System.IO.Path.GetExtension(assemblyName).ToUpper().CompareTo(".DLL") == 0)
\r
271 refs += "-r:" + assemblyName;
\r
275 refs += "-r:" + assemblyName + ".dll";
\r
280 refs += "-r:" + assemblyName.Substring(0, nPos) + ".dll";
\r
284 MakefileBuilder.AppendFormat("$({0}): $({1}_SRC) {2}\n", pi.makename_ext, pi.makename, deps);
\r
288 MakefileBuilder.Append("\t-mkdir -p $(TARGET)\n");
\r
292 MakefileBuilder.Append("\t-md $(TARGET)\n");
\r
295 MakefileBuilder.Append("\t$(MCS) $(MCSFLAGS)");
\r
297 // Test to see if any configuratino has the Allow unsafe blocks on
\r
298 if(pi.AllowUnsafeCode == true ) {
\r
299 MakefileBuilder.Append(" -unsafe");
\r
302 // Test for LIBS usage
\r
303 if(m_bIsUsingLib == true) {
\r
304 MakefileBuilder.Append(" $(LIBS)");
\r
307 MakefileBuilder.AppendFormat(" {2}{3} -out:$({0}) $({1}_RES) $({1}_SRC)\n",
\r
308 pi.makename_ext, pi.makename, refs, pi.switches);
\r
310 MakefileBuilder.Append("\n");
\r
313 if (!noCommonTargets)
\r
315 MakefileBuilder.Append("\n");
\r
316 MakefileBuilder.Append("# common targets\n\n");
\r
317 MakefileBuilder.Append("all:\t");
\r
321 foreach (PrjxInfo pi in projNameInfo.Values)
\r
325 MakefileBuilder.Append(" \\\n\t");
\r
327 MakefileBuilder.AppendFormat("$({0})", pi.makename_ext);
\r
330 MakefileBuilder.Append("\n\n");
\r
332 MakefileBuilder.Append("clean:\n");
\r
334 foreach (PrjxInfo pi in projNameInfo.Values)
\r
338 MakefileBuilder.AppendFormat("\t-rm -f \"$({0})\" 2> /dev/null\n", pi.makename_ext);
\r
339 MakefileBuilder.AppendFormat("\t-rm -f \"$({0}_PDB)\" 2> /dev/null\n", pi.makename);
\r
343 MakefileBuilder.AppendFormat("\t-del \"$({0})\" 2> nul\n", pi.makename_ext);
\r
344 MakefileBuilder.AppendFormat("\t-del \"$({0}_PDB)\" 2> nul\n", pi.makename);
\r
347 MakefileBuilder.Append("\n");
\r
350 if (!noProjectTargets)
\r
352 MakefileBuilder.Append("\n");
\r
353 MakefileBuilder.Append("# project names as targets\n\n");
\r
354 foreach (PrjxInfo pi in projNameInfo.Values)
\r
356 MakefileBuilder.AppendFormat("{0}: $({1})\n", pi.name, pi.makename_ext);
\r
360 catch (Exception e)
\r
362 Console.WriteLine("EXCEPTION: {0}\n", e);
\r
366 return MakefileBuilder.ToString();
\r