amxmodx/installer/builder/Main.cs

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;
}
}
}