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