3 using System
.Reflection
;
4 using System
.Diagnostics
;
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,
22 RedirectStandardOutput
= true
25 string monoVersion
, monoCorlibVersion
;
27 Process winsetupProcess
;
30 winsetupProcess
= Process
.Start (psi
);
31 } catch (Exception exc
) {
32 Console
.Error
.WriteLine ("Failed starting winsetup.bat");
33 Console
.Error
.WriteLine (exc
);
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
;
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}");
61 var configData
= File
.ReadAllText (configPath
);
63 var m
= Regex
.Match (configData
, @"#define.*VERSION.*""([0-9.]+)""");
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)
73 Console
.WriteLine ($"MONO_VERSION={monoVersion}");
74 m
= Regex
.Match (configData
, @"#define.*MONO_CORLIB_VERSION.*""([^\\s]+)""");
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}");
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");
103 File
.WriteAllText (resultPath
, resultText
);
104 Console
.WriteLine ($"Generated {resultPath} successfully");