sourcemod/tools/builder/ABuilder.cs
David Anderson 7a8d164b25 Added compression support
--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40409
2007-01-28 04:19:46 +00:00

233 lines
5.4 KiB
C#

using System;
using System.IO;
using System.Diagnostics;
namespace builder
{
public abstract class ABuilder
{
public Config cfg;
public ABuilder()
{
}
public abstract string CompressPackage(Package pkg);
public abstract bool BuildLibrary(Package pkg, Library lib, ref string _binName, ref string _binPath);
public string GetRevsionOfPath(string path)
{
ProcessStartInfo info = new ProcessStartInfo();
info.WorkingDirectory = path;
info.FileName = cfg.SVNVersion;
info.Arguments = "--committed " + path;
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
Process p = Process.Start(info);
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
string [] revs = output.Split(":".ToCharArray(), 2);
if (revs.Length < 1)
{
return null;
}
string rev = null;
if (revs.Length == 1)
{
rev = revs[0];
}
else
{
rev = revs[1];
}
rev = rev.Trim();
rev = rev.Replace("M", "");
rev = rev.Replace("S", "");
return rev;
}
public void UpdateRevisionInfo(Package pkg, Library lib)
{
string path = Config.PathFormat("{0}/{1}", cfg.SourceBase, lib.LocalPath);
string file = Config.PathFormat("{0}/svn_version.h", path);
if (File.Exists(file))
{
UpdateRevisionInfo(path, file);
}
}
public void UpdateRevisionInfo(string path, string file)
{
string vers = cfg.ProductVersion.Replace(".", ",");
string rev = GetRevsionOfPath(path);
File.Delete(file);
StreamWriter sw = File.CreateText(file);
sw.WriteLine("/** This file is autogenerated by build scripts */");
sw.WriteLine("");
sw.WriteLine("#ifndef _INCLUDE_SVN_VERSION_H_");
sw.WriteLine("#define _INCLUDE_SVN_VERSION_H_");
sw.WriteLine("");
sw.WriteLine("#define SVN_REVISION {0}", rev);
sw.WriteLine("#define SVN_REVISION_STRING \"{0}\"", rev);
sw.WriteLine("#define SVN_FILE_VERSION {0},{1}", vers, rev);
sw.WriteLine("");
sw.WriteLine("#endif //_INCLUDE_SVN_VERSION_H_");
sw.WriteLine("");
sw.Close();
}
public bool CopyFile(Package pkg, string source, string dest)
{
string from = Config.PathFormat("{0}/{1}",
cfg.SourceBase,
source);
string to = Config.PathFormat("{0}/{1}/{2}",
cfg.OutputBase,
pkg.GetBaseFolder(),
dest);
File.Copy(from, to, true);
return true;
}
/** dest can be null to mean root base folder */
public void CopyFolder(Package pkg, string source, string dest, string [] omits)
{
string from_base = Config.PathFormat("{0}/{1}", cfg.SourceBase, source);
string to_base = null;
if (dest == null)
{
to_base = Config.PathFormat("{0}/{1}",
cfg.OutputBase,
pkg.GetBaseFolder());
}
else
{
to_base = Config.PathFormat("{0}/{1}/{2}",
cfg.OutputBase,
pkg.GetBaseFolder(),
dest);
}
string [] files = Directory.GetFiles(from_base);
string file;
for (int i=0; i<files.Length; i++)
{
file = Path.GetFileName(files[i]);
if (omits != null)
{
bool skip = false;
for (int j=0; j<omits.Length; j++)
{
if (file.CompareTo(omits[j]) == 0)
{
skip = true;
break;
}
}
if (skip)
{
continue;
}
}
dest = Config.PathFormat("{0}/{1}", to_base, file);
File.Copy(files[i], dest, true);
}
}
public string PackageBuildName(Package pkg)
{
return pkg.GetPackageName()
+ "-"
+ DateTime.Now.Day.ToString("00")
+ DateTime.Now.Month.ToString("00")
+ DateTime.Now.Year
+ "-r"
+ GetRevsionOfPath(cfg.SourceBase);
}
public void BuildPackage(Package pkg)
{
string path = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg.GetBaseFolder());
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
/* Create all dirs */
string [] paths = pkg.GetFolders();
for (int i=0; i<paths.GetLength(0); i++)
{
path = Config.PathFormat("{0}/{1}/{2}", cfg.OutputBase, pkg.GetBaseFolder(), paths[i]);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
/* Do primitive copies */
pkg.OnCopyFolders(this);
pkg.OnCopyFiles(this);
/* Do libraries */
Library [] libs = pkg.GetLibraries();
string bin = null, binpath = null;
for (int i=0; i<libs.Length; i++)
{
UpdateRevisionInfo(pkg, libs[i]);
if (BuildLibrary(pkg, libs[i], ref bin, ref binpath))
{
path = Config.PathFormat("{0}/{1}/{2}/{3}",
cfg.OutputBase,
pkg.GetBaseFolder(),
libs[i].Destination,
bin);
File.Copy(binpath, path, true);
}
else
{
throw new System.Exception("Failed to compile library: " + libs[i].Name);
}
}
string pkg_file = null;
if ((pkg_file=CompressPackage(pkg)) == null)
{
throw new System.Exception("Failed to compress package: " + pkg.GetPackageName());
}
string lpath = null, ltarget = null;
pkg.GetCompressBases(ref lpath, ref ltarget);
lpath = Config.PathFormat("{0}/{1}/{2}",
cfg.OutputBase,
lpath,
pkg_file);
ltarget = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg_file);
if (File.Exists(ltarget))
{
File.Delete(ltarget);
}
File.Move(lpath, ltarget);
}
}
}