183
205
return cr.GetResult();
186
public void GenerateMakefile (Project project, Combine parentCombine)
188
StreamWriter stream = new StreamWriter (Path.Combine (project.BaseDirectory, "Makefile." + project.Name.Replace (" ", "")));
190
DotNetProjectConfiguration configuration = (DotNetProjectConfiguration) project.ActiveConfiguration;
191
NemerleParameters cp = (NemerleParameters) configuration.CompilationParameters;
193
string outputName = Path.GetFileName (configuration.CompiledOutputName);
195
string relativeOutputDir = fileUtilityService.AbsoluteToRelativePath (project.BaseDirectory, parentCombine.OutputDirectory);
197
ArrayList compile_files = new ArrayList ();
198
ArrayList pkg_references = new ArrayList ();
199
ArrayList assembly_references = new ArrayList ();
200
ArrayList project_references = new ArrayList ();
201
ArrayList system_references = new ArrayList ();
203
foreach (ProjectFile finfo in project.ProjectFiles) {
204
if (finfo.Subtype != Subtype.Directory) {
205
switch (finfo.BuildAction) {
206
case BuildAction.Compile:
207
string rel_path = fileUtilityService.AbsoluteToRelativePath (project.BaseDirectory, Path.GetDirectoryName (finfo.Name));
208
if (CanCompile (finfo.Name));
209
compile_files.Add (Path.Combine (rel_path, Path.GetFileName (finfo.Name)));
215
SystemAssemblyService sas = (SystemAssemblyService)ServiceManager.GetService (typeof (SystemAssemblyService));
216
foreach (ProjectReference lib in project.ProjectReferences) {
217
switch (lib.ReferenceType) {
218
case ReferenceType.Gac:
219
string pkg = sas.GetPackageFromFullName (lib.Reference);
220
if (pkg == "MONO-SYSTEM") {
221
system_references.Add (Path.GetFileName (lib.GetReferencedFileName ()));
222
} else if (!pkg_references.Contains (pkg)) {
223
pkg_references.Add (pkg);
226
case ReferenceType.Assembly:
227
string assembly_fileName = lib.GetReferencedFileName ();
228
string rel_path_to = fileUtilityService.AbsoluteToRelativePath (project.BaseDirectory, Path.GetDirectoryName (assembly_fileName));
229
assembly_references.Add (Path.Combine (rel_path_to, Path.GetFileName (assembly_fileName)));
231
case ReferenceType.Project:
232
CombineEntryCollection allProjects = project.RootCombine.GetAllProjects();
234
foreach (Project projectEntry in allProjects) {
235
if (projectEntry.Name == lib.Reference) {
236
string project_base_dir = fileUtilityService.AbsoluteToRelativePath (project.BaseDirectory, projectEntry.BaseDirectory);
238
string project_output_fileName = projectEntry.GetOutputFileName ();
239
project_references.Add (Path.Combine (project_base_dir, Path.GetFileName (project_output_fileName)));
246
stream.WriteLine ("# This makefile is autogenerated by MonoDevelop");
247
stream.WriteLine ("# Do not modify this file");
249
stream.WriteLine ("SOURCES = \\");
250
for (int i = 0; i < compile_files.Count; i++) {
251
stream.Write (((string)compile_files[i]).Replace (" ", "\\ "));
252
if (i != compile_files.Count - 1)
253
stream.WriteLine (" \\");
259
if (pkg_references.Count > 0) {
260
stream.WriteLine ("PKG_REFERENCES = \\");
261
for (int i = 0; i < pkg_references.Count; i++) {
262
stream.Write (pkg_references[i]);
263
if (i != pkg_references.Count - 1)
264
stream.WriteLine (" \\");
270
stream.WriteLine ("PKG_REFERENCES_BUILD = $(addprefix -pkg:, $(PKG_REFERENCES))");
272
stream.WriteLine ("PKG_REFERENCES_CHECK = $(addsuffix .pkgcheck, $(PKG_REFERENCES))");
276
if (system_references.Count > 0) {
277
stream.WriteLine ("SYSTEM_REFERENCES = \\");
278
for (int i = 0; i < system_references.Count; i++) {
279
stream.Write (system_references[i]);
280
if (i != system_references.Count - 1)
281
stream.WriteLine (" \\");
286
stream.WriteLine ("SYSTEM_REFERENCES_BUILD = $(addprefix -r:, $(SYSTEM_REFERENCES))");
288
stream.WriteLine ("SYSTEM_REFERENCES_CHECK = $(addsuffix .check, $(SYSTEM_REFERENCES))");
292
if (assembly_references.Count > 0) {
293
stream.WriteLine ("ASSEMBLY_REFERENCES = \\");
294
for (int i = 0; i < assembly_references.Count; i++) {
295
stream.Write ("\"" + assembly_references[i] + "\"");
296
if (i != assembly_references.Count - 1)
297
stream.WriteLine (" \\");
303
stream.WriteLine ("ASSEMBLY_REFERENCES_BUILD = $(addprefix -r:, $(ASSEMBLY_REFERENCES))");
307
if (project_references.Count > 0) {
308
stream.WriteLine ("PROJECT_REFERENCES = \\");
309
for (int i = 0; i < project_references.Count; i++) {
310
stream.Write ("\"" + project_references[i] + "\"");
311
if (i != project_references.Count - 1)
312
stream.WriteLine (" \\");
318
stream.WriteLine ("PROJECT_REFERENCES_BUILD = $(addprefix -r:, $(PROJECT_REFERENCES))");
322
stream.Write ("NCC_OPTIONS = " + GetOptionsString (configuration, cp));
327
stream.WriteLine ("all: " + outputName);
330
stream.WriteLine(outputName + ": $(SOURCES)");
332
stream.Write ("\t{0} $(NCC_OPTIONS) -out:\"{1}\"", ncc, outputName);
333
if (pkg_references.Count > 0) {
334
stream.Write (" $(PKG_REFERENCES_BUILD)");
336
if (assembly_references.Count > 0) {
337
stream.Write (" $(ASSEMBLY_REFERENCES_BUILD)");
339
if (project_references.Count > 0) {
340
stream.Write (" $(PROJECT_REFERENCES_BUILD)");
342
if (system_references.Count > 0) {
343
stream.Write (" $(SYSTEM_REFERENCES_BUILD)");
345
stream.WriteLine (" $(SOURCES) \\");
346
stream.WriteLine ("\t&& cp \"{0}\" {1}/.", outputName, relativeOutputDir);
349
stream.WriteLine ("clean:");
350
stream.WriteLine ("\trm -f {0}", outputName);
353
stream.Write ("depcheck: ");
354
if (pkg_references.Count > 0) {
355
stream.Write ("PKG_depcheck ");
357
if (system_references.Count > 0) {
358
stream.Write ("SYSTEM_depcheck");
362
if (pkg_references.Count > 0) {
363
stream.WriteLine ("PKG_depcheck: $(PKG_REFERENCES_CHECK)");
365
stream.WriteLine ("%.pkgcheck:");
366
stream.WriteLine ("\t@echo -n Checking for package $(subst .pkgcheck,,$@)...");
367
stream.WriteLine ("\t@if pkg-config --libs $(subst .pkgcheck,,$@) &> /dev/null; then \\");
368
stream.WriteLine ("\t\techo yes; \\");
369
stream.WriteLine ("\telse \\");
370
stream.WriteLine ("\t\techo no; \\");
371
stream.WriteLine ("\t\texit 1; \\");
372
stream.WriteLine ("\tfi");
376
if (system_references.Count > 0) {
377
stream.WriteLine ("SYSTEM_depcheck: $(SYSTEM_REFERENCES_CHECK)");
379
stream.WriteLine ("%.check:");
380
stream.WriteLine ("\t@echo -n Checking for $(subst .check,,$@)...");
381
stream.WriteLine ("\t@if [ ! -e `pkg-config --variable=libdir mono`/mono/1.0/$(subst .check,,$@) ]; then \\");
382
stream.WriteLine ("\t\techo no; \\");
383
stream.WriteLine ("\t\texit 1; \\");
384
stream.WriteLine ("\telse \\");
385
stream.WriteLine ("\t\techo yes; \\");
386
stream.WriteLine ("\tfi");