146 lines
3.2 KiB
C#
Executable File
146 lines
3.2 KiB
C#
Executable File
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace AMXXRelease
|
|
{
|
|
//Entry point for application.
|
|
//1. Reads config file
|
|
//2. Instantiates correct build process (ABuilder)
|
|
//3. Instantiates the build (Build)
|
|
//4. Passes configuration and build to the Builder
|
|
public class Releaser
|
|
{
|
|
private Config m_Cfg;
|
|
public static bool IsWindows;
|
|
public static bool IsOSX;
|
|
|
|
[STAThread]
|
|
static void Main(string[] args)
|
|
{
|
|
string file;
|
|
if (args.GetLength(0) < 1)
|
|
file = "release.info";
|
|
else
|
|
file = args[0];
|
|
|
|
Releaser r = new Releaser();
|
|
|
|
r.Release(file);
|
|
}
|
|
|
|
public void Release(string file)
|
|
{
|
|
m_Cfg = new Config();
|
|
|
|
file = ABuilder.PropSlashes(file);
|
|
if (!m_Cfg.ReadFromFile(file))
|
|
{
|
|
Console.WriteLine("Failed to read config, aborting.");
|
|
Console.WriteLine("Build failed!");
|
|
return;
|
|
}
|
|
|
|
if (!ValidateConfigPaths())
|
|
{
|
|
Console.WriteLine("Build failed!");
|
|
return;
|
|
}
|
|
|
|
ABuilder builder = null;
|
|
if (IsMacOSX())
|
|
{
|
|
builder = new MacBuilder();
|
|
Releaser.IsWindows = false;
|
|
Releaser.IsOSX = true;
|
|
}
|
|
else if (System.Environment.OSVersion.Platform == System.PlatformID.Unix)
|
|
{
|
|
builder = new LinuxBuilder();
|
|
Releaser.IsWindows = false;
|
|
Releaser.IsOSX = false;
|
|
} else {
|
|
builder = new Win32Builder();
|
|
Releaser.IsWindows = true;
|
|
Releaser.IsOSX = false;
|
|
}
|
|
|
|
Build build = new Build(m_Cfg);
|
|
|
|
if (!builder.Build(m_Cfg, build))
|
|
{
|
|
throw new Exception("Build failed!");
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Build succeeded!");
|
|
}
|
|
}
|
|
|
|
private bool ValidateConfigPaths()
|
|
{
|
|
string source = ABuilder.PropSlashes(m_Cfg.GetSourceTree());
|
|
|
|
if (!Directory.Exists(source))
|
|
{
|
|
Console.WriteLine("Failed to find source tree! Check 'source' option in config.");
|
|
return false;
|
|
} else {
|
|
// Check subdirectories of source tree to make sure they contain necessary directories
|
|
if (!Directory.Exists(ABuilder.PropSlashes(source + "\\amxmodx")) ||
|
|
!Directory.Exists(ABuilder.PropSlashes(source + "\\configs")) ||
|
|
!Directory.Exists(ABuilder.PropSlashes(source + "\\dlls")) ||
|
|
!Directory.Exists(ABuilder.PropSlashes(source + "\\plugins")))
|
|
{
|
|
Console.WriteLine("Source tree appears invalid! Check 'source' option in config.");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if ( !File.Exists( ABuilder.PropSlashes(m_Cfg.DevenvPath()) ) )
|
|
{
|
|
Console.WriteLine("Failed to find compilation program! Check 'devenv' option in config.");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
[DllImport("libc")]
|
|
static extern int uname(IntPtr buf);
|
|
|
|
// Environment.OSVersion.Platform returns PlatformID.Unix under Mono on OS X
|
|
// Code adapted from Mono: mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUI.cs
|
|
private bool IsMacOSX()
|
|
{
|
|
IntPtr buf = IntPtr.Zero;
|
|
|
|
try
|
|
{
|
|
// The size of the utsname struct varies from system to system, but this _seems_ more than enough
|
|
buf = Marshal.AllocHGlobal(4096);
|
|
|
|
if (uname(buf) == 0)
|
|
{
|
|
string sys = Marshal.PtrToStringAnsi(buf);
|
|
if (sys == "Darwin")
|
|
return true;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// Do nothing
|
|
}
|
|
finally
|
|
{
|
|
if (buf != IntPtr.Zero)
|
|
Marshal.FreeHGlobal(buf);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|