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:
Bill Wendling 2012-03-12 21:22:35 +00:00
parent 3870bc4805
commit 281ca2917b
2 changed files with 46 additions and 41 deletions

View File

@ -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, static void AddLinkerInputs(const ToolChain &TC,
const InputInfoList &Inputs, const ArgList &Args, const InputInfoList &Inputs, const ArgList &Args,
ArgStringList &CmdArgs) { ArgStringList &CmdArgs) {
@ -128,6 +160,9 @@ static void AddLinkerInputs(const ToolChain &TC,
} else } else
A.renderAsInput(Args, CmdArgs); 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 /// \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)); 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, void Clang::AddPreprocessingOptions(Compilation &C,
const Driver &D, const Driver &D,
const ArgList &Args, const ArgList &Args,
@ -399,19 +402,19 @@ void Clang::AddPreprocessingOptions(Compilation &C,
// frontend into the driver. It will allow deleting 4 otherwise unused flags. // frontend into the driver. It will allow deleting 4 otherwise unused flags.
// CPATH - included following the user specified includes (but prior to // CPATH - included following the user specified includes (but prior to
// builtin and standard includes). // 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. // C_INCLUDE_PATH - system includes enabled when compiling C.
AddIncludeDirectoryList(Args, CmdArgs, "-c-isystem", AddDirectoryList(Args, CmdArgs, "-c-isystem",
::getenv("C_INCLUDE_PATH")); ::getenv("C_INCLUDE_PATH"));
// CPLUS_INCLUDE_PATH - system includes enabled when compiling C++. // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
AddIncludeDirectoryList(Args, CmdArgs, "-cxx-isystem", AddDirectoryList(Args, CmdArgs, "-cxx-isystem",
::getenv("CPLUS_INCLUDE_PATH")); ::getenv("CPLUS_INCLUDE_PATH"));
// OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC. // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
AddIncludeDirectoryList(Args, CmdArgs, "-objc-isystem", AddDirectoryList(Args, CmdArgs, "-objc-isystem",
::getenv("OBJC_INCLUDE_PATH")); ::getenv("OBJC_INCLUDE_PATH"));
// OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++. // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
AddIncludeDirectoryList(Args, CmdArgs, "-objcxx-isystem", AddDirectoryList(Args, CmdArgs, "-objcxx-isystem",
::getenv("OBJCPLUS_INCLUDE_PATH")); ::getenv("OBJCPLUS_INCLUDE_PATH"));
// Add C++ include arguments, if needed. // Add C++ include arguments, if needed.
if (types::isCXX(Inputs[0].getType())) if (types::isCXX(Inputs[0].getType()))

View 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