Make clang-cl accept .lib inputs (PR20065)
Patch by Ehsan Akhgari! (Tiny tweak by me: renamed PathSegment to LibDir.) Differential Revision: http://reviews.llvm.org/D4192 llvm-svn: 211189
This commit is contained in:
parent
fc308f5c9f
commit
23d26a3ef7
|
@ -21,6 +21,7 @@
|
|||
#include "clang/Driver/ToolChain.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/Option/Arg.h"
|
||||
|
@ -33,6 +34,7 @@
|
|||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/PrettyStackTrace.h"
|
||||
#include "llvm/Support/Process.h"
|
||||
#include "llvm/Support/Program.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <map>
|
||||
|
@ -927,6 +929,35 @@ void Driver::BuildUniversalActions(const ToolChain &TC,
|
|||
}
|
||||
}
|
||||
|
||||
/// \brief Check whether the file referenced by Value exists in the LIB
|
||||
/// environment variable.
|
||||
static bool ExistsInLibDir(StringRef Value) {
|
||||
llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("LIB");
|
||||
if (!OptPath.hasValue())
|
||||
return false;
|
||||
|
||||
#ifdef LLVM_ON_WIN32
|
||||
const StringRef PathSeparators = ";";
|
||||
#else
|
||||
const StringRef PathSeparators = ":";
|
||||
#endif
|
||||
|
||||
SmallVector<StringRef, 8> LibDirs;
|
||||
llvm::SplitString(OptPath.getValue(), LibDirs, PathSeparators);
|
||||
|
||||
for (const auto &LibDir : LibDirs) {
|
||||
if (LibDir.empty())
|
||||
continue;
|
||||
|
||||
SmallString<128> FilePath(LibDir);
|
||||
llvm::sys::path::append(FilePath, Value);
|
||||
if (llvm::sys::fs::exists(Twine(FilePath)))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// \brief Check that the file referenced by Value exists. If it doesn't,
|
||||
/// issue a diagnostic and return false.
|
||||
static bool DiagnoseInputExistence(const Driver &D, const DerivedArgList &Args,
|
||||
|
@ -950,6 +981,9 @@ static bool DiagnoseInputExistence(const Driver &D, const DerivedArgList &Args,
|
|||
if (llvm::sys::fs::exists(Twine(Path)))
|
||||
return true;
|
||||
|
||||
if (D.IsCLMode() && ExistsInLibDir(Value))
|
||||
return true;
|
||||
|
||||
D.Diag(clang::diag::err_drv_no_such_file) << Path.str();
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -40,4 +40,13 @@
|
|||
// RUN: %clang_cl -### /Tc - 2>&1 | FileCheck -check-prefix=STDINTc %s
|
||||
// STDINTc: "-x" "c"
|
||||
|
||||
// RUN: env LIB=%S/Inputs/cl-libs %clang_cl -### -- %s cl-test.lib 2>&1 | FileCheck -check-prefix=LIBINPUT %s
|
||||
// LIBINPUT: "link.exe"
|
||||
// LIBINPUT: "cl-test.lib"
|
||||
|
||||
// RUN: env LIB=%S/Inputs/cl-libs %clang_cl -### -- %s cl-test2.lib 2>&1 | FileCheck -check-prefix=LIBINPUT2 %s
|
||||
// LIBINPUT2: error: no such file or directory: 'cl-test2.lib'
|
||||
// LIBINPUT2: "link.exe"
|
||||
// LIBINPUT2-NOT: "cl-test2.lib"
|
||||
|
||||
void f();
|
||||
|
|
Loading…
Reference in New Issue