sourcemod/tools/builder/ABuilder.cs
Scott Ehlert 251cced1f8 Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401971
2008-03-30 07:00:22 +00:00

200 lines
4.7 KiB
C#

using System;
using System.IO;
using System.Diagnostics;
namespace builder
{
public abstract class ABuilder
{
public Config cfg;
public ABuilder()
{
}
public abstract bool BuildLibrary(Package pkg, Library lib);
public abstract string GetPawnCompilerName();
public bool CompilePlugin(Package pkg, Plugin pl)
{
string local_dir = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting", cfg.pkg_path, pkg.GetBaseFolder());
string filepath = null;
if (pl.Folder != null)
{
filepath = Config.PathFormat("{0}/{1}", pl.Folder, pl.Source);
}
else
{
filepath = pl.Source;
}
ProcessStartInfo info = new ProcessStartInfo();
info.WorkingDirectory = local_dir;
info.FileName = Config.PathFormat("{0}/{1}", local_dir, GetPawnCompilerName());
info.Arguments = filepath + ".sp";
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
Process p = Process.Start(info);
string output = p.StandardOutput.ReadToEnd() + "\n";
output += p.StandardError.ReadToEnd();
p.WaitForExit();
p.Close();
Console.WriteLine("Debug: wd = " + info.WorkingDirectory + " fn = " + info.FileName + " arg = " + info.Arguments);
Console.WriteLine(output);
string binary = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source);
if (!File.Exists(binary))
{
Console.WriteLine("Could not find binary: " + binary);
return false;
}
string new_loc;
if (pl.disabled)
{
new_loc = Config.PathFormat("{0}/{1}/addons/sourcemod/plugins/disabled/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source);
}
else
{
new_loc = Config.PathFormat("{0}/{1}/addons/sourcemod/plugins/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source);
}
try
{
if (File.Exists(new_loc))
{
File.Delete(new_loc);
}
File.Move(binary, new_loc);
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
return false;
}
return true;
}
public bool CopyFile(Package pkg, string source, string dest)
{
string from = Config.PathFormat("{0}/{1}",
cfg.source_path,
source);
string to = Config.PathFormat("{0}/{1}/{2}",
cfg.pkg_path,
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.source_path, source);
string to_base = null;
if (dest == null)
{
to_base = Config.PathFormat("{0}/{1}",
cfg.pkg_path,
pkg.GetBaseFolder());
}
else
{
to_base = Config.PathFormat("{0}/{1}/{2}",
cfg.pkg_path,
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 void BuildPackage(Package pkg)
{
string path = Config.PathFormat("{0}/{1}", cfg.pkg_path, 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.pkg_path, 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();
for (int i=0; i<libs.Length; i++)
{
if (libs[i].build_mode == BuildMode.BuildMode_Episode1)
{
continue;
}
if (!BuildLibrary(pkg, libs[i]))
{
throw new System.Exception("Failed to compile library: " + libs[i].binary_name);
}
}
/* Do plugins */
Plugin [] plugins = pkg.GetPlugins();
if (plugins != null)
{
for (int i=0; i<plugins.Length; i++)
{
if (!CompilePlugin(pkg, plugins[i]))
{
throw new System.Exception("Failed to compile plugin: " + plugins[i].Source);
}
}
}
}
}
}