tools/builder/ABuilder.cs
author Scott Ehlert <ds@alliedmods.net>
Wed Feb 18 02:19:22 2009 -0600 (2009-02-18)
changeset 2583 d3b2571c378b
parent 2289 44045ead61cd
permissions -rw-r--r--
Added support for Dark Messiah engine and game. (no bug, r=me).

The development of this feature would not be possible without the support of the following people from the game's community:
Dylan Riggs, Carl Pettengill, Ed Moreland, and Christian.
dvander@388
     1
using System;
dvander@388
     2
using System.IO;
dvander@388
     3
using System.Diagnostics;
dvander@388
     4
dvander@388
     5
namespace builder
dvander@388
     6
{
dvander@388
     7
	public abstract class ABuilder
dvander@388
     8
	{
dvander@388
     9
		public Config cfg;
dvander@388
    10
dvander@388
    11
		public ABuilder()
dvander@388
    12
		{
dvander@388
    13
		}
dvander@388
    14
dvander@1558
    15
		public abstract bool BuildLibrary(Package pkg, Library lib);
dvander@388
    16
dvander@852
    17
		public abstract string GetPawnCompilerName();
dvander@852
    18
dvander@852
    19
		public bool CompilePlugin(Package pkg, Plugin pl)
dvander@852
    20
		{
dvander@1548
    21
			string local_dir = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting", cfg.pkg_path, pkg.GetBaseFolder());
dvander@852
    22
dvander@852
    23
			string filepath = null;
dvander@852
    24
			if (pl.Folder != null)
dvander@852
    25
			{
dvander@852
    26
				filepath = Config.PathFormat("{0}/{1}", pl.Folder, pl.Source);
dvander@852
    27
			} 
dvander@852
    28
			else 
dvander@852
    29
			{
dvander@852
    30
				filepath = pl.Source;
dvander@852
    31
			}
dvander@852
    32
dvander@852
    33
			ProcessStartInfo info = new ProcessStartInfo();
dvander@852
    34
			info.WorkingDirectory = local_dir;
dvander@852
    35
			info.FileName = Config.PathFormat("{0}/{1}", local_dir, GetPawnCompilerName());
dvander@852
    36
			info.Arguments = filepath + ".sp";
dvander@852
    37
			info.UseShellExecute = false;
dvander@852
    38
			info.RedirectStandardOutput = true;
dvander@852
    39
			info.RedirectStandardError = true;
dvander@852
    40
dvander@852
    41
			Process p = Process.Start(info);
dvander@852
    42
			string output = p.StandardOutput.ReadToEnd() + "\n";
dvander@852
    43
			output += p.StandardError.ReadToEnd();
dvander@852
    44
			p.WaitForExit();
dvander@852
    45
			p.Close();
dvander@852
    46
dvander@852
    47
			Console.WriteLine(output);
dvander@852
    48
dvander@1548
    49
			string binary = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source);
dvander@852
    50
			if (!File.Exists(binary))
dvander@852
    51
			{
dvander@1774
    52
				Console.WriteLine("Could not find binary: " + binary);
dvander@852
    53
				return false;
dvander@852
    54
			}
dvander@1329
    55
dvander@1329
    56
			string new_loc;
dvander@1329
    57
			if (pl.disabled)
dvander@1329
    58
			{
dvander@1548
    59
				new_loc = Config.PathFormat("{0}/{1}/addons/sourcemod/plugins/disabled/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source);
dvander@1329
    60
			} 
dvander@1329
    61
			else 
dvander@1329
    62
			{
dvander@1548
    63
				new_loc = Config.PathFormat("{0}/{1}/addons/sourcemod/plugins/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source);
dvander@1329
    64
			}
dvander@852
    65
dvander@852
    66
			try
dvander@852
    67
			{
dvander@852
    68
				if (File.Exists(new_loc))
dvander@852
    69
				{
dvander@852
    70
					File.Delete(new_loc);
dvander@852
    71
				}
dvander@852
    72
				File.Move(binary, new_loc);
dvander@852
    73
			}
dvander@852
    74
			catch (System.Exception e)
dvander@852
    75
			{
dvander@852
    76
				Console.WriteLine(e.Message);
dvander@852
    77
				return false;
dvander@852
    78
			}
dvander@852
    79
dvander@852
    80
			return true;
dvander@852
    81
		}
dvander@852
    82
dvander@403
    83
		public bool CopyFile(Package pkg, string source, string dest)
dvander@403
    84
		{
dvander@403
    85
			string from = Config.PathFormat("{0}/{1}", 
dvander@1548
    86
				cfg.source_path,
dvander@403
    87
				source);
dvander@403
    88
			string to = Config.PathFormat("{0}/{1}/{2}",
dvander@1548
    89
				cfg.pkg_path,
dvander@403
    90
				pkg.GetBaseFolder(),
dvander@403
    91
				dest);
dvander@403
    92
dvander@403
    93
			File.Copy(from, to, true);
dvander@403
    94
dvander@403
    95
			return true;
dvander@403
    96
		}
dvander@403
    97
dvander@403
    98
		/** dest can be null to mean root base folder */
dvander@388
    99
		public void CopyFolder(Package pkg, string source, string dest, string [] omits)
dvander@388
   100
		{
dvander@1548
   101
			string from_base = Config.PathFormat("{0}/{1}", cfg.source_path, source);
dvander@403
   102
			string to_base = null;
dvander@403
   103
			
dvander@403
   104
			if (dest == null)
dvander@403
   105
			{
dvander@403
   106
				to_base = Config.PathFormat("{0}/{1}", 
dvander@1548
   107
					cfg.pkg_path, 
dvander@403
   108
					pkg.GetBaseFolder());
dvander@403
   109
			} 
dvander@403
   110
			else 
dvander@403
   111
			{
dvander@403
   112
				to_base = Config.PathFormat("{0}/{1}/{2}", 
dvander@1548
   113
					cfg.pkg_path, 
dvander@403
   114
					pkg.GetBaseFolder(), 
dvander@403
   115
					dest);
dvander@403
   116
			}
dvander@388
   117
dvander@388
   118
			string [] files = Directory.GetFiles(from_base);
dvander@388
   119
			string file;
dvander@388
   120
dvander@388
   121
			for (int i=0; i<files.Length; i++)
dvander@388
   122
			{
dvander@388
   123
				file = Path.GetFileName(files[i]);
dvander@388
   124
dvander@388
   125
				if (omits != null)
dvander@388
   126
				{
dvander@388
   127
					bool skip = false;
dvander@388
   128
					for (int j=0; j<omits.Length; j++)
dvander@388
   129
					{
dvander@388
   130
						if (file.CompareTo(omits[j]) == 0)
dvander@388
   131
						{
dvander@388
   132
							skip = true;
dvander@388
   133
							break;
dvander@388
   134
						}
dvander@388
   135
					}
dvander@388
   136
					if (skip)
dvander@388
   137
					{
dvander@388
   138
						continue;
dvander@388
   139
					}
dvander@388
   140
				}
dvander@388
   141
				dest = Config.PathFormat("{0}/{1}", to_base, file);
dvander@388
   142
				File.Copy(files[i], dest, true);
dvander@388
   143
			}
dvander@388
   144
		}
dvander@388
   145
dvander@388
   146
		public void BuildPackage(Package pkg)
dvander@388
   147
		{
dvander@1548
   148
			string path = Config.PathFormat("{0}/{1}", cfg.pkg_path, pkg.GetBaseFolder());
dvander@388
   149
dvander@388
   150
			if (!Directory.Exists(path))
dvander@388
   151
			{
dvander@388
   152
				Directory.CreateDirectory(path);
dvander@388
   153
			}
dvander@388
   154
dvander@388
   155
			/* Create all dirs */
dvander@388
   156
			string [] paths = pkg.GetFolders();
dvander@388
   157
			for (int i=0; i<paths.GetLength(0); i++)
dvander@388
   158
			{
dvander@1548
   159
				path = Config.PathFormat("{0}/{1}/{2}", cfg.pkg_path, pkg.GetBaseFolder(), paths[i]);
dvander@388
   160
				if (!Directory.Exists(path))
dvander@388
   161
				{
dvander@388
   162
					Directory.CreateDirectory(path);
dvander@388
   163
				}
dvander@388
   164
			}
dvander@388
   165
dvander@388
   166
			/* Do primitive copies */
dvander@388
   167
			pkg.OnCopyFolders(this);
dvander@403
   168
			pkg.OnCopyFiles(this);
dvander@388
   169
dvander@388
   170
			/* Do libraries */
dvander@388
   171
			Library [] libs = pkg.GetLibraries();
dvander@388
   172
			for (int i=0; i<libs.Length; i++)
dvander@388
   173
			{
dvander@1817
   174
				if (libs[i].build_mode == BuildMode.BuildMode_Episode1)
dvander@1817
   175
				{
dvander@1817
   176
					continue;
dvander@1817
   177
				}
ds@2583
   178
				if ((libs[i].platform & cfg.Platform) != cfg.Platform)
ds@2583
   179
				{
ds@2583
   180
					continue;
ds@2583
   181
				}
dvander@1558
   182
				if (!BuildLibrary(pkg, libs[i]))
dvander@388
   183
				{
dvander@1548
   184
					throw new System.Exception("Failed to compile library: " + libs[i].binary_name);
dvander@388
   185
				}
dvander@388
   186
			}
dvander@403
   187
dvander@852
   188
			/* Do plugins */
dvander@852
   189
			Plugin [] plugins = pkg.GetPlugins();
dvander@852
   190
			if (plugins != null)
dvander@852
   191
			{
dvander@852
   192
				for (int i=0; i<plugins.Length; i++)
dvander@852
   193
				{
dvander@852
   194
					if (!CompilePlugin(pkg, plugins[i]))
dvander@852
   195
					{
dvander@852
   196
						throw new System.Exception("Failed to compile plugin: " + plugins[i].Source);
dvander@852
   197
					}
dvander@852
   198
				}
dvander@852
   199
			}
dvander@388
   200
		}
dvander@388
   201
	}
dvander@388
   202
}