tools/builder/ABuilder.cs
author Scott Ehlert <ds@alliedmods.net>
Fri Feb 02 11:08:51 2007 +0000 (2007-02-02)
changeset 424 f9bcc06b52eb
parent 403 fe1c5a3a4ba2
child 538 f2440cef1a52
permissions -rw-r--r--
Fixed annoying bug in builder where executing svnversion command on a path containing spaces would cause a crash
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@403
    15
		public abstract string CompressPackage(Package pkg);
dvander@403
    16
dvander@388
    17
		public abstract bool BuildLibrary(Package pkg, Library lib, ref string _binName, ref string _binPath);
dvander@388
    18
dvander@403
    19
		public string GetRevsionOfPath(string path)
dvander@403
    20
		{
dvander@403
    21
			ProcessStartInfo info = new ProcessStartInfo();
dvander@403
    22
dvander@403
    23
			info.WorkingDirectory = path;
dvander@403
    24
			info.FileName = cfg.SVNVersion;
ds@424
    25
			info.Arguments = "--committed \"" + path + "\"";
dvander@403
    26
			info.UseShellExecute = false;
dvander@403
    27
			info.RedirectStandardOutput = true;
dvander@403
    28
dvander@403
    29
			Process p = Process.Start(info);
dvander@403
    30
			string output = p.StandardOutput.ReadToEnd();
dvander@403
    31
			p.WaitForExit();
dvander@403
    32
			p.Close();
dvander@403
    33
dvander@403
    34
			string [] revs = output.Split(":".ToCharArray(), 2);
dvander@403
    35
			if (revs.Length < 1)
dvander@403
    36
			{
dvander@403
    37
				return null;
dvander@403
    38
			}
dvander@403
    39
dvander@403
    40
			string rev = null;
dvander@403
    41
			if (revs.Length == 1)
dvander@403
    42
			{
dvander@403
    43
				rev = revs[0];
dvander@403
    44
			} 
dvander@403
    45
			else 
dvander@403
    46
			{
dvander@403
    47
				rev = revs[1];
dvander@403
    48
			}
dvander@403
    49
dvander@403
    50
			rev = rev.Trim();
dvander@403
    51
			rev = rev.Replace("M", "");
dvander@403
    52
			rev = rev.Replace("S", "");
dvander@403
    53
dvander@403
    54
			return rev;
dvander@403
    55
		}
dvander@403
    56
dvander@388
    57
		public void UpdateRevisionInfo(Package pkg, Library lib)
dvander@388
    58
		{
dvander@388
    59
			string path = Config.PathFormat("{0}/{1}", cfg.SourceBase, lib.LocalPath);
dvander@388
    60
			string file = Config.PathFormat("{0}/svn_version.h", path);
dvander@388
    61
dvander@388
    62
			if (File.Exists(file))
dvander@388
    63
			{
dvander@388
    64
				UpdateRevisionInfo(path, file);
dvander@388
    65
			}
dvander@388
    66
		}
dvander@388
    67
dvander@403
    68
		public void UpdateRevisionInfo(string path, string file)
dvander@403
    69
		{
dvander@403
    70
			string vers = cfg.ProductVersion.Replace(".", ",");
dvander@403
    71
			string rev = GetRevsionOfPath(path);
dvander@403
    72
dvander@403
    73
			File.Delete(file);
dvander@403
    74
			StreamWriter sw = File.CreateText(file);
dvander@403
    75
dvander@403
    76
			sw.WriteLine("/** This file is autogenerated by build scripts */");
dvander@403
    77
			sw.WriteLine("");
dvander@403
    78
			sw.WriteLine("#ifndef _INCLUDE_SVN_VERSION_H_");
dvander@403
    79
			sw.WriteLine("#define _INCLUDE_SVN_VERSION_H_");
dvander@403
    80
			sw.WriteLine("");
dvander@403
    81
			sw.WriteLine("#define SVN_REVISION			{0}", rev);
dvander@403
    82
			sw.WriteLine("#define SVN_REVISION_STRING	\"{0}\"", rev);
dvander@403
    83
			sw.WriteLine("#define SVN_FILE_VERSION		{0},{1}", vers, rev);
dvander@403
    84
			sw.WriteLine("");
dvander@403
    85
			sw.WriteLine("#endif //_INCLUDE_SVN_VERSION_H_");
dvander@403
    86
			sw.WriteLine("");
dvander@403
    87
dvander@403
    88
			sw.Close();
dvander@403
    89
		}
