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

Yaron Keren yaron.keren at gmail.com
Tue Jul 21 04:36:48 PDT 2015


tests in r242766.
I tested it with mingw toolchain on Windows 7 and Ubuntu.
Ismail, Thomas, could you test on openSUSE & Arch Linux?


2015-07-20 22:30 GMT+03:00 Yaron Keren <yaron.keren at gmail.com>:

> The code emitting list of directories based on the root, yes.
> Looking at the code I think sysroot isn't handled correctly in the Linux
> case. It should specify the mingw root directory, not the base directory
> from where the search starts.
> I'll modify sysroot to work so and then make test where various sysroots
> are provided and the the output directories tested.
>
>
> 2015-07-20 22:08 GMT+03:00 Nico Weber <thakis at google.com>:
>
>> 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/20150721/1adc9108/attachment.html>


More information about the cfe-commits mailing list