]> granicus.if.org Git - clang/commitdiff
Teach mingw toolchain the msys2 mingw-w64 distribution C++ dirs.
authorYaron Keren <yaron.keren@gmail.com>
Mon, 6 Jul 2015 07:40:10 +0000 (07:40 +0000)
committerYaron Keren <yaron.keren@gmail.com>
Mon, 6 Jul 2015 07:40:10 +0000 (07:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241432 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/MinGWToolChain.cpp
lib/Driver/ToolChains.h

index 606508da69648758dadd41b98150882783e9de02..d3dc235216d0c87104445b283b97ea77486adc59 100644 (file)
@@ -45,6 +45,7 @@ MinGW::MinGW(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
   llvm::sys::fs::directory_iterator MingW64Entry(LibDir + Arch, EC);
   if (!EC) {
     GccLibDir = MingW64Entry->path();
+    Ver = llvm::sys::path::filename(GccLibDir);
   } else {
     // If mingw-w64 not found, try looking for mingw.org.
     Arch = "mingw32";
@@ -128,16 +129,21 @@ void MinGW::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
       DriverArgs.hasArg(options::OPT_nostdincxx))
     return;
 
-  llvm::SmallString<1024> IncludeDir;
-  for (bool MingW64 : {true, false}) {
-    if (MingW64)
-      IncludeDir = Base + Arch;
-    else
-      IncludeDir = GccLibDir;
-    llvm::sys::path::append(IncludeDir, "include", "c++");
-    addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
-    IncludeDir += llvm::sys::path::get_separator();
-    addSystemInclude(DriverArgs, CC1Args, IncludeDir.str() + Arch);
-    addSystemInclude(DriverArgs, CC1Args, IncludeDir.str() + "backward");
+  // C++ includes may be found in several locations depending on distribution.
+  // mingw-w64 mingw-builds: $sysroot/i686-w64-mingw32/include/c++.
+  // mingw-w64 msys2:        $sysroot/include/c++/4.9.2
+  // mingw.org:              GccLibDir/include/c++
+  llvm::SmallVector<llvm::SmallString<1024>, 3> CppIncludeBases;
+  CppIncludeBases.emplace_back(Base);
+  llvm::sys::path::append(CppIncludeBases[0], Arch, "include", "c++");
+  CppIncludeBases.emplace_back(Base);
+  llvm::sys::path::append(CppIncludeBases[1], "include", "c++", Ver);
+  CppIncludeBases.emplace_back(GccLibDir);
+  llvm::sys::path::append(CppIncludeBases[2], "include", "c++");
+  for (auto &CppIncludeBase : CppIncludeBases) {
+    CppIncludeBase += llvm::sys::path::get_separator();
+    addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);
+    addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + Arch);
+    addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + "backward");
   }
 }
index 629f90ac79f825289fffe3bdd22d34a92a602f7b..05066ee5f7f3683c4d9848024c9caaf0e4853d46 100644 (file)
@@ -552,6 +552,7 @@ protected:
 private:
   std::string Base;
   std::string GccLibDir;
+  std::string Ver;
   std::string Arch;
   mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocessor;
   mutable std::unique_ptr<tools::gcc::Compiler> Compiler;