tools/builder/ABuilder.cs
author David Anderson <dvander@alliedmods.net>
Sat Jan 27 04:50:48 2007 +0000 (2007-01-27)
changeset 398 626ce2e591ad
parent 388 4c346c316a49
child 403 fe1c5a3a4ba2
permissions -rw-r--r--
fixed a bug in the admin plugin
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@388
    15
		public abstract bool BuildLibrary(Package pkg, Library lib, ref string _binName, ref string _binPath);
dvander@388
    16
dvander@388
    17
		public void UpdateRevisionInfo(Package pkg, Library lib)
dvander@388
    18
		{
dvander@388
    19
			string path = Config.PathFormat("{0}/{1}", cfg.SourceBase, lib.LocalPath);
dvander@388
    20
			string file = Config.PathFormat("{0}/svn_version.h", path);
dvander@388
    21
dvander@388
    22
			if (File.Exists(file))
dvander@388
    23
			{
dvander@388
    24
				UpdateRevisionInfo(path, file);
dvander@388
    25
			}
dvander@388
    26
		}
dvander@388
    27
dvander@388
    28
		public void CopyFolder(Package pkg, string source, string dest, string [] omits)
dvander@388
    29
		{
dvander@388
    30
			string from_base = Config.PathFormat("{0}/{1}", cfg.SourceBase, source);
dvander@388
    31
			string to_base = Config.PathFormat("{0}/{1}/{2}", 
dvander@388
    32
				cfg.OutputBase, 
dvander@388
    33
				pkg.GetBaseFolder(), 
dvander@388
    34
				dest);
dvander@388
    35
dvander@388
    36
			string [] files = Directory.GetFiles(from_base);
dvander@388
    37
			string file;
dvander@388
    38
dvander@388
    39
			for (int i=0; i<files.Length; i++)
dvander@388
    40
			{
dvander@388
    41
				file = Path.GetFileName(files[i]);
dvander@388
    42
dvander@388
    43
				if (omits != null)
dvander@388
    44
				{
dvander@388
    45
					bool skip = false;
dvander@388
    46
					for (int j=0; j<omits.Length; j++)
dvander@388
    47
					{
dvander@388
    48
						if (file.CompareTo(omits[j]) == 0)
dvander@388
    49
						{
dvander@388
    50
							skip = true;
dvander@388
    51
							break;
dvander@388
    52
						}
dvander@388
    53
					}
dvander@388
    54
					if (skip)
dvander@388
    55
					{
dvander@388
    56
						continue;
dvander@388
    57
					}
dvander@388
    58
				}
dvander@388
    59
				dest = Config.PathFormat("{0}/{1}", to_base, file);
dvander@388
    60
				File.Copy(files[i], dest, true);
dvander@388
    61
			}
dvander@388
    62
		}
dvander@388
    63
dvander@388
    64
		public void UpdateRevisionInfo(string path, string file)
