Browse Source

Cleanup Clang resource directory lookup logic.

Now the logic is more standard across platforms, we always re-use the builtin bundled headers.

Fixes https://github.com/mono/CppSharp/issues/1259.
pull/1274/head
Joao Matos 6 years ago committed by João Matos
parent
commit
7df1623e6d
  1. 8
      src/CppParser/Bindings/CLI/CppParser.cpp
  2. 2
      src/CppParser/Bindings/CLI/CppParser.h
  3. 8
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs
  4. 8
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
  5. 8
      src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs
  6. 8
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs
  7. 8
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs
  8. 8
      src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
  9. 2
      src/CppParser/CppParser.h
  10. 29
      src/CppParser/Parser.cpp
  11. 32
      src/Parser/ParserOptions.cs

8
src/CppParser/Bindings/CLI/CppParser.cpp

@ -421,14 +421,14 @@ void CppSharp::Parser::CppParserOptions::TargetTriple::set(System::String^ value
((::CppSharp::CppParser::CppParserOptions*)NativePtr)->targetTriple = clix::marshalString<clix::E_UTF8>(value); ((::CppSharp::CppParser::CppParserOptions*)NativePtr)->targetTriple = clix::marshalString<clix::E_UTF8>(value);
} }
System::String^ CppSharp::Parser::CppParserOptions::CurrentDir::get() System::String^ CppSharp::Parser::CppParserOptions::ResourceDir::get()
{ {
return clix::marshalString<clix::E_UTF8>(((::CppSharp::CppParser::CppParserOptions*)NativePtr)->currentDir); return clix::marshalString<clix::E_UTF8>(((::CppSharp::CppParser::CppParserOptions*)NativePtr)->resourceDir);
} }
void CppSharp::Parser::CppParserOptions::CurrentDir::set(System::String^ value) void CppSharp::Parser::CppParserOptions::ResourceDir::set(System::String^ value)
{ {
((::CppSharp::CppParser::CppParserOptions*)NativePtr)->currentDir = clix::marshalString<clix::E_UTF8>(value); ((::CppSharp::CppParser::CppParserOptions*)NativePtr)->resourceDir = clix::marshalString<clix::E_UTF8>(value);
} }
bool CppSharp::Parser::CppParserOptions::NoStandardIncludes::get() bool CppSharp::Parser::CppParserOptions::NoStandardIncludes::get()

2
src/CppParser/Bindings/CLI/CppParser.h

@ -150,7 +150,7 @@ namespace CppSharp
void set(System::String^); void set(System::String^);
} }
property System::String^ CurrentDir property System::String^ ResourceDir
{ {
System::String^ get(); System::String^ get();
void set(System::String^); void set(System::String^);

8
src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs

@ -47465,7 +47465,7 @@ namespace CppSharp
internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C targetTriple; internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C targetTriple;
[FieldOffset(128)] [FieldOffset(128)]
internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C currentDir; internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C resourceDir;
[FieldOffset(140)] [FieldOffset(140)]
internal byte noStandardIncludes; internal byte noStandardIncludes;
@ -47970,17 +47970,17 @@ namespace CppSharp
} }
} }
public string CurrentDir public string ResourceDir
{ {
get get
{ {
var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->currentDir)); var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->resourceDir));
return global::Std.BasicStringExtensions.Data(__basicStringRet0); return global::Std.BasicStringExtensions.Data(__basicStringRet0);
} }
set set
{ {
global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->currentDir), value); global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->resourceDir), value);
} }
} }

8
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs

@ -47465,7 +47465,7 @@ namespace CppSharp
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple; internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple;
[FieldOffset(152)] [FieldOffset(152)]
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C currentDir; internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C resourceDir;
[FieldOffset(176)] [FieldOffset(176)]
internal byte noStandardIncludes; internal byte noStandardIncludes;
@ -47970,17 +47970,17 @@ namespace CppSharp
} }
} }
public string CurrentDir public string ResourceDir
{ {
get get
{ {
var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->currentDir)); var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->resourceDir));
return global::Std.BasicStringExtensions.Data(__basicStringRet0); return global::Std.BasicStringExtensions.Data(__basicStringRet0);
} }
set set
{ {
global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->currentDir), value); global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->resourceDir), value);
} }
} }

8
src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs

