singrdk/base/Windows/BuildTasks/Mkmani.cs

146 lines
4.6 KiB
C#
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
// ----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ----------------------------------------------------------------------------
using System;
using System.IO;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Microsoft.Build.Framework;
namespace Microsoft.Singularity.BuildTasks
{
public class Mkmani : ExecTaskBase
{
string _outputManifestPath;
string _applicationName;
string _cacheRootPath;
string _outputNativeExecutablePath;
string _codeGenParameters;
string _linkerParameters;
ITaskItem[] _assemblies;
protected override bool Execute()
{
ArrayList codegen = new ArrayList();
ArrayList linker = new ArrayList();
string outfile = _outputManifestPath;
string appname = _applicationName;
string x86file = _outputNativeExecutablePath;
string cacheDirectory = _cacheRootPath;
// check all input files
ArrayList infiles = new ArrayList();
foreach (ITaskItem assembly in _assemblies) {
if (!File.Exists(assembly.ItemSpec)) {
LogError(String.Format("Error: Assembly '{0}' not found.", assembly.ItemSpec));
return false;
}
infiles.Add(assembly.ItemSpec);
}
if (!Directory.Exists(cacheDirectory)) {
LogError(String.Format("Error: Cache directory '{0}' not found.", cacheDirectory));
return false;
}
// This is to work around a bug in ManifestBuilder that causes it to emit paths like
// cache="/Apps/..." into manifests, which are later interpreted as absolute paths
// by NIB.
if (!cacheDirectory.EndsWith("\\"))
cacheDirectory += "\\";
// initialize the empty app manifest.
ManifestBuilder mb = new ManifestBuilder(_cacheRootPath, infiles);
string nativeExecutableFullPath;
if (!String.IsNullOrEmpty(_outputNativeExecutablePath))
nativeExecutableFullPath = Path.GetFullPath(_outputNativeExecutablePath);
else
nativeExecutableFullPath = "";
// create the app manifest
if (!mb.CreateNewManifest(appname, nativeExecutableFullPath)) {
LogError("An error occurred while generating the manifest.");
return false;
}
// Add the codegen flags.
foreach (string param in codegen) {
mb.AddCodegenParameter(param);
}
// Add the linker flags.
foreach (string param in linker) {
mb.AddLinkerParameter(param);
}
// output the xml document:
try {
using (XmlTextWriter writer = new XmlTextWriter(outfile, System.Text.Encoding.UTF8)) {
writer.Formatting = Formatting.Indented;
mb.Save(writer);
}
}
catch (Exception ex) {
LogError("The manifest file could not be created: " + ex.Message);
return false;
}
return true;
}
[Required]
public string OutputManifestPath
{
get { return _outputManifestPath; }
set { _outputManifestPath = value; }
}
[Required]
public string ApplicationName
{
get { return _applicationName; }
set { _applicationName = value; }
}
[Required]
public string CacheRootPath
{
get { return _cacheRootPath; }
set { _cacheRootPath = value; }
}
[Required]
public string OutputNativeExecutablePath
{
get { return _outputNativeExecutablePath; }
set { _outputNativeExecutablePath = value; }
}
public ITaskItem[] Assemblies
{
get { return _assemblies; }
set { _assemblies = value; }
}
public string CodeGenParameters
{
get { return _codeGenParameters; }
set { _codeGenParameters = value; }
}
public string LinkerParameters
{
get { return _linkerParameters; }
set { _linkerParameters = value; }
}
}
}