dvander@403
    90
dvander@403
    91
		public bool CopyFile(Package pkg, string source, string dest)
dvander@403
    92
		{
dvander@403
    93
			string from = Config.PathFormat("{0}/{1}", 
dvander@403
    94
				cfg.SourceBase,
dvander@403
    95
				source);
dvander@403
    96
			string to = Config.PathFormat("{0}/{1}/{2}",
dvander@403
    97
				cfg.OutputBase,
dvander@403
    98
				pkg.GetBaseFolder(),
dvander@403
    99
				dest);
dvander@403
   100
dvander@403
   101
			File.Copy(from, to, true);
dvander@403
   102
dvander@403
   103
			return true;
dvander@403
   104
		}
dvander@403
   105
dvander@403
   106
		/** dest can be null to mean root base folder */
dvander@388
   107
		public void CopyFolder(Package pkg, string source, string dest, string [] omits)
dvander@388
   108
		{
dvander@388
   109
			string from_base = Config.PathFormat("{0}/{1}", cfg.SourceBase, source);
dvander@403
   110
			string to_base = null;
dvander@403
   111
			
dvander@403
   112
			if (dest == null)
dvander@403
   113
			{
dvander@403
   114
				to_base = Config.PathFormat("{0}/{1}", 
dvander@403
   115
					cfg.OutputBase, 
dvander@403
   116
					pkg.GetBaseFolder());
dvander@403
   117
			} 
dvander@403
   118
			else 
dvander@403
   119
			{
dvander@403
   120
				to_base = Config.PathFormat("{0}/{1}/{2}", 
dvander@403
   121
					cfg.OutputBase, 
dvander@403
   122
					pkg.GetBaseFolder(), 
dvander@403
   123
					dest);
dvander@403
   124
			}
dvander@388
   125
dvander@388
   126
			string [] files = Directory.GetFiles(from_base);
dvander@388
   127
			string file;
dvander@388
   128
dvander@388
   129
			for (int i=0; i<files.Length; i++)
dvander@388
   130
			{
dvander@388
   131
				file = Path.GetFileName(files[i]);
dvander@388
   132
dvander@388
   133
				if (omits != null)
dvander@388
   134
				{
dvander@388
   135
					bool skip = false;
dvander@388
   136
					for (int j=0; j<omits.Length; j++)
dvander@388
   137
					{
dvander@388
   138
						if (file.CompareTo(omits[j]) == 0)
dvander@388
   139
						{
dvander@388
   140
							skip = true;
dvander@388
   141
							break;
dvander@388
   142
						}
dvander@388
   143
					}
dvander@388
   144
					if (skip)
dvander@388
   145
					{
dvander@388
   146
						continue;
dvander@388
   147
					}
dvander@388
   148
				}
dvander@388
   149
				dest = Config.PathFormat("{0}/{1}", to_base, file);
dvander@388
   150
				File.Copy(files[i], dest, true);
dvander@388
   151
			}
dvander@388
   152
		}
dvander@388
   153
dvander@403
   154
		public string PackageBuildName(Package pkg)