dvander@388
    65
		{
dvander@388
    66
			ProcessStartInfo info = new ProcessStartInfo();
dvander@388
    67
dvander@388
    68
			info.WorkingDirectory = path;
dvander@388
    69
			info.FileName = cfg.SVNVersion;
dvander@388
    70
			info.Arguments = "--committed " + path;
dvander@388
    71
			info.UseShellExecute = false;
dvander@388
    72
			info.RedirectStandardOutput = true;
dvander@388
    73
dvander@388
    74
			Process p = Process.Start(info);
dvander@388
    75
			string output = p.StandardOutput.ReadToEnd();
dvander@388
    76
			p.WaitForExit();
dvander@388
    77
			p.Close();
dvander@388
    78
dvander@388
    79
			string [] revs = output.Split(":".ToCharArray(), 2);
dvander@388
    80
			if (revs.Length < 1)
dvander@388
    81
			{
dvander@388
    82
				return;
dvander@388
    83
			}
dvander@388
    84
dvander@388
    85
			string rev = null;
dvander@388
    86
			if (revs.Length == 1)
dvander@388
    87
			{
dvander@388
    88
				rev = revs[0];
dvander@388
    89
			} 
dvander@388
    90
			else 
dvander@388
    91
			{
dvander@388
    92
				rev = revs[1];
dvander@388
    93
			}
dvander@388
    94
dvander@388
    95
			rev = rev.Trim();
dvander@388
    96
			rev = rev.Replace("M", "");
dvander@388
    97
			rev = rev.Replace("S", "");
dvander@388
    98
dvander@388
    99
			string vers = cfg.ProductVersion.Replace(".", ",");
dvander@388
   100
dvander@388
   101
			File.Delete(file);
dvander@388
   102
			StreamWriter sw = File.CreateText(file);
dvander@388
   103
dvander@388
   104
			sw.WriteLine("/** This file is autogenerated by build scripts */");
dvander@388
   105
			sw.WriteLine("");
dvander@388
   106
			sw.WriteLine("#ifndef _INCLUDE_SVN_VERSION_H_");
dvander@388
   107
			sw.WriteLine("#define _INCLUDE_SVN_VERSION_H_");
dvander@388
   108
			sw.WriteLine("");
dvander@388
   109
			sw.WriteLine("#define SVN_REVISION			{0}", rev);
dvander@388
   110
			sw.WriteLine("#define SVN_REVISION_STRING	\"{0}\"", rev);
dvander@388
   111
			sw.WriteLine("#define SVN_FILE_VERSION		{0},{1}", vers, rev);
dvander@388
   112
			sw.WriteLine("");
dvander@388
   113
			sw.WriteLine("#endif //_INCLUDE_SVN_VERSION_H_");
dvander@388
   114
			sw.WriteLine("");
dvander@388
   115
dvander@388
   116
			sw.Close();
dvander@388
   117
		}
dvander@388
   118
dvander@388
   119
		public void BuildPackage(Package pkg)
dvander@388
   120
		{
dvander@388
   121
			string path = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg.GetBaseFolder());
dvander@388
   122
dvander@388
   123
			if (!Directory.Exists(path))
dvander@388
   124
			{
dvander@388
   125
				Directory.CreateDirectory(path);
dvander@388
   126
			}
dvander@388
   127
dvander@388
   128
			/* Create all dirs */
dvander@388
   129
			string [] paths = pkg.GetFolders();
dvander@388
   130
			for (int i=0; i<paths.GetLength(0); i++)
dvander@388
   131
			{
dvander@388
   132
				path = Config.PathFormat("{0}/{1}/{2}", cfg.OutputBase, pkg.GetBaseFolder(), paths[i]);
dvander@388
   133
				if (!Directory.Exists(path))
dvander@388
   134
				{
dvander@388
   135
					Directory.CreateDirectory(path);
dvander@388
   136
				}
dvander@388
   137
			}
dvander@388
   138
dvander@388
   139
			/* Do primitive copies */
dvander@388
   140
			pkg.OnCopyFolders(this);
dvander@388
   141
			pkg.OnCopyFiles();
dvander@388
   142
dvander@388
   143
			/* Do libraries */
dvander@388
   144
			Library [] libs = pkg.GetLibraries();
dvander@388
   145
			string bin = null, binpath = null;
dvander@388
   146
			for (int i=0; i<libs.Length; i++)
dvander@388
   147
			{
dvander@388
   148
				UpdateRevisionInfo(pkg, libs[i]);
dvander@388
   149
				if (BuildLibrary(pkg, libs[i], ref bin, ref binpath))
dvander@388
   150
				{
dvander@388
   151
					path = Config.PathFormat("{0}/{1}/{2}/{3}",
dvander@388
   152
						cfg.OutputBase,
dvander@388
   153
						pkg.GetBaseFolder(),
dvander@388
   154
						libs[i].Destination,
dvander@388
   155
						bin);
dvander@388
   156
					File.Copy(binpath, path, true);
dvander@388
   157
				}
dvander@388
   158
				else 
dvander@388
   159
				{
dvander@388
   160
					throw new System.Exception("Failed to compile library: " + libs[i].Name);
dvander@388
   161
				}
dvander@388
   162
			}
dvander@388
   163
		}
dvander@388
   164
	}
dvander@388
   165
}