Welcome to mirror list, hosted at ThFree Co, Russian Federation.

genconsts.cs « scripts « msvc - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 599e68cbfd70580c9abfb91b0e5412b3c53620b6 (plain)
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;
    }
}