From 4306054fdc1947f8022f800dcafd53b03efc18a4 Mon Sep 17 00:00:00 2001 From: Conrad Kreyling Date: Fri, 2 Feb 2024 20:10:53 -0500 Subject: [PATCH] Expand ParserGen to accept ARM64 build process --- src/CppParser/Bindings/CLI/Decl.h | 2 +- src/CppParser/ParserGen/ParserGen.cs | 33 +++++++++++++++++++--------- src/Parser/ParserOptions.cs | 2 +- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/CppParser/Bindings/CLI/Decl.h b/src/CppParser/Bindings/CLI/Decl.h index 940ad969..ef71e36c 100644 --- a/src/CppParser/Bindings/CLI/Decl.h +++ b/src/CppParser/Bindings/CLI/Decl.h @@ -255,7 +255,7 @@ namespace CppSharp Itanium = 0, Microsoft = 1, ARM = 2, - AArch64 = 3, + AArch64 = 3, iOS = 4, AppleARM64 = 5, WebAssembly = 6 diff --git a/src/CppParser/ParserGen/ParserGen.cs b/src/CppParser/ParserGen/ParserGen.cs index 48b0ab4a..703bb386 100644 --- a/src/CppParser/ParserGen/ParserGen.cs +++ b/src/CppParser/ParserGen/ParserGen.cs @@ -68,7 +68,16 @@ namespace CppSharp SetupMacOptions(parserOptions); if (Triple.Contains("linux")) - SetupLinuxOptions(parserOptions); + { + if(Triple.Contains("arm64")) + { + SetupLinuxOptions(parserOptions, "arm64-linux-gnu"); + } + else + { + SetupLinuxOptions(parserOptions, "x86_64-linux-gnu"); + } + } var basePath = Path.Combine(GetSourceDirectory("src"), "CppParser"); parserModule.IncludeDirs.Add(basePath); @@ -87,13 +96,13 @@ namespace CppSharp parserOptions.UnityBuild = true; } - private void SetupLinuxOptions(ParserOptions options) + private void SetupLinuxOptions(ParserOptions options, string headerFolderName) { options.MicrosoftMode = false; options.NoBuiltinIncludes = true; var headersPath = Platform.IsLinux ? string.Empty : - Path.Combine(GetSourceDirectory("build"), "headers", "x86_64-linux-gnu"); + Path.Combine(GetSourceDirectory("build"), "headers", headerFolderName); options.SetupLinux(headersPath); options.AddDefines("_GLIBCXX_USE_CXX11_ABI=" + (IsGnuCpp11Abi ? "1" : "0")); } @@ -111,7 +120,7 @@ namespace CppSharp var headersPath = Path.Combine(GetSourceDirectory("build"), "headers", "osx"); - + options.AddDefines("__DARWIN_OS_INLINE=inline"); options.AddSystemIncludeDirs(Path.Combine(headersPath, "include", "c++", "v1")); options.AddSystemIncludeDirs(options.BuiltinsDir); options.AddSystemIncludeDirs(Path.Combine(headersPath, "include")); @@ -186,18 +195,22 @@ namespace CppSharp var linuxHeadersPath = Path.Combine(GetSourceDirectory("build"), @"headers\x86_64-linux-gnu"); if (Directory.Exists(linuxHeadersPath) || Platform.IsLinux) { - Console.WriteLine("Generating the C# parser bindings for Linux..."); + Console.WriteLine("Generating the C# parser bindings for Linux x64..."); ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "x86_64-linux-gnu")); Console.WriteLine(); - Console.WriteLine("Generating the C# parser bindings for Linux ARM64..."); - ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "arm64-linux-gnu")); - Console.WriteLine(); - - Console.WriteLine("Generating the C# parser bindings for Linux (GCC C++11 ABI)..."); + Console.WriteLine("Generating the C# parser bindings for Linux x64 (GCC C++11 ABI)..."); ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "x86_64-linux-gnu", isGnuCpp11Abi: true)); Console.WriteLine(); + } + + var linuxArmHeadersPath = Path.Combine(GetSourceDirectory("build"), @"headers\arm64-linux-gnu"); + if (Directory.Exists(linuxArmHeadersPath)) + { + Console.WriteLine("Generating the C# parser bindings for Linux ARM64..."); + ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "arm64-linux-gnu")); + Console.WriteLine(); Console.WriteLine("Generating the C# parser bindings for Linux ARM64 (GCC C++11 ABI)..."); ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "arm64-linux-gnu", diff --git a/src/Parser/ParserOptions.cs b/src/Parser/ParserOptions.cs index 51170944..3d8a0c14 100644 --- a/src/Parser/ParserOptions.cs +++ b/src/Parser/ParserOptions.cs @@ -249,7 +249,7 @@ namespace CppSharp.Parser AddArguments(int.Parse(majorVersion) >= 11 ? $"-fgnuc-version=10.1" : $"-fgnuc-version={longVersion}"); string[] versions = { longVersion, shortVersion, majorVersion }; - string[] triples = { "x86_64-linux-gnu", "x86_64-pc-linux-gnu" }; + string[] triples = { "x86_64-linux-gnu", "x86_64-pc-linux-gnu", "aarch64-linux-gnu" }; if (compiler == "gcc") { foreach (var version in versions)