1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
using System;
using System.IO;
using System.Reflection;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
public static class Program {
public static int Main (string[] args) {
var myAssembly = Assembly.GetExecutingAssembly ();
var codeBase = new Uri (myAssembly.CodeBase);
var executablePath = Path.GetFullPath (codeBase.LocalPath);
var executableDirectory = Path.GetDirectoryName (executablePath);
var winsetupDirectory = Path.Combine (executableDirectory, "..");
var winsetupPath = Path.Combine (winsetupDirectory, "winsetup.bat");
var psi = new ProcessStartInfo (winsetupPath) {
WorkingDirectory = winsetupDirectory,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardOutput = true
};
string monoVersion, monoCorlibVersion;
Process winsetupProcess;
try {
winsetupProcess = Process.Start (psi);
} catch (Exception exc) {
Console.Error.WriteLine ("Failed starting winsetup.bat");
Console.Error.WriteLine (exc);
return 1;
}
using (winsetupProcess) {
var outputBuffer = new StringBuilder ();
winsetupProcess.OutputDataReceived += (s, e) => {
outputBuffer.AppendLine (e.Data);
};
winsetupProcess.BeginOutputReadLine ();
winsetupProcess.WaitForExit ();
var output = outputBuffer.ToString ().Trim ();
if (winsetupProcess.ExitCode != 0) {
Console.Error.WriteLine ("Failed running winsetup.bat");
Console.Write (output);
return winsetupProcess.ExitCode;
} else {
var configDirectory = Path.Combine (executableDirectory, "..", "..");
var configPath = Path.Combine (configDirectory, "config.h");
if (!File.Exists (configPath)) {
Console.Error.WriteLine ($"File not found: {configPath}");
return 1;
}
var configData = File.ReadAllText (configPath);
var m = Regex.Match (configData, @"#define.*VERSION.*""([0-9.]+)""");
if (!m.Success)
return 1;
monoVersion = m.Groups[1].Value;
// HACK: winsetup.bat produces N.N.N instead of N.N.N.N like configure.ac,
// so we add .0's to match the Consts.cs generated by make
while (monoVersion.Split ('.').Length < 4)
monoVersion += ".0";
Console.WriteLine ($"MONO_VERSION={monoVersion}");
m = Regex.Match (configData, @"#define.*MONO_CORLIB_VERSION.*""([^\\s]+)""");
if (!m.Success)
return 1;
monoCorlibVersion = m.Groups[1].Value;
Console.WriteLine ($"MONO_CORLIB_VERSION=\"{monoCorlibVersion}\"");
}
}
var constsDirectory = Path.Combine (executableDirectory, "..", "..", "mcs", "build", "common");
var constsTemplatePath = Path.Combine (constsDirectory, "Consts.cs.in");
if (!Directory.Exists (constsDirectory) || !File.Exists (constsTemplatePath)) {
Console.Error.WriteLine ($"File not found: {constsTemplatePath}");
return 1;
}
var resultPath = Path.GetFullPath (Path.Combine (constsDirectory, "Consts.cs"));
var templateText = File.ReadAllText (constsTemplatePath);
var resultText = templateText.Replace ("@MONO_VERSION@", monoVersion)
.Replace ("@MONO_CORLIB_VERSION@", monoCorlibVersion);
if (File.Exists (resultPath)) {
var existingText = File.ReadAllText (resultPath);
if (existingText.Trim () == resultText.Trim ()) {
Console.WriteLine ($"{resultPath} not changed");
return 0;
}
}
File.WriteAllText (resultPath, resultText);
Console.WriteLine ($"Generated {resultPath} successfully");
return 0;
}
}
|