mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 08:30:34 +08:00
Have clang pay attention to the LIBRARY_PATH environment variable.
The LIBRARY_PATH environment variable should be honored by clang. Have the driver pass the directories to the linker. <rdar://problem/9743567> and PR10296. llvm-svn: 152578
This commit is contained in:
@@ -88,6 +88,38 @@ static void QuoteTarget(StringRef Target,
|
||||
}
|
||||
}
|
||||
|
||||
static void AddDirectoryList(const ArgList &Args,
|
||||
ArgStringList &CmdArgs,
|
||||
const char *ArgName,
|
||||
const char *DirList) {
|
||||
if (!DirList)
|
||||
return; // Nothing to do.
|
||||
|
||||
StringRef Dirs(DirList);
|
||||
if (Dirs.empty()) // Empty string should not add '.'.
|
||||
return;
|
||||
|
||||
StringRef::size_type Delim;
|
||||
while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
|
||||
if (Delim == 0) { // Leading colon.
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(".");
|
||||
} else {
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
|
||||
}
|
||||
Dirs = Dirs.substr(Delim + 1);
|
||||
}
|
||||
|
||||
if (Dirs.empty()) { // Trailing colon.
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(".");
|
||||
} else { // Add the last path.
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(Args.MakeArgString(Dirs));
|
||||
}
|
||||
}
|
||||
|
||||
static void AddLinkerInputs(const ToolChain &TC,
|
||||
const InputInfoList &Inputs, const ArgList &Args,
|
||||
ArgStringList &CmdArgs) {
|
||||
@@ -128,6 +160,9 @@ static void AddLinkerInputs(const ToolChain &TC,
|
||||
} else
|
||||
A.renderAsInput(Args, CmdArgs);
|
||||
}
|
||||
|
||||
// LIBRARY_PATH - included following the user specified library paths.
|
||||
AddDirectoryList(Args, CmdArgs, "-L", ::getenv("LIBRARY_PATH"));
|
||||
}
|
||||
|
||||
/// \brief Determine whether Objective-C automated reference counting is
|
||||
@@ -162,38 +197,6 @@ static void addProfileRT(const ToolChain &TC, const ArgList &Args,
|
||||
CmdArgs.push_back(Args.MakeArgString(ProfileRT));
|
||||
}
|
||||
|
||||
static void AddIncludeDirectoryList(const ArgList &Args,
|
||||
ArgStringList &CmdArgs,
|
||||
const char *ArgName,
|
||||
const char *DirList) {
|
||||
if (!DirList)
|
||||
return; // Nothing to do.
|
||||
|
||||
StringRef Dirs(DirList);
|
||||
if (Dirs.empty()) // Empty string should not add '.'.
|
||||
return;
|
||||
|
||||
StringRef::size_type Delim;
|
||||
while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
|
||||
if (Delim == 0) { // Leading colon.
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(".");
|
||||
} else {
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
|
||||
}
|
||||
Dirs = Dirs.substr(Delim + 1);
|
||||
}
|
||||
|
||||
if (Dirs.empty()) { // Trailing colon.
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(".");
|
||||
} else { // Add the last path.
|
||||
CmdArgs.push_back(ArgName);
|
||||
CmdArgs.push_back(Args.MakeArgString(Dirs));
|
||||
}
|
||||
}
|
||||
|
||||
void Clang::AddPreprocessingOptions(Compilation &C,
|
||||
const Driver &D,
|
||||
const ArgList &Args,
|
||||
@@ -399,19 +402,19 @@ void Clang::AddPreprocessingOptions(Compilation &C,
|
||||
// frontend into the driver. It will allow deleting 4 otherwise unused flags.
|
||||
// CPATH - included following the user specified includes (but prior to
|
||||
// builtin and standard includes).
|
||||
AddIncludeDirectoryList(Args, CmdArgs, "-I", ::getenv("CPATH"));
|
||||
AddDirectoryList(Args, CmdArgs, "-I", ::getenv("CPATH"));
|
||||
// C_INCLUDE_PATH - system includes enabled when compiling C.
|
||||
AddIncludeDirectoryList(Args, CmdArgs, "-c-isystem",
|
||||
::getenv("C_INCLUDE_PATH"));
|
||||
AddDirectoryList(Args, CmdArgs, "-c-isystem",
|
||||
::getenv("C_INCLUDE_PATH"));
|
||||
// CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
|
||||
AddIncludeDirectoryList(Args, CmdArgs, "-cxx-isystem",
|
||||
::getenv("CPLUS_INCLUDE_PATH"));
|
||||
AddDirectoryList(Args, CmdArgs, "-cxx-isystem",
|
||||
::getenv("CPLUS_INCLUDE_PATH"));
|
||||
// OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
|
||||
AddIncludeDirectoryList(Args, CmdArgs, "-objc-isystem",
|
||||
::getenv("OBJC_INCLUDE_PATH"));
|
||||
AddDirectoryList(Args, CmdArgs, "-objc-isystem",
|
||||
::getenv("OBJC_INCLUDE_PATH"));
|
||||
// OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
|
||||
AddIncludeDirectoryList(Args, CmdArgs, "-objcxx-isystem",
|
||||
::getenv("OBJCPLUS_INCLUDE_PATH"));
|
||||
AddDirectoryList(Args, CmdArgs, "-objcxx-isystem",
|
||||
::getenv("OBJCPLUS_INCLUDE_PATH"));
|
||||
|
||||
// Add C++ include arguments, if needed.
|
||||
if (types::isCXX(Inputs[0].getType()))
|
||||
|
||||
2
clang/test/Driver/linker-opts.c
Normal file
2
clang/test/Driver/linker-opts.c
Normal file
@@ -0,0 +1,2 @@
|
||||
// RUN: env LIBRARY_PATH=%T/test1 %clang -x c %s -### -o foo 2> %t.log
|
||||
// RUN: grep '".*ld.*" .*"-L" "%T/test1"' %t.log
|
||||
Reference in New Issue
Block a user