r242660 - Support mingw toolchain include and lib directories on Arch Linux.

Nico Weber thakis at google.com
Sun Jul 19 23:46:49 PDT 2015


Is it possible to test this?
On Jul 19, 2015 11:39 PM, "Yaron Keren" <yaron.keren at gmail.com> wrote:

> Author: yrnkrn
> Date: Mon Jul 20 01:38:39 2015
> New Revision: 242660
>
> URL: http://llvm.org/viewvc/llvm-project?rev=242660&view=rev
> Log:
> Support mingw toolchain include and lib directories on Arch Linux.
> Thanks to Thomas Pochtrager for testing this!
>
>
> Modified:
>     cfe/trunk/lib/Driver/MinGWToolChain.cpp
>
> Modified: cfe/trunk/lib/Driver/MinGWToolChain.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/MinGWToolChain.cpp?rev=242660&r1=242659&r2=242660&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/MinGWToolChain.cpp (original)
> +++ cfe/trunk/lib/Driver/MinGWToolChain.cpp Mon Jul 20 01:38:39 2015
> @@ -26,6 +26,8 @@ MinGW::MinGW(const Driver &D, const llvm
>
>    llvm::SmallString<1024> LibDir;
>
> +  // In Windows there aren't any standard install locations, we search
> +  // for gcc on the PATH. In Liunx the base is always /usr.
>  #ifdef LLVM_ON_WIN32
>    if (getDriver().SysRoot.size())
>      Base = getDriver().SysRoot;
> @@ -36,42 +38,48 @@ MinGW::MinGW(const Driver &D, const llvm
>    else
>      Base = llvm::sys::path::parent_path(getDriver().getInstalledDir());
>    Base += llvm::sys::path::get_separator();
> -  LibDir = Base;
> -  llvm::sys::path::append(LibDir, "lib", "gcc");
>  #else
>    if (getDriver().SysRoot.size())
>      Base = getDriver().SysRoot;
>    else
>      Base = "/usr/";
> -  LibDir = Base;
> -  llvm::sys::path::append(LibDir, "lib64", "gcc");
>  #endif
>
> -  LibDir += llvm::sys::path::get_separator();
> -
> -  // First look for mingw-w64.
> -  Arch = getTriple().getArchName();
> -  Arch += "-w64-mingw32";
> -  std::error_code EC;
> -  llvm::sys::fs::directory_iterator MingW64Entry(LibDir + Arch, EC);
> -  if (!EC) {
> -    GccLibDir = MingW64Entry->path();
> -    Ver = llvm::sys::path::filename(GccLibDir);
> -  } else {
> +  // By default Arch is for mingw-w64.
> +  Arch = (getTriple().getArchName() + "-w64-mingw32").str();
> +  // lib: Arch Linux, Ubuntu, Windows
> +  // lib64: openSUSE Linux
> +  for (StringRef Lib : {"lib", "lib64 "}) {
> +    LibDir = Base;
> +    llvm::sys::path::append(LibDir, Lib, "gcc");
> +    LibDir += llvm::sys::path::get_separator();
> +    std::error_code EC;
> +    // First look for mingw-w64.
> +    llvm::sys::fs::directory_iterator MingW64Entry(LibDir + Arch, EC);
> +    if (!EC) {
> +      GccLibDir = MingW64Entry->path();
> +      Ver = llvm::sys::path::filename(GccLibDir);
> +      break;
> +    }
>      // If mingw-w64 not found, try looking for mingw.org.
> -    Arch = "mingw32";
> -    llvm::sys::fs::directory_iterator MingwOrgEntry(LibDir + Arch, EC);
> -    if (!EC)
> +    llvm::sys::fs::directory_iterator MingwOrgEntry(LibDir + "mingw32",
> EC);
> +    if (!EC) {
>        GccLibDir = MingwOrgEntry->path();
> +      // Replace Arch with mingw32 arch.
> +      Arch = "mingw32";
> +      break;
> +    }
>    }
> +
>    Arch += llvm::sys::path::get_separator();
>    // GccLibDir must precede Base/lib so that the
>    // correct crtbegin.o ,cetend.o would be found.
>    getFilePaths().push_back(GccLibDir);
> -  getFilePaths().push_back(Base + "lib");
>    getFilePaths().push_back(Base + Arch + "lib");
> -#ifdef LLVM_ON_UNIX
> -  // For openSUSE.
> +#ifdef LLVM_ON_WIN32
> +  getFilePaths().push_back(Base + "lib");
> +#else
> +  // openSUSE
>    getFilePaths().push_back(Base + Arch + "sys-root/mingw/lib");
>  #endif
>  }
> @@ -134,7 +142,7 @@ void MinGW::AddClangSystemIncludeArgs(co
>    addSystemInclude(DriverArgs, CC1Args, IncludeDir.c_str());
>    IncludeDir += "-fixed";
>  #ifdef LLVM_ON_UNIX
> -  // For openSUSE.
> +  // openSUSE
>    addSystemInclude(DriverArgs, CC1Args,
>                     "/usr/x86_64-w64-mingw32/sys-root/mingw/include");
>  #endif
> @@ -149,23 +157,28 @@ void MinGW::AddClangCXXStdlibIncludeArgs
>        DriverArgs.hasArg(options::OPT_nostdincxx))
>      return;
>
> -  // C++ includes may be found in several locations depending on
> distribution.
> +  // C++ includes locations are different with almost every mingw
> distribution.
> +  //
>    // Windows
>    // -------
> -  // mingw-w64 mingw-builds: $sysroot/i686-w64-mingw32/include/c++.
> +  // mingw-w64 mingw-builds: $sysroot/i686-w64-mingw32/include/c++
>    // mingw-w64 msys2:        $sysroot/include/c++/4.9.2
>    // mingw.org:              GccLibDir/include/c++
>    //
>    // Linux
>    // -----
>    // openSUSE:               GccLibDir/include/c++
> -  llvm::SmallVector<llvm::SmallString<1024>, 3> CppIncludeBases;
> +  // Arch:                   $sysroot/i686-w64-mingw32/include/c++/5.1.0
> +  //
> +  llvm::SmallVector<llvm::SmallString<1024>, 4> 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);
> +  llvm::sys::path::append(CppIncludeBases[1], Arch, "include", "c++",
> Ver);
> +  CppIncludeBases.emplace_back(Base);
> +  llvm::sys::path::append(CppIncludeBases[2], "include", "c++", Ver);
>    CppIncludeBases.emplace_back(GccLibDir);
> -  llvm::sys::path::append(CppIncludeBases[2], "include", "c++");
> +  llvm::sys::path::append(CppIncludeBases[3], "include", "c++");
>    for (auto &CppIncludeBase : CppIncludeBases) {
>      CppIncludeBase += llvm::sys::path::get_separator();
>      addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150719/12d10df5/attachment.html>


More information about the cfe-commits mailing list