using System; using System.Collections.Generic; using System.Text; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Cosmos.Build.Common; using Cosmos.Compiler.Builder; using Cosmos.IL2CPU; using System.IO; namespace Cosmos.Build.MSBuild { public class BuildImage : AppDomainIsolatedTask { private Boolean buildFailed; public override bool Execute() { buildFailed = false; Log.LogMessage(MessageImportance.High, "Building Cosmos System Image"); String buildOutputPath; String buildKernelAssemblyPath; Boolean buildUseInternalAssembler; TargetHost buildTarget; Framework buildFramework; if (System.IO.Path.IsPathRooted(this.OutputPath) == false) { buildOutputPath = (new System.IO.DirectoryInfo(this.OutputPath)).FullName; } else { buildOutputPath = this.OutputPath; } buildKernelAssemblyPath = System.IO.Path.Combine(buildOutputPath, this.KernelAssembly); buildUseInternalAssembler = this.UseInternalAssembler; buildFramework = EnumValue.Parse(this.Framework, Cosmos.Build.Common.Framework.MicrosoftNET); buildTarget = EnumValue.Parse(this.BuildTarget, TargetHost.QEMU); Log.LogMessage(MessageImportance.High, "Output Path: {0}", buildOutputPath); Log.LogMessage(MessageImportance.High, "Kernal Assembly: {0}", buildKernelAssemblyPath); Log.LogMessage(MessageImportance.High, "Use Internal Assembler: {0}", buildUseInternalAssembler); Log.LogMessage(MessageImportance.High, "Framework: {0}", buildFramework); Log.LogMessage(MessageImportance.High, "Target: {0}", buildTarget); System.Reflection.Assembly kernelAssembly; var builtEvent = new System.Threading.AutoResetEvent(false); var builder = new Builder(); var xOptions = BuildOptions.Load(); xOptions.Target = "ISO"; //builder.UseInternalAssembler = this.UseInternalAssembler; builder.BuildCompleted += delegate { builtEvent.Set(); }; builder.LogMessage += delegate(LogSeverityEnum aSeverity, string aMessage) { switch (aSeverity) { case LogSeverityEnum.Informational: Log.LogMessage(aMessage); break; case LogSeverityEnum.Warning: Log.LogWarning(aMessage); break; case LogSeverityEnum.Error: Log.LogError(aMessage); this.buildFailed = true; break; } }; kernelAssembly = System.Reflection.Assembly.LoadFile(Path.Combine(buildOutputPath, this.KernelAssembly)); builder.TargetAssembly = kernelAssembly; builder.BeginCompile(xOptions); builtEvent.WaitOne(); if (!builder.HasErrors) { File.Copy(Path.Combine(builder.BuildPath, "Cosmos.iso"), Path.Combine(OutputPath, Path.GetFileNameWithoutExtension(KernelAssembly) + ".iso"), true); } return (this.buildFailed == false) && !builder.HasErrors; //Log.LogWarning("Not rebuilding image"); //return true; } [Required] public string KernelAssembly { get; set; } [Required] public string OutputPath { get; set; } public Boolean UseInternalAssembler { get; set; } public string BuildTarget { get; set; } public string Framework { get; set; } } }