2using Microsoft.CodeAnalysis;
3using Microsoft.CodeAnalysis.MSBuild;
6using Project = Microsoft.CodeAnalysis.Project;
10internal static class Program
12 private static async Task<int> Main(
string[] args)
14 using var msbuild = MSBuildWorkspace.Create();
18 Console.Error.WriteLine(
19 "error: insufficient arguments\n" +
20 "usage: MLLIFCSharpFrontBuild <csproj-file> <output-dir>");
24 var projectPath = args[0];
25 var outputDir = args[1];
30 project = await msbuild.OpenProjectAsync(projectPath);
32 catch (FileNotFoundException)
34 Console.Error.WriteLine($
"error: no such project '{projectPath}'");
39 Compilation? compilation;
41 var start = DateTime.Now;
43 compilation = await project.GetCompilationAsync();
45 var elapsed = DateTime.Now - start;
46 Console.Error.WriteLine($
"info: {elapsed.Humanize()} taken to build");
49 if (compilation is
null)
51 Console.Error.WriteLine(
"error: failed to build project");
56 Directory.CreateDirectory(outputDir);
57 await
using var hdr =
new StreamWriter(File.Create(Path.Combine(outputDir,
"library.h")), Encoding.UTF8);
58 await
using var src =
new StreamWriter(File.Create(Path.Combine(outputDir,
"library.cxx")), Encoding.UTF8);
59 await
using var hdrW =
new CodeWriter(hdr,
" ");
60 await
using var srcW =
new CodeWriter(src,
" ");
63 var stub = await Embedded.Resource(
"BridgeStub.cxx");
65 var start = DateTime.Now;
67 var ns = compilation.Assembly.GlobalNamespace;
68 var ctx =
new CodeContext(project);
70 foreach (var diag
in new NamespaceWriter(ns).WriteTo(hdrW, ctx))
71 Console.Error.WriteLine(diag);
74 foreach (var t
in ctx)
75 foreach (var diag
in new TypeDefWriter(t).WriteTo(srcW, ctx))
76 Console.Error.WriteLine(diag);
78 var elapsed = DateTime.Now - start;
79 Console.Error.WriteLine($
"info: {elapsed.Humanize()} taken to generate");
85 string? version =
null;
86 foreach (var reference
in compilation.References)
88 if (reference.Display is
null)
91 var terms = reference.Display.Replace(
"\\",
"/").Split(
'/', StringSplitOptions.RemoveEmptyEntries);
94 for (i = 0; i < terms.Length; i++)
95 if (terms[i] ==
"microsoft.netcore.app.ref")
98 if (i >= terms.Length)
106 version = Environment.Version.ToString();
107 Console.Error.WriteLine(
108 $
"warning: cannot infer .net runtime version; defaults to running .net runtime version ({version})");
112 var cmake = await Embedded.Resource(
"CMakeLists.txt");
113 cmake = cmake.Replace(
"{@}", version);
114 await File.WriteAllTextAsync(Path.Combine(outputDir,
"CMakeLists.txt"), cmake);
Microsoft.CodeAnalysis.Project Project