@ -47464,7 +47464,7 @@ namespace CppSharp
internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C targetTriple; internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C targetTriple;
[FieldOffset(256)] [FieldOffset(256)]
internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C currentDir; internal global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C resourceDir;
[FieldOffset(280)] [FieldOffset(280)]
internal byte noStandardIncludes; internal byte noStandardIncludes;
@ -47969,17 +47969,17 @@ namespace CppSharp
} }
} }
public string CurrentDir public string ResourceDir
{ {
get get
{ {
var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->currentDir)); var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->resourceDir));
return global::Std.BasicStringExtensions.Data(__basicStringRet0); return global::Std.BasicStringExtensions.Data(__basicStringRet0);
} }
set set
{ {
global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->currentDir), value); global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->resourceDir), value);
} }
} }

8
src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs

@ -47464,7 +47464,7 @@ namespace CppSharp
internal global::Std.BasicString.__Internalc__N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple; internal global::Std.BasicString.__Internalc__N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple;
[FieldOffset(272)] [FieldOffset(272)]
internal global::Std.BasicString.__Internalc__N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C currentDir; internal global::Std.BasicString.__Internalc__N_std_N___cxx11_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C resourceDir;
[FieldOffset(304)] [FieldOffset(304)]
internal byte noStandardIncludes; internal byte noStandardIncludes;
@ -47969,17 +47969,17 @@ namespace CppSharp
} }
} }
public string CurrentDir public string ResourceDir
{ {
get get
{ {
var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->currentDir)); var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->resourceDir));
return global::Std.BasicStringExtensions.Data(__basicStringRet0); return global::Std.BasicStringExtensions.Data(__basicStringRet0);
} }
set set
{ {
global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->currentDir), value); global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->resourceDir), value);
} }
} }

8
src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs

@ -47464,7 +47464,7 @@ namespace CppSharp
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple; internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple;
[FieldOffset(224)] [FieldOffset(224)]
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C currentDir; internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C resourceDir;
[FieldOffset(232)] [FieldOffset(232)]
internal byte noStandardIncludes; internal byte noStandardIncludes;
@ -47969,17 +47969,17 @@ namespace CppSharp
} }
} }
public string CurrentDir public string ResourceDir
{ {
get get
{ {
var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->currentDir)); var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->resourceDir));
return global::Std.BasicStringExtensions.Data(__basicStringRet0); return global::Std.BasicStringExtensions.Data(__basicStringRet0);
} }
set set
{ {
global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->currentDir), value); global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->resourceDir), value);
} }
} }

8
src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs

@ -47465,7 +47465,7 @@ namespace CppSharp
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple; internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C targetTriple;
[FieldOffset(272)] [FieldOffset(272)]
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C currentDir; internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C resourceDir;
[FieldOffset(304)] [FieldOffset(304)]
internal byte noStandardIncludes; internal byte noStandardIncludes;
@ -47970,17 +47970,17 @@ namespace CppSharp
} }
} }
public string CurrentDir public string ResourceDir
{ {
get get
{ {
var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->currentDir)); var __basicStringRet0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->resourceDir));
return global::Std.BasicStringExtensions.Data(__basicStringRet0); return global::Std.BasicStringExtensions.Data(__basicStringRet0);
} }
set set
{ {
global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->currentDir), value); global::Std.BasicStringExtensions.__Internal.Assign(new global::System.IntPtr(&((global::CppSharp.Parser.CppParserOptions.__Internal*)__Instance)->resourceDir), value);
} }
} }

2
src/CppParser/CppParser.h

@ -37,7 +37,7 @@ struct CS_API CppParserOptions
int toolSetToUse; int toolSetToUse;
std::string targetTriple; std::string targetTriple;
std::string currentDir; std::string resourceDir;
bool noStandardIncludes; bool noStandardIncludes;
bool noBuiltinIncludes; bool noBuiltinIncludes;

29
src/CppParser/Parser.cpp

