From 7e825c4dd32dd68dfc9b4dc4ee83e9f312d5749b Mon Sep 17 00:00:00 2001
From: josetr <37419832+josetr@users.noreply.github.com>
Date: Sat, 12 Mar 2022 04:03:02 +0000
Subject: [PATCH] Add LanguageVersion.CPP23
---
src/Parser/ParserOptions.cs | 760 ++++++++++++++++++------------------
1 file changed, 387 insertions(+), 373 deletions(-)
diff --git a/src/Parser/ParserOptions.cs b/src/Parser/ParserOptions.cs
index 03828029..7e064e3a 100644
--- a/src/Parser/ParserOptions.cs
+++ b/src/Parser/ParserOptions.cs
@@ -11,377 +11,391 @@ using LanguageVersion = CppSharp.Parser.LanguageVersion;
namespace CppSharp.Parser
{
- public enum LanguageVersion
- {
- ///
- /// C programming language (year 1999).
- ///
- C99,
- ///
- /// C programming language (year 1999, GNU variant).
- ///
- C99_GNU,
- ///
- /// C++ programming language (year 1998).
- ///
- CPP98,
- ///
- /// C++ programming language (year 1998, GNU variant).
- ///
- CPP98_GNU,
- ///
- /// C++ programming language (year 2011).
- ///
- CPP11,
- ///
- /// C++ programming language (year 2011, GNU variant).
- ///
- CPP11_GNU,
- ///
- /// C++ programming language (year 2014).
- ///
- CPP14,
- ///
- /// C++ programming language (year 2014, GNU variant).
- ///
- CPP14_GNU,
- ///
- /// C++ programming language (year 2017).
- ///
- CPP17,
- ///
- /// C++ programming language (year 2017, GNU variant).
- ///
- CPP17_GNU,
- ///
- /// C++ programming language (year 2020).
- ///
- CPP20,
- ///
- /// C++ programming language (year 2020, GNU variant).
- ///
- CPP20_GNU,
- }
-
- public class ParserOptions : CppParserOptions
- {
- public ParserOptions()
- {
- MicrosoftMode = !Platform.IsUnixPlatform;
- AddCompilationOptions("-flto");
- AddCompilationOptions("-O3");
- AddCompilationOptions("-fno-use-cxa-atexit");
- }
-
- public bool IsItaniumLikeAbi => !IsMicrosoftAbi;
- public bool IsMicrosoftAbi => TargetTriple.Contains("win32") ||
- TargetTriple.Contains("windows") || TargetTriple.Contains("msvc");
-
- public bool EnableRTTI { get; set; }
- public LanguageVersion? LanguageVersion { get; set; }
-
- public void BuildForSourceFile(
- IEnumerable modules, string file = null)
- {
- // This eventually gets passed to Clang's MSCompatibilityVersion, which
- // is in turn used to derive the value of the built-in define _MSC_VER.
- // It used to receive a 4-digit based identifier but now expects a full
- // version MSVC digit, so check if we still have the old version and
- // convert to the right format.
-
- if (ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4)
- ToolSetToUse *= 100000;
-
- foreach (var module in modules.Where(
- m => file == null || m.Headers.Contains(file)))
- {
- foreach (var include in module.IncludeDirs)
- AddIncludeDirs(include);
-
- foreach (var define in module.Defines)
- AddDefines(define);
-
- foreach (var undefine in module.Undefines)
- AddUndefines(undefine);
- }
- }
-
- public void SetupMSVC()
- {
- var vsVersion = VisualStudioVersion.Latest;
-
- // Silence "warning CS0162: Unreachable code detected"
- #pragma warning disable 162
-
- switch (BuildConfig.Choice)
- {
- case "vs2012":
- vsVersion = VisualStudioVersion.VS2012;
- break;
- case "vs2013":
- vsVersion = VisualStudioVersion.VS2013;
- break;
- case "vs2015":
- vsVersion = VisualStudioVersion.VS2015;
- break;
- case "vs2017":
- vsVersion = VisualStudioVersion.VS2017;
- break;
- case "vs2019":
- vsVersion = VisualStudioVersion.VS2019;
- break;
-
- #pragma warning restore 162
-
- }
-
- SetupMSVC(vsVersion);
- }
-
- ///
- /// Sets up the parser options to work with the given Visual Studio toolchain.
- ///
- /// The version of Visual Studio to look for.
- public void SetupMSVC(VisualStudioVersion vsVersion)
- {
- MicrosoftMode = true;
-
- var clVersion = MSVCToolchain.GetCLVersion(vsVersion);
- ToolSetToUse = clVersion.Major * 10000000 + clVersion.Minor * 100000;
-
- // do not remove the CppSharp prefix becase the Mono C# compiler breaks
- if (!LanguageVersion.HasValue)
- LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
-
- AddArguments("-fms-extensions");
- AddArguments("-fms-compatibility");
- AddArguments("-fdelayed-template-parsing");
- }
-
- ///
- /// Set to true to opt for Xcode Clang builtin headers
- ///
- public bool UseXcodeBuiltins;
-
- public void SetupXcode()
- {
- var cppIncPath = XcodeToolchain.GetXcodeCppIncludesFolder();
- AddSystemIncludeDirs(cppIncPath);
-
- var builtinsPath = XcodeToolchain.GetXcodeBuiltinIncludesFolder();
- AddSystemIncludeDirs(UseXcodeBuiltins ? builtinsPath : BuiltinsDir);
-
- var includePath = XcodeToolchain.GetXcodeIncludesFolder();
- AddSystemIncludeDirs(includePath);
-
- NoBuiltinIncludes = true;
- NoStandardIncludes = true;
-
- AddArguments("-fgnuc-version=4.2.1");
- AddArguments("-stdlib=libc++");
- }
-
- private void GetUnixCompilerInfo(string headersPath, out string compiler,
- out string longVersion, out string shortVersion)
- {
- if (!Platform.IsLinux)
- {
- compiler = "gcc";
-
- // Search for the available GCC versions on the provided headers.
- var versions = Directory.EnumerateDirectories(Path.Combine(headersPath,
- "usr", "include", "c++"));
-
- if (versions.Count() == 0)
- throw new Exception("No valid GCC version found on system include paths");
-
- string gccVersionPath = versions.First();
- longVersion = shortVersion = gccVersionPath.Substring(
- gccVersionPath.LastIndexOf(Path.DirectorySeparatorChar) + 1);
-
- return;
- }
-
- var info = new ProcessStartInfo(Environment.GetEnvironmentVariable("CXX") ?? "gcc", "-v");
- info.RedirectStandardError = true;
- info.CreateNoWindow = true;
- info.UseShellExecute = false;
-
- var process = Process.Start(info);
- if (process == null)
- throw new SystemException("GCC compiler was not found.");
-
- process.WaitForExit();
-
- var output = process.StandardError.ReadToEnd();
- var match = Regex.Match(output, "(gcc|clang) version (([0-9]+\\.[0-9]+)\\.[0-9]+)");
- if (!match.Success)
- throw new SystemException("GCC compiler was not found.");
-
- compiler = match.Groups[1].ToString();
- longVersion = match.Groups[2].ToString();
- shortVersion = match.Groups[3].ToString();
- }
-
- public void SetupLinux(string headersPath = "")
- {
- MicrosoftMode = false;
- NoBuiltinIncludes = true;
- NoStandardIncludes = true;
-
- string compiler, longVersion, shortVersion;
- GetUnixCompilerInfo(headersPath, out compiler, out longVersion, out shortVersion);
-
- AddSystemIncludeDirs(BuiltinsDir);
- AddArguments($"-fgnuc-version={longVersion}");
-
- string majorVersion = shortVersion.Split('.')[0];
- string[] versions = { longVersion, shortVersion, majorVersion };
- string[] triples = { "x86_64-linux-gnu", "x86_64-pc-linux-gnu" };
- if (compiler == "gcc")
- {
- foreach (var version in versions)
- {
- AddSystemIncludeDirs($"{headersPath}/usr/include/c++/{version}");
- AddSystemIncludeDirs($"{headersPath}/usr/include/c++/{version}/backward");
-
- foreach (var triple in triples)
- {
- AddSystemIncludeDirs($"{headersPath}/usr/include/{triple}/c++/{version}");
- AddSystemIncludeDirs($"{headersPath}/usr/include/c++/{version}/{triple}");
- }
- }
- }
-
- foreach (var triple in triples)
- {
- foreach (var version in versions)
- {
- AddSystemIncludeDirs($"{headersPath}/usr/lib/{compiler}/{triple}/{version}/include");
- AddSystemIncludeDirs($"{headersPath}/usr/lib/{compiler}/{triple}/{version}/include/c++");
- AddSystemIncludeDirs($"{headersPath}/usr/lib/{compiler}/{triple}/{version}/include/c++/{triple}");
- }
-
- AddSystemIncludeDirs($"{headersPath}/usr/include/{triple}");
- }
-
- AddSystemIncludeDirs($"{headersPath}/usr/include");
- AddSystemIncludeDirs($"{headersPath}/usr/include/linux");
- }
-
- public void Setup()
- {
- SetupArguments();
-
- if (!NoBuiltinIncludes)
- SetupIncludes();
- }
-
- private void SetupArguments()
- {
- // do not remove the CppSharp prefix becase the Mono C# compiler breaks
- if (!LanguageVersion.HasValue)
- LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
-
- // As of Clang revision 5e866e411caa we are required to pass "-fgnuc-version="
- // to get the __GNUC__ symbol defined. macOS and Linux system headers require
- // this define, so we need explicitly pass it to Clang.
-
- // Note that this setup is more accurately done in the platform-specific
- // setup methods, below is generic fallback in case that logic was disabled.
- if (NoBuiltinIncludes)
- {
- switch (Platform.Host)
- {
- case TargetPlatform.MacOS:
- case TargetPlatform.Linux:
- AddArguments("-fgnuc-version=4.2.1");
- break;
- }
- }
-
- switch (LanguageVersion)
- {
- case CppSharp.Parser.LanguageVersion.C99:
- case CppSharp.Parser.LanguageVersion.C99_GNU:
- AddArguments("-xc");
- break;
- default:
- AddArguments("-xc++");
- break;
- }
-
- switch (LanguageVersion)
- {
- case CppSharp.Parser.LanguageVersion.C99:
- AddArguments("-std=c99");
- break;
- case CppSharp.Parser.LanguageVersion.C99_GNU:
- AddArguments("-std=gnu99");
- break;
- case CppSharp.Parser.LanguageVersion.CPP98:
- AddArguments("-std=c++98");
- break;
- case CppSharp.Parser.LanguageVersion.CPP98_GNU:
- AddArguments("-std=gnu++98");
- break;
- case CppSharp.Parser.LanguageVersion.CPP11:
- AddArguments("-std=c++11");
- break;
- case CppSharp.Parser.LanguageVersion.CPP11_GNU:
- AddArguments("-std=gnu++11");
- break;
- case CppSharp.Parser.LanguageVersion.CPP14:
- AddArguments("-std=c++14");
- break;
- case CppSharp.Parser.LanguageVersion.CPP14_GNU:
- AddArguments("-std=gnu++14");
- break;
- case CppSharp.Parser.LanguageVersion.CPP17:
- AddArguments("-std=c++17");
- break;
- case CppSharp.Parser.LanguageVersion.CPP17_GNU:
- AddArguments("-std=gnu++17");
- break;
- case CppSharp.Parser.LanguageVersion.CPP20:
- AddArguments("-std=c++20");
- break;
- case CppSharp.Parser.LanguageVersion.CPP20_GNU:
- AddArguments("-std=gnu++20");
- break;
- }
-
- if (!EnableRTTI)
- AddArguments("-fno-rtti");
- }
-
- public string BuiltinsDir
- {
- get
- {
- var assemblyDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
- return Path.Combine(assemblyDir, "lib", "clang", ClangVersion, "include");
- }
- }
-
- private void SetupIncludes()
- {
- // Check that the builtin includes folder exists.
- if (!Directory.Exists(BuiltinsDir))
- throw new Exception($"Clang resource folder 'lib/clang/{ClangVersion}/include' was not found.");
-
- switch (Platform.Host)
- {
- case TargetPlatform.Windows:
- SetupMSVC();
- break;
- case TargetPlatform.MacOS:
- SetupXcode();
- break;
- case TargetPlatform.Linux:
- SetupLinux();
- break;
- }
- }
- }
+ public enum LanguageVersion
+ {
+ ///
+ /// C programming language (year 1999).
+ ///
+ C99,
+ ///
+ /// C programming language (year 1999, GNU variant).
+ ///
+ C99_GNU,
+ ///
+ /// C++ programming language (year 1998).
+ ///
+ CPP98,
+ ///
+ /// C++ programming language (year 1998, GNU variant).
+ ///
+ CPP98_GNU,
+ ///
+ /// C++ programming language (year 2011).
+ ///
+ CPP11,
+ ///
+ /// C++ programming language (year 2011, GNU variant).
+ ///
+ CPP11_GNU,
+ ///
+ /// C++ programming language (year 2014).
+ ///
+ CPP14,
+ ///
+ /// C++ programming language (year 2014, GNU variant).
+ ///
+ CPP14_GNU,
+ ///
+ /// C++ programming language (year 2017).
+ ///
+ CPP17,
+ ///
+ /// C++ programming language (year 2017, GNU variant).
+ ///
+ CPP17_GNU,
+ ///
+ /// C++ programming language (year 2020).
+ ///
+ CPP20,
+ ///
+ /// C++ programming language (year 2020, GNU variant).
+ ///
+ CPP20_GNU,
+ ///
+ /// C++ programming language (year 2023).
+ ///
+ CPP23,
+ ///
+ /// C++ programming language (year 2023, GNU variant).
+ ///
+ CPP23_GNU,
+ }
+
+ public class ParserOptions : CppParserOptions
+ {
+ public ParserOptions()
+ {
+ MicrosoftMode = !Platform.IsUnixPlatform;
+ AddCompilationOptions("-flto");
+ AddCompilationOptions("-O3");
+ AddCompilationOptions("-fno-use-cxa-atexit");
+ }
+
+ public bool IsItaniumLikeAbi => !IsMicrosoftAbi;
+ public bool IsMicrosoftAbi => TargetTriple.Contains("win32") ||
+ TargetTriple.Contains("windows") || TargetTriple.Contains("msvc");
+
+ public bool EnableRTTI { get; set; }
+ public LanguageVersion? LanguageVersion { get; set; }
+
+ public void BuildForSourceFile(
+ IEnumerable modules, string file = null)
+ {
+ // This eventually gets passed to Clang's MSCompatibilityVersion, which
+ // is in turn used to derive the value of the built-in define _MSC_VER.
+ // It used to receive a 4-digit based identifier but now expects a full
+ // version MSVC digit, so check if we still have the old version and
+ // convert to the right format.
+
+ if (ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4)
+ ToolSetToUse *= 100000;
+
+ foreach (var module in modules.Where(
+ m => file == null || m.Headers.Contains(file)))
+ {
+ foreach (var include in module.IncludeDirs)
+ AddIncludeDirs(include);
+
+ foreach (var define in module.Defines)
+ AddDefines(define);
+
+ foreach (var undefine in module.Undefines)
+ AddUndefines(undefine);
+ }
+ }
+
+ public void SetupMSVC()
+ {
+ var vsVersion = VisualStudioVersion.Latest;
+
+ // Silence "warning CS0162: Unreachable code detected"
+#pragma warning disable 162
+
+ switch (BuildConfig.Choice)
+ {
+ case "vs2012":
+ vsVersion = VisualStudioVersion.VS2012;
+ break;
+ case "vs2013":
+ vsVersion = VisualStudioVersion.VS2013;
+ break;
+ case "vs2015":
+ vsVersion = VisualStudioVersion.VS2015;
+ break;
+ case "vs2017":
+ vsVersion = VisualStudioVersion.VS2017;
+ break;
+ case "vs2019":
+ vsVersion = VisualStudioVersion.VS2019;
+ break;
+
+#pragma warning restore 162
+
+ }
+
+ SetupMSVC(vsVersion);
+ }
+
+ ///
+ /// Sets up the parser options to work with the given Visual Studio toolchain.
+ ///
+ /// The version of Visual Studio to look for.
+ public void SetupMSVC(VisualStudioVersion vsVersion)
+ {
+ MicrosoftMode = true;
+
+ var clVersion = MSVCToolchain.GetCLVersion(vsVersion);
+ ToolSetToUse = clVersion.Major * 10000000 + clVersion.Minor * 100000;
+
+ // do not remove the CppSharp prefix becase the Mono C# compiler breaks
+ if (!LanguageVersion.HasValue)
+ LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
+
+ AddArguments("-fms-extensions");
+ AddArguments("-fms-compatibility");
+ AddArguments("-fdelayed-template-parsing");
+ }
+
+ ///
+ /// Set to true to opt for Xcode Clang builtin headers
+ ///
+ public bool UseXcodeBuiltins;
+
+ public void SetupXcode()
+ {
+ var cppIncPath = XcodeToolchain.GetXcodeCppIncludesFolder();
+ AddSystemIncludeDirs(cppIncPath);
+
+ var builtinsPath = XcodeToolchain.GetXcodeBuiltinIncludesFolder();
+ AddSystemIncludeDirs(UseXcodeBuiltins ? builtinsPath : BuiltinsDir);
+
+ var includePath = XcodeToolchain.GetXcodeIncludesFolder();
+ AddSystemIncludeDirs(includePath);
+
+ NoBuiltinIncludes = true;
+ NoStandardIncludes = true;
+
+ AddArguments("-fgnuc-version=4.2.1");
+ AddArguments("-stdlib=libc++");
+ }
+
+ private void GetUnixCompilerInfo(string headersPath, out string compiler,
+ out string longVersion, out string shortVersion)
+ {
+ if (!Platform.IsLinux)
+ {
+ compiler = "gcc";
+
+ // Search for the available GCC versions on the provided headers.
+ var versions = Directory.EnumerateDirectories(Path.Combine(headersPath,
+ "usr", "include", "c++"));
+
+ if (versions.Count() == 0)
+ throw new Exception("No valid GCC version found on system include paths");
+
+ string gccVersionPath = versions.First();
+ longVersion = shortVersion = gccVersionPath.Substring(
+ gccVersionPath.LastIndexOf(Path.DirectorySeparatorChar) + 1);
+
+ return;
+ }
+
+ var info = new ProcessStartInfo(Environment.GetEnvironmentVariable("CXX") ?? "gcc", "-v");
+ info.RedirectStandardError = true;
+ info.CreateNoWindow = true;
+ info.UseShellExecute = false;
+
+ var process = Process.Start(info);
+ if (process == null)
+ throw new SystemException("GCC compiler was not found.");
+
+ process.WaitForExit();
+
+ var output = process.StandardError.ReadToEnd();
+ var match = Regex.Match(output, "(gcc|clang) version (([0-9]+\\.[0-9]+)\\.[0-9]+)");
+ if (!match.Success)
+ throw new SystemException("GCC compiler was not found.");
+
+ compiler = match.Groups[1].ToString();
+ longVersion = match.Groups[2].ToString();
+ shortVersion = match.Groups[3].ToString();
+ }
+
+ public void SetupLinux(string headersPath = "")
+ {
+ MicrosoftMode = false;
+ NoBuiltinIncludes = true;
+ NoStandardIncludes = true;
+
+ string compiler, longVersion, shortVersion;
+ GetUnixCompilerInfo(headersPath, out compiler, out longVersion, out shortVersion);
+
+ AddSystemIncludeDirs(BuiltinsDir);
+ AddArguments($"-fgnuc-version={longVersion}");
+
+ string majorVersion = shortVersion.Split('.')[0];
+ string[] versions = { longVersion, shortVersion, majorVersion };
+ string[] triples = { "x86_64-linux-gnu", "x86_64-pc-linux-gnu" };
+ if (compiler == "gcc")
+ {
+ foreach (var version in versions)
+ {
+ AddSystemIncludeDirs($"{headersPath}/usr/include/c++/{version}");
+ AddSystemIncludeDirs($"{headersPath}/usr/include/c++/{version}/backward");
+
+ foreach (var triple in triples)
+ {
+ AddSystemIncludeDirs($"{headersPath}/usr/include/{triple}/c++/{version}");
+ AddSystemIncludeDirs($"{headersPath}/usr/include/c++/{version}/{triple}");
+ }
+ }
+ }
+
+ foreach (var triple in triples)
+ {
+ foreach (var version in versions)
+ {
+ AddSystemIncludeDirs($"{headersPath}/usr/lib/{compiler}/{triple}/{version}/include");
+ AddSystemIncludeDirs($"{headersPath}/usr/lib/{compiler}/{triple}/{version}/include/c++");
+ AddSystemIncludeDirs($"{headersPath}/usr/lib/{compiler}/{triple}/{version}/include/c++/{triple}");
+ }
+
+ AddSystemIncludeDirs($"{headersPath}/usr/include/{triple}");
+ }
+
+ AddSystemIncludeDirs($"{headersPath}/usr/include");
+ AddSystemIncludeDirs($"{headersPath}/usr/include/linux");
+ }
+
+ public void Setup()
+ {
+ SetupArguments();
+
+ if (!NoBuiltinIncludes)
+ SetupIncludes();
+ }
+
+ private void SetupArguments()
+ {
+ // do not remove the CppSharp prefix becase the Mono C# compiler breaks
+ if (!LanguageVersion.HasValue)
+ LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
+
+ // As of Clang revision 5e866e411caa we are required to pass "-fgnuc-version="
+ // to get the __GNUC__ symbol defined. macOS and Linux system headers require
+ // this define, so we need explicitly pass it to Clang.
+
+ // Note that this setup is more accurately done in the platform-specific
+ // setup methods, below is generic fallback in case that logic was disabled.
+ if (NoBuiltinIncludes)
+ {
+ switch (Platform.Host)
+ {
+ case TargetPlatform.MacOS:
+ case TargetPlatform.Linux:
+ AddArguments("-fgnuc-version=4.2.1");
+ break;
+ }
+ }
+
+ switch (LanguageVersion)
+ {
+ case CppSharp.Parser.LanguageVersion.C99:
+ case CppSharp.Parser.LanguageVersion.C99_GNU:
+ AddArguments("-xc");
+ break;
+ default:
+ AddArguments("-xc++");
+ break;
+ }
+
+ switch (LanguageVersion)
+ {
+ case CppSharp.Parser.LanguageVersion.C99:
+ AddArguments("-std=c99");
+ break;
+ case CppSharp.Parser.LanguageVersion.C99_GNU:
+ AddArguments("-std=gnu99");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP98:
+ AddArguments("-std=c++98");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP98_GNU:
+ AddArguments("-std=gnu++98");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP11:
+ AddArguments("-std=c++11");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP11_GNU:
+ AddArguments("-std=gnu++11");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP14:
+ AddArguments("-std=c++14");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP14_GNU:
+ AddArguments("-std=gnu++14");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP17:
+ AddArguments("-std=c++17");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP17_GNU:
+ AddArguments("-std=gnu++17");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP20:
+ AddArguments("-std=c++20");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP20_GNU:
+ AddArguments("-std=gnu++20");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP23:
+ AddArguments("-std=c++2b");
+ break;
+ case CppSharp.Parser.LanguageVersion.CPP23_GNU:
+ AddArguments("-std=gnu++2b");
+ break;
+ }
+
+ if (!EnableRTTI)
+ AddArguments("-fno-rtti");
+ }
+
+ public string BuiltinsDir
+ {
+ get
+ {
+ var assemblyDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
+ return Path.Combine(assemblyDir, "lib", "clang", ClangVersion, "include");
+ }
+ }
+
+ private void SetupIncludes()
+ {
+ // Check that the builtin includes folder exists.
+ if (!Directory.Exists(BuiltinsDir))
+ throw new Exception($"Clang resource folder 'lib/clang/{ClangVersion}/include' was not found.");
+
+ switch (Platform.Host)
+ {
+ case TargetPlatform.Windows:
+ SetupMSVC();
+ break;
+ case TargetPlatform.MacOS:
+ SetupXcode();
+ break;
+ case TargetPlatform.Linux:
+ SetupLinux();
+ break;
+ }
+ }
+ }
}