forked from OSchip/llvm-project
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:
parent
3870bc4805
commit
281ca2917b
|
@ -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()))
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue