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