dvander@388
   155
		{
dvander@403
   156
			return pkg.GetPackageName() 
dvander@403
   157
				+ "-"
dvander@403
   158
				+ DateTime.Now.Day.ToString("00")
dvander@403
   159
				+ DateTime.Now.Month.ToString("00")
dvander@403
   160
				+ DateTime.Now.Year
dvander@403
   161
				+ "-r"
dvander@403
   162
				+ GetRevsionOfPath(cfg.SourceBase);
dvander@388
   163
		}
dvander@388
   164
dvander@388
   165
		public void BuildPackage(Package pkg)
dvander@388
   166
		{
dvander@388
   167
			string path = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg.GetBaseFolder());
dvander@388
   168
dvander@388
   169
			if (!Directory.Exists(path))
dvander@388
   170
			{
dvander@388
   171
				Directory.CreateDirectory(path);
dvander@388
   172
			}
dvander@388
   173
dvander@388
   174
			/* Create all dirs */
dvander@388
   175
			string [] paths = pkg.GetFolders();
dvander@388
   176
			for (int i=0; i<paths.GetLength(0); i++)
dvander@388
   177
			{
dvander@388
   178
				path = Config.PathFormat("{0}/{1}/{2}", cfg.OutputBase, pkg.GetBaseFolder(), paths[i]);
dvander@388
   179
				if (!Directory.Exists(path))
dvander@388
   180
				{
dvander@388
   181
					Directory.CreateDirectory(path);
dvander@388
   182
				}
dvander@388
   183
			}
dvander@388
   184
dvander@388
   185
			/* Do primitive copies */
dvander@388
   186
			pkg.OnCopyFolders(this);
dvander@403
   187
			pkg.OnCopyFiles(this);
dvander@388
   188
dvander@388
   189
			/* Do libraries */
dvander@388
   190
			Library [] libs = pkg.GetLibraries();
dvander@388
   191
			string bin = null, binpath = null;
dvander@388
   192
			for (int i=0; i<libs.Length; i++)
dvander@388
   193
			{
dvander@388
   194
				UpdateRevisionInfo(pkg, libs[i]);
dvander@388
   195
				if (BuildLibrary(pkg, libs[i], ref bin, ref binpath))
dvander@388
   196
				{
dvander@388
   197
					path = Config.PathFormat("{0}/{1}/{2}/{3}",
dvander@388
   198
						cfg.OutputBase,
dvander@388
   199
						pkg.GetBaseFolder(),
dvander@388
   200
						libs[i].Destination,
dvander@388
   201
						bin);
dvander@388
   202
					File.Copy(binpath, path, true);
dvander@388
   203
				}
dvander@388
   204
				else 
dvander@388
   205
				{
dvander@388
   206
					throw new System.Exception("Failed to compile library: " + libs[i].Name);
dvander@388
   207
				}
dvander@388
   208
			}
dvander@403
   209
dvander@403
   210
			string pkg_file = null;
dvander@403
   211
			if ((pkg_file=CompressPackage(pkg)) == null)
dvander@403
   212
			{
dvander@403
   213
				throw new System.Exception("Failed to compress package: " + pkg.GetPackageName());
dvander@403
   214
			}
dvander@403
   215
dvander@403
   216
			string lpath = null, ltarget = null;
dvander@403
   217
			pkg.GetCompressBases(ref lpath, ref ltarget);
dvander@403
   218
			lpath = Config.PathFormat("{0}/{1}/{2}",
dvander@403
   219
				cfg.OutputBase,
dvander@403
   220
				lpath,
dvander@403
   221
				pkg_file);
dvander@403
   222
			ltarget = Config.PathFormat("{0}/{1}", cfg.OutputBase, pkg_file);
dvander@403
   223
dvander@403
   224
			if (File.Exists(ltarget))
dvander@403
   225
			{
dvander@403
   226
				File.Delete(ltarget);
dvander@403
   227
			}
dvander@403
   228
dvander@403
   229
			File.Move(lpath, ltarget);
dvander@388
   230
		}
dvander@388
   231
	}
dvander@388
   232
}