public static void PostExecution() { var graph = Bam.Core.Graph.Instance; var commonMeta = graph.MetaData as MakeFileCommonMetaData; var makeEnvironment = new System.Text.StringBuilder(); var makeVariables = new System.Text.StringBuilder(); var makeRules = new System.Text.StringBuilder(); // delete suffix rules makeEnvironment.AppendLine(".SUFFIXES:"); foreach (var env in commonMeta.Environment) { makeEnvironment.AppendFormat("{0}:={1}", env.Key, env.Value.ToString(System.IO.Path.PathSeparator)); makeEnvironment.AppendLine(); } if (commonMeta.Directories.Count > 0) { makeVariables.Append("DIRS:="); foreach (var dir in commonMeta.Directories) { makeVariables.AppendFormat("{0} ", dir); } makeVariables.AppendLine(); } // all rule makeRules.Append("all:"); var allPrerequisites = new Bam.Core.StringArray(); // loop over all ranks, until the top-most modules with Make metadata are added to 'all' // this allows skipping over any upper modules without Make policies foreach (var rank in graph) { foreach (var module in rank) { var metadata = module.MetaData as MakeFileMeta; if (null == metadata) { continue; } foreach (var rule in metadata.Rules) { // TODO: could just exit from the loop after the first iteration if (!rule.IsFirstRule) { continue; } rule.AppendTargetNames(allPrerequisites); } } if (allPrerequisites.Any()) { break; } } makeRules.AppendLine(allPrerequisites.ToString(' ')); // directory direction rule makeRules.AppendLine("$(DIRS):"); if (Bam.Core.OSUtilities.IsWindowsHosting) { makeRules.AppendLine("\tmkdir $@"); } else { makeRules.AppendLine("\tmkdir -pv $@"); } // clean rule makeRules.AppendLine(".PHONY: clean"); makeRules.AppendLine("clean:"); makeRules.AppendLine("\t@rm -frv $(DIRS)"); foreach (var rank in graph.Reverse()) { foreach (var module in rank) { var metadata = module.MetaData as MakeFileMeta; if (null == metadata) { continue; } foreach (var rule in metadata.Rules) { rule.WriteVariables(makeVariables); rule.WriteRules(makeRules); } } } Bam.Core.Log.DebugMessage("MAKEFILE CONTENTS: BEGIN"); Bam.Core.Log.DebugMessage(makeEnvironment.ToString()); Bam.Core.Log.DebugMessage(makeVariables.ToString()); Bam.Core.Log.DebugMessage(makeRules.ToString()); Bam.Core.Log.DebugMessage("MAKEFILE CONTENTS: END"); var makeFilePath = Bam.Core.TokenizedString.Create("$(buildroot)/Makefile", null); makeFilePath.Parse(); using (var writer = new System.IO.StreamWriter(makeFilePath.ToString())) { writer.Write(makeEnvironment.ToString()); writer.Write(makeVariables.ToString()); writer.Write(makeRules.ToString()); } Bam.Core.Log.Info("Successfully created MakeFile for package '{0}'\n\t{1}", graph.MasterPackage.Name, makeFilePath); }