On Mon, Jul 20, 2015 at 11:07 AM, Yaron Keren <yaron.ke...@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 <tha...@google.com>: > >> On Mon, Jul 20, 2015 at 12:20 AM, Yaron Keren <yaron.ke...@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 <tha...@google.com>: >>> >>>> Is it possible to test this? >>>> On Jul 19, 2015 11:39 PM, "Yaron Keren" <yaron.ke...@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@cs.uiuc.edu >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>>>> >>>> >>> >>
_______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits