forked from OSchip/llvm-project
[clang][driver] Dynamically select gcc-toolset/devtoolset version
And pick the highest one, instead of adding all possibilities to the prefixes. Differential Revision: https://reviews.llvm.org/D125862
This commit is contained in:
parent
8e9528cb54
commit
8717b492df
|
@ -2130,17 +2130,31 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
|
|||
// and gcc-toolsets.
|
||||
if (SysRoot.empty() && TargetTriple.getOS() == llvm::Triple::Linux &&
|
||||
D.getVFS().exists("/opt/rh")) {
|
||||
Prefixes.push_back("/opt/rh/gcc-toolset-11/root/usr");
|
||||
Prefixes.push_back("/opt/rh/gcc-toolset-10/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-11/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-10/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-9/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-8/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-7/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-6/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
|
||||
Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
|
||||
// Find the directory in /opt/rh/ starting with gcc-toolset-* or
|
||||
// devtoolset-* with the highest version number and add that
|
||||
// one to our prefixes.
|
||||
std::string ChosenToolsetDir;
|
||||
unsigned ChosenToolsetVersion = 0;
|
||||
std::error_code EC;
|
||||
for (llvm::vfs::directory_iterator LI = D.getVFS().dir_begin("/opt/rh", EC),
|
||||
LE;
|
||||
!EC && LI != LE; LI = LI.increment(EC)) {
|
||||
StringRef ToolsetDir = llvm::sys::path::filename(LI->path());
|
||||
unsigned ToolsetVersion;
|
||||
if ((!ToolsetDir.startswith("gcc-toolset-") &&
|
||||
!ToolsetDir.startswith("devtoolset-")) ||
|
||||
ToolsetDir.substr(ToolsetDir.rfind('-') + 1)
|
||||
.getAsInteger(10, ToolsetVersion))
|
||||
continue;
|
||||
|
||||
if (ToolsetVersion > ChosenToolsetVersion) {
|
||||
ChosenToolsetVersion = ToolsetVersion;
|
||||
ChosenToolsetDir = "/opt/rh/" + ToolsetDir.str();
|
||||
}
|
||||
}
|
||||
|
||||
if (ChosenToolsetVersion > 0)
|
||||
Prefixes.push_back(ChosenToolsetDir);
|
||||
}
|
||||
|
||||
// Fall back to /usr which is used by most non-Solaris systems.
|
||||
|
|
|
@ -610,4 +610,92 @@ TEST(DxcModeTest, ValidatorVersionValidation) {
|
|||
DiagConsumer->clear();
|
||||
}
|
||||
|
||||
TEST(ToolChainTest, Toolsets) {
|
||||
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
|
||||
IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
|
||||
struct TestDiagnosticConsumer : public DiagnosticConsumer {};
|
||||
|
||||
// Check (newer) GCC toolset installation.
|
||||
{
|
||||
IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem(
|
||||
new llvm::vfs::InMemoryFileSystem);
|
||||
|
||||
// These should be ignored
|
||||
InMemoryFileSystem->addFile("/opt/rh/gcc-toolset-2", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
InMemoryFileSystem->addFile("/opt/rh/gcc-toolset-", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
InMemoryFileSystem->addFile("/opt/rh/gcc-toolset--", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
InMemoryFileSystem->addFile("/opt/rh/gcc-toolset--1", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
|
||||
// File needed for GCC installation detection.
|
||||
InMemoryFileSystem->addFile(
|
||||
"/opt/rh/gcc-toolset-12/lib/gcc/x86_64-redhat-linux/11/crtbegin.o", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
|
||||
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
|
||||
Driver TheDriver("/bin/clang", "x86_64-redhat-linux", Diags,
|
||||
"clang LLVM compiler", InMemoryFileSystem);
|
||||
std::unique_ptr<Compilation> C(TheDriver.BuildCompilation({"-v"}));
|
||||
ASSERT_TRUE(C);
|
||||
std::string S;
|
||||
{
|
||||
llvm::raw_string_ostream OS(S);
|
||||
C->getDefaultToolChain().printVerboseInfo(OS);
|
||||
}
|
||||
if (is_style_windows(llvm::sys::path::Style::native))
|
||||
std::replace(S.begin(), S.end(), '\\', '/');
|
||||
EXPECT_EQ("Found candidate GCC installation: "
|
||||
"/opt/rh/gcc-toolset-12/lib/gcc/x86_64-redhat-linux/11\n"
|
||||
"Selected GCC installation: "
|
||||
"/opt/rh/gcc-toolset-12/lib/gcc/x86_64-redhat-linux/11\n"
|
||||
"Candidate multilib: .;@m64\n"
|
||||
"Selected multilib: .;@m64\n",
|
||||
S);
|
||||
}
|
||||
|
||||
// And older devtoolset.
|
||||
{
|
||||
IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem(
|
||||
new llvm::vfs::InMemoryFileSystem);
|
||||
|
||||
// These should be ignored
|
||||
InMemoryFileSystem->addFile("/opt/rh/devtoolset-2", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
InMemoryFileSystem->addFile("/opt/rh/devtoolset-", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
InMemoryFileSystem->addFile("/opt/rh/devtoolset--", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
InMemoryFileSystem->addFile("/opt/rh/devtoolset--1", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
|
||||
// File needed for GCC installation detection.
|
||||
InMemoryFileSystem->addFile(
|
||||
"/opt/rh/devtoolset-12/lib/gcc/x86_64-redhat-linux/11/crtbegin.o", 0,
|
||||
llvm::MemoryBuffer::getMemBuffer("\n"));
|
||||
|
||||
DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
|
||||
Driver TheDriver("/bin/clang", "x86_64-redhat-linux", Diags,
|
||||
"clang LLVM compiler", InMemoryFileSystem);
|
||||
std::unique_ptr<Compilation> C(TheDriver.BuildCompilation({"-v"}));
|
||||
ASSERT_TRUE(C);
|
||||
std::string S;
|
||||
{
|
||||
llvm::raw_string_ostream OS(S);
|
||||
C->getDefaultToolChain().printVerboseInfo(OS);
|
||||
}
|
||||
if (is_style_windows(llvm::sys::path::Style::native))
|
||||
std::replace(S.begin(), S.end(), '\\', '/');
|
||||
EXPECT_EQ("Found candidate GCC installation: "
|
||||
"/opt/rh/devtoolset-12/lib/gcc/x86_64-redhat-linux/11\n"
|
||||
"Selected GCC installation: "
|
||||
"/opt/rh/devtoolset-12/lib/gcc/x86_64-redhat-linux/11\n"
|
||||
"Candidate multilib: .;@m64\n"
|
||||
"Selected multilib: .;@m64\n",
|
||||
S);
|
||||
}
|
||||
}
|
||||
|
||||
} // end anonymous namespace.
|
||||
|
|
Loading…
Reference in New Issue