Files
MIRROR-LX-OriginalRepo/LX-Build/Main.cs
Pasha Bibko 616ed1ca21 Refactored error handling
Now uses base error class which has an abstract function for overiding how it is displayed to the console.
2025-05-05 15:44:59 +01:00

70 lines
2.1 KiB
C#

using System;
using System.ComponentModel;
namespace LX_Build
{
class Program
{
static void CompileToObj(string inPath, string outPath)
{
// The arguments to compiler LLVM IR to object files //
string arguments = $"-filetype=obj -o \"{outPath}\" \"{inPath}\"";
// Runs the command //
CommandProcess process = new("llc", arguments);
if (process.ExitCode() == 0)
{
Console.WriteLine(inPath + " -> " + outPath);
return;
}
Console.WriteLine(process.Error());
}
static void LinkToExe(string objectFile)
{
// The arguments to turn object files into an .exe //
string arguments = $"/OUT:example/Main.exe {objectFile} /ENTRY:main";
// Runs the command //
CommandProcess process = new("lld-link", arguments);
if (process.ExitCode() == 0)
{
Console.WriteLine(objectFile + " -> " + "Main.exe");
return;
}
Console.WriteLine(process.Error());
}
static void Main()
{
// Initalises the CPP interface, MUST ALWAYS BE CALLED FIRST //
LX_API.Init();
// Generates LLVM IR with the example files //
if (LX_API.GenIR("example/main.lx", "example/main.ll", "example/log") != 0)
{
// Quits if the IR Generation fails //
// The C++ script handles all of the error message outputting //
return;
}
// Compilers the LLVM IR to an object file using the command line //
CompileToObj("example/main.ll", "example/main.obj");
// Links the object file to an .exe //
LinkToExe("example/main.obj");
// Runs the outputted .exe //
string command = "example/Main.exe";
CommandProcess exe = new(command);
// Outputs that the program ended with {x} exit code //
Console.WriteLine("\nProcess {Main.exe} finished with exit code: " + exe.ExitCode());
}
}
}