From c519e3825d2ef397df04350039109ae14f305ef5 Mon Sep 17 00:00:00 2001
From: Conrad Kreyling <conrad@kreyling.biz>
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)