@ -209,22 +209,20 @@ void Parser::ReadClassLayout(Class* Class, const clang::RecordDecl* RD,
} }
} }
static std::string GetClangResourceDir(std::string CurrentDir) //-----------------------------------//
// Compute the path to the resource directory.
static std::string GetClangResourceDir(std::string baseResourceDir)
{ {
using namespace llvm; llvm::SmallString<128> Path(baseResourceDir);
using namespace clang;
// Compute the path to the resource directory. llvm::StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
SmallString<128> P(CurrentDir);
llvm::sys::path::remove_filename(P);
if (ClangResourceDir != "") if (ClangResourceDir != "")
llvm::sys::path::append(P, ClangResourceDir); llvm::sys::path::append(Path, ClangResourceDir);
else else
llvm::sys::path::append(P, "lib", "clang", CLANG_VERSION_STRING); llvm::sys::path::append(Path, "lib", "clang", CLANG_VERSION_STRING);
return P.str(); return Path.str();
} }
//-----------------------------------// //-----------------------------------//
@ -319,15 +317,14 @@ void Parser::Setup()
if (opts->verbose) if (opts->verbose)
HSOpts.Verbose = true; HSOpts.Verbose = true;
#ifndef __APPLE__ // Initialize the builtin compiler headers.
// Initialize the default platform headers. HSOpts.ResourceDir = GetClangResourceDir(opts->resourceDir);
HSOpts.ResourceDir = GetClangResourceDir(opts->currentDir);
llvm::SmallString<128> ResourceDir(HSOpts.ResourceDir); llvm::SmallString<128> ResourceDir(HSOpts.ResourceDir);
llvm::sys::path::append(ResourceDir, "include"); llvm::sys::path::append(ResourceDir, "include");
HSOpts.AddPath(ResourceDir.str(), clang::frontend::System, /*IsFramework=*/false, HSOpts.AddPath(ResourceDir.str(), clang::frontend::System, /*IsFramework=*/false,
/*IgnoreSysRoot=*/false); /*IgnoreSysRoot=*/false);
#endif
for (unsigned I = 0, E = opts->IncludeDirs.size(); I != E; ++I) for (unsigned I = 0, E = opts->IncludeDirs.size(); I != E; ++I)
{ {

32
src/Parser/ParserOptions.cs

@ -1,13 +1,12 @@
using System; using System;
using CppSharp.Parser.AST;
using System.Reflection;
using LanguageVersion = CppSharp.Parser.LanguageVersion;
using System.Globalization;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.IO; using LanguageVersion = CppSharp.Parser.LanguageVersion;
namespace CppSharp.Parser namespace CppSharp.Parser
{ {
@ -60,7 +59,6 @@ namespace CppSharp.Parser
public ParserOptions() public ParserOptions()
{ {
MicrosoftMode = !Platform.IsUnixPlatform; MicrosoftMode = !Platform.IsUnixPlatform;
CurrentDir = Assembly.GetExecutingAssembly().Location;
} }
public ParserOptions(ParserOptions options) public ParserOptions(ParserOptions options)
@ -78,6 +76,7 @@ namespace CppSharp.Parser
SkipFunctionBodies = options.SkipFunctionBodies; SkipFunctionBodies = options.SkipFunctionBodies;
SkipLayoutInfo = options.SkipLayoutInfo; SkipLayoutInfo = options.SkipLayoutInfo;
ForceClangToolchainLookup = options.ForceClangToolchainLookup; ForceClangToolchainLookup = options.ForceClangToolchainLookup;
ResourceDir = options.ResourceDir;
} }
public bool IsItaniumLikeAbi => !IsMicrosoftAbi; public bool IsItaniumLikeAbi => !IsMicrosoftAbi;
@ -225,9 +224,6 @@ namespace CppSharp.Parser
public void SetupXcode() public void SetupXcode()
{ {
var builtinsPath = XcodeToolchain.GetXcodeBuiltinIncludesFolder();
AddSystemIncludeDirs(builtinsPath);
var cppIncPath = XcodeToolchain.GetXcodeCppIncludesFolder(); var cppIncPath = XcodeToolchain.GetXcodeCppIncludesFolder();
AddSystemIncludeDirs(cppIncPath); AddSystemIncludeDirs(cppIncPath);
@ -323,6 +319,8 @@ namespace CppSharp.Parser
{ {
SetupArguments(); SetupArguments();
SetupBuiltinIncludes();
if (!NoBuiltinIncludes) if (!NoBuiltinIncludes)
SetupIncludes(); SetupIncludes();
} }
@ -382,6 +380,22 @@ namespace CppSharp.Parser
AddArguments("-fno-rtti"); AddArguments("-fno-rtti");
} }
private void SetupBuiltinIncludes()
{
// If we have an explicit resource directory, then do nothing.
if (!string.IsNullOrEmpty(ResourceDir))
return;
// Else use the resource directory that was bundled next to the
// binaries by the build bootstrap scripts.
var assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!Directory.Exists(Path.Combine(assemblyDir, "lib", "clang")))
throw new Exception("Clang resource folder 'lib/clang/<version>' was not found.");
ResourceDir = assemblyDir;
}
private void SetupIncludes() private void SetupIncludes()
{ {
switch(Platform.Host) switch(Platform.Host)

Loading…
Cancel
Save