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

Nico Weber thakis at google.com
Mon Jul 20 12:08:53 PDT 2015


On Mon, Jul 20, 2015 at 11:07 AM, Yaron Keren <yaron.keren at gmail.com> wrote:

> If we input the root externally then we are not testing the
> root-discovering code (MinGW constructor)... and that's where the last
> "space" bug was.
>

But it could still cover the code changes in this revision here, right?
Having some coverage is probably better than none at all?


> gcc driver does not have this problem as it knows where it's configured,
> but clang has to check several possible directories.
> Maybe this could be simulated with the VirtualFileSystem if we make the
> mingw toolchain work with an abstract file system instead of the regular
> one? it will probably slow the driver and not sure it's worth the
> complexity.
>
>
>
> 2015-07-20 20:48 GMT+03:00 Nico Weber <thakis at google.com>:
>
>> On Mon, Jul 20, 2015 at 12:20 AM, Yaron Keren <yaron.keren at gmail.com>
>> wrote:
>>
>>> To make the toolchain "just work", clang gathers information - gcc
>>> installed version and existance of various directories - from the directory
>>> structure itself instead of requiring the user to supply them. So clang
>>> requires the mingw directory structure (at least) to really exist at the
>>> right locations, all of which are outside the llvm tree.
>>>
>>
>> Maybe there could be some test-only flag to set the root of the mingw
>> tree to another place? Then driver tests could write a mingw-like tree in
>> some temp dir and that could be used for testing (similar to how the gcc
>> driver tests work).
>>
>>
>>>
>>> The real-world test would be to compile an small C++ test program that
>>> includes both C and C++ headers using the mingw toolchain on every target
>>> platform to see that all includes and libraries are found and the program
>>> correctly compiled and runs. That requires setting up mingw toolchains on
>>> the various bots. Currently we have a bot running mingw toolchain on
>>> windows only:
>>>
>>>  http://bb.pgr.jp/grid
>>>
>>> I'm not sure what could be tested otherwise.
>>>
>>>
>>> 2015-07-20 9:46 GMT+03:00 Nico Weber <thakis at google.com>:
>>>
>>>> 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/20150720/6a9b1d4f/attachment.html>


More information about the cfe-commits mailing list