Yes I can. Create a deep nested directly, create a symlink from there to your Inputs/CUDA, and run "clang -v --target=i386-unknown-linux --sysroot=<very long directory>/Inputs/CUDA".
On Wed, Sep 23, 2015 at 4:47 PM, Artem Belevich <t...@google.com> wrote: > I'm looking into it. Can you reproduce it on linux? > > > On Wed, Sep 23, 2015 at 4:43 PM, Rui Ueyama <r...@google.com> wrote: > >> On Wed, Sep 23, 2015 at 2:49 PM, Artem Belevich via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> Author: tra >>> Date: Wed Sep 23 16:49:39 2015 >>> New Revision: 248433 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=248433&view=rev >>> Log: >>> [CUDA] Added CUDA installation detector class. >>> >>> Added new option --cuda-path=<path> which allows >>> overriding default search paths. >>> If it's not specified we look for CUDA installation in >>> /usr/include/cuda and /usr/include/cuda-7.0. >>> >>> Differential Revision: http://reviews.llvm.org/D12989 >>> >>> Added: >>> cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep >>> cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep >>> cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep >>> cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep >>> cfe/trunk/test/Driver/cuda-detect.cu >>> Modified: >>> cfe/trunk/include/clang/Driver/Options.td >>> cfe/trunk/lib/Driver/ToolChains.cpp >>> cfe/trunk/lib/Driver/ToolChains.h >>> >>> Modified: cfe/trunk/include/clang/Driver/Options.td >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=248433&r1=248432&r2=248433&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/include/clang/Driver/Options.td (original) >>> +++ cfe/trunk/include/clang/Driver/Options.td Wed Sep 23 16:49:39 2015 >>> @@ -359,6 +359,8 @@ def cuda_gpu_arch_EQ : Joined<["--"], "c >>> Flags<[DriverOption, HelpHidden]>, HelpText<"CUDA GPU architecture">; >>> def cuda_host_only : Flag<["--"], "cuda-host-only">, >>> HelpText<"Do host-side CUDA compilation only">; >>> +def cuda_path_EQ : Joined<["--"], "cuda-path=">, Group<i_Group>, >>> + HelpText<"CUDA installation path">; >>> def dA : Flag<["-"], "dA">, Group<d_Group>; >>> def dD : Flag<["-"], "dD">, Group<d_Group>, Flags<[CC1Option]>, >>> HelpText<"Print macro definitions in -E mode in addition to normal >>> output">; >>> >>> Modified: cfe/trunk/lib/Driver/ToolChains.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=248433&r1=248432&r2=248433&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/Driver/ToolChains.cpp (original) >>> +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Sep 23 16:49:39 2015 >>> @@ -1482,6 +1482,48 @@ bool Generic_GCC::GCCInstallationDetecto >>> BiarchTripleAliases.push_back(BiarchTriple.str()); >>> } >>> >>> +// \brief -- try common CUDA installation paths looking for files we >>> need for >>> +// CUDA compilation. >>> + >>> +void >>> +Generic_GCC::CudaInstallationDetector::init(const Driver &D, >>> + const llvm::Triple >>> &TargetTriple, >>> + const llvm::opt::ArgList >>> &Args) { >>> + SmallVector<StringRef, 4> CudaPathCandidates; >>> + >>> + if (Args.hasArg(options::OPT_cuda_path_EQ)) >>> + CudaPathCandidates.push_back( >>> + Args.getLastArgValue(options::OPT_cuda_path_EQ)); >>> + else { >>> + CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda"); >>> + CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0"); >>> + } >>> + >>> + for (const auto CudaPath : CudaPathCandidates) { >>> + if (CudaPath.empty() || !llvm::sys::fs::exists(CudaPath)) >>> + continue; >>> + >>> + CudaInstallPath = CudaPath; >>> + CudaIncludePath = CudaInstallPath + "/include"; >>> + CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice"; >>> + CudaLibPath = >>> + CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : >>> "/lib"); >>> + >>> + if (!(llvm::sys::fs::exists(CudaIncludePath) && >>> + llvm::sys::fs::exists(CudaLibPath) && >>> + llvm::sys::fs::exists(CudaLibDevicePath))) >>> + continue; >>> + >>> + IsValid = true; >>> + break; >>> + } >>> +} >>> + >>> +void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) >>> const { >>> + if (isValid()) >>> + OS << "Found CUDA installation: " << CudaInstallPath << "\n"; >>> +} >>> + >>> namespace { >>> // Filter to remove Multilibs that don't exist as a suffix to Path >>> class FilterNonExistent { >>> @@ -2053,7 +2095,7 @@ void Generic_GCC::GCCInstallationDetecto >>> >>> Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple, >>> const ArgList &Args) >>> - : ToolChain(D, Triple, Args), GCCInstallation() { >>> + : ToolChain(D, Triple, Args), GCCInstallation(), CudaInstallation() >>> { >>> getProgramPaths().push_back(getDriver().getInstalledDir()); >>> if (getDriver().getInstalledDir() != getDriver().Dir) >>> getProgramPaths().push_back(getDriver().Dir); >>> @@ -2085,6 +2127,7 @@ Tool *Generic_GCC::buildLinker() const { >>> void Generic_GCC::printVerboseInfo(raw_ostream &OS) const { >>> // Print the information about how we detected the GCC installation. >>> GCCInstallation.print(OS); >>> + CudaInstallation.print(OS); >>> } >>> >>> bool Generic_GCC::IsUnwindTablesDefault() const { >>> @@ -3261,6 +3304,7 @@ static StringRef getOSLibDir(const llvm: >>> Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList >>> &Args) >>> : Generic_ELF(D, Triple, Args) { >>> GCCInstallation.init(D, Triple, Args); >>> + CudaInstallation.init(D, Triple, Args); >>> Multilibs = GCCInstallation.getMultilibs(); >>> llvm::Triple::ArchType Arch = Triple.getArch(); >>> std::string SysRoot = computeSysRoot(); >>> >>> Modified: cfe/trunk/lib/Driver/ToolChains.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=248433&r1=248432&r2=248433&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/Driver/ToolChains.h (original) >>> +++ cfe/trunk/lib/Driver/ToolChains.h Wed Sep 23 16:49:39 2015 >>> @@ -157,6 +157,38 @@ public: >>> protected: >>> GCCInstallationDetector GCCInstallation; >>> >>> + // \brief A class to find a viable CUDA installation >>> + >>> + class CudaInstallationDetector { >>> + bool IsValid; >>> + std::string CudaInstallPath; >>> + std::string CudaLibPath; >>> + std::string CudaLibDevicePath; >>> + std::string CudaIncludePath; >>> + >>> + public: >>> + CudaInstallationDetector() : IsValid(false) {} >>> + void init(const Driver &D, const llvm::Triple &TargetTriple, >>> + const llvm::opt::ArgList &Args); >>> + >>> + /// \brief Check whether we detected a valid Cuda install. >>> + bool isValid() const { return IsValid; } >>> + /// \brief Print information about the detected CUDA installation. >>> + void print(raw_ostream &OS) const; >>> + >>> + /// \brief Get the detected Cuda installation path. >>> + StringRef getInstallPath() const { return CudaInstallPath; } >>> + /// \brief Get the detected Cuda Include path. >>> + StringRef getIncludePath() const { return CudaIncludePath; } >>> + /// \brief Get the detected Cuda library path. >>> + StringRef getLibPath() const { return CudaLibPath; } >>> + /// \brief Get the detected Cuda device library path. >>> + StringRef getLibDevicePath() const { return CudaLibDevicePath; } >>> + /// \brief Get libdevice file for given architecture >>> + }; >>> + >>> + CudaInstallationDetector CudaInstallation; >>> + >>> public: >>> Generic_GCC(const Driver &D, const llvm::Triple &Triple, >>> const llvm::opt::ArgList &Args); >>> >>> Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep?rev=248433&view=auto >>> >>> ============================================================================== >>> (empty) >>> >>> Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep?rev=248433&view=auto >>> >>> ============================================================================== >>> (empty) >>> >>> Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep?rev=248433&view=auto >>> >>> ============================================================================== >>> (empty) >>> >>> Added: >>> cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep?rev=248433&view=auto >>> >>> ============================================================================== >>> (empty) >>> >>> Added: cfe/trunk/test/Driver/cuda-detect.cu >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cuda-detect.cu?rev=248433&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/test/Driver/cuda-detect.cu (added) >>> +++ cfe/trunk/test/Driver/cuda-detect.cu Wed Sep 23 16:49:39 2015 >>> @@ -0,0 +1,12 @@ >>> +// REQUIRES: clang-driver >>> +// REQUIRES: x86-registered-target >>> +// >>> +// RUN: %clang -v --target=i386-unknown-linux \ >>> +// RUN: --sysroot=/tmp/no-cuda-there 2>&1 | FileCheck %s >>> -check-prefix NOCUDA >>> +// RUN: %clang -v --target=i386-unknown-linux \ >>> +// RUN: --sysroot=%S/Inputs/CUDA 2>&1 | FileCheck %s >>> +// RUN: %clang -v --target=i386-unknown-linux \ >>> +// RUN: --cuda-path=%S/Inputs/CUDA/usr/local/cuda 2>&1 | FileCheck %s >>> + >>> +// CHECK: Found CUDA installation: {{.*}}/Inputs/CUDA/usr/local/cuda >>> +// NOCUDA-NOT: Found CUDA installation: >>> >> >> This test seems to fail on Linux if the full path to Inputs directory is >> very long because it fails to detect the cuda installation path. Can you >> take a look? >> > > > > -- > --Artem Belevich >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits