VSCode expects the decription field to be populated for the variables display
[mono-project.git] / msvc / scripts / genconsts.cs
blob253d9068791475ccbd4a6a8e1bf2c719edf2dcd2
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 m = Regex.Match (output, "MONO_VERSION=([0-9.]+)");
54 if (!m.Success)
55 return 1;
56 monoVersion = m.Groups[1].Value;
58 // HACK: winsetup.bat produces N.N.N instead of N.N.N.N like configure.ac,
59 // so we add .0's to match the Consts.cs generated by make
60 while (monoVersion.Split ('.').Length < 4)
61 monoVersion += ".0";
63 Console.WriteLine ($"MONO_VERSION={monoVersion}");
64 m = Regex.Match (output, "MONO_CORLIB_VERSION=([^\\s]+)");
65 if (!m.Success)
66 return 1;
67 monoCorlibVersion = m.Groups[1].Value;
68 Console.WriteLine ($"MONO_CORLIB_VERSION=\"{monoCorlibVersion}\"");
72 var constsDirectory = Path.Combine (executableDirectory, "..", "..", "mcs", "build", "common");
73 var constsTemplatePath = Path.Combine (constsDirectory, "Consts.cs.in");
74 if (!Directory.Exists (constsDirectory) || !File.Exists (constsTemplatePath)) {
75 Console.Error.WriteLine ($"File not found: {constsTemplatePath}");
76 return 1;
79 var resultPath = Path.GetFullPath (Path.Combine (constsDirectory, "Consts.cs"));
80 var templateText = File.ReadAllText (constsTemplatePath);
82 var resultText = templateText.Replace ("@MONO_VERSION@", monoVersion)
83 .Replace ("@MONO_CORLIB_VERSION@", monoCorlibVersion);
85 if (File.Exists (resultPath)) {
86 var existingText = File.ReadAllText (resultPath);
87 if (existingText.Trim () == resultText.Trim ()) {
88 Console.WriteLine ($"{resultPath} not changed");
89 return 0;
93 File.WriteAllText (resultPath, resultText);
94 Console.WriteLine ($"Generated {resultPath} successfully");
96 